文档章节

ThinkPHP3.2中集成财付通支付

mickelfeng
 mickelfeng
发布于 2015/11/19 11:07
字数 1632
阅读 55
收藏 3
ThinkPHP3.2中集成财付通支付
在项目过程中用到了支付宝和财付通的支付接口问题,发现在TP还未有人写财付通的实例,我仿照前辈们写的一个案例 http://www.thinkphp.cn/code/240.html 写了一个

一、把接口集成开发包中文件提出来,用的php(utf8)版

把classes文件夹中的文件复制到TP目录下的Library\Think 新建一个Tenpay目录。
二,加入命名空间,方便调用


三、在项目配置文件中加入接口配置参数

//财付通配置参数
    'tenpay_config' => array(
        'partner' => '**********', //这里是你在成功申请财付通接口后获取到的商户号;
        'key' => '*******************', //这里是你在成功申请财付通接口后获取到的密钥
        'return_url' => '********/tenreturnurl',
        'notify_url' => '********/tennotifyurl',
    ),

三、在支付操作的控制器中加入代码如下

public function tenpay($data) {
        $tenpay_config = C('tenpay_config');
        /* 获取提交的订单号 */
        $out_trade_no = $data["orderid"];
        /* 获取提交的商品名称 */
        $product_name = $data["title"];
        /* 获取提交的商品价格 */
        $order_price = $data["money"];
        /* 获取提交的备注信息 */
        $remarkexplain = $data["remark"];
        /* 支付方式 */
        $trade_mode = 1; 
        $strDate = date("Ymd");
        $strTime = date("His");
        /* 商品价格(包含运费),以分为单位 */
        $total_fee = $order_price * 100;
        /* 商品名称 */
        $desc = "商品:" . $product_name . ",备注:" . $remarkexplain;
        /* 创建支付请求对象 */
        $reqHandler = new \Think\Tenpay\RequestHandler();
        $reqHandler->init();
        $reqHandler->setKey(trim($tenpay_config['key']));
        $reqHandler->setGateUrl("https://gw.tenpay.com/gateway/pay.htm");
 //----------------------------------------
 //设置支付参数 
 //----------------------------------------
        $reqHandler->setParameter("partner", trim($tenpay_config['partner']));
        $reqHandler->setParameter("out_trade_no", $out_trade_no);
        $reqHandler->setParameter("total_fee", $total_fee);  //总金额
        $reqHandler->setParameter("return_url", $tenpay_config['return_url']);
        $reqHandler->setParameter("notify_url", $tenpay_config['notify_url']);
        $reqHandler->setParameter("body", $desc);
        $reqHandler->setParameter("bank_type", "DEFAULT");     //银行类型,默认为财付通
 //用户ip
        $reqHandler->setParameter("spbill_create_ip", $_SERVER['REMOTE_ADDR']); //客户端IP
        $reqHandler->setParameter("fee_type", "1");               //币种
        $reqHandler->setParameter("subject", $desc);          //商品名称,(中介交易时必填)
 //系统可选参数
        $reqHandler->setParameter("sign_type", "MD5");       //签名方式,默认为MD5,可选RSA
        $reqHandler->setParameter("service_version", "1.0");    //接口版本号
        $reqHandler->setParameter("input_charset", "utf-8");      //字符集
        $reqHandler->setParameter("sign_key_index", "1");       //密钥序号
 //业务可选参数
        $reqHandler->setParameter("attach", "");                //附件数据,原样返回就可以了
        $reqHandler->setParameter("product_fee", "");           //商品费用
        $reqHandler->setParameter("transport_fee", "0");         //物流费用
        $reqHandler->setParameter("time_start", date("YmdHis"));  //订单生成时间
        $reqHandler->setParameter("time_expire", "");             //订单失效时间
        $reqHandler->setParameter("buyer_id", "");                //买方财付通帐号
        $reqHandler->setParameter("goods_tag", "");               //商品标记
        $reqHandler->setParameter("trade_mode", $trade_mode);              //交易模式(1.即时到帐模式,2.中介担保模式,3.后台选择(卖家进入支付中心列表选择))
        $reqHandler->setParameter("transport_desc", "");              //物流说明
        $reqHandler->setParameter("trans_type", "1");              //交易类型
        $reqHandler->setParameter("agentid", "");                  //平台ID
        $reqHandler->setParameter("agent_type", "");               //代理模式(0.无代理,1.表示卡易售模式,2.表示网店模式)
        $reqHandler->setParameter("seller_id", "");                //卖家的商户号
 //请求的URL
        $reqUrl = $reqHandler->getRequestURL();
 //获取debug信息,建议把请求和debug信息写入日志,方便定位问题
        /**/
        $reqHandler->doSend2($reqUrl);
        $debugInfo = $reqHandler->getDebugInfo();
    }

声明一下,$data是商品的参数,里面必须包含订单号,商品名称,订单描述,商品价格。上述代码中的doSend2函数是一个跳转函数,修改的是ResponseHandler.class.php中的dosend函数。

function doSend2($url) {
        header("Location:" . $url);
        exit;
}

四、支付成功跳转处理

/*
      财付通页面跳转处理方法;
     */
    function tenreturnurl() {
        /* 创建支付应答对象 */
        $tenpay_config = C('tenpay_config');
        $resHandler = new \Think\Tenpay\ResponseHandler();
        $resHandler->setKey(trim($tenpay_config['key']));
 //判断签名
        if ($resHandler->isTenpaySign()) {
            //通知id
            $notify_id = $resHandler->getParameter("notify_id");
            //商户订单号
            $out_trade_no = $resHandler->getParameter("out_trade_no");
            //财付通订单号
            $transaction_id = $resHandler->getParameter("transaction_id");
            //金额,以分为单位
            $total_fee = $resHandler->getParameter("total_fee");
            //如果有使用折扣券,discount有值,total_fee+discount=原请求的total_fee
            $discount = $resHandler->getParameter("discount");
            //支付结果
            $trade_state = $resHandler->getParameter("trade_state");
            //交易模式,1即时到账
            $trade_mode = $resHandler->getParameter("trade_mode");
            //支付完成时间
            $time_end = $resHandler->getParameter("time_end");
            $parameter = array(
                "out_trade_no" => $out_trade_no, //商户订单编号;
                "trade_no" => $transaction_id, //财付通订单号;
                "total_fee" => $total_fee, //交易金额;
                "trade_status" => $trade_state, //交易状态
                "notify_id" => $notify_id, //通知校验ID。
                "notify_time" => $time_end, //通知的发送时间。
            );
            if ("1" == $trade_mode) {
                if ("0" == $trade_state) {
                    $status = CommonController::checkorderstatus($out_trade_no);
                    if (!$status) {
                        CommonController::orderhandle($parameter);
                        //进行订单处理,并传送从支付宝返回的参数;
                    }
                    $this->success("支付成功", U('Home/Order/Payscuess', array('id' => $out_trade_no)));
                } else {
                    //当做不成功处理
                    $this->error("支付失败");
                }
            }
        } else {
            $this->error("认证签名失败," . $resHandler->getDebugInfo());
        }
    }
    /*
      财付通异步通知处理方法;
     */
    function tennotifyurl() {
        $tenpay_config = C('tenpay_config');
        /* 创建支付应答对象 */
        $resHandler = new \Think\Tenpay\ResponseHandler();
        $resHandler->setKey(trim($tenpay_config['key']));
        //判断签名
        if ($resHandler->isTenpaySign()) {
            //通知id
            $notify_id = $resHandler->getParameter("notify_id");
            //通过通知ID查询,确保通知来至财付通
            //创建查询请求
            $queryReq = new \Think\Tenpay\RequestHandler();
            $queryReq->init();
            $queryReq->setKey(trim($tenpay_config['key']));
            $queryReq->setGateUrl("https://gw.tenpay.com/gateway/simpleverifynotifyid.xml");
            $queryReq->setParameter("partner", trim($tenpay_config['partner']));
            $queryReq->setParameter("notify_id", $notify_id);
            //通信对象
            $httpClient = new \Think\Tenpay\client\TenpayHttpClient();
            $httpClient->setTimeOut(5);
            //设置请求内容
            $httpClient->setReqContent($queryReq->getRequestURL());
            //后台调用
            if ($httpClient->call()) {
                //设置结果参数
                $queryRes = new \Think\Tenpay\client\ClientResponseHandler();
                $queryRes->setContent($httpClient->getResContent());
                $queryRes->setKey(trim($tenpay_config['key']));
                if ($resHandler->getParameter("trade_mode") == "1") {
                    //判断签名及结果(即时到帐)
                    //只有签名正确,retcode为0,trade_state为0才是支付成功
                    if ($queryRes->isTenpaySign() && $queryRes->getParameter("retcode") == "0" && $resHandler->getParameter("trade_state") == "0") {
                        //通知id
                        $notify_id = $resHandler->getParameter("notify_id");
                        //商户订单号
                        $out_trade_no = $resHandler->getParameter("out_trade_no");
                        //财付通订单号
                        $transaction_id = $resHandler->getParameter("transaction_id");
                        //金额,以分为单位
                        $total_fee = $resHandler->getParameter("total_fee");
                        //如果有使用折扣券,discount有值,total_fee+discount=原请求的total_fee
                        $discount = $resHandler->getParameter("discount");
                        //支付结果
                        $trade_state = $resHandler->getParameter("trade_state");
                        //交易模式,1即时到账
                        $trade_mode = $resHandler->getParameter("trade_mode");
                        //支付完成时间
                        $time_end = $resHandler->getParameter("time_end");
                        $parameter = array(
                            "out_trade_no" => $out_trade_no, //商户订单编号;
                            "trade_no" => $transaction_id, //财付通订单号;
                            "total_fee" => $total_fee, //交易金额;
                            "trade_status" => $trade_state, //交易状态
                            "notify_id" => $notify_id, //通知校验ID。
                            "notify_time" => $time_end, //通知的发送时间。
                        );
                        $status = CommonController::checkorderstatus($out_trade_no);
                        if (!$status) {
                            CommonController::orderhandle($parameter);
                            //进行订单处理,并传送从支付宝返回的参数;
                        }
                        echo "success";
                    } else {
                        echo "fail";
                    }
                }
            } else {
                //通信失败
                echo "fail";
                //后台调用通信失败,写日志,方便定位问题
                echo "<br>call err:" . $httpClient->getResponseCode() . "," . $httpClient->getErrInfo() . "<br>";
            }
        } else {
            echo "<br/>" . "认证签名失败" . "<br/>";
            echo $resHandler->getDebugInfo() . "<br>";
        }
    }

其中的checkorderstatus和orderhandle用的是上述支付宝即时交易案例中的订单处理函数

//处理订单函数
    //更新订单状态,写入订单支付后返回的数据
    function orderhandle($parameter) {
        $ordid = $parameter['out_trade_no'];
        $data['trade_no'] = $parameter['trade_no'];
        $data['trade_status'] = $parameter['trade_status'];
        $data['notify_id'] = $parameter['notify_id'];
        $data['notify_time'] = $parameter['notify_time'];
        $data['buyer_email'] = $parameter['buyer_email'];
        $data['paystatus'] = 1;
        $Ord = M('order');
        $Ord->where('orderid=' . $ordid)->save($data);
    }
    //在线交易订单支付处理函数
    //函数功能:根据支付接口传回的数据判断该订单是否已经支付成功;
    //返回值:如果订单已经成功支付,返回true,否则返回false;
    function checkorderstatus($ordid) {
        $Ord = M('order');
        $ordstatus = $Ord->where('orderid=' . $ordid)->getField('paystatus');
        if ($ordstatus == 1) {
            return true;
        } else {
            return false;
        }
    }

其他请参看 http://www.thinkphp.cn/code/240.html 中的案例,支付接口的方法大致都是一样的,下面提供财付通集成开发包

附件 php(utf8).zip ( 60.83 KB 下载:280 次 )

本文转载自:http://www.thinkphp.cn/code/665.html

mickelfeng

mickelfeng

粉丝 237
博文 2802
码字总数 605868
作品 0
成都
高级程序员
私信 提问
Magento微信跨境支付模块V2.1发布

关于微信跨境支付(WeChat Cross-border Payment) 微信跨境支付的核心功能是实现“人民币收款,向境外商家结算外币”。微信支付已支持:英镑、港币、美元、日元、加拿大元、澳大利亚元、欧元、...

Alipaymate
2015/11/21
548
1
财付通开放平台开发资源下载

Java SDK下载 当前版本 发布日期 下载链接 文件大小 1.0.0 2010-6-30 openapi-JAVA-SDK-1.0.0.zip 129k sdk-javadoc.zip 128k 样例代码下载 当前版本 发布日期 下载链接 文件大小 1.0.0 2010...

红薯
2010/07/14
4.4K
7
iOS集成微信支付--Swift

微信支付在微信红包的推动发展势头越来越猛,甚至有超过支付宝的趋势,那么在App集成微信支付也是比不可少了。我最近在一个项目中集成微信支付遇到了不少问题,Google了不少资料才搞定,不得...

上官尘
2016/02/26
978
0
网友爆料:财付通因违规”二清“被央行责令整改

雷锋网(公众号:雷锋网)AI金融评论5月16日消息 据蓝鲸财经报道,一位微博网友爆料,近日财付通违规为“二次清算”机构京东商城提供支付服务,而遭至人民银行深圳中心支行责令整改。 图片Via...

AI金融评论
2018/05/16
0
0
腾讯财付通 (Tenpay) 开放平台正式发布

腾讯财付通开放平台正式发布 (财付通开放平台于2010年7月14日对外开放:http://open.tenpay.com ) 路透北京7月14日电---腾讯控股公司旗下第三方支付平台--财付通将允许独立软件开发商向上亿...

红薯
2010/07/14
3K
2

没有更多内容

加载失败,请刷新页面

加载更多

java通过ServerSocket与Socket实现通信

首先说一下ServerSocket与Socket. 1.ServerSocket ServerSocket是用来监听客户端Socket连接的类,如果没有连接会一直处于等待状态. ServetSocket有三个构造方法: (1) ServerSocket(int port);...

Blueeeeeee
今天
6
0
用 Sphinx 搭建博客时,如何自定义插件?

之前有不少同学看过我的个人博客(http://python-online.cn),也根据我写的教程完成了自己个人站点的搭建。 点此:使用 Python 30分钟 教你快速搭建一个博客 为防有的同学不清楚 Sphinx ,这...

王炳明
昨天
5
0
黑客之道-40本书籍助你快速入门黑客技术免费下载

场景 黑客是一个中文词语,皆源自英文hacker,随着灰鸽子的出现,灰鸽子成为了很多假借黑客名义控制他人电脑的黑客技术,于是出现了“骇客”与"黑客"分家。2012年电影频道节目中心出品的电影...

badaoliumang
昨天
16
0
很遗憾,没有一篇文章能讲清楚线程的生命周期!

(手机横屏看源码更方便) 注:java源码分析部分如无特殊说明均基于 java8 版本。 简介 大家都知道线程是有生命周期,但是彤哥可以认真负责地告诉你网上几乎没有一篇文章讲得是完全正确的。 ...

彤哥读源码
昨天
18
0
jquery--DOM操作基础

本文转载于:专业的前端网站➭jquery--DOM操作基础 元素的访问 元素属性操作 获取:attr(name);$("#my").attr("src"); 设置:attr(name,value);$("#myImg").attr("src","images/1.jpg"); ......

前端老手
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部