最近公司的小程序需要使用到支付功能,我们使用的是银联商务的支付,那么如何在微信小程序中对接银联商务的微信小程序支付呢?这里我记录下我在微信小程序中实现银联商务的微信小程序支付流程
一:接口部分:
这里注意银联商务的小程序支付目前不支持测试号支付,只有使用正式的参数实现小程序支付
1:银联商务的小程序支付接口地址:
https://qr.chinaums.com/netpay-route-server/api/
2:主要参数说明:
(1):msgSrc
消息来源:如:WWW.TEST.COM
(2):msgType
消息类型:微信小程序支付参数固定为:wx.unifiedOrder
(3):mid
商户号
(4):tid
终端号
(5):requestTimestamp
报文请求时间,格式yyyy-MM-dd HH:mm:ss
(6):merOrderId
订单号,这里注意传递给银联商务的订单号的前缀必须是来源编号,例如测试号的来源编号为3194,那么这里的订单号就必须是以3194开头
(7):instMid
机构商户号,这里固定为:MINIDEFAULT
(8):totalAmount
订单金额,这里的单位为分,例如一元的话,此参数就为100
(9):tradeType
交易类型:这里固定为MINI
(10):signType
签名算法:这里的参数有三种分别为MD5,SHA1,RSA,这里我使用的是MD5
(11):subOpenId
支付用户openid
(12):notifyUrl
支付结果通知地址,及异步回调地址,这里注意:支付通知地址必须是伪静态地址,例如: XXXXX/back/index,不能是XXXX/index.php?r=back/index
(13):sign
签名,将上面的参数按照a-z的顺序进行排序,排序完成之后用&字符连接起来,连接起来之后如果存在转义字符,那么去掉转义字符,然后进行md5加密获取到签名
接口端微信小程序下单的简单实例如下:
$url = 'https://qr.chinaums.com/netpay-route-server/api/';
$requestTimestamp = date('Y-m-d H:i:s',time());
$data = [
'msgSrc' => 'XXX',//消息来源
'msgType' => 'wx.unifiedOrder',//消息类型
'requestTimestamp' => $requestTimestamp,
'mid' => 'XXX',
'tid' => 'XXX',
'merOrderId' => 'XXX',
'instMid' => 'MINIDEFAULT',
'totalAmount' => 1,
'tradeType' => 'MINI',
'signType' => 'MD5',
'subOpenId' => 'XXX',
'notifyUrl' => 'XXX',//回调地址
];
//获取sign参数
ksort($data);
reset($data);
$options = '';
foreach ($data as $key => $value) {
$options .= $key . '=' . $value .'&';
}
$options = rtrim($options, '&');
//存在转义字符,那么去掉转义
if(get_magic_quotes_gpc()){
$options = stripslashes($options);
}
$sign = md5($options . $params['mdKey']);
$data['sign'] = $sign;
//调用银联商务的微信小程序下单接口
$client = new Client();
$response = $client->createRequest()
->setMethod('POST') // 请求方式
->setUrl($url) // 请求地址
->setData($data) //数据传数组
->setHeaders(['Content-Type'=>'application/json']) //header
->setFormat(Client::FORMAT_JSON) //提交的数据的格式
->send();
if (!$response->isOk) {
return [
'type' => 'error',
'message' => '支付调用失败'
];
}
if ($response->data['errCode'] == 'SUCCESS') {
return [
'type' => 'success',
'message' => '支付调用成功',
'data' => $response->data['miniPayRequest'],//小程序支付用的请求报文,带有签名信息
];
} else {
return [
'type' => 'error',
'message' => '支付调用失败' . $response->data['errMsg']
];
}
二:小程序端:
银联商务接口返回的miniPayRequest参数包含了微信小程序调用支付的所有参数,所以我们在微信小程序端只需要见接口中的数据填充进去就可以实现微信小程序支付了
//这里的payData就是接口返回的data参数
wx.requestPayment({
timeStamp: payData.timeStamp,
nonceStr: payData.nonceStr,
package: payData.package,
signType: payData.signType,
paySign: payData.paySign,
success: (res) => {
//支付成功处理
},
fail: (res) => {
//支付失败处理
}
})
这里我们就实现了在微信小程序中对接银联商务支付了,微信小程序的支付对调是post传值,具体信息如下:
可以根据你项目的具体需求进行处理即可,这里注意在回调的结尾需要输入SUCCESS或FAILED,不然的话可以会出现对此通知的现象