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

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

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

这些测试数据写到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里了:

重命名一下文件,在这些文件头部加上命名空间: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接入银联支付相关推荐

  1. thinkphp5.1接入paypal支付

    thinkphp5.1接入paypal支付 php计入paypal,要先到https://developer.paypal.com/developer/dashboard/sandbox 下面以测试环 ...

  2. 1.Java接入银联支付(chinapay)教程及避坑点

    一.背景及效果展示 现如今,诸多的供应链系统需要使用电子钱包功能,所以接入银联B2B无卡支付,是很多系统应用需要做的事情.银联支付的类型分很多种:网关支付(带token请求实现,下次有空再分享).B2 ...

  3. 安卓app接入银联支付

    刚接触了下银联支付,在网上搜还是看官方文档银联支付都不是很清晰,所以自己总结一篇,希望可以帮助大家快速集成. 一.进入下载官网,选择下载手机控件支付demo: https://open.unionpa ...

  4. android app 快速接入银联支付流程(android studio版)

    刚接触了下银联支付,在网上搜还是看官方文档银联支付都不是很清晰,所以自己总结一篇,希望可以帮助大家快速集成. 一.进入下载官网,选择下载手机控件支付demo: https://open.unionpa ...

  5. Android 接入银联支付

    1.打开银联开放平台 https://open.unionpay.com/ 注册账户 2.点击"技术集成"01选择手机控件支付开发包(安卓版) 3.根据 中国银联手机支付控件接入指 ...

  6. 西米支付:支付宝/微信支付/银联支付通道的接入介绍

    本文以电脑网站支付为例,着重对第三方支付通道的接入进行了分析,包括支付宝支付接入.微信支付接入及银联支付接入. 1.支付宝支付接入 支付宝支付能力主要有当面付.刷脸付.App支付.手机网站支付.电脑网 ...

  7. .NET接入UnionPay银联支付(一)手机wap支付

    最近呢,比较忙,公司在接入银联全渠道支付,博主接手的wap支付,发表一下博主在接入的时候遇到的坑和注意事项,方便大家学习接入,爬坑的路上更顺利一点~ 开发步骤 1. 以表单的方式组装要发送给银联全渠道 ...

  8. PHP接入银联在线网关支付

    网站支付:一般接入微信支付.支付宝支付.银联支付,本文介绍的是如何接入中国银联在线网关支付 银联介绍 银联在线支付网关是中国银联联合各商业银行为持卡人提供的集成化.综合性互联网支付工具,主要支持输入卡 ...

  9. uni-app 接入银联H5支付(Java)思路代码

    uni-app 接入银联H5支付(Java)思路代码 uni-app-web-view Java(后台部分代码)可以参考官方的Demo取代码 银联文档地址: H5支付. 第一次接触银联支付的话建议 跑 ...

  10. python 支付宝支付 无效根证书_python实现银联支付和支付宝支付接入

    本文实例为大家分享了python银联支付和支付宝支付接入的具体代码,供大家参考,具体内容如下 前置条件:需要安装Python的OpenSSL模块,我使用的版本是16.1.0,可以使用pip insta ...

最新文章

  1. Linux下三个密码生成工具
  2. 怎么看b树是几阶_看我在B站上怎么学习的
  3. win7下python的安装与配置_Win7下Python与Tensorflow-CPU版开发环境的安装与配置过程...
  4. Libra教程之:move语言的特点和例子
  5. 用原生JS读写CSS样式的方法总结
  6. WORD开发工具的控件功能?
  7. 仿真器如何工作以及如何编写? [关闭]
  8. Android无界面编程之使用Service
  9. OpenCV(三) 图像的读取和显示
  10. PyMining-开源中文文本数据挖掘平台 Ver 0.1发布
  11. html登录注册页面验证代码,登录注册页面验证码问题
  12. 金字塔原理读书笔记 一 为什么使用金字塔结构
  13. 之前安装过Multisim14,再次安装失败的解决方法
  14. 面试官看到一定会打我---软件测试工程师面试套路和暗语灵魂解密
  15. 关于 2021 年度「博客之星」评选刷票行为处罚通知
  16. centos7搭建elastiflow
  17. 手机号归属地运营商查询-JAVA
  18. Zabbix监控系统搭建
  19. 磁盘无损简单卷转主分区
  20. 转:Ubuntu常用命令速查

热门文章

  1. Android Studio中的typo波浪线提示
  2. oracle9i12535错误,11gr2 alert日志中报TNS-12535 TNS-00505原因及解决方法
  3. 微信支付:请求参数与订单信息不一致
  4. BJ54坐标或者XA80坐标到WGS84坐标的转换(小工具附代码)
  5. python实现画樱花树
  6. 计算机应用于设计,计算机工程与设计期刊_计算机工程与设计_计算机工程与应用...
  7. MySQL 5.7都即将停只维护了,是时候学习一波MySQL 8了
  8. 高通平台android9.0充电电量,充电指示灯以及充电图标读取分析
  9. js 时间格式化转换
  10. 拼多多顶级佣金助手-微信群自动发单