### **APP 觸發購買操作后,后端的處理流程如下:**
<br>
```
//下單用到的參數整理
let json = {
appid: 'wx2421b1c4370ec43b', //微信開放平臺審核通過的應用APPID
body: '填寫購買產品的相關信息',
mch_id: '10000100', //微信支付分配的商戶號
nonce_str: '1add1a30ac87aa2',
notify_url: 'http://wxpay.wxutil.com/pay/notify.php', //微信支付完成后,會回調的地址,用來通知后端此次交易的情況
out_trade_no: 'wx1415659990', //自定義的訂單號,后端自己生成
spbill_create_ip: '12.12.12.12', //終端IP,發起訂單請求IP req.ip
total_fee: 100, //價格,單位為分
trade_type: 'APP', //支付類型為:APP支付
};
//第一步:對參數按照key=value的格式,按照參數名ASCII碼從小到大排序,生成URL鍵值對的格式(即key1=value1&key2=value2…)拼接成字符串stringA。
let stringA = stringifyParams(json);
function stringifyParams(params) {
return Object.keys(params).sort().reduce((ret, x) => {
ret = ret ? ret + '&' : ret;
ret += (x + '=' + params[x]);
return ret;
}, '');
}
//第二步:拼接API密鑰:
let stringSignTemp = stringA + "&key=" + wx.key; //注:key為商戶平臺設置的密鑰key
json.sign = MD5(stringSignTemp).toString().toUpperCase(); //MD5簽名方式
//第三步:把上面的 json 數據生成 XML 數據格式。(生成 XML 格式,具體方法在此不再細說,各位可自行谷歌、百度了解)
let formData = buildXml(json, 'xml');
//第四步:請求微信后臺統一下單接口
request({
url: "https://api.mch.weixin.qq.com/pay/unifiedorder",
method: 'POST',
body: formData
}, function (error, response, body) {
if (response.statusCode == 200) {
//對返回的參數進行 XML 解碼
let parseString = xml2js.parseString;
parseString(body, function (err, result) {
let wxData = result.xml;
//把安卓APP用來喚起微信支付所用到的數據返回
let toAppData = {
appid: wxData.appid[0], //應用ID
partnerid: wxData.mch_id[0], //商戶號
prepayid: wxData.prepay_id[0], //預支付交易會話ID
package: 'Sign=WXPay', //固定值Sign=WXPay
noncestr: wxData.nonce_str[0], //隨機字符串
timestamp: (Date.parse(new Date()) / 1000).toString(), //時間戳(秒級時間戳10位數)
// sign: wxData.sign[0] //此處用返回的 sign 是錯誤的!!!
};
//要注意!!!特別提醒!!!這里是初次開發微信支付的小朋友們會踩到的一個大坑!!!! 此處簽名不是微信返回的簽名,而是要按照上面第一、第二步 簽名的方式一樣,進行第二次生成簽名。
//進行簽名算法(生成簽名)
let stringA = stringifyParams(toAppData);
let stringSignTemp = stringA + "&key=" + wx.key; //注:key為商戶平臺設置的密鑰key
toAppData.sign = MD5(stringSignTemp).toString().toUpperCase();
//把參數返回給 APP,讓 APP 喚起微信的支付,后端處理購買下單流程操作到此結束。
res.send(toAppData);
})
}
});
```