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 采集书并合成txt格式的实现代码
Mar 01 PHP
PHP数组的交集array_intersect(),array_intersect_assoc(),array_inter_key()函数的小问题
May 29 PHP
深入了解PHP类Class的概念
Jun 14 PHP
PHP命名空间(Namespace)简明教程
Jun 11 PHP
PHP连接MSSQL2008/2005数据库(SQLSRV)配置实例
Oct 22 PHP
PHP中UNIX时间戳和日期间的转换与计算实例
Nov 19 PHP
thinkPHP实现瀑布流的方法
Nov 29 PHP
thinkphp中ajax与php响应过程详解
Dec 08 PHP
PHP中使用imagick生成PSD文件缩略图教程
Jan 26 PHP
使用php-timeit估计php函数的执行时间
Sep 06 PHP
php处理json格式数据经典案例总结
May 19 PHP
PHP调试及性能分析工具Xdebug详解
Feb 09 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
PHP中的生成XML文件的4种方法分享
2012/10/06 PHP
完美解决PHP中的Cannot modify header information 问题
2013/08/12 PHP
php使用多个进程同时控制文件读写示例
2014/02/28 PHP
PHP截取IE浏览器并缩小原图的方法
2016/03/04 PHP
PHP内存溢出优化代码详解
2021/02/26 PHP
JSON 学习之JSON in JavaScript详细使用说明
2010/02/23 Javascript
JavaScript在IE和Firefox(火狐)的不兼容问题解决方法小结
2010/04/13 Javascript
获取非最后一列td值并将title设为该值的方法
2013/10/30 Javascript
多引号嵌套的变量命名的问题
2014/05/09 Javascript
IE中鼠标经过option触发mouseout的解决方法
2015/01/29 Javascript
js实现简单鼠标跟随效果的方法
2015/04/10 Javascript
JavaScript事件代理和委托详解
2016/04/08 Javascript
jQuery实现右键菜单、遮罩等效果代码
2016/09/27 Javascript
pc加载更多功能和移动端下拉刷新加载数据
2016/11/07 Javascript
canvas实现爱心和彩虹雨效果
2017/03/09 Javascript
vue计算属性时v-for处理数组时遇到的一个bug问题
2018/01/21 Javascript
js+html5实现手机九宫格密码解锁功能
2018/07/30 Javascript
微信小程序新手教程之启动页的重要性
2019/03/03 Javascript
[08:08]DOTA2-DPC中国联赛2月28日Recap集锦
2021/03/11 DOTA
Python中计算三角函数之cos()方法的使用简介
2015/05/15 Python
Python3实现并发检验代理池地址的方法
2016/09/18 Python
关于Python面向对象编程的知识点总结
2017/02/14 Python
python实现函数极小值
2019/07/10 Python
pygame实现俄罗斯方块游戏(AI篇2)
2019/10/29 Python
IntelliJ 中配置 Anaconda的过程图解
2020/06/01 Python
用html5实现语音搜索框的方法
2014/03/18 HTML / CSS
联想台湾官网:Lenovo TW
2018/05/09 全球购物
医学院毕业生自荐信
2013/11/08 职场文书
《音乐之都维也纳》教学反思
2014/04/16 职场文书
乒乓球兴趣小组活动总结
2014/07/08 职场文书
2014年群众路线党员自我评议
2014/09/24 职场文书
2015年安全生产责任书
2015/01/30 职场文书
召开会议通知范文
2015/04/15 职场文书
学雷锋献爱心活动总结
2015/05/11 职场文书
导游词之山西祁县乔家大院
2019/10/14 职场文书
mysql 索引的数据结构为什么要采用B+树
2022/04/26 MySQL