最近公司的小程序需要使用到支付功能,我們使用的是銀聯(lián)商務(wù)的支付,那么如何在微信小程序中對接銀聯(lián)商務(wù)的微信小程序支付呢?這里我記錄下我在微信小程序中實(shí)現(xiàn)銀聯(lián)商務(wù)的微信小程序支付流程
一:接口部分:
這里注意銀聯(lián)商務(wù)的小程序支付目前不支持測試號(hào)支付,只有使用正式的參數(shù)實(shí)現(xiàn)小程序支付
1:銀聯(lián)商務(wù)的小程序支付接口地址:
https://qr.chinaums.com/netpay-route-server/api/
2:主要參數(shù)說明:
(1):msgSrc
消息來源:如:WWW.TEST.COM
(2):msgType
消息類型:微信小程序支付參數(shù)固定為:wx.unifiedOrder
(3):mid
商戶號(hào)
(4):tid
終端號(hào)
(5):requestTimestamp
報(bào)文請求時(shí)間,格式y(tǒng)yyy-MM-dd HH:mm:ss
(6):merOrderId
訂單號(hào),這里注意傳遞給銀聯(lián)商務(wù)的訂單號(hào)的前綴必須是來源編號(hào),例如測試號(hào)的來源編號(hào)為3194,那么這里的訂單號(hào)就必須是以3194開頭
(7):instMid
機(jī)構(gòu)商戶號(hào),這里固定為:MINIDEFAULT
(8):totalAmount
訂單金額,這里的單位為分,例如一元的話,此參數(shù)就為100
(9):tradeType
交易類型:這里固定為MINI
(10):signType
簽名算法:這里的參數(shù)有三種分別為MD5,SHA1,RSA,這里我使用的是MD5
(11):subOpenId
支付用戶openid
(12):notifyUrl
支付結(jié)果通知地址,及異步回調(diào)地址,這里注意:支付通知地址必須是偽靜態(tài)地址,例如: XXXXX/back/index,不能是XXXX/index.php?r=back/index
(13):sign
簽名,將上面的參數(shù)按照a-z的順序進(jìn)行排序,排序完成之后用&字符連接起來,連接起來之后如果存在轉(zhuǎn)義字符,那么去掉轉(zhuǎn)義字符,然后進(jìn)行md5加密獲取到簽名
接口端微信小程序下單的簡單實(shí)例如下:
$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',//回調(diào)地址 ]; //獲取sign參數(shù) ksort($data); reset($data); $options = ''; foreach ($data as $key => $value) { $options .= $key . '=' . $value .'&'; } $options = rtrim($options, '&'); //存在轉(zhuǎn)義字符,那么去掉轉(zhuǎn)義 if(get_magic_quotes_gpc()){ $options = stripslashes($options); } $sign = md5($options . $params['mdKey']); $data['sign'] = $sign; //調(diào)用銀聯(lián)商務(wù)的微信小程序下單接口 $client = new Client(); $response = $client->createRequest() ->setMethod('POST') // 請求方式 ->setUrl($url) // 請求地址 ->setData($data) //數(shù)據(jù)傳數(shù)組 ->setHeaders(['Content-Type'=>'application/json']) //header ->setFormat(Client::FORMAT_JSON) //提交的數(shù)據(jù)的格式 ->send(); if (!$response->isOk) { return [ 'type' => 'error', 'message' => '支付調(diào)用失敗' ]; } if ($response->data\['errCode'] == 'SUCCESS') { return [ 'type' => 'success', 'message' => '支付調(diào)用成功', 'data' => $response->data\['miniPayRequest'\],//小程序支付用的請求報(bào)文,帶有簽名信息 ]; } else { return [ 'type' => 'error', 'message' => '支付調(diào)用失敗' . $response->data['errMsg'] ]; }
二:小程序端:
銀聯(lián)商務(wù)接口返回的miniPayRequest參數(shù)包含了微信小程序調(diào)用支付的所有參數(shù),所以我們在微信小程序端只需要見接口中的數(shù)據(jù)填充進(jìn)去就可以實(shí)現(xiàn)微信小程序支付了
//這里的payData就是接口返回的data參數(shù) wx.requestPayment({ timeStamp: payData.timeStamp, nonceStr: payData.nonceStr, package: payData.package, signType: payData.signType, paySign: payData.paySign, success: (res) => { //支付成功處理 }, fail: (res) => { //支付失敗處理 } })
這里我們就實(shí)現(xiàn)了在微信小程序中對接銀聯(lián)商務(wù)支付了,微信小程序的支付對調(diào)是post傳值,具體信息如下:
可以根據(jù)你項(xiàng)目的具體需求進(jìn)行處理即可,這里注意在回調(diào)的結(jié)尾需要輸入SUCCESS或FAILED,不然的話可以會(huì)出現(xiàn)對此通知的現(xiàn)象