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