### **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);
})
}
});
```