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来实现网络服务
Sep 15 PHP
PHP chmod 函数与批量修改文件目录权限
May 10 PHP
PHP+SQL 注入攻击的技术实现以及预防办法
Jan 27 PHP
PHP中for与foreach的区别分析
Mar 09 PHP
php和数据库结合的一个简单的web实例 代码分析 (php初学者)
Jul 28 PHP
php数组函数序列 之array_count_values() 统计数组中所有值出现的次数函数
Oct 29 PHP
php中并发读写文件冲突的解决方案
Oct 25 PHP
PHP中Session引起的脚本阻塞问题解决办法
Apr 08 PHP
php支付宝手机网页支付类实例
Mar 04 PHP
codeigniter中view通过循环显示数组数据的方法
Mar 20 PHP
PHP微信公众号自动发送红包API
Jun 01 PHP
简单实现PHP留言板功能
Dec 21 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
VML绘图板②脚本--VMLgraph.js、XMLtool.js
2006/10/09 PHP
PHP下用rmdir实现删除目录的三种方法小结
2008/04/20 PHP
PHP文件上传主要代码讲解
2013/09/30 PHP
Symfony2学习笔记之插件格式分析
2016/03/17 PHP
使用PHP+MySql+Ajax+jQuery实现省市区三级联动功能示例
2017/09/15 PHP
laravel实现上传图片并在页面显示的例子
2019/10/14 PHP
js 如何实现对数据库的增删改查
2012/11/23 Javascript
js简单工厂模式用法实例
2015/06/30 Javascript
JavaScript实现点击自动选择TextArea文本的方法
2015/07/02 Javascript
checkbox 选中一个另一个checkbox也会选中的实现代码
2016/07/09 Javascript
js实现界面向原生界面发消息并跳转功能
2016/11/22 Javascript
修改ligerui 默认确认按钮的方法
2016/12/27 Javascript
JavaScript中的高级函数
2018/01/04 Javascript
利用Angular2 + Ionic3开发IOS应用实例教程
2018/01/15 Javascript
浅谈HTTP 缓存的那些事儿
2018/10/17 Javascript
ES6 Map结构的应用实例分析
2019/06/26 Javascript
NodeJS http模块用法示例【创建web服务器/客户端】
2019/11/05 NodeJs
vue-cli3中配置alias和打包加hash值操作
2020/09/04 Javascript
Python群发邮件实例代码
2014/01/03 Python
Python实现检测服务器是否可以ping通的2种方法
2015/01/01 Python
python 动态生成变量名以及动态获取变量的变量名方法
2019/01/20 Python
33个Python爬虫项目实战(推荐)
2019/07/08 Python
PyTorch中Tensor的维度变换实现
2019/08/18 Python
python实现FTP文件传输的方法(服务器端和客户端)
2020/03/20 Python
Keras之fit_generator与train_on_batch用法
2020/06/17 Python
html5通过canvas实现刮刮卡效果示例分享
2014/01/27 HTML / CSS
台湾乐天市场:日本No.1的网路购物网站
2017/03/22 全球购物
巴黎卡诗加拿大官网:Kérastase加拿大
2018/11/12 全球购物
人力资源管理专业毕业生自我评价
2013/09/21 职场文书
质检部部长职责
2013/12/16 职场文书
单位介绍信范文
2014/01/18 职场文书
学雷锋的心得体会
2014/09/04 职场文书
镇班子对照检查材料思想汇报
2014/09/24 职场文书
2015年中学元旦晚会活动方案
2014/12/09 职场文书
详解非极大值抑制算法之Python实现
2021/06/28 Python
python数据可视化JupyterLab实用扩展程序Mito
2021/11/20 Python