{"id":30345,"date":"2024-11-25T09:13:25","date_gmt":"2024-11-25T01:13:25","guid":{"rendered":"https:\/\/fwq.ai\/blog\/30345\/"},"modified":"2024-11-25T09:13:25","modified_gmt":"2024-11-25T01:13:25","slug":"%e5%88%86%e4%ba%ab%e5%b0%8f%e7%a8%8b%e5%ba%8f%e6%94%af%e4%bb%98%e5%8a%9f%e8%83%bd%e7%9a%84%e5%ae%9e%e4%be%8b%e4%bb%a3%e7%a0%81%e6%95%99%e7%a8%8b","status":"publish","type":"post","link":"https:\/\/fwq.ai\/blog\/30345\/","title":{"rendered":"\u5206\u4eab\u5c0f\u7a0b\u5e8f\u652f\u4ed8\u529f\u80fd\u7684\u5b9e\u4f8b\u4ee3\u7801\u6559\u7a0b"},"content":{"rendered":"<p>\u5fae\u4fe1\u5c0f\u7a0b\u5e8f\u7684\u652f\u4ed8\u548c\u5fae\u4fe1\u516c\u4f17\u53f7\u7684\u652f\u4ed8\u662f\u7c7b\u4f3c\u7684\uff0c\u5bf9\u6bd4\u8d77\u6765\u8fd8\u6bd4\u516c\u4f17\u53f7\u652f\u4ed8\u7b80\u5355\u4e86\u4e00\u4e9b\uff0c\u6211\u4eec\u53ea\u9700\u8981\u8c03\u7528\u5fae\u4fe1\u7684\u7edf\u4e00\u4e0b\u5355\u63a5\u53e3\u83b7\u53d6prepay_id\u4e4b\u540e\u6211\u4eec\u5728\u8c03\u7528\u5fae\u4fe1\u7684\u652f\u4ed8\u5373\u53ef\u3002<\/p>\n<p>\u4eca\u5929\u6211\u4eec\u6765\u5c01\u88c5\u4e00\u822cnode\u7684\u652f\u4ed8\u63a5\u53e3\uff01\uff01\uff01<\/p>\n<p>\u9996\u5148\u8c03\u7528\u7edf\u4e00\u4e0b\u5355\u63a5\u53e3\u6211\u4eec\u9700\u8981\u77e5\u9053\u4e00\u4e9b\u4fe1\u606f<\/p>\n<pre>var&nbsp;bookingNo&nbsp;=&nbsp;'davdian'&nbsp;+&nbsp;this.createNonceStr()&nbsp;+&nbsp;this.createTimeStamp()\r\n&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;deferred&nbsp;=&nbsp;Q.defer()&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;appid&nbsp;=&nbsp;config.appId&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;nonce_str&nbsp;=&nbsp;this.createNonceStr()&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;timeStamp&nbsp;=&nbsp;this.createTimeStamp()&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;url&nbsp;=&nbsp;\"https:\/\/api.mch.weixin.qq.com\/pay\/unifiedorder\"&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;formData&nbsp;=&nbsp;\"&lt;xml&gt;\"&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;formData&nbsp;+=&nbsp;\"&lt;appid&gt;\"&nbsp;+&nbsp;appid&nbsp;+&nbsp;\"&lt;\/appid&gt;\"&nbsp;\/\/appid&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;formData&nbsp;+=&nbsp;\"&lt;attach&gt;\"&nbsp;+&nbsp;attach&nbsp;+&nbsp;\"&lt;\/attach&gt;\"&nbsp;\/\/\u9644\u52a0\u6570\u636e&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;formData&nbsp;+=&nbsp;\"\"&nbsp;+&nbsp;body&nbsp;+&nbsp;\"\"&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;formData&nbsp;+=&nbsp;\"&lt;mch_id&gt;\"&nbsp;+&nbsp;mch_id&nbsp;+&nbsp;\"&lt;\/mch_id&gt;\"&nbsp;\/\/\u5546\u6237\u53f7&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;formData&nbsp;+=&nbsp;\"&lt;nonce_str&gt;\"&nbsp;+&nbsp;nonce_str&nbsp;+&nbsp;\"&lt;\/nonce_str&gt;\"&nbsp;\/\/\u968f\u673a\u5b57\u7b26\u4e32\uff0c\u4e0d\u957f\u4e8e32\u4f4d\u3002&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;formData&nbsp;+=&nbsp;\"&lt;notify_url&gt;\"&nbsp;+&nbsp;notify_url&nbsp;+&nbsp;\"&lt;\/notify_url&gt;\"&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;formData&nbsp;+=&nbsp;\"&lt;openid&gt;\"&nbsp;+&nbsp;openid&nbsp;+&nbsp;\"&lt;\/openid&gt;\"&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;formData&nbsp;+=&nbsp;\"&lt;out_trade_no&gt;\"&nbsp;+&nbsp;bookingNo&nbsp;+&nbsp;\"&lt;\/out_trade_no&gt;\"&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;formData&nbsp;+=&nbsp;\"&lt;spbill_create_ip&gt;61.50.221.43&lt;\/spbill_create_ip&gt;\"&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;formData&nbsp;+=&nbsp;\"&lt;total_fee&gt;\"&nbsp;+&nbsp;total_fee&nbsp;+&nbsp;\"&lt;\/total_fee&gt;\"&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;formData&nbsp;+=&nbsp;\"&lt;trade_type&gt;JSAPI&lt;\/trade_type&gt;\"&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;formData&nbsp;+=&nbsp;\"&lt;sign&gt;\"&nbsp;+&nbsp;this.paysignjsapi(appid,&nbsp;attach,&nbsp;body,&nbsp;mch_id,&nbsp;nonce_str,&nbsp;notify_url,&nbsp;openid,&nbsp;bookingNo,&nbsp;'61.50.221.43',&nbsp;total_fee,&nbsp;'JSAPI')&nbsp;+&nbsp;\"&lt;\/sign&gt;\"&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;formData&nbsp;+=&nbsp;\"&lt;\/xml&gt;\"&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;self&nbsp;=&nbsp;this\r\n&nbsp;&nbsp;&nbsp;&nbsp;request({&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;url:&nbsp;url,&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;method:&nbsp;'POST',&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;body:&nbsp;formData&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;},&nbsp;function(err,&nbsp;response,&nbsp;body)&nbsp;{&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!err&nbsp;&amp;amp;&amp;amp;&nbsp;response.statusCode&nbsp;==&nbsp;200)&nbsp;{&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;prepay_id&nbsp;=&nbsp;self.getXMLNodeValue('prepay_id',&nbsp;body.toString(\"utf-8\"))&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;tmp&nbsp;=&nbsp;prepay_id.split('[')&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;tmp1&nbsp;=&nbsp;tmp[2].split(']')&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/\u7b7e\u540d&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;_paySignjs&nbsp;=&nbsp;self.paysignjs(appid,&nbsp;nonce_str,&nbsp;'prepay_id='&nbsp;+&nbsp;tmp1[0],&nbsp;'MD5',&nbsp;timeStamp)&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;args&nbsp;=&nbsp;{&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;appId:&nbsp;appid,&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;timeStamp:&nbsp;timeStamp,&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nonceStr:&nbsp;nonce_str,&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;signType:&nbsp;\"MD5\",&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;package:&nbsp;tmp1[0],&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;paySign:&nbsp;_paySignjs&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;deferred.resolve(args)&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;console.log(body)&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;})&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;deferred.promise<\/pre>\n<p> \u767b\u5f55\u540e\u590d\u5236 <\/p>\n<p>\u8fd9\u4e2a\u662f\u4e00\u4e2a\u7edf\u4e00\u4e0b\u5355\u63a5\u53e3\u7684\u4ee3\u7801\uff0c\u6211\u4eec\u9700\u8981appid\u5c0f\u7a0b\u5e8f\u516c\u4f17\u53f7id\uff0cmch_id\u5546\u6237\u53f7id,openid\u5c0f\u7a0b\u5e8f\u7684\u552f\u4e00\u6807\u5b9e,\u652f\u4ed8\u7528\u7684\u5bc6\u7801\uff0c\u5269\u4e0b\u7684\u53c2\u6570\u90fd\u662f\u8ba2\u5355\u7684\u4fe1\u606f\u548c\u4ef7\u683c\u4e4b\u7c7b\u7684\uff0c\u672c\u4eba\u8fdbq\u6a21\u5757\u4f7f\u7528promise\uff0c\u8fd9\u4e2a\u56e0\u4eba\u800c\u5f02\uff0c\u53ef\u4ee5\u6839\u636e\u81ea\u5df1\u9700\u8981\u6765\u3002\u6211\u4eec\u9700\u8981\u8bf7\u6c42api.mch.weixin.qq.com\/pay\/unifiedorder\u63a5\u53e3<\/p>\n<p>\u6ce8\u610f\uff1a\u8fd9\u91cc\u6211\u4eec\u4f20\u9012\u7684formdata\u662f\u4e00\u4e2axml\u800c\u4e0d\u662f<\/p>\n<p>\u7136\u540e\u6211\u4eec\u9700\u8981\u7b7e\u540d\u65b9\u6cd5\uff0c\u8fd9\u91cc\u6211\u4eec\u9700\u8981\u5c01\u88c5\u4e24\u4e2a\u65b9\u6cd5\uff0c\u4e00\u4e2a\u662f\u7b7e\u540d\u65b9\u6cd5\u8c03\u7528\u7edf\u4e00\u4e0b\u5355\u63a5\u53e3\u4f1a\u7528\u5230\uff0c\u53e6\u4e00\u4e2a\u662f\u8c03\u7528\u5c0f\u7a0b\u5e8f\u652f\u4ed8\u7528\u5230<\/p>\n<p>\u7edf\u4e00\u4e0b\u5355\u63a5\u53e3sign\uff1a<\/p>\n<pre>var&nbsp;ret&nbsp;=&nbsp;{&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;appid:&nbsp;appid,&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;attach:&nbsp;attach,&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;body:&nbsp;body,&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mch_id:&nbsp;mch_id,&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nonce_str:&nbsp;nonce_str,&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;notify_url:&nbsp;notify_url,&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;openid:&nbsp;openid,&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out_trade_no:&nbsp;out_trade_no,&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;spbill_create_ip:&nbsp;spbill_create_ip,&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;total_fee:&nbsp;total_fee,&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;trade_type:&nbsp;trade_type&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;string&nbsp;=&nbsp;this.raw(ret)&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;string&nbsp;=&nbsp;string&nbsp;+&nbsp;'&amp;amp;key='&nbsp;+&nbsp;key&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;crypto&nbsp;=&nbsp;require('crypto')&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;sign&nbsp;=&nbsp;crypto.createHash('md5').update(string,&nbsp;'utf8').digest('hex')&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;sign.toUpperCase()&nbsp;\r\n\r\n\u652f\u4ed8sign\uff1a<\/pre>\n<p> \u767b\u5f55\u540e\u590d\u5236 <\/p>\n<pre>var&nbsp;ret&nbsp;=&nbsp;{&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;appId:&nbsp;appid,&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nonceStr:&nbsp;nonceStr,&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;package:&nbsp;package,&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;signType:&nbsp;signType,&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;timeStamp:&nbsp;timeStamp&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;string&nbsp;=&nbsp;this.raw(ret)&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;string&nbsp;=&nbsp;string&nbsp;+&nbsp;'&amp;amp;key='&nbsp;+&nbsp;key&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;sign&nbsp;=&nbsp;crypto.createHash('md5').update(string,&nbsp;'utf8').digest('hex')&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;sign.toUpperCase()&nbsp;&nbsp;\r\n\r\n\u6ce8\u610f\u52a0\u5bc6\u7684\u65f6\u5019\u6211\u4eec\u83b7\u53d6\u7684\u662fstring\u800c\u4e0d\u662f\u4e00\u4e2ajson\uff0c\u6240\u4ee5\u6211\u4eec\u9700\u8981\u5427json\u8f6c\u6362\u6210string\uff0c\u4ee3\u7801\u5982\u4e0b\uff1a<\/pre>\n<p> \u767b\u5f55\u540e\u590d\u5236 <\/p>\n<p>&nbsp;<\/p>\n<pre>var&nbsp;keys&nbsp;=&nbsp;Object.keys(args)&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;keys&nbsp;=&nbsp;keys.sort()&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;newArgs&nbsp;=&nbsp;{}&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;keys.forEach(function(key)&nbsp;{&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;newArgs[key]&nbsp;=&nbsp;args[key]&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;})&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;string&nbsp;=&nbsp;''&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(var&nbsp;k&nbsp;in&nbsp;newArgs)&nbsp;{&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;string&nbsp;+=&nbsp;'&amp;amp;'&nbsp;+&nbsp;k&nbsp;+&nbsp;'='&nbsp;+&nbsp;newArgs[k]&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;string&nbsp;=&nbsp;string.substr(1)&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;string&nbsp;&nbsp;\r\n\r\n\u7edf\u4e00\u4e0b\u5355\u63a5\u53e3\u8fd4\u56de\u7684\u662f\u5e26\u6709prepay_id\u7684xml\uff0c\u6240\u4ee5\u6211\u4eec\u9700\u8981\u4e00\u4e2a\u65b9\u6cd5\u8fdb\u884c\u89e3\u6790\uff0c\u4ee3\u7801\u5982\u4e0b\uff1a<\/pre>\n<p> \u767b\u5f55\u540e\u590d\u5236 <\/p>\n<pre>var&nbsp;tmp&nbsp;=&nbsp;xml.split(\"\")&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;_tmp&nbsp;=&nbsp;tmp[1].split(\"\"&nbsp;+&nbsp;node_name&nbsp;+&nbsp;\"&amp;gt;\")&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;_tmp[0]&nbsp;&nbsp;\r\n\r\n\u6700\u540e\u6211\u4eec\u53ea\u9700\u8981\u628a\u8fd9\u4e9b\u8fde\u63a5\u5230\u4e00\u8d77\u5c31\u662f\u53ef\u4ee5\u83b7\u53d6\u6240\u6709\u5fae\u4fe1\u652f\u4ed8\u6240\u9700\u53c2\u6570\uff0c\u4ee3\u7801\u5982\u4e0b\uff1a<\/pre>\n<p> \u767b\u5f55\u540e\u590d\u5236 <\/p>\n<pre>\/\/\u5fae\u4fe1\u5c0f\u7a0b\u5e8f\u652f\u4ed8\u5c01\u88c5,\u6682\u652f\u6301md5\u52a0\u5bc6\uff0c\u4e0d\u652f\u6301sha1\r\n\/**\r\n***create&nbsp;order&nbsp;by&nbsp;jianchep&nbsp;2016\/11\/22&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\r\n&nbsp;**\/\r\nvar&nbsp;config&nbsp;=&nbsp;require('..\/config\/weapp.js')\r\nvar&nbsp;Q&nbsp;=&nbsp;require(\"q\")&nbsp;&nbsp;\r\nvar&nbsp;request&nbsp;=&nbsp;require(\"request\")&nbsp;&nbsp;\r\nvar&nbsp;crypto&nbsp;=&nbsp;require('crypto')&nbsp;&nbsp;\r\nvar&nbsp;ejs&nbsp;=&nbsp;require('ejs')\r\nvar&nbsp;fs&nbsp;=&nbsp;require('fs')&nbsp;&nbsp;\r\nvar&nbsp;key&nbsp;=&nbsp;config.key\r\nmodule.exports&nbsp;=&nbsp;{\r\n&nbsp;&nbsp;\/\/&nbsp;\u83b7\u53d6prepay_id\r\n&nbsp;&nbsp;getXMLNodeValue:&nbsp;function(node_name,&nbsp;xml)&nbsp;{&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;tmp&nbsp;=&nbsp;xml.split(\"\")&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;_tmp&nbsp;=&nbsp;tmp[1].split(\"\"&nbsp;+&nbsp;node_name&nbsp;+&nbsp;\"&gt;\")&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;_tmp[0]&nbsp;&nbsp;\r\n&nbsp;&nbsp;},\r\n&nbsp;&nbsp;\/\/&nbsp;object--&gt;string\r\n&nbsp;&nbsp;raw:&nbsp;function(args)&nbsp;{&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;keys&nbsp;=&nbsp;Object.keys(args)&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;keys&nbsp;=&nbsp;keys.sort()&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;newArgs&nbsp;=&nbsp;{}&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;keys.forEach(function(key)&nbsp;{&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;newArgs[key]&nbsp;=&nbsp;args[key]&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;})&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;string&nbsp;=&nbsp;''&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(var&nbsp;k&nbsp;in&nbsp;newArgs)&nbsp;{&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;string&nbsp;+=&nbsp;'&amp;'&nbsp;+&nbsp;k&nbsp;+&nbsp;'='&nbsp;+&nbsp;newArgs[k]&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;string&nbsp;=&nbsp;string.substr(1)&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;string&nbsp;&nbsp;\r\n&nbsp;&nbsp;},&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;\/\/&nbsp;\u968f\u673a\u5b57\u7b26\u4e32\u4ea7\u751f\u51fd\u6570&nbsp;&nbsp;\r\n&nbsp;&nbsp;createNonceStr:&nbsp;function()&nbsp;{&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;Math.random().toString(36).substr(2,&nbsp;15)&nbsp;&nbsp;\r\n&nbsp;&nbsp;},&nbsp;&nbsp;\r\n&nbsp;&nbsp;\/\/&nbsp;\u65f6\u95f4\u6233\u4ea7\u751f\u51fd\u6570&nbsp;&nbsp;\r\n&nbsp;&nbsp;createTimeStamp:&nbsp;function()&nbsp;{&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;parseInt(new&nbsp;Date().getTime()&nbsp;\/&nbsp;1000)&nbsp;+&nbsp;''&nbsp;&nbsp;\r\n&nbsp;&nbsp;},\r\n&nbsp;&nbsp;\/\/&nbsp;\u652f\u4ed8md5\u52a0\u5bc6\u83b7\u53d6sign\r\n&nbsp;&nbsp;paysignjs:&nbsp;function(appid,&nbsp;nonceStr,&nbsp;package,&nbsp;signType,&nbsp;timeStamp)&nbsp;{&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;ret&nbsp;=&nbsp;{&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;appId:&nbsp;appid,&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nonceStr:&nbsp;nonceStr,&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;package:&nbsp;package,&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;signType:&nbsp;signType,&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;timeStamp:&nbsp;timeStamp&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;string&nbsp;=&nbsp;this.raw(ret)&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;string&nbsp;=&nbsp;string&nbsp;+&nbsp;'&amp;key='&nbsp;+&nbsp;key&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;sign&nbsp;=&nbsp;crypto.createHash('md5').update(string,&nbsp;'utf8').digest('hex')&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;sign.toUpperCase()&nbsp;&nbsp;\r\n&nbsp;&nbsp;},\r\n&nbsp;&nbsp;\/\/&nbsp;\u7edf\u4e00\u4e0b\u5355\u63a5\u53e3\u52a0\u5bc6\u83b7\u53d6sign\r\n&nbsp;&nbsp;paysignjsapi:&nbsp;function(appid,&nbsp;attach,&nbsp;body,&nbsp;mch_id,&nbsp;nonce_str,&nbsp;notify_url,&nbsp;openid,&nbsp;out_trade_no,&nbsp;spbill_create_ip,&nbsp;total_fee,&nbsp;trade_type)&nbsp;{&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;ret&nbsp;=&nbsp;{&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;appid:&nbsp;appid,&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;attach:&nbsp;attach,&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;body:&nbsp;body,&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mch_id:&nbsp;mch_id,&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nonce_str:&nbsp;nonce_str,&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;notify_url:&nbsp;notify_url,&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;openid:&nbsp;openid,&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out_trade_no:&nbsp;out_trade_no,&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;spbill_create_ip:&nbsp;spbill_create_ip,&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;total_fee:&nbsp;total_fee,&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;trade_type:&nbsp;trade_type&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;string&nbsp;=&nbsp;this.raw(ret)&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;string&nbsp;=&nbsp;string&nbsp;+&nbsp;'&amp;key='&nbsp;+&nbsp;key&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;crypto&nbsp;=&nbsp;require('crypto')&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;sign&nbsp;=&nbsp;crypto.createHash('md5').update(string,&nbsp;'utf8').digest('hex')&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;sign.toUpperCase()&nbsp;&nbsp;\r\n&nbsp;&nbsp;},\r\n&nbsp;&nbsp;\/\/&nbsp;\u4e0b\u5355\u63a5\u53e3\r\n&nbsp;&nbsp;order:&nbsp;function(attach,&nbsp;body,&nbsp;mch_id,&nbsp;openid,&nbsp;total_fee,&nbsp;notify_url)&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;bookingNo&nbsp;=&nbsp;'davdian'&nbsp;+&nbsp;this.createNonceStr()&nbsp;+&nbsp;this.createTimeStamp()\r\n&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;deferred&nbsp;=&nbsp;Q.defer()&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;appid&nbsp;=&nbsp;config.appId&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;nonce_str&nbsp;=&nbsp;this.createNonceStr()&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;timeStamp&nbsp;=&nbsp;this.createTimeStamp()&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;url&nbsp;=&nbsp;\"https:\/\/api.mch.weixin.qq.com\/pay\/unifiedorder\"&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;formData&nbsp;=&nbsp;\"&lt;xml&gt;\"&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;formData&nbsp;+=&nbsp;\"&lt;appid&gt;\"&nbsp;+&nbsp;appid&nbsp;+&nbsp;\"&lt;\/appid&gt;\"&nbsp;\/\/appid&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;formData&nbsp;+=&nbsp;\"&lt;attach&gt;\"&nbsp;+&nbsp;attach&nbsp;+&nbsp;\"&lt;\/attach&gt;\"&nbsp;\/\/\u9644\u52a0\u6570\u636e&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;formData&nbsp;+=&nbsp;\"\"&nbsp;+&nbsp;body&nbsp;+&nbsp;\"\"&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;formData&nbsp;+=&nbsp;\"&lt;mch_id&gt;\"&nbsp;+&nbsp;mch_id&nbsp;+&nbsp;\"&lt;\/mch_id&gt;\"&nbsp;\/\/\u5546\u6237\u53f7&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;formData&nbsp;+=&nbsp;\"&lt;nonce_str&gt;\"&nbsp;+&nbsp;nonce_str&nbsp;+&nbsp;\"&lt;\/nonce_str&gt;\"&nbsp;\/\/\u968f\u673a\u5b57\u7b26\u4e32\uff0c\u4e0d\u957f\u4e8e32\u4f4d\u3002&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;formData&nbsp;+=&nbsp;\"&lt;notify_url&gt;\"&nbsp;+&nbsp;notify_url&nbsp;+&nbsp;\"&lt;\/notify_url&gt;\"&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;formData&nbsp;+=&nbsp;\"&lt;openid&gt;\"&nbsp;+&nbsp;openid&nbsp;+&nbsp;\"&lt;\/openid&gt;\"&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;formData&nbsp;+=&nbsp;\"&lt;out_trade_no&gt;\"&nbsp;+&nbsp;bookingNo&nbsp;+&nbsp;\"&lt;\/out_trade_no&gt;\"&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;formData&nbsp;+=&nbsp;\"&lt;spbill_create_ip&gt;61.50.221.43&lt;\/spbill_create_ip&gt;\"&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;formData&nbsp;+=&nbsp;\"&lt;total_fee&gt;\"&nbsp;+&nbsp;total_fee&nbsp;+&nbsp;\"&lt;\/total_fee&gt;\"&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;formData&nbsp;+=&nbsp;\"&lt;trade_type&gt;JSAPI&lt;\/trade_type&gt;\"&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;formData&nbsp;+=&nbsp;\"&lt;sign&gt;\"&nbsp;+&nbsp;this.paysignjsapi(appid,&nbsp;attach,&nbsp;body,&nbsp;mch_id,&nbsp;nonce_str,&nbsp;notify_url,&nbsp;openid,&nbsp;bookingNo,&nbsp;'61.50.221.43',&nbsp;total_fee,&nbsp;'JSAPI')&nbsp;+&nbsp;\"&lt;\/sign&gt;\"&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;formData&nbsp;+=&nbsp;\"&lt;\/xml&gt;\"&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;self&nbsp;=&nbsp;this\r\n&nbsp;&nbsp;&nbsp;&nbsp;request({&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;url:&nbsp;url,&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;method:&nbsp;'POST',&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;body:&nbsp;formData&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;},&nbsp;function(err,&nbsp;response,&nbsp;body)&nbsp;{&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!err&nbsp;&amp;amp;&amp;amp;&nbsp;response.statusCode&nbsp;==&nbsp;200)&nbsp;{&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;prepay_id&nbsp;=&nbsp;self.getXMLNodeValue('prepay_id',&nbsp;body.toString(\"utf-8\"))&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;tmp&nbsp;=&nbsp;prepay_id.split('[')&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;tmp1&nbsp;=&nbsp;tmp[2].split(']')&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/\u7b7e\u540d&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;_paySignjs&nbsp;=&nbsp;self.paysignjs(appid,&nbsp;nonce_str,&nbsp;'prepay_id='&nbsp;+&nbsp;tmp1[0],&nbsp;'MD5',&nbsp;timeStamp)&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;args&nbsp;=&nbsp;{&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;appId:&nbsp;appid,&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;timeStamp:&nbsp;timeStamp,&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nonceStr:&nbsp;nonce_str,&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;signType:&nbsp;\"MD5\",&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;package:&nbsp;tmp1[0],&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;paySign:&nbsp;_paySignjs&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;deferred.resolve(args)&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;console.log(body)&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;})&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;deferred.promise&nbsp;&nbsp;\r\n&nbsp;&nbsp;}\r\n}\r\n\r\n\u4e4b\u540e\u6211\u4eec\u5c01\u88c5\u4e0b\u5355\u63a5\u53e3\uff1a<\/pre>\n<p> \u767b\u5f55\u540e\u590d\u5236 <\/p>\n<pre>unifiedorder:&nbsp;function&nbsp;(req,&nbsp;res)&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;body&nbsp;=&nbsp;\"\u6d4b\u8bd5\u652f\u4ed8\"&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;openid&nbsp;=&nbsp;\"openid\"\r\n&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;total_fee&nbsp;=&nbsp;1\r\n&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;notify_url&nbsp;=&nbsp;\"http:\/\/localhost\/notify\"\r\n&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;mch_id&nbsp;=&nbsp;config.shopId\r\n&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;attach&nbsp;=&nbsp;\"\u6d4b\u8bd5\"&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;wxpay.order(attach,&nbsp;body,&nbsp;mch_id,&nbsp;openid,&nbsp;total_fee,&nbsp;notify_url)\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.then(function(data){&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;console.log('data---&amp;gt;',&nbsp;data,&nbsp;123123)\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res.json(data)\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;})&nbsp;&nbsp;\r\n&nbsp;&nbsp;},<\/pre>\n<p> \u767b\u5f55\u540e\u590d\u5236 <\/p>\n<p>\u7136\u540e\u6211\u4eec\u53ea\u9700\u8981\u5728\u5c0f\u7a0b\u5e8f\u91cc\u9762\u8c03\u7528\u8fd9\u4e2a\u63a5\u53e3\uff0c\u5c31\u4f1a\u83b7\u53d6\u5230\u6240\u6709\u7684\u652f\u4ed8\u9700\u8981\u4fe1\u606f\uff0c\u518d\u6389\u5fae\u4fe1\u652f\u4ed8\u5373\u53ef\u3002<\/p>\n<p>\u8fd9\u91cc\u8bf4\u51e0\u4e2a\u5c0f\u7a0b\u5e8f\u652f\u4ed8\u7684\u5751\uff1a<\/p>\n<p>1.\u7edf\u4e00\u4e0b\u5355\u63a5\u53e3\u662fxml\uff08\u8fd9\u4e2a\u4e0d\u53ea\u662f\u5c0f\u7a0b\u5e8f\uff0c\u516c\u4f17\u53f7\u4e5f\u662f\uff09\uff0c\u8fd4\u56de\u503c\u4e5f\u662fxml\u683c\u5f0f\u9700\u8981\u81ea\u5df1\u83b7\u53d6prepay_id,<\/p>\n<p>2.\u7b7e\u540d\u7b97\u6cd5\u8981\u5e26\u4e0akey\uff0c\u6700\u540e\u8981\u8f6c\u6362\u6210\u5927\u4e9b<\/p>\n<p>3.\u5fae\u4fe1\u652f\u4ed8\u7684sign\u7b97\u6cd5\u4e5f\u8981\u5e26\u4e0aappid\uff08\u8fd9\u4e2a\u4e0d\u79d1\u5b66\uff0c\u6df1\u5751\uff09<\/p>\n<p>4.\u7b7e\u540d\u7b97\u6cd5\u4e00\u5b9a\u4e0d\u8981\u7528json\u62fc\u63a5key<\/p>\n<p>\u3010\u76f8\u5173\u63a8\u8350\u3011<\/p>\n<p>1.&nbsp;<\/p>\n<p>2.<\/p>\n<p>3.&nbsp;<\/p>\n<p>\u4ee5\u4e0a\u5c31\u662f\u5206\u4eab\u5c0f\u7a0b\u5e8f\u652f\u4ed8\u529f\u80fd\u7684\u5b9e\u4f8b\u4ee3\u7801\u6559\u7a0b\u7684\u8be6\u7ec6\u5185\u5bb9\uff0c\u66f4\u591a\u8bf7\u5173\u6ce8\u7c73\u4e91\u5176\u5b83\u76f8\u5173\u6587\u7ae0\uff01<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u5fae\u4fe1\u5c0f\u7a0b\u5e8f\u7684\u652f\u4ed8\u548c\u5fae\u4fe1\u516c\u4f17\u53f7\u7684\u652f\u4ed8\u662f\u7c7b\u4f3c\u7684\uff0c\u5bf9\u6bd4\u8d77\u6765\u8fd8\u6bd4\u516c\u4f17\u53f7\u652f\u4ed8\u7b80\u5355\u4e86\u4e00\u4e9b\uff0c\u6211\u4eec\u53ea\u9700\u8981\u8c03\u7528\u5fae\u4fe1\u7684\u7edf\u4e00\u4e0b\u5355\u63a5\u53e3\u83b7\u53d6prepay_id\u4e4b\u540e\u6211\u4eec\u5728\u8c03\u7528\u5fae\u4fe1\u7684\u652f\u4ed8\u5373\u53ef\u3002 \u4eca\u5929\u6211\u4eec\u6765\u5c01\u88c5\u4e00\u822cnode\u7684\u652f\u4ed8\u63a5\u53e3\uff01\uff01\uff01 \u9996\u5148\u8c03\u7528\u7edf\u4e00\u4e0b\u5355\u63a5\u53e3\u6211\u4eec\u9700\u8981\u77e5\u9053\u4e00\u4e9b\u4fe1\u606f var&nbsp;bookingNo&nbsp;=&nbsp;&#8216;davdian&#8217;&nbsp;+&nbsp;this.createNonceStr()&nbsp;+&nbsp;this.createTimeStamp() &nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;deferred&nbsp;=&nbsp;Q.defer()&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;appid&nbsp;=&nbsp;config.appId&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;nonce_str&nbsp;=&nbsp;this.createNonceStr()&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;timeStamp&nbsp;=&nbsp;this.createTimeStamp()&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;url&nbsp;=&nbsp;&#8220;https:\/\/api.mch.weixin.qq.com\/pay\/unifiedorder&#8221;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;formData&nbsp;=&nbsp;&#8220;&lt;xml&gt;&#8221;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;formData&nbsp;+=&nbsp;&#8220;&lt;appid&gt;&#8221;&nbsp;+&nbsp;appid&nbsp;+&nbsp;&#8220;&lt;\/appid&gt;&#8221;&nbsp;\/\/appid&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;formData&nbsp;+=&nbsp;&#8220;&lt;attach&gt;&#8221;&nbsp;+&nbsp;attach&nbsp;+&nbsp;&#8220;&lt;\/attach&gt;&#8221;&nbsp;\/\/\u9644\u52a0\u6570\u636e&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;formData&nbsp;+=&nbsp;&#8220;&#8221;&nbsp;+&nbsp;body&nbsp;+&nbsp;&#8220;&#8221;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;formData&nbsp;+=&nbsp;&#8220;&lt;mch_id&gt;&#8221;&nbsp;+&nbsp;mch_id&nbsp;+&nbsp;&#8220;&lt;\/mch_id&gt;&#8221;&nbsp;\/\/\u5546\u6237\u53f7&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;formData&nbsp;+=&nbsp;&#8220;&lt;nonce_str&gt;&#8221;&nbsp;+&nbsp;nonce_str&nbsp;+&nbsp;&#8220;&lt;\/nonce_str&gt;&#8221;&nbsp;\/\/\u968f\u673a\u5b57\u7b26\u4e32\uff0c\u4e0d\u957f\u4e8e32\u4f4d\u3002&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;formData&nbsp;+=&nbsp;&#8220;&lt;notify_url&gt;&#8221;&nbsp;+&nbsp;notify_url&nbsp;+&nbsp;&#8220;&lt;\/notify_url&gt;&#8221;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;formData&nbsp;+=&nbsp;&#8220;&lt;openid&gt;&#8221;&nbsp;+&nbsp;openid&nbsp;+&nbsp;&#8220;&lt;\/openid&gt;&#8221;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;formData&nbsp;+=&nbsp;&#8220;&lt;out_trade_no&gt;&#8221;&nbsp;+&nbsp;bookingNo&nbsp;+&nbsp;&#8220;&lt;\/out_trade_no&gt;&#8221;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;formData&nbsp;+=&nbsp;&#8220;&lt;spbill_create_ip&gt;61.50.221.43&lt;\/spbill_create_ip&gt;&#8221;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;formData&nbsp;+=&nbsp;&#8220;&lt;total_fee&gt;&#8221;&nbsp;+&nbsp;total_fee&nbsp;+&nbsp;&#8220;&lt;\/total_fee&gt;&#8221;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;formData&nbsp;+=&nbsp;&#8220;&lt;trade_type&gt;JSAPI&lt;\/trade_type&gt;&#8221;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;formData&nbsp;+=&nbsp;&#8220;&lt;sign&gt;&#8221;&nbsp;+&nbsp;this.paysignjsapi(appid,&nbsp;attach,&nbsp;body,&nbsp;mch_id,&nbsp;nonce_str,&nbsp;notify_url,&nbsp;openid,&nbsp;bookingNo,&nbsp;&#8216;61.50.221.43&#8217;,&nbsp;total_fee,&nbsp;&#8216;JSAPI&#8217;)&nbsp;+&nbsp;&#8220;&lt;\/sign&gt;&#8221;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;formData&nbsp;+=&nbsp;&#8220;&lt;\/xml&gt;&#8221;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;self&nbsp;=&nbsp;this &nbsp;&nbsp;&nbsp;&nbsp;request({&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;url:&nbsp;url,&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;method:&nbsp;&#8216;POST&#8217;,&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;body:&nbsp;formData&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;},&nbsp;function(err,&nbsp;response,&nbsp;body)&nbsp;{&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!err&nbsp;&amp;amp;&amp;amp;&nbsp;response.statusCode&nbsp;==&nbsp;200)&nbsp;{&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;prepay_id&nbsp;=&nbsp;self.getXMLNodeValue(&#8216;prepay_id&#8217;,&nbsp;body.toString(&#8220;utf-8&#8221;))&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;tmp&nbsp;=&nbsp;prepay_id.split(&#8216;[&#8216;)&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;tmp1&nbsp;=&nbsp;tmp[2].split(&#8216;]&#8217;)&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/\u7b7e\u540d&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;_paySignjs&nbsp;=&nbsp;self.paysignjs(appid,&nbsp;nonce_str,&nbsp;&#8216;prepay_id=&#8217;&nbsp;+&nbsp;tmp1[0],&nbsp;&#8216;MD5&#8217;,&nbsp;timeStamp)&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;args&nbsp;=&nbsp;{&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;appId:&nbsp;appid,&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;timeStamp:&nbsp;timeStamp,&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nonceStr:&nbsp;nonce_str,&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;signType:&nbsp;&#8220;MD5&#8221;,&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;package:&nbsp;tmp1[0],&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;paySign:&nbsp;_paySignjs&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;deferred.resolve(args)&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;console.log(body)&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;})&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;deferred.promise \u767b\u5f55\u540e\u590d\u5236 \u8fd9\u4e2a\u662f\u4e00\u4e2a\u7edf\u4e00\u4e0b\u5355\u63a5\u53e3\u7684\u4ee3\u7801\uff0c\u6211\u4eec\u9700\u8981appid\u5c0f\u7a0b\u5e8f\u516c\u4f17\u53f7id\uff0cmch_id\u5546\u6237\u53f7id,openid\u5c0f\u7a0b\u5e8f\u7684\u552f\u4e00\u6807\u5b9e,\u652f\u4ed8\u7528\u7684\u5bc6\u7801\uff0c\u5269\u4e0b\u7684\u53c2\u6570\u90fd\u662f\u8ba2\u5355\u7684\u4fe1\u606f\u548c\u4ef7\u683c\u4e4b\u7c7b\u7684\uff0c\u672c\u4eba\u8fdbq\u6a21\u5757\u4f7f\u7528promise\uff0c\u8fd9\u4e2a\u56e0\u4eba\u800c\u5f02\uff0c\u53ef\u4ee5\u6839\u636e\u81ea\u5df1\u9700\u8981\u6765\u3002\u6211\u4eec\u9700\u8981\u8bf7\u6c42api.mch.weixin.qq.com\/pay\/unifiedorder\u63a5\u53e3 \u6ce8\u610f\uff1a\u8fd9\u91cc\u6211\u4eec\u4f20\u9012\u7684formdata\u662f\u4e00\u4e2axml\u800c\u4e0d\u662f \u7136\u540e\u6211\u4eec\u9700\u8981\u7b7e\u540d\u65b9\u6cd5\uff0c\u8fd9\u91cc\u6211\u4eec\u9700\u8981\u5c01\u88c5\u4e24\u4e2a\u65b9\u6cd5\uff0c\u4e00\u4e2a\u662f\u7b7e\u540d\u65b9\u6cd5\u8c03\u7528\u7edf\u4e00\u4e0b\u5355\u63a5\u53e3\u4f1a\u7528\u5230\uff0c\u53e6\u4e00\u4e2a\u662f\u8c03\u7528\u5c0f\u7a0b\u5e8f\u652f\u4ed8\u7528\u5230 \u7edf\u4e00\u4e0b\u5355\u63a5\u53e3sign\uff1a var&nbsp;ret&nbsp;=&nbsp;{&nbsp;&nbsp; [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[19],"tags":[],"class_list":["post-30345","post","type-post","status-publish","format-standard","hentry","category-19"],"_links":{"self":[{"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/posts\/30345","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/comments?post=30345"}],"version-history":[{"count":0,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/posts\/30345\/revisions"}],"wp:attachment":[{"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/media?parent=30345"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/categories?post=30345"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/tags?post=30345"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}