最近公(gong)司的(de)小程(cheng)(cheng)序(xu)需要使(shi)用(yong)到支(zhi)付(fu)功(gong)能(neng),我們使(shi)用(yong)的(de)是(shi)銀聯商務的(de)支(zhi)付(fu),那(nei)么(me)如(ru)何(he)在微信(xin)小程(cheng)(cheng)序(xu)中(zhong)對接(jie)銀聯商務的(de)微信(xin)小程(cheng)(cheng)序(xu)支(zhi)付(fu)呢?這里我記錄下(xia)我在微信(xin)小程(cheng)(cheng)序(xu)中(zhong)實現銀聯商務的(de)微信(xin)小程(cheng)(cheng)序(xu)支(zhi)付(fu)流程(cheng)(cheng)
一:接(jie)口(kou)部分:
這里注意銀聯商(shang)務的小程序支付(fu)目前不支持測試號支付(fu),只有使用正式的參(can)數(shu)實現小程序支付(fu)
1:銀聯商務的小程序支(zhi)付接口地址:
//qr.chinaums.com/netpay-route-server/api/
2:主要參數說明:
(1):msgSrc
消息來(lai)源:如:WWW.TEST.COM
(2):msgType
消息類型:微信小程序支付(fu)參數固定為:wx.unifiedOrder
(3):mid
商戶號
(4):tid
終端號
(5):requestTimestamp
報文請求時(shi)間,格(ge)式(shi)yyyy-MM-dd HH:mm:ss
(6):merOrderId
訂(ding)單號(hao),這里注意傳遞給銀(yin)聯商務的訂(ding)單號(hao)的前綴必須(xu)是來源(yuan)編(bian)號(hao),例如測試號(hao)的來源(yuan)編(bian)號(hao)為3194,那么這里的訂(ding)單號(hao)就必須(xu)是以(yi)3194開(kai)頭
(7):instMid
機構商戶號,這里固定為:MINIDEFAULT
(8):totalAmount
訂單金額,這里(li)的單位為(wei)(wei)分,例(li)如一元的話,此參數就為(wei)(wei)100
(9):tradeType
交易類型:這里(li)固(gu)定為(wei)MINI
(10):signType
簽名算法:這里(li)的(de)參(can)數有三種分別為MD5,SHA1,RSA,這里(li)我(wo)使(shi)用(yong)的(de)是(shi)MD5
(11):subOpenId
支付用戶openid
(12):notifyUrl
支(zhi)付(fu)結果通知(zhi)地址(zhi),及異步回調地址(zhi),這里注意:支(zhi)付(fu)通知(zhi)地址(zhi)必(bi)須是偽(wei)靜態地址(zhi),例如: XXXXX/back/index,不能是XXXX/index.php?r=back/index
(13):sign
簽名(ming)(ming),將上面的參(can)數按(an)照a-z的順序(xu)進行排序(xu),排序(xu)完成之(zhi)后用&字符(fu)(fu)連(lian)接起來,連(lian)接起來之(zhi)后如果存在轉(zhuan)義(yi)字符(fu)(fu),那么(me)去(qu)掉轉(zhuan)義(yi)字符(fu)(fu),然后進行md5加密獲取(qu)到簽名(ming)(ming)
接口端(duan)微信小(xiao)程序下單的(de)簡單實例如下:
$url = '//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']
];
}
二:小程序端:
銀聯商務(wu)接口返回的(de)(de)miniPayRequest參數包含了(le)微(wei)信小程序調(diao)用支付(fu)的(de)(de)所(suo)有參數,所(suo)以我們在微(wei)信小程序端只(zhi)需要(yao)見接口中的(de)(de)數據填充(chong)進(jin)去就(jiu)可以實現微(wei)信小程序支付(fu)了(le)
//這里的payData就是接口返回的data參數
wx.requestPayment({
timeStamp: payData.timeStamp,
nonceStr: payData.nonceStr,
package: payData.package,
signType: payData.signType,
paySign: payData.paySign,
success: (res) => {
//支付成功處理
},
fail: (res) => {
//支付失敗處理
}
})
這里(li)我們(men)就(jiu)實現了在(zai)微(wei)信小程序中對(dui)接銀聯商務支付了,微(wei)信小程序的支付對(dui)調是post傳值,具體信息如下:
可以根據你項(xiang)目的具體需求進行處理即可,這(zhe)里注意在回調的結尾需要輸(shu)入(ru)SUCCESS或FAILED,不然的話(hua)可以會(hui)出現(xian)對此通知的現(xian)象