dedecms集成财付通支付接口


Posted in PHP onDecember 28, 2014

用织梦做了个旅游网站,客户要求财付通支付,上网找了下 不是要买就是要钱,只有自己写了。

代码:

<?php

if(!defined('DEDEINC')) exit('Request Error!');

/**

 *财付通接口类

 */

class tenpay

{

    var $dsql;

    var $mid;

    var $reqURL_onLine = "http://www.tenpay.com";

    var $return_url='/plus/carbuyaction.php?dopost=return'; //返回处理地址

    /**

    * 构造函数

    *

    * @access  public

    * @param

    *

    * @return void

    */

    function tenpay()

    {

        global $dsql;

        $this->dsql = $dsql;

    }

    function __construct()

    {

        $this->tenpay();

    }

    /**

     *  设定接口会送地址

     *

     *  例如: $this->SetReturnUrl($cfg_basehost."/tuangou/control/index.php?ac=pay&orderid=".$p2_Order)

     *

     * @param     string  $returnurl  会送地址

     * @return    void

     */

    function SetReturnUrl($returnurl='')

    {

        if (!empty($returnurl))

        {

            $this->return_url = $returnurl;

        }

    }

    /**

    * 生成支付代码

    * @param   array   $order      订单信息

    * @param   array   $payment    支付方式信息

    */

    function GetCode($order, $payment)

    {

        global $cfg_basehost,$cfg_cmspath;

        //对于二级目录的处理

        if(!empty($cfg_cmspath)) $cfg_basehost = $cfg_basehost.'/'.$cfg_cmspath;

          $partner      =  $payment['tenpay_account'];

          $out_trade_no = $order['out_trade_no'];

          $total_fee = floatval($order['price']) * 100;

           $body = $order['out_trade_no'];

           $attach = '';

           $bank_type = 'DEFAULT';

            /* 交易类型:2、虚拟交易,1、实物交易 */

         $trans_type = 1;

         $trade_mode=empty($payment['tenpay_pay_method']) ? '1' : $payment['tenpay_pay_method'];

       $parameter = array(

            'partner'              => $partner,

            'out_trade_no'         => $out_trade_no,                           //订单号

            'total_fee'            => $total_fee,                              //总金额

            'notify_url'           => $cfg_basehost.$this->return_url."&code=".$payment['code'],  //返回地址

            'return_url'           => $cfg_basehost.$this->return_url."&code=".$payment['code'], //提醒地址

            'body'                 => $body,                            //交易描述

            'bank_type'            => $bank_type,                       //交易类型  默认财付通

            //用户ip

            'spbill_create_ip'     => $_SERVER['REMOTE_ADDR'],          //交易ip

            'fee_type'             => '1',                        //币种  1 人民币

            'subject'              => $body,                            //商品名称

            //系统可选参数

            'sign_type'            => 'MD5',                            //加密方式

            'service_version'      => '1.0',                            //接口版本号 默认1.0

            'input_charset'        => 'UTF-8',                         //系统编码  'GBK'

            'sign_key_index'       => '1',                              //密钥序号

            //业务可选参数

            'attach'               => $attach,            //附加数据 原样返回  默认为空

            'product_fee'          => '',                 //商品费用

            'transport_fee'        => '0',                //物流费用

            'time_start'           => date("YmdHis"),     //订单生成时间   date("YmdHis")

            'time_expire'          => '',                 //订单失效时间

            'buyer_id'             => '',                 //买方财付通帐号

            'goods_tag'            => '',                 //商品标记

            'trade_mode'           => $trade_mode,        //交易模式(1.即时到帐模式,2.中介担保模式,3.后台选择(卖家进入支付中心列表选择))

            'transport_desc'       => '',                 //物流说明

            'trans_type'           => $trans_type,        //交易类型

            'agentid'              => '',                 //平台ID

            'agent_type'           => '',                 //代理模式(0.无代理,1.表示卡易售模式,2.表示网店模式)

            'seller_id'            => ''                  //卖家商户号

        );

        ksort($parameter);

        reset($parameter);

        $param = '';

        $sign  = '';

        foreach ($parameter AS $key => $val)

        {

            $param .= "$key=" .urlencode($val). "&";

            if("" != $val && "sign" != $key) {

                $sign  .= "$key=$val&";

            }

        }

        $param = substr($param, 0, -1);

        $sign .= "key=".$payment['tenpay_key'];

        $sign = strtolower(md5($sign));  

        $button = '<div style="text-align:center"><a href="https://gw.tenpay.com/gateway/pay.htm?'.$param. '&sign='.$sign.'"><button>立即使用财付通支付</button></a></div>'; 

        return $button;

    /* 清空购物车 */

        require_once DEDEINC.'/shopcar.class.php';

        $cart     = new MemberShops();

        $cart->clearItem();

        $cart->MakeOrders();

        return $button;

    }

    /**

    * 响应操作

    */

    function respond()

    {

        /* 引入配置文件 */

        $code = preg_replace( "#[^0-9a-z-]#i", "", $_GET['code'] );

        require_once DEDEDATA.'/payment/'.$code.'.php';

        $attach         = $_GET['attach'];

        $trade_state    = $_GET['trade_state'];

        $total_fee      = $_GET['total_fee'];

        $out_trade_no = trim($_GET['out_trade_no']);

 if(preg_match ("/S-P[0-9]+RN[0-9]/",$order_sn)) {

            //检查支付金额是否相符

            $row = $this->dsql->GetOne("SELECT * FROM #@__shops_orders WHERE oid = '{$order_sn}'");

            if ($row['priceCount'] != $_GET['total_fee'])

            {

                return $msg = "支付失败,支付金额与商品总价不相符!";

            }

            $this->mid = $row['userid'];

          /* 检查数字签名是否正确 */

        ksort($_GET);

        reset($_GET);

       $sign = '';

        foreach ($_GET AS $key => $val)

        {

            if("" != $val && "sign" != $key && $key != 'code') {

                $sign  .= "$key=$val&";

            }

        }

           $sign .= "key=".$payment['tenpay_key'];

  if(strtolower(md5($sign))==strtolower($_GET['sign']))

{

            if($trade_state==0)

            {      

                     /* 改变订单状态 */

               if($this->success_db($out_trade_no))  

               return $msg = "支付成功!<br> <a href='/'>返回主页</a> <a href='/member'>会员中心</a>";

               else  return $msg = "支付失败!<br> <a href='/'>返回主页</a> <a href='/member'>会员中心</a>";

            }   

}

else{

   //return $msg = "支付失败!<br> <a href='/'>返回主页</a> <a href='/member'>会员中心</a>";

  }

   }

    /*处理物品交易*/

    function success_db($order_sn)

    {

        $time=time();

        $mid=$this->mid;

        //获取订单信息,检查订单的有效性

        $row = $this->dsql->GetOne("SELECT state,priceCount FROM #@__shops_orders WHERE oid='$order_sn' ");

        if($row['state'] > 0)

        {

            return TRUE;

        }  

        /* 改变订单状态_支付成功 */

        $sql = "UPDATE `#@__shops_orders` SET `state`='1' WHERE `oid`='$order_sn' AND `userid`='".$this->mid."'";

        if($this->dsql->ExecuteNoneQuery($sql))

        {

            $this->log_result("verify_success,订单号:".$order_sn); //将验证结果存入文件

            return TRUE;

        } else {

            $this->log_result ("verify_failed,订单号:".$order_sn);//将验证结果存入文件

            return FALSE;

        }

    }

    function  log_result($word) {

        global $cfg_cmspath;

        $fp = fopen(dirname(__FILE__)."/../../data/payment/log.txt","a");

        flock($fp, LOCK_EX) ;

        fwrite($fp,$word.",执行日期:".strftime("%Y-%m-%d %H:%I:%S",time())."\r\n");

        flock($fp, LOCK_UN);

        fclose($fp);

    }

}
PHP 相关文章推荐
一步一步学习PHP(1) php开发环境配置
Feb 15 PHP
探讨PHP JSON中文乱码的解决方法详解
Jun 06 PHP
php多个字符串替换成同一个的解决方法
Jun 18 PHP
PHP也能干大事之PHP中的编码解码详解
Apr 20 PHP
初识通用数据库操作类――前端easyui-datagrid,form(php)
Jul 31 PHP
php二维码生成
Oct 19 PHP
yii2中结合gridview如何使用modal弹窗实例代码详解
Jun 12 PHP
php实现留言板功能(会话控制)
May 23 PHP
PHP用户注册邮件激活账户的实现代码
May 31 PHP
PHP多进程编程之僵尸进程问题的理解
Oct 15 PHP
ajax+php实现无刷新验证手机号的实例
Dec 22 PHP
PHP耦合设计模式实例分析
Aug 08 PHP
VPS中使用LNMP安装WordPress教程
Dec 28 #PHP
php随机取mysql记录方法小结
Dec 27 #PHP
php使用PDO方法详解
Dec 27 #PHP
PHP把MSSQL数据导入到MYSQL的方法
Dec 27 #PHP
php将图片保存入mysql数据库失败的解决方法
Dec 27 #PHP
php下pdo的mysql事务处理用法实例
Dec 27 #PHP
php5.3不能连接mssql数据库的解决方法
Dec 27 #PHP
You might like
JavaScript 在网页上单击鼠标的地方显示层及关闭层
2012/12/30 Javascript
JavaScript获取图片的原始尺寸以宽度为例
2014/05/04 Javascript
js父页面与子页面不同时显示的方法
2014/10/16 Javascript
JS实现下拉菜单赋值到文本框的方法
2015/08/18 Javascript
jQuery实现点击小图显示大图代码分享
2015/08/25 Javascript
Bootstrap每天必学之折叠
2016/04/12 Javascript
JS从一组数据中找到指定的单条数据的方法
2016/06/02 Javascript
js实现手机拍照上传功能
2017/01/17 Javascript
bootstrapValidator 重新启用提交按钮的方法
2017/02/20 Javascript
详解React Native开源时间日期选择器组件(react-native-datetime)
2017/09/13 Javascript
Vue 中如何正确引入第三方模块的方法步骤
2019/05/05 Javascript
vue轻量级框架无法获取到vue对象解决方法
2019/05/12 Javascript
JS桶排序的简单理解与实现方法示例
2019/11/25 Javascript
[50:02]完美世界DOTA2联赛循环赛 Magma vs IO BO2第一场 11.01
2020/11/02 DOTA
Python lxml模块安装教程
2015/06/02 Python
python压缩文件夹内所有文件为zip文件的方法
2015/06/20 Python
python 实时遍历日志文件
2016/04/12 Python
简单谈谈Python中的几种常见的数据类型
2017/02/10 Python
python web基础之加载静态文件实例
2018/03/20 Python
解决PyCharm import torch包失败的问题
2018/10/13 Python
python爬虫解决验证码的思路及示例
2019/08/01 Python
Python实现决策树并且使用Graphviz可视化的例子
2019/08/09 Python
python 子类调用父类的构造函数实例
2020/03/12 Python
详解python 内存优化
2020/08/17 Python
HTML5基于flash实现播放RTMP协议视频的示例代码
2020/12/04 HTML / CSS
STRATHBERRY苏贝瑞包包官网:西班牙高级工匠手工打造
2020/11/10 全球购物
董事长岗位职责
2013/11/30 职场文书
会计岗位描述
2014/02/22 职场文书
访谈节目策划方案
2014/05/15 职场文书
村主任“四风”问题个人整改措施
2014/10/04 职场文书
2014最新党员违纪检讨书
2014/10/12 职场文书
2015年护士节活动策划方案
2015/05/04 职场文书
2015年学校办公室工作总结
2015/05/26 职场文书
2015年学校医务室工作总结
2015/07/20 职场文书
2015初中政教处工作总结
2015/07/21 职场文书
python用字节处理文件实例讲解
2021/04/13 Python