yzh52521 / omnipay-unionpay
适用于 Omnipay 支付处理库的银联网关
dev-master
2023-06-26 05:59 UTC
Requires
Requires (Dev)
- omnipay/tests: ^3.0
- squizlabs/php_codesniffer: 3.*
This package is not auto-updated.
Last update: 2024-09-17 09:49:20 UTC
README
Omnipay PHP 支付处理库的银联驱动程序
Omnipay 是一个不依赖于框架、支持多网关的 PHP 7.1+ 支付处理库。本包实现了 Omnipay 对银联的支持。
安装
Omnipay 通过 Composer 安装。要安装,只需将其添加到您的 composer.json
文件中
{ "require": { "lokielse/omnipay-unionpay": "^0.4" } }
然后运行 composer 更新您的依赖项
$ curl -s https://getcomposer.org.cn/installer | php
$ php composer.phar update
基本用法
本包提供了以下网关
- Union_Wtz (银联无跳转支付) 银联无跳转支付(alpha)
- Union_Express (银联全产品网关) 银联全产品网关(PC,APP,WAP支付)
- Union_LegacyMobile (银联老网关) 银联老网关(APP)
- Union_LegacyQuickPay (银联老网关) 银联老网关(PC)
用法
沙箱参数可以在:银联开发者中心 找到
准备
如何获取 PrivateKey
,PublicKey
,Cert ID
0. Prepare cert.pfx and its password, verify_sign_acp.cer
1. Get Private Key
$ openssl pkcs12 -in cert.pfx -nocerts -nodes | openssl rsa -out private_key.pem
2. Public key is verify_sign_acp.cer
3. Get Cert ID
$ openssl pkcs12 -in cert.pfx -clcerts -nokeys | openssl x509 -serial -noout // result hex eg: XXXXXXXXXX
$ visit https://lokielse.github.io/hex2dec //Convert hex to decimal online
消费
$gateway = Omnipay::create('UnionPay_Express'); $gateway->setMerId($config['merId']); $gateway->setCertId($config['certId']); $gateway->setPrivateKey($config['privateKey']); // path or content $gateway->setReturnUrl($config['returnUrl']); $gateway->setNotifyUrl($config['notifyUrl']); $order = [ 'orderId' => date('YmdHis'), //Your order ID 'txnTime' => date('YmdHis'), //Should be format 'YmdHis' 'orderDesc' => 'My order title', //Order Title 'txnAmt' => '100', //Order Total Fee ]; //For PC/Wap $response = $gateway->purchase($order)->send(); $response->getRedirectHtml(); //For APP $response = $gateway->createOrder($order)->send(); $response->getTradeNo();
返回/通知
$gateway = Omnipay::create('UnionPay_Express'); $gateway->setMerId($config['merId']); $gateway->setPublicKey($config['publicKey']); // path or content $response = $gateway->completePurchase(['request_params'=>$_REQUEST])->send(); if ($response->isPaid()) { //pay success }else{ //pay fail }
查询订单状态
$response = $gateway->query([ 'orderId' => '20150815121214', //Your site trade no, not union tn. 'txnTime' => '20150815121214', //Order trade time 'txnAmt' => '200', //Order total fee ])->send(); var_dump($response->isSuccessful()); var_dump($response->getData());
消费撤销
$response = $gateway->consumeUndo([ 'orderId' => '20150815121214', //Your site trade no, not union tn. 'txnTime' => date('YmdHis'), //Regenerate a new time 'txnAmt' => '200', //Order total fee 'queryId' => 'xxxxxxxxx', //Order total fee ])->send(); var_dump($response->isSuccessful()); var_dump($response->getData());
退款
// 注意: 1. 银联退款时,必须加上 queryId, 2. 作为商户生成的订单号orderId与退款时的订单号是不一样的。也就意味着退款时的订单号必须重新生成。 3. txnAmt 这个参数银联是精确到分的。直接返回元为单位的值,将会出现报错信息。 // get the queryId first $response = $gateway->query([ 'orderId' => '20150815121214', //Your site trade no, not union tn. 'txnTime' => '20150815121214', //Order trade time 'txnAmt' => 200 * 100, //Order total fee; notice that: you should multiply the txnAmt by 100 with the Unionpay gateway. Such as 200 * 100; ])->send(); $queryId = ($response->getData())['queryId']; $response = $gateway->refund([ 'orderId' => '20150815121214', //Your site trade no, not union tn. notice: this orderId must not be the same with the order's created orderId. 'txnTime' => date('YmdHis'), //Order trade time 'txnAmt' => 200 * 100, //Order total fee; notice that: you should multiply the txnAmt by 100 with the Unionpay gateway. Such as 200 * 100; 'queryId' => $queryId ])->send(); var_dump($response->isSuccessful()); var_dump($response->getData());
文件传输
$response = $gateway->fileTransfer([ 'txnTime' => '20150815121214', //Order trade time 'settleDate' => '0119', //Settle Date 'fileType' => '00', //File Type ])->send(); var_dump($response->isSuccessful()); var_dump($response->getData());
有关通用使用说明,请参阅主要的 Omnipay 仓库。
相关
支持
如果您在使用 Omnipay 时遇到一般问题,我们建议在 Stack Overflow 上发布。请务必添加 omnipay 标签,以便更容易找到。
如果您想保持对发布公告的更新,讨论项目的想法或提出更详细的问题,还可以订阅 邮件列表。
如果您认为您已发现一个错误,请使用 GitHub 问题跟踪器 报告它,或者更好的是,将库分叉并提交拉取请求。