Laravel支付如何使用银联进行支付(Omnipay-UnionPay)
发布时间:2017-05-04 编辑:小张个人博客 查看次数:20210
想必大家已经了解了OmniPay这个牛逼的GitHub项目,也对如何使用OmniPay for Laravel 5 & Lumen这个Laravel包有了大致的了解。没错,接下来要讲的银联支付还是使用这个Laravel包,并集成OmniPay提供的银联支付(UnionPay)接口——UmniPay UnionPay。
安装银联支付依赖包:
composer require lokielse/omnipay-unionpay dev-master
获取银联支付配置信息(https://open.unionpay.com/ajweb/account/testPara)
到银联支付开发者中心注册账户并提交商户资料进行审核,等待审核通过后获取相关证书ID等信息用于填写银联支付配置选项。
如果你是测试的话银联支付提供了相应的测试接口和配置数据:
测试商户号: 777290058144739
测试证书:
[签名与验签、加密证书(仅供测试使用)]
商户私钥证书(签名使用,密码:000000) 银联公钥证书(签名使用)
测试入口地址:
前台交易请求地址:
https://gateway.test.95516.com/gateway/api/frontTransReq.do
APP交易请求地址:
https://gateway.test.95516.com/gateway/api/appTransReq.do
后台交易请求地址(无卡交易配置该地址):
https://gateway.test.95516.com/gateway/api/backTransReq.do
后台交易请求地址(若为有卡交易配置该地址):
https://gateway.test.95516.com/gateway/api/cardTransReq.do
单笔查询请求地址:
https://gateway.test.95516.com/gateway/api/queryTrans.do
批量交易请求地址:
https://gateway.test.95516.com/gateway/api/batchTrans.do
文件传输类交易地址:
https://filedownload.test.95516.com/
缴费产品前台交易请求地址:
https://gateway.test.95516.com/jiaofei/api/frontTransReq.do
缴费产品手机APP交易请求地址:
https://gateway.test.95516.com/jiaofei/api/appTransReq.do
缴费产品后台交易请求地址(无卡交易配置该地址):
https://gateway.test.95516.com/jiaofei/api/backTransReq.do
缴费产品笔查询请求地址:
https://gateway.test.95516.com/jiaofei/api/queryTrans.do
测试卡号信息:[测试环境发卡仿真配置的支付账号(仅供测试使用)]
OmniPay UnionPay提供了以下支付网关接口:
Union_Express (Union Express Checkout) 银联全产品网关(PC,APP,WAP支付) Union_LegacyMobile (Union Legacy Mobile Checkout) 银联老网关(APP) Union_LegacyQuickPay (Union Legacy QuickPay Checkout) 银联老网关(PC)
银联支付路由设置:
//银联支付发起请求 Route::get('UnionPay','Home\[email protected]'); //页面跳转同步通知页面路径 Route::any('UnionPayReturn','Home\[email protected]');
此外,由于该回调请求来自第三方API,无法通过CSRF验证,所以需要在CSRF验证中排除该URL,否则会抛出TokenMismatchException异常,这里我们要排除的URL是(app/Htpp/Middleware/VerifyCsrfToken.php):
protected $except = [ // 'UnionPayReturn' ];
银联支付配置文件:
function UnionPayConfig(){ $gateway = Omnipay::create('UnionPay_Express'); //银联全产品网关(PC,APP,WAP支付) $gateway->setMerId('777290058144739'); //商户号 $gateway->setCertPath(APP_PATH().'/Tool/UnionPay/700000000000001_acp.pfx'); // 商户私钥证书 $gateway->setCertDir(APP_PATH().'/Tool/UnionPay'); //测试环境银联公钥证书 $gateway->setCertPassword('000000'); // 密码 $gateway->setReturnUrl('http://web.wan.com/UnionPayReturn'); // 支付后同步通知页面地址 return $gateway; }
新建控制器UnionPayController,提供生成订单必需的数据,如果订单号,订单金额订单标题等,创建订单,并跳转到银联支付。
// 发起银联支付 public function UnionPay(){ $order = [ 'orderId' => date('YmdHis') . mt_rand(1000,9999), // 订单号 'txnTime' => date('YmdHis'), 'orderDesc' => 'UnionPay Test', //订单名称 'txnAmt' => ('1.5'* 100), //订单价格,单位是:"分" 1x100 ]; $gateway = $this ->UnionPayConfig(); $response = $gateway->purchase($order)->send(); $response->redirect(); // 发起银联支付请求 }
根据返回数据处理订单
这里是 return url 的内容 ,跟据接受到的参数,验证订单支付状态,根据验证状态确定支付成功,如果支付成功,处理订单(这里是直接显示一个支付成功的字符串),如果支付失败,返回支付失败信息。我这里没有做任何逻辑处理,只是简单的输出了支付成功或者支付失败,如果是在实际项目中使用请根据自己的业务逻辑处理订单数据。
如何判断银联支付交易成功
对异步接口(接口规范的交易流程里有异步通知流程的那些):
1. 收到后台通知验签成功,判断respcode=00。
2. 没有收到通知的情况主动调查询接口查到origrespcode=00。
对同步接口:
1. 同步收到respcode=00即可。
public function UnionPayReturn(){ // 判断交易是否成功 if ($_POST['respCode'] == "00") { //pay success Log::info('支付成功'.$_POST['orderId']); echo "支付成功!".$_POST['orderId']; }else{ //pay fail Log::info('支付失败'.$_POST['orderId']); echo "支付失败".$_POST['orderId']; } }
银联支付测试
在浏览中访问http://www.023xs.cn/UnionPay,页面会跳转到银联支付页面:
我们将测试银行卡号填写到输入框并点击下一步:
将测试卡号对应身份证号码填入输入框,然后点击“免费获取”,最后直接将手机验证码123456填写到验证码输入框,然后点击“确认付款”,页面就会跳转到支付成功页面:
点击“返回商户”,则页面跳转到http://www.023xs.cn/UnionPayReturn。我们这里简单测试了支付和回调接口,更多接口方法使用请参考Omnipay-UnionPay:https://github.com/lokielse/omnipay-unionpay。
Copyright © 小张个人博客 All Rights Reserved 渝ICP备15006773号-1
联系方式:[email protected] | 本站文章仅供学习和参考