thinkphp5.1接入银联支付

2024-02-21 06:48

本文主要是介绍thinkphp5.1接入银联支付,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最近项目中要用到银联支付,所以记录一下开发过程:

1.先去银联申请接口https://open.unionpay.com/tjweb/api/dictionary?apiSvcId=453,我用的是手机网页支付(WAP支付)

2.去个人中心查看产品和测试参数

68/e2d1e7dd3a5cddad3d248872900f12.png

 

15/cbb467bd2e7d6db7877ec2664fe7fc.png

这些测试数据写到config.php里,稍后会用到。

    //银联支付部分配置信息(具体配置查看extend/unionpay/sdk/acp_sdk.ini)'unionpay_config'        => ['merId'              => '',//商户代码'configFile'         => Env::get('root_path') . 'config/acp_sdk.ini',//银联配置],

3.下载银联官方实例:https://open.unionpay.com/tjweb/acproduct/list?apiSvcId=453

4.我的是放到extend里了:

b6/aa7e54f03b0922d76ad291ae52a5bd.jpg

重命名一下文件,在这些文件头部加上命名空间:namespace unionpay\sdk;

5.在application/common.php里面引入

use unionpay\sdk\SDKConfig;use unionpay\sdk\AcpService;

然后就可以写方法调用了:

/*** 银联支付* @param array $data付款参数* @return string*/function unionpay($order){$SDKConfig              = new SDKConfig();$params                 = array(  //以下信息非特殊情况不需要改动'version'           => $SDKConfig->getSDKConfig()->version,                 //版本号'encoding'          => 'utf-8',                //编码方式'txnType'           => '01',                    //交易类型'txnSubType'        => '01',                 //交易子类'bizType'           => '000201',                //业务类型'frontUrl'          => $SDKConfig->getSDKConfig()->frontUrl,  //前台通知地址'backUrl'           => $SDKConfig->getSDKConfig()->backUrl,     //后台通知地址'signMethod'        => $SDKConfig->getSDKConfig()->signMethod,               //签名方法'channelType'       => '08',                //渠道类型,07-PC,08-手机'accessType'        => '0',                  //接入类型'currencyCode'      => '156',              //交易币种,境内商户固定156//TODO 以下信息需要填写'merId'             => $order['merId'],     //商户代码,请改自己的测试商户号,此处默认取demo演示页面传递的参数'orderId'           => $order["orderId"], //商户订单号,8-32位数字字母,不能含“-”或“_”,此处默认取demo演示页面传递的参数,可以自行定制规则'txnTime'           => date("YmdHis",$order["txnTime"]), //订单发送时间,格式为YYYYMMDDhhmmss,取北京时间,此处默认取demo演示页面传递的参数'txnAmt'            => $order["txnAmt"],   //交易金额,单位分,此处默认取demo演示页面传递的参数// 订单超时时间。// 超过此时间后,除网银交易外,其他交易银联系统会拒绝受理,提示超时。 跳转银行网银交易如果超时后交易成功,会自动退款,大约5个工作日金额返还到持卡人账户。// 此时间建议取支付时的北京时间加15分钟。// 超过超时时间调查询接口应答origRespCode不是A6或者00的就可以判断为失败。'payTimeout'        => date('YmdHis', strtotime('+15 minutes')), 'riskRateInfo'      => $order["riskRateInfo"],// 请求方保留域,// 透传字段,查询、通知、对账文件中均会原样出现,如有需要请启用并修改自己希望透传的数据。// 出现部分特殊字符时可能影响解析,请按下面建议的方式填写:// 1. 如果能确定内容不会出现&={}[]"'等符号时,可以直接填写数据,建议的方法如下。//    'reqReserved' =>'透传信息1|透传信息2|透传信息3',// 2. 内容可能出现&={}[]"'符号时:// 1) 如果需要对账文件里能显示,可将字符替换成全角&={}【】“‘字符(自己写代码,此处不演示);// 2) 如果对账文件没有显示要求,可做一下base64(如下)。//    注意控制数据长度,实际传输的数据长度不能超过1024位。//    查询、通知等接口解析时使用base64_decode解base64后再对数据做后续解析。//    'reqReserved' => base64_encode('任意格式的信息都可以'),//TODO 其他特殊用法请查看 special_use_purchase.php);$AcpService             = new AcpService();$AcpService->sign($params);$uri                    = $SDKConfig->getSDKConfig()->frontTransUrl;$html_form              = $AcpService->createAutoFormHtml($params, $uri);echo $html_form;}/*** 银联支付验证签名* @param array $data付款参数* @return bool */function checkUnionpaySign($data){$AcpService             = new AcpService();return  $AcpService->validate($data);}/*** 银联支付查询订单* @param array $data付款参数* @return bool*/function checkUnionpayOrder($data){$SDKConfig              = new SDKConfig();$params                 = array(//以下信息非特殊情况不需要改动'version'           => $SDKConfig->getSDKConfig()->version,         //版本号'encoding'          => 'utf-8',        //编码方式'signMethod'        => $SDKConfig->getSDKConfig()->signMethod,       //签名方法'txnType'           => '00',            //交易类型'txnSubType'        => '00',         //交易子类'bizType'           => '000000',        //业务类型'accessType'        => '0',          //接入类型'channelType'       => '07',        //渠道类型//TODO 以下信息需要填写'orderId'           => $data["orderId"], //请修改被查询的交易的订单号,8-32位数字字母,不能含“-”或“_”,此处默认取demo演示页面传递的参数'merId'             => $data["merId"], //商户代码,请改自己的测试商户号,此处默认取demo演示页面传递的参数'txnTime'           => date("YmdHis",$data["txnTime"]), //请修改被查询的交易的订单发送时间,格式为YYYYMMDDhhmmss,此处默认取demo演示页面传递的参数);$AcpService             = new AcpService();$AcpService->sign($params);// 签名$url                    = $SDKConfig->getSDKConfig()->singleQueryUrl;$result_arr             = $AcpService->post($params, $url);//没收到200应答的情况if(count($result_arr) <= 0) { return ['status'=>0,'msg'=>'无应答'];}//应答报文验签失败if (!$AcpService->validate ($result_arr) ){return ['status'=>2,'msg'=>'应答报文验签失败'];}if ($result_arr["respCode"] == "00"){if ($result_arr["origRespCode"] == "00"){//交易成功//TODOreturn ['status'=>1,'msg'=>'交易成功'];} else if ($result_arr["origRespCode"] == "03"|| $result_arr["origRespCode"] == "04"|| $result_arr["origRespCode"] == "05"){//后续需发起交易状态查询交易确定交易状态//TODOreturn ['status'=>3,'msg'=>'后续需发起交易状态查询交易确定交易状态'];} else {//其他应答码做以失败处理//TODOreturn ['status'=>4,'msg'=>'交易失败:'. $result_arr["origRespMsg"]];}} else if ($result_arr["respCode"] == "03"|| $result_arr["respCode"] == "04"|| $result_arr["respCode"] == "05" ){//后续需发起交易状态查询交易确定交易状态//TODOreturn ['status'=>5,'msg'=>'处理超时,请稍微查询。'];} else {//其他应答码做以失败处理//TODOreturn ['status'=>6,'msg'=>'失败:'. $result_arr["respMsg"]];}}6.然后在需要的地方就可以直接调用了:/*** 调用银联支付* @param int $id 订单ID* @return html 跳转到银联支付页面或调起云闪付app*/public function pay(){$id = input('id');$row = Db::name('order')->where('id',$id)->find();$uniopayData = [];$uniopayData['merId'] = config('app.unionpay_config.merId');$uniopayData['orderId'] = $row['order_id'];$uniopayData['txnAmt'] = $row['money'];$uniopayData['txnTime'] = time();$uniopayData['riskRateInfo'] = '{commodityName=test}';$tempRow = Db::name('unionpay')->where(['orderId'=>$row['order_id']])->find();if(!$tempRow){$id = Db::name('unionpay')->insertGetId($uniopayData);if($id){unionpay($uniopayData);}else{exit('请求失败,请联系客服');}}else{unionpay($uniopayData);}}/*** 银联支付异步回调*/public function unionpayNotify(){$notifyData = $_POST;logStr("支付回调POST返回值:".json_encode($notifyData));//判断订单是否存在if(isset($notifyData['orderId'])){$notifyRow = Db::name('unionpay_notify')->where(['orderId'=>$notifyData['orderId']])->find();if(!$notifyRow){$notifyData['time'] = time();Db::name('unionpay_notify')->insertGetId($notifyData);//验证签名if (isset($_POST['signature'])){$signCheck = checkUnionpaySign($_POST);logStr("支付回调POST验证签名:".$signCheck);//验证签名成功的话,查询一下订单,查询成功更新数据状态if($signCheck){$orderId = $_POST ['orderId']; //其他字段也可用类似方式获取$respCode = $_POST ['respCode'];logStr("支付回调POST状态码:".$respCode.($respCode == "00"));//状态代码if($respCode == "00"){$unionpayRow = Db::name('unionpay')->where('orderId',$orderId)->find();//数据存在且状态为未支付if(!empty($unionpayRow) && $unionpayRow['status'] == 0){//查询订单信息$res = checkUnionpayOrder($unionpayRow);logStr("支付回调POST查询订单:".json_encode($res));if($res['status'] == 1){//更新支付状态Db::name('unionpay')->where('orderId',$orderId)->update(['status'=>1]);}}}}}}else{if($notifyData['respCode'] != $notifyData['respCode']){$notifyData['time'] = time();Db::name('unionpay_notify')->where(['orderId'=>$notifyData['orderId']])->update($notifyData);}}}}

 

这篇关于thinkphp5.1接入银联支付的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/730891

相关文章

Java应用对接pinpoint监控工具的时候,应用名称长度超出限制而导致接入失败

一、背景 java应用需要接入pinpoint,同一个虚拟机上的其他应用接入成功,唯独本应用不行。 首先排除是pinpoint agent的问题,因为其他应用都正常。 然后,我就对比二者的启动脚本。 -javaagent:/opt/pinpoint/pinpoint-bootstrap.jar -Dpinpoint.agentId=DA301004_17 -Dpinpoint.applic

jsapi 支付缺少appid ¬ify_url

$.ajax({url: 'url',type: 'get',dataType: "json",//改成jsonsuccess: function (data) {//$('#xx').val(data)WeixinJSBridge.invoke('getBrandWCPayRequest', $.parseJSON(data),function(res){if(res.err_msg == "

“设计模式双剑合璧:工厂模式与策略模式在支付系统中的完美结合”

工厂模式(Factory Pattern)和策略模式(Strategy Pattern)都是常见的设计模式,但它们解决的问题和应用场景不同。下面是它们的区别: 1. 目的不同: 工厂模式(Factory Pattern): 工厂模式的主要目的是创建对象。它通过定义一个创建对象的接口,让子类决定实例化哪一个具体类,从而将对象创建的逻辑与使用的代码分离。 工厂模式可以分为简单工厂、工厂方法和抽象

一步步教你接入个推 推送

一: manifast中的配置 权限: <!-- 个推SDK权限配置开始 --> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permissi

一步步教你如何为你的app接入支付宝

官方接口文档步骤链接: https://doc.open.alipay.com/doc2/detail?treeId=59&articleId=103563&docType=1 1首先,你的要有一个企业的账户,并且已经和支付宝平台签约了, (具体操作查看https://doc.open.alipay.com/doc2/detail.htm?treeId=58&articleId=1035

兼容Trino Connector,扩展Apache Doris数据源接入能力|Lakehouse 使用手册(四)

Apache Doris 内置支持包括 Hive、Iceberg、Hudi、Paimon、LakeSoul、JDBC 在内的多种 Catalog,并为其提供原生高性能且稳定的访问能力,以满足与数据湖的集成需求。而随着 Apache Doris 用户的增加,新的数据源连接需求也随之增加。因此,从 3.0 版本开始,Apache Doris 引入了 Trino Connector 兼容框架。 Tri

社群空间站付费入群系统易支付版全套搭建教程

社群空间站9.9付费入群系统易支付版全套搭建教程 1.创建站点 2.搭建环境 php7.2 3.上传源码包 数据库批量修改sq9.dongge1.icu s10.dongge1.icu 改为你的域名 4.上传数据库 修改数据库文件/data/config/ 5.访问域名 6.账户密码 admin 123456 7.易支付修改地址是在/data/tpl/app/default/yy_

强化网络安全:通过802.1X协议保障远程接入设备安全认证

随着远程办公和移动设备的普及,企业网络面临着前所未有的安全挑战。为了确保网络的安全性,同时提供无缝的用户体验,我们的 ASP 身份认证平台引入了先进的 802.1X 认证协议,确保只有经过认证的设备才能接入您的网络。本文档将详细介绍我们的平台如何通过 802.1X 协议实现高效、安全的远程接入认证。 产品亮点 1. 无缝集成 我们的 ASP 身份认证平台支持无缝集成到现有的网络基础设施中

店匠科技携手Stripe共谋电商支付新篇章

在全球电商行业蓬勃发展的背景下,支付环节作为交易闭环的核心,其重要性日益凸显。随着消费者对支付体验要求的不断提高,以及跨境电商的迅猛发展,支付市场正经历着前所未有的变革与挑战。在这一充满机遇与竞争的领域,店匠科技(Shoplazza)凭借其创新的嵌入式支付解决方案—— Shoplazza Payments,成功在市场中占据了一席之地。 近日,在新加坡举办的 Stripe Tour 新加坡站 20

浪子易支付8.29版本PHP网站源码

源码下载 浪子易支付8.29版本PHP网站源码 更新记录 2024/08/29: 1.付款记录管理支持批量操作 2.优化数据清理功能 3.修复了一些已知问题 2024/07/21: 1.更新全新的V2版API接口,使用RSA公私钥验证 2.支持通过接口发起代付转账、退款、查询等 3.支持通过接口发起付款码支付、JSAPI支付、APP支付 4.订单退款支持多次部分金额退款 5.针对插件开