Laravel支付如何使用银联进行支付(Omnipay-UnionPay)

发布时间:2017-05-04 编辑:小张个人博客 查看次数:16258

想必大家已经了解了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银联支付测试卡号

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,页面会跳转到银联支付页面:

银联支付测试

我们将测试银行卡号填写到输入框并点击下一步:

Omnipay-UnionPay

 将测试卡号对应身份证号码填入输入框,然后点击“免费获取”,最后直接将手机验证码123456填写到验证码输入框,然后点击“确认付款”,页面就会跳转到支付成功页面:

银联支付测试

点击“返回商户”,则页面跳转到http://www.023xs.cn/UnionPayReturn。我们这里简单测试了支付和回调接口,更多接口方法使用请参考Omnipay-UnionPay:https://github.com/lokielse/omnipay-unionpay。

出处:小张个人博客

网址:http://blog.023xs.cn/

您的支持是对博主最大的鼓励,感谢您的认真阅读。欢迎转载,但请保留该声明。

顶部

Copyright © 小张个人博客 All Rights Reserved 渝ICP备15006773号-1

联系方式:[email protected] | 本站文章仅供学习和参考

渝公网安备 50024102500267号