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的GROUP_CONCAT()函数使用方法
Mar 28 PHP
php获取数组中重复数据的两种方法
Jun 28 PHP
php遍历目录与文件夹的多种方法详解
Nov 14 PHP
PHP图片等比缩放类SimpleImage使用方法和使用实例分享
Apr 10 PHP
php实现zip压缩文件解压缩代码分享(简单易懂)
May 10 PHP
解析PHP强制转换类型及远程管理插件的安全隐患
Jun 30 PHP
php过滤html标记属性类用法实例
Sep 23 PHP
php打印输出棋盘的实现方法
Dec 23 PHP
php通过修改header强制图片下载的方法
Mar 24 PHP
PHP安装memcached扩展笔记
May 28 PHP
使用ThinkPHP的自动完成实现无限级分类实例详解
Sep 02 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转换IP地址到真实地址的方法详解
2013/06/09 PHP
PHP数组操作――获取数组最后一个值的方法
2015/04/14 PHP
WordPress分页伪静态加html后缀
2016/06/08 PHP
PHP设计模式之策略模式原理与用法实例分析
2019/04/04 PHP
javascript 带有滚动条的表格,标题固定,带排序功能.
2009/11/13 Javascript
Javascript 实现TreeView CheckBox全选效果
2010/01/11 Javascript
jQuery+ajax实现顶一下,踩一下效果
2010/07/17 Javascript
基于JQuery模仿苹果桌面的Dock效果(初级版)
2012/10/15 Javascript
jQuery不使用插件及swf实现无刷新文件上传
2014/12/08 Javascript
jquery对复选框(checkbox)的操作汇总
2016/01/13 Javascript
基于javascript html5实现3D翻书特效
2016/03/14 Javascript
BootStrap实用代码片段之一
2016/03/22 Javascript
jquery 抽奖小程序实现代码
2016/10/12 Javascript
详解Vue-cli 创建的项目如何跨域请求
2017/05/18 Javascript
knockoutjs模板实现树形结构列表
2017/07/31 Javascript
详解js静态资源文件请求的处理
2017/08/01 Javascript
nodejs项目windows下开机自启动的方法
2017/11/22 NodeJs
详细讲解如何创建, 发布自己的 Vue UI 组件库
2019/05/29 Javascript
JS实现从对象获取对象中单个键值的方法示例
2019/06/05 Javascript
JavaScript常用内置对象用法分析
2019/07/09 Javascript
Vue Components 数字键盘的实现
2019/09/18 Javascript
JS实现容器模块左右拖动效果
2020/01/14 Javascript
js实现无缝轮播图效果
2020/03/09 Javascript
ES11屡试不爽的新特性,你用上了几个
2020/10/21 Javascript
linux下python抓屏实现方法
2015/05/22 Python
python time()的实例用法
2020/11/03 Python
马来西亚网上购物:Youbeli
2018/03/30 全球购物
大学生个人求职信范文
2013/09/21 职场文书
给医务人员表扬信
2014/01/12 职场文书
金融行业职业生涯规划范文
2014/01/17 职场文书
大课间活动制度
2014/01/18 职场文书
大学三年计划书范文
2014/04/30 职场文书
先进教师个人总结
2015/02/11 职场文书
卫生院艾滋病宣传活动总结
2015/05/09 职场文书
python引入其他文件夹下的py文件具体方法
2021/05/23 Python
Win11怎么添加用户?Win11添加用户账户的方法
2022/07/15 数码科技