博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ThinkPHP3.2中集成财付通支付
阅读量:7117 次
发布时间:2019-06-28

本文共 10684 字,大约阅读时间需要 35 分钟。

hot3.png

ThinkPHP3.2中集成财付通支付
在项目过程中用到了支付宝和财付通的支付接口问题,发现在TP还未有人写财付通的实例,我仿照前辈们写的一个案例
写了一个
一、把接口集成开发包中文件提出来,用的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 "
call err:" . $httpClient->getResponseCode() . "," . $httpClient->getErrInfo() . "
"; } } else { echo "
" . "认证签名失败" . "
"; echo $resHandler->getDebugInfo() . "
"; } }

其中的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;        }    }

其他请参看
中的案例,支付接口的方法大致都是一样的,下面提供财付通集成开发包

附件  ( 60.83 KB 下载:280 次 )

转载于:https://my.oschina.net/mickelfeng/blog/532451

你可能感兴趣的文章
c++ 读取所有图片
查看>>
[设计模式之禅读书笔记]011_23种设计模式五:建造者模式
查看>>
另立山头
查看>>
leetcode 51 N皇后问题
查看>>
struct内存对齐:gcc与VC的差别
查看>>
2015年度总结--javaWeb
查看>>
Secret的三种形式
查看>>
Oracle创建存储过程
查看>>
UVAlive 6763 Modified LCS
查看>>
优秀网站和博客导航
查看>>
Python 编程要求
查看>>
软件测试行业了解
查看>>
Http请求处理流程
查看>>
[extjs(1)]MyEclipse2014安装ext4插件Spket
查看>>
窗口提交自身打开新窗体问题
查看>>
解析Java对象的equals()和hashCode()的使用 转载http://blog.csdn.net/terry84fun/article/details/4752042...
查看>>
centos内核引导参数
查看>>
人机交互的第二次超级无敌贼厉害的最终版王思祺的作业
查看>>
c++——类 继承
查看>>
恐怖谷 Uncanny Valley
查看>>