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的安全策略
Oct 09 PHP
基于mysql的论坛(3)
Oct 09 PHP
解析如何在PHP下载文件名中解决乱码的问题
Jun 20 PHP
PHP中使用TCPDF生成PDF文档实例
Jul 01 PHP
php+mysqli实现将数据库中一张表信息打印到表格里的方法
Jan 28 PHP
PHP中的魔术方法总结和使用实例
May 11 PHP
php mongodb操作类 带几个简单的例子
Aug 25 PHP
PHP网站自动化配置的实现方法(必看)
May 27 PHP
PHP使用文件锁解决高并发问题示例
Mar 29 PHP
Laravel框架实现的记录SQL日志功能示例
Jun 19 PHP
php图片裁剪函数
Oct 31 PHP
PHP中define() 与 const定义常量的区别详解
Jun 25 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
我的论坛源代码(二)
2006/10/09 PHP
使用网络地址转换实现多服务器负载均衡
2006/10/09 PHP
介绍php设计模式中的工厂模式
2008/06/12 PHP
Laravel 5框架学习之Eloquent (laravel 的ORM)
2015/04/08 PHP
PHP PDOStatement::execute讲解
2019/01/31 PHP
php 多继承的几种常见实现方法示例
2019/11/18 PHP
mouse_on_title.js
2006/08/25 Javascript
jQuery each()小议
2010/03/18 Javascript
JS判断页面加载状态以及添加遮罩和缓冲动画的代码
2012/10/11 Javascript
通过JS自动隐藏手机浏览器的地址栏实现原理与代码
2013/01/02 Javascript
多次注册事件会导致一个事件被触发多次的解决方法
2013/08/12 Javascript
JS.elementGetStyle(element, style)应用示例
2013/09/24 Javascript
js数组操作学习总结
2013/11/04 Javascript
js中实现字符串和数组的相互转化详解
2016/01/24 Javascript
浅谈$('div a') 与$('div&gt;a')的区别
2016/07/18 Javascript
使用jQuery的ajax方法向服务器发出get和post请求的方法
2017/01/13 Javascript
jQuery使用unlock.js插件实现滑动解锁
2017/04/04 jQuery
Bootstrap Table 双击、单击行获取该行及全表内容
2018/08/31 Javascript
cnpm加速Angular项目创建的方法
2018/09/07 Javascript
vue插件--仿微信小程序showModel实现模态提示窗功能
2020/08/19 Javascript
python完成FizzBuzzWhizz问题(拉勾网面试题)示例
2014/05/05 Python
Python中用memcached来减少数据库查询次数的教程
2015/04/07 Python
pymongo实现多结果进行多列排序的方法
2015/05/16 Python
剖析Django中模版标签的解析与参数传递
2015/07/21 Python
Python 3中print函数的使用方法总结
2017/08/08 Python
Python内置函数 next的具体使用方法
2017/11/24 Python
5款非常棒的Python工具
2018/01/05 Python
Python将QQ聊天记录生成词云的示例代码
2021/02/10 Python
利用CSS3实现圆角的outline效果的教程
2015/06/05 HTML / CSS
房地产销售大学生自我评价分享
2013/11/11 职场文书
科研先进个人典型材料
2014/01/31 职场文书
毕业生就业推荐表自我鉴定
2014/03/20 职场文书
数字化校园建设方案
2014/05/03 职场文书
抵押贷款承诺书
2014/05/30 职场文书
Python机器学习之决策树和随机森林
2021/07/15 Javascript
SQLyog的下载、安装、破解、配置教程(MySQL可视化工具安装)
2022/09/23 MySQL