PHP 集成银联支付

2019-12-17 21:57:16 浏览数 (1)

现如今支付系统几乎成了许多网站必不可少的东西,那么常见的几种支付方式:支付宝微信;关于 支付宝微信 的实现方式在 世界上最好用的 Alipay 和 WeChat 的支付 SDK 这篇文章有介绍,这里就不多解释了。 今天就着重介绍下银联支付 的具体实现方式。

关于银联支付我发现一个很好用的 SDK omnipay-unionpay . 下面步入正题:

安装 omnipay-unionpay

composer.json 文件中添加如下代码

代码语言:javascript复制
{
    "require": {
        "lokielse/omnipay-unionpay": "^0.4"
    }
}

使用 composer update 进行更新依赖

代码语言:javascript复制
composer update

或者直接采用如下命令安装

代码语言:javascript复制
composer require lokielse/omnipay-unionpay dev-master

获取银联支付配置信息 到 银联支付开发者中心 获取配置信息,我们测试的话使用测试接口就好

点击 私钥和公钥进行下载

获取 PrivateKey, PublicKey, Cert ID

1.获取 PrivateKey

代码语言:javascript复制
openssl pkcs12 -in 700000000000001_acp.pfx  -nocerts -nodes | openssl rsa -out private_key.pem
file 2.Public key 就是 verify_sign_acp.cer

3.获取 Cert ID

代码语言:javascript复制
openssl pkcs12 -in 700000000000001_acp.pfx -clcerts -nokeys | openssl x509 -serial -noout

1_1542987039_6MHoKfeRk4.png

4.将第三步获取到的值使用如下网址进行进制转换

代码语言:javascript复制
https://lokielse.github.io/hex2dec

1_1542987233_uQM557RM99.png

支付

代码语言:javascript复制
use OmnipayOmnipay;

public function actionIndex()
{
    $gateway    = Omnipay::create('UnionPay_Express');
    $gateway->setMerId(Yii::$app->params['merId']);
    $gateway->setCertId(Yii::$app->params['certId']);
    $gateway->setPrivateKey(Yii::getAlias('@backend').'/web/pem/private_key.pem'); // path or content
    $gateway->setReturnUrl('https://laravelcode.cn/return');
    $gateway->setNotifyUrl('https://laravelcode.cn/notify');

    $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();
   return $response->getRedirectHtml();

   //For APP
    $response = $gateway->createOrder($order)->send();
   return $response->getTradeNo();
}

注意上方设置私钥我这里采用YII框架进行配置,如不是 YII 框架,请使用根目录全路径进行配置,如:/etc/

只要你的配置正确那么以上就可以调起银联支付了。

回调

代码语言:javascript复制
public function actionNotify()
{
    $gateway    = Omnipay::create('UnionPay_Express');
    $gateway->setMerId(Yii::$app->params['merId']);
    $gateway->setPublicKey(Yii::getAlias('@backend').'/web/pem/publicKey'); // path or content

    $response = $gateway->completePurchase(['request_params'=>$_REQUEST])->send();

    if ($response->isPaid()) {
        //pay success
    }else{
        //pay fail
    }
}

更多使用方法请看 官方文档

0 人点赞