{"id":29038,"date":"2024-11-25T13:54:12","date_gmt":"2024-11-25T05:54:12","guid":{"rendered":"https:\/\/fwq.ai\/blog\/29038\/"},"modified":"2024-11-25T13:54:12","modified_gmt":"2024-11-25T05:54:12","slug":"%e5%be%ae%e4%bf%a1%e6%94%af%e4%bb%98%e7%9a%84%e5%bc%80%e5%8f%91%e6%b5%81%e7%a8%8b%e8%af%a6%e7%bb%86%e4%bb%8b%e7%bb%8d","status":"publish","type":"post","link":"https:\/\/fwq.ai\/blog\/29038\/","title":{"rendered":"\u5fae\u4fe1\u652f\u4ed8\u7684\u5f00\u53d1\u6d41\u7a0b\u8be6\u7ec6\u4ecb\u7ecd"},"content":{"rendered":"<p>\u8fd9\u7bc7\u6587\u7ae0\u4e3b\u8981\u4ecb\u7ecd\u4e86\u5fae\u4fe1\u652f\u4ed8\u7684\u5f00\u53d1\u6d41\u7a0b\u7684\u76f8\u5173\u8d44\u6599,\u9700\u8981\u7684\u670b\u53cb\u53ef\u4ee5\u53c2\u8003\u4e0b<\/p>\n<p>\u6ce8\u610f\uff0c\u6211\u4f7f\u7528\u7684\u662f\u5fae\u4fe1\u5f00\u653e\u5e73\u53f0\u7684\u652f\u4ed8\uff0c\u4e0e\u624b\u673aapp\u76f8\u5173\uff0c\u800c\u4e0e\u516c\u4f17\u8d26\u53f7\u65e0\u5173\u3002<\/p>\n<p><strong>\u5fae\u4fe1\u652f\u4ed8\u7684\u4e3b\u8981\u64cd\u4f5c\u6d41\u7a0b<\/strong><\/p>\n<p>1.\u7528\u6237\u6d4f\u89c8app\uff0c\u9009\u5b9a\u5546\u54c1\u7136\u540e\u4e0b\u5355\u3002<\/p>\n<p>2.\u670d\u52a1\u5668\u5904\u7406\u8ba2\u5355\u903b\u8f91\uff0c\u5f00\u59cb\u6b63\u5f0f\u53d1\u8d77\u652f\u4ed8\u6d41\u7a0b<\/p>\n<p>3.\u9996\u5148\uff0c\u540e\u53f0\u670d\u52a1\u5668\u5411weixin\u670d\u52a1\u5668\u53d1\u8d77\u8bf7\u6c42\uff0c\u83b7\u53d6\u4e00\u4e2atoken\u3002<\/p>\n<p>4.\u540e\u53f0\u670d\u52a1\u5668\u62ff\u5230token\uff0c\u4f7f\u7528\u548c\u5176\u4ed6\u53c2\u6570\u52a0\u5bc6\uff0c\u518d\u6b21\u5411weixin\u670d\u52a1\u5668\u53d1\u8d77\u8bf7\u6c42\uff0c\u83b7\u53d6\u4e00\u4e2a\u9884\u652f\u4ed8prepayid<\/p>\n<p>5.\u540e\u53f0\u670d\u52a1\u5668\u5c06\u8be5prepayid\u8fd4\u56de\u7ed9app\u5ba2\u6237\u7aef<\/p>\n<p>6.app\u8c03\u7528\u624b\u673a\u4e0a\u7684\u5fae\u4fe1\uff0c\u5b8c\u6210\u4ed8\u6b3e\u6d41\u7a0b\u3002<\/p>\n<p>7.app\u5411\u540e\u53f0\u670d\u52a1\u5668\u53d1\u8d77\u4e00\u4e2a\u56de\u8c03\u8bf7\u6c42\uff0c\u901a\u77e5\u670d\u52a1\u5668\u4ea4\u6613\u5b8c\u6210\u3002<\/p>\n<p>8.weixin\u670d\u52a1\u5668\u5904\u7406\u5b8c\u6240\u6709\u7684\u6d41\u7a0b\u540e\uff0c\u5411\u540e\u53f0\u670d\u52a1\u5668\u53d1\u8d77\u4e00\u4e2a\uff0c\u6b63\u5f0f\u901a\u77e5\u540e\u53f0\u670d\u52a1\u5668\u4ea4\u6613\u5b8c\u6bd5<\/p>\n<p><strong>\u4e0a\u9762\u6d41\u7a0b\u7684\u4e00\u4e9b\u6ce8\u610f\u70b9\uff1a<\/strong><\/p>\n<p>1.\u6bcf\u6b21\u83b7\u53d6\u7684token\u662f\u6709\u65f6\u6548\u7684\uff0c\u9ed8\u8ba4\u662f7200s\uff0c\u800c\u4e14\u6bcf\u5929\u6700\u591a\u83b7\u53d6200\u6b21\uff0c\u56e0\u6b64\u6700\u597d\u653e\u5230\u4e2d\u8d77\u6765\uff0c\u7b49\u5931\u6548\u540e\u518d\u53bb\u91cd\u65b0\u83b7\u53d6<\/p>\n<p>2.app\u53d1\u8d77\u7684\u56de\u8c03\u9ed8\u8ba4\u662f\u4e0d\u53ef\u9760\u7684\uff0c\u540e\u53f0\u5e94\u8be5\u5c3d\u53ef\u80fd\uff08\u4e0d\u662f\u5fc5\u987b\uff09\u5411\u5fae\u4fe1\u670d\u52a1\u5668\u53d1\u8d77\u8ba2\u5355\uff0c\u67e5\u8be2\u672c\u6b21\u4ea4\u6613\u7684\u7ed3\u679c\u3002<\/p>\n<p>3.weixin\u670d\u52a1\u5668\u5411\u540e\u53f0\u53d1\u8d77\u7684noty\uff0c\u624d\u662f\u786e\u4fdd\u4ea4\u6613\u5b8c\u6210\u7684\u6700\u540e\u5c4f\u969c\u3002\u540e\u53f0\u670d\u52a1\u5668\u786e\u8ba4\u540e\u5fc5\u987b\u8fd4\u56de\u201csuccess\u201d\uff0c\u5426\u5219weixin\u670d\u52a1\u5668\u4f1a\u5c1d\u8bd5\u91cd\u53d1\u8bf7\u6c42\u3002<\/p>\n<p><strong>\u83b7\u53d6token<\/strong><\/p>\n<p>\u8fd9\u6b65\u5f88\u7b80\u5355\uff0c\u53d1\u9001\u4e00\u4e2aget\u8bf7\u6c42\u5373\u53ef\u3002\u53ea\u9700\u914d\u7f6e\u6b63\u786e\u53c2\u6570\u3002<\/p>\n<\/p>\n<pre>\u2018\u2018\u2018\u4ece\u5fae\u4fe1\u670d\u52a1\u5668\u83b7\u53d6token\u2018\u2018\u2018\r\n&nbsp;&nbsp;def&nbsp;_getAccessTokenFromWeixin(self):\r\n&nbsp;&nbsp;&nbsp;&nbsp;response&nbsp;=&nbsp;requests.get(self.tokenUrl&nbsp;%&nbsp;(self.appId,&nbsp;self.appSecret))\r\n&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;response.status_code&nbsp;==&nbsp;200:\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;text&nbsp;=&nbsp;response.text\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tokenInfo&nbsp;=&nbsp;json.loads(text)\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try:\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;token&nbsp;=&nbsp;tokenInfo[\u2018access_token\u2018]\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;expires_in&nbsp;=&nbsp;tokenInfo[\u2018expires_in\u2018]\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self._writeWeixinTokenLog(token,&nbsp;self.order_no)\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;token\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;except&nbsp;KeyError:\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;None&nbsp;#token\u83b7\u53d6\u5931\u8d25\r\n&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;None&nbsp;#http\u8bf7\u6c42\u5931\u8d25<\/pre>\n<p> \u767b\u5f55\u540e\u590d\u5236 <\/p>\n<p><strong>\u83b7\u53d6prepayid<\/strong><\/p>\n<p>\u5728\u5fae\u4fe1\u652f\u4ed8\u7684\u5f00\u53d1\u6d41\u7a0b\u4e2d\uff0c\u6700\u7e41\u7410\u7684\u5c31\u662f\u83b7\u53d6prepayid\u3002<\/p>\n<p>\u8fd9\u4e00\u6b65\u6211\u4eec\u9700\u8981\u7ec4\u88c5\u8fd9\u6837\u4e00\u4e2a\u53c2\u6570\uff1a<\/p>\n<\/p>\n<pre>{\r\n\"appid\":\"wxd930ea5d5a258f4f\",\r\n\"traceid\":\"test_1399514976\",\r\n\"noncestr\":\"e7d161ac8d8a76529d39d9f5b4249ccb&nbsp;\",\r\n\"timestamp\":1399514976,&nbsp;\"package\":\"bank_type=WX&amp;amp;body=%E6%94%AF%E4%BB%98%E6%B5%8B%E8%AF%\r\n95&amp;amp;fee_type=1&amp;amp;input_charset=UTF-8&amp;amp;notify_url=http%3A%2F%2Fweixin.qq.com&amp;amp;out_trade_&nbsp;no=7240b65810859cbf2a8d9f76a638c0a3&amp;amp;partner=1900000109&amp;amp;spbill_create_ip=196.168.1.1&amp;amp;&nbsp;total_fee=1&amp;amp;sign=7F77B507B755B3262884291517E380F8\",\r\n\"sign_method\":\"sha1\",&nbsp;\"app_signature\":\"7f77b507b755b3262884291517e380f8\"\r\n}<\/pre>\n<p> \u767b\u5f55\u540e\u590d\u5236 <\/p>\n<p><strong>\u7ec4\u88c5package<\/strong><\/p>\n<p>\u8fd9\u91cc\u7684\u7b2c\u4e00\u6b65\u5c31\u662f\u7ec4\u88c5package\uff1a<\/p>\n<\/p>\n<pre>\"package\":\"bank_type=WX&amp;amp;body=%E6%94%AF%E4%BB%98%E6%B5%8B%E8%AF%\r\n95&amp;amp;fee_type=1&amp;amp;input_charset=UTF-8&amp;amp;notify_url=http%3A%2F%2Fweixin.qq.com&amp;amp;out_trade_&nbsp;no=7240b65810859cbf2a8d9f76a638c0a3&amp;amp;partner=1900000109&amp;amp;spbill_create_ip=196.168.1.1&amp;amp;&nbsp;total_fee=1&amp;amp;sign=7F77B507B755B3262884291517E380F8\",<\/pre>\n<p> \u767b\u5f55\u540e\u590d\u5236 <\/p>\n<p>\u7ec4\u88c5package\u9700\u8981\u7684\u53c2\u6570\u5982\u4e0a\u9762\u4ee3\u7801\u6240\u793a\uff0c\u6240\u4ee5\u6211\u4eec\u9700\u8981\u51c6\u5907\u4e00\u4e2aparams\uff0c\u7136\u540e\u51c6\u5907\u7b7e\u540d\uff0c\u7b7e\u540d\u6d41\u7a0b\u5982\u4e0b\uff1a<\/p>\n<p>1.\u6309\u7167key\u7684\u5b57\u5178\u5e8f\uff0c\u5bf9params\u8fdb\u884c\u6392\u5e8f\uff0c\u7136\u540e\u62fc\u63a5\u6210\uff0c\u6ce8\u610f\u8fd9\u4e9bkey\u4e0d\u5305\u62ecsign<\/p>\n<p>2.\u5728\u4e0a\u9762\u7684\u5b57\u7b26\u4e32\u540e\u9762\u62fc\u63a5key=paternerKey\uff0c\u7136\u540e\u5bf9\u6574\u4e2a\u5b57\u7b26\u4e32\u8fdb\u884c\u7b7e\u540d\uff0c\u7136\u540e\u8f6c\u6362\u6210\u5927\u5199\uff0c\u6b64\u65f6\u6211\u4eec\u5c31\u5f97\u5230\u4e86\u7b7e\u540d<\/p>\n<p>\u7136\u540e\u6211\u4eec\u5c06\u6240\u6709params\u7684value\u8fdb\u884curlencode\u8f6c\u7801\uff0c\u7136\u540e\u540e\u9762\u62fc\u63a5\u4e0asign=signValue\uff0c\u5c31\u5f97\u5230\u4e86package\u5b57\u7b26\u4e32\u3002<\/p>\n<p>\u8fd9\u91cc\u521b\u5efaMD5\u7684\u8fc7\u5982\u4e0b\uff1a<\/p>\n<\/p>\n<pre>def&nbsp;createMD5Signature(self,&nbsp;signParams):\r\n&nbsp;&nbsp;&nbsp;&nbsp;\u2018\u2018\u2018\u5148\u6392\u5e8f\u2018\u2018\u2018\r\n&nbsp;&nbsp;&nbsp;&nbsp;sortedParams&nbsp;=&nbsp;sorted(signParams.iteritems(),&nbsp;key=lambda&nbsp;d:d[0])\r\n&nbsp;&nbsp;&nbsp;&nbsp;\u2018\u2018\u2018\u62fc\u63a5\u2018\u2018\u2018&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;stringSignTemp&nbsp;=&nbsp;\"&amp;amp;\".join([\"%s=%s\"&nbsp;%&nbsp;(item[0],&nbsp;item[1])&nbsp;for&nbsp;item&nbsp;in&nbsp;sortedParams&nbsp;if&nbsp;item[0]&nbsp;!=&nbsp;\u2018sign\u2018&nbsp;and&nbsp;\u2018\u2018&nbsp;!=&nbsp;item[1]])\r\n&nbsp;&nbsp;&nbsp;&nbsp;#\u52a0\u4e0a\u8d22\u4ed8\u901a\u5546\u6237\u6743\u9650\u5bc6\u94a5\r\n&nbsp;&nbsp;&nbsp;&nbsp;stringSignTemp&nbsp;+=&nbsp;\u2018&amp;amp;key=%s\u2018&nbsp;%&nbsp;(self.partnerKey)\r\n&nbsp;&nbsp;&nbsp;&nbsp;#\u4f7f\u7528MD5\u8fdb\u884c\u7b7e\u540d\uff0c\u7136\u540e\u8f6c\u5316\u4e3a\u5927\u5199\r\n&nbsp;&nbsp;&nbsp;&nbsp;stringSign&nbsp;=&nbsp;hashlib.md5(stringSignTemp).hexdigest().upper()&nbsp;&nbsp;#Upper\r\n&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;stringSign<\/pre>\n<p> \u767b\u5f55\u540e\u590d\u5236 <\/p>\n<p>\u7ec4\u88c5package\u7684\u4ee3\u7801\uff1a<\/p>\n<\/p>\n<pre>def&nbsp;getPackage(self,&nbsp;packageParams):\r\n&nbsp;&nbsp;&nbsp;&nbsp;\u2018\u2018\u2018\u5148\u83b7\u53d6params\u7684sign\uff0c\u7136\u540e\u5c06params\u8fdb\u884curlencode\uff0c\u6700\u540e\u62fc\u63a5\uff0c\u52a0\u4e0asign\u2018\u2018\u2018\r\n&nbsp;&nbsp;&nbsp;&nbsp;sign&nbsp;=&nbsp;self.createMD5Signature(packageParams)\r\n&nbsp;&nbsp;&nbsp;&nbsp;packageParams&nbsp;=&nbsp;sorted(packageParams.iteritems(),&nbsp;key=lambda&nbsp;d:d[0])\r\n&nbsp;&nbsp;&nbsp;&nbsp;stringParams&nbsp;=&nbsp;\"&amp;amp;\".join([\"%s=%s\"&nbsp;%&nbsp;(item[0],&nbsp;urllib.quote(str(item[1])))&nbsp;for&nbsp;item&nbsp;in&nbsp;packageParams])\r\n&nbsp;&nbsp;&nbsp;&nbsp;stringParams&nbsp;+=&nbsp;\u2018&amp;amp;sign=%s\u2018&nbsp;%&nbsp;(sign)\r\n&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;stringParams<\/pre>\n<p> \u767b\u5f55\u540e\u590d\u5236 <\/p>\n<p><strong>\u7ee7\u7eed\u7ec4\u88c5\u53c2\u6570<\/strong><\/p>\n<p>\u5f97\u5230package\u540e\uff0c\u6211\u4eec\u7ee7\u7eed\u7ec4\u88c5\u53c2\u6570\uff1a<\/p>\n<p>\u8fd9\u91cc\u9700\u8981\u7684\u53c2\u6570\u4e3a\uff1a<\/p>\n<\/p>\n<pre>appid=wxd930ea5d5a258f4f\r\nappkey=L8LrMqqeGRxST5reouB0K66CaY&nbsp;A&nbsp;WpqhA&nbsp;Vsq7ggKkxHCOastWksvuX1uvmvQcl&nbsp;xaHoYd3ElNBrNO2DHnnzgfVG9Qs473M3DTOZug5er46FhuGofumV8H2FVR9qkjSlC5K\r\nnoncestr=e7d161ac8d8a76529d39d9f5b4249ccb\r\npackage=bank_type=WX&amp;amp;body=%E6%94%AF%E4%BB%98%E6%B5%8B%E8%AF%95&nbsp;&amp;amp;fee_type=1&amp;amp;input_charset=UTF-8&amp;amp;notify_url=http%3A%2F%2Fweixin.qq.com&amp;amp;out_trade_no&nbsp;=7240b65810859cbf2a8d9f76a638c0a3&amp;amp;partner=1900000109&amp;amp;spbill_create_ip=196.168.1.1&amp;amp;tot&nbsp;al_fee=1&amp;amp;sign=7F77B507B755B3262884291517E380F8\r\ntimestamp=1399514976<\/pre>\n<p> \u767b\u5f55\u540e\u590d\u5236 <\/p>\n<p>traceid=test_1399514976<\/p>\n<p>\u6ce8\u610f\u8fd9\u91cc\u6709\u4e2a\u5751\uff1a<\/p>\n<p>\u53c2\u4e0e\u7b7e\u540d\u7684\u662f\u4e0a\u9762\u7684\u53c2\u6570<span style=\"color: #ff0000\">\uff0c\u4f46\u662f\u6700\u540e\u7684\u53c2\u6570\u4e2d\u4e0d\u5305\u62ecappKey\uff0c\u7b7e\u540d\u540e\u8981\u8bb0\u5f97\u3002<\/span><\/p>\n<p>1.\u6240\u6709\u53c2\u6570\u6309\u7167\u5b57\u5178\u5e8f\u6392\u5e8f\uff0c\u7136\u540e\u62fc\u63a5<\/p>\n<p>2.\u8fdb\u884csha1\u7b7e\u540d\uff0c\u62fc\u63a5\u5230\u4e0a\u9762\u5b57\u7b26\u4e32\u7684\u540e\u9762<\/p>\n<p>3.\u6ce8\u610f\u8fd9\u91cc\u8981\u5220\u9664appKey\uff0c\u7136\u540e\u52a0\u4e0asign<\/p>\n<p>\u83b7\u53d6sha1\u7b7e\u540d\u7684\u4ee3\u7801\u5982\u4e0b\uff1a<\/p>\n<\/p>\n<pre>def&nbsp;createSHA1Signature(self,&nbsp;params):\r\n&nbsp;&nbsp;&nbsp;&nbsp;\u2018\u2018\u2018\u5148\u6392\u5e8f\uff0c\u7136\u540e\u62fc\u63a5\u2018\u2018\u2018\r\n&nbsp;&nbsp;&nbsp;&nbsp;sortedParams&nbsp;=&nbsp;sorted(params.iteritems(),&nbsp;key=lambda&nbsp;d:d[0])&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;stringSignTemp&nbsp;=&nbsp;\"&amp;amp;\".join([\"%s=%s\"&nbsp;%&nbsp;(item[0],&nbsp;item[1])&nbsp;for&nbsp;item&nbsp;in&nbsp;sortedParams])\r\n&nbsp;&nbsp;&nbsp;&nbsp;stringSign&nbsp;=&nbsp;hashlib.sha1(stringSignTemp).hexdigest()\r\n&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;stringSign<\/pre>\n<p> \u767b\u5f55\u540e\u590d\u5236 <\/p>\n<p>\u968f\u540e\u6211\u4eec\u83b7\u53d6\u5230\u8fd9\u6837\u7684\u53c2\u6570\uff1a<\/p>\n<\/p>\n<pre>{\r\n\"appid\":\"wxd930ea5d5a258f4f\",&nbsp;\r\n\"noncestr\":\"e7d161ac8d8a76529d39d9f5b4249ccb\",&nbsp;\r\n\"package\":\"Sign=WXpay\";\r\n\"partnerid\":\"1900000109\"&nbsp;\r\n\"prepayid\":\"1101000000140429eb40476f8896f4c9\",&nbsp;\r\n\"sign\":\"7ffecb600d7157c5aa49810d2d8f28bc2811827b\",&nbsp;\r\n\"timestamp\":\"1399514976\"\r\n}<\/pre>\n<p> \u767b\u5f55\u540e\u590d\u5236 \u767b\u5f55\u540e\u590d\u5236 <\/p>\n<p>\u83b7\u53d6prepayid<\/p>\n<p>\u4ee3\u7801\u5982\u4e0b\uff1a<\/p>\n<\/p>\n<pre>\u2018\u2018\u2018\u83b7\u53d6\u9884\u652f\u4ed8prepayid\u2018\u2018\u2018\r\n&nbsp;&nbsp;def&nbsp;gerPrepayId(self,&nbsp;token,&nbsp;requestParams):\r\n&nbsp;&nbsp;&nbsp;&nbsp;\u2018\u2018\u2018\u5c06\u53c2\u6570\uff0c\u5305\u62ecpackage\uff0c\u8fdb\u884cjson\u5316\uff0c\u7136\u540e\u53d1\u8d77post\u8bf7\u6c42\u2018\u2018\u2018\r\n&nbsp;&nbsp;&nbsp;&nbsp;data&nbsp;=&nbsp;json.dumps(requestParams)\r\n&nbsp;&nbsp;&nbsp;&nbsp;response&nbsp;=&nbsp;requests.post(self.gateUrl&nbsp;%&nbsp;(token),&nbsp;data=data)\r\n&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;response.status_code&nbsp;==&nbsp;200:\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;text&nbsp;=&nbsp;response.text\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;text&nbsp;=&nbsp;json.loads(text)\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;errcode&nbsp;=&nbsp;text[\u2018errcode\u2018]\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;errcode&nbsp;==&nbsp;0:\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;text[\u2018prepayid\u2018]\r\n&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;None<\/pre>\n<p> \u767b\u5f55\u540e\u590d\u5236 <\/p>\n<p>\u6211\u4eec\u83b7\u53d6\u7684prepayid\u683c\u5f0f\u5e94\u8be5\u662f\u8fd9\u6837\uff1a<\/p>\n<p>{&#8220;prepayid&#8221;:&#8221;1101000000140429eb40476f8896f4c9&#8243;,&#8221;errcode&#8221;:0,&#8221;errmsg&#8221;:&#8221;Success&#8221;}&nbsp;<\/p>\n<p><strong>\u518d\u6b21\u7b7e\u540d<\/strong><\/p>\n<p>\u8fd9\u91cc\u91c7\u7528\u4e0a\u9762sha1\u7684\u7b7e\u540d\u65b9\u5f0f\u518d\u6b21\u7b7e\u540d\uff0c\u83b7\u53d6\u5230\u4e0b\u9762\u7684\u53c2\u6570\uff1a<\/p>\n<\/p>\n<pre>{\r\n\"appid\":\"wxd930ea5d5a258f4f\",&nbsp;\r\n\"noncestr\":\"e7d161ac8d8a76529d39d9f5b4249ccb\",&nbsp;\r\n\"package\":\"Sign=WXpay\";\r\n\"partnerid\":\"1900000109\"&nbsp;\r\n\"prepayid\":\"1101000000140429eb40476f8896f4c9\",&nbsp;\r\n\"sign\":\"7ffecb600d7157c5aa49810d2d8f28bc2811827b\",&nbsp;\r\n\"timestamp\":\"1399514976\"\r\n}<\/pre>\n<p> \u767b\u5f55\u540e\u590d\u5236 \u767b\u5f55\u540e\u590d\u5236 <\/p>\n<p>\u540e\u53f0\u670d\u52a1\u5668\u5c06\u8be5\u7ed3\u679c\u8fd4\u56de\u7ed9app\uff0c\u6b64\u65f6app\u5373\u53ef\u53d1\u8d77\u652f\u4ed8\u3002<\/p>\n<p>\u4e0a\u9762\u7684\u6d41\u7a0b\u4ee3\u7801\u4e3a\uff1a<\/p>\n<\/p>\n<pre>\u2018\u2018\u2018\u63a5\u6536app\u7684\u8bf7\u6c42\uff0c\u8fd4\u56deprepayid\u2018\u2018\u2018\r\nclass&nbsp;WeixinRequirePrePaidHandler(BasicTemplateHandler):\r\n\r\n&nbsp;&nbsp;\u2018\u2018\u2018\u8fd9\u4e2a\u65b9\u6cd5\u5728OrdersAddHandler\u4e2d\u88ab\u8c03\u7528\u2018\u2018\u2018\r\n&nbsp;&nbsp;@staticmethod\r\n&nbsp;&nbsp;def&nbsp;getPrePaidResult(order_no,&nbsp;total_pay,&nbsp;product_name,&nbsp;client_ip):\r\n&nbsp;&nbsp;&nbsp;&nbsp;\u2018\u2018\u2018\u5c01\u88c5\u4e86\u5e38\u7528\u7684\u7b7e\u540d\u7b97\u6cd5\u2018\u2018\u2018\r\n&nbsp;&nbsp;&nbsp;&nbsp;weixinRequestHandler&nbsp;=&nbsp;WeixinRequestHandler(order_no)\r\n&nbsp;&nbsp;&nbsp;&nbsp;\u2018\u2018\u2018\u6536\u96c6\u8ba2\u5355\u76f8\u5173\u4fe1\u606f\u2018\u2018\u2018\r\n&nbsp;&nbsp;&nbsp;&nbsp;addtion&nbsp;=&nbsp;str(random.randint(10,&nbsp;100))&nbsp;#\u4ea7\u751f\u4e00\u4e2a\u4e24\u4f4d\u7684\u6570\u5b57\uff0c\u62fc\u63a5\u5728\u8ba2\u5355\u53f7\u7684\u540e\u9762\r\n&nbsp;&nbsp;&nbsp;&nbsp;out_trade_no&nbsp;=&nbsp;str(order_no)&nbsp;+&nbsp;addtion\r\n&nbsp;&nbsp;&nbsp;&nbsp;order_price&nbsp;=&nbsp;float(total_pay)&nbsp;#\u8fd9\u91cc\u5fc5\u987b\u5141\u8bb8\u6d6e\u70b9\u6570\uff0c\u540e\u9762\u8f6c\u5316\u6210\u5206\u4e4b\u540e\u8f6c\u5316\u4e3aint\r\n&nbsp;&nbsp;&nbsp;&nbsp;#order_price&nbsp;=&nbsp;0.01&nbsp;#\u6d4b\u8bd5\r\n&nbsp;&nbsp;&nbsp;&nbsp;remote_addr&nbsp;=&nbsp;client_ip&nbsp;#\u5ba2\u6237\u7aef\u7684IP\u5730\u5740\r\n&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;remote_addr\r\n&nbsp;&nbsp;&nbsp;&nbsp;current_time&nbsp;=&nbsp;int(time.time())\r\n&nbsp;&nbsp;&nbsp;&nbsp;order_create_time&nbsp;=&nbsp;str(current_time)\r\n&nbsp;&nbsp;&nbsp;&nbsp;order_deadline&nbsp;=&nbsp;str(current_time&nbsp;+&nbsp;20*60)\r\n\r\n&nbsp;&nbsp;&nbsp;&nbsp;\u2018\u2018\u2018\u8fd9\u91cc\u7684\u4e00\u4e9b\u53c2\u6570\u4f9b\u4e0b\u9762\u4f7f\u7528\u2018\u2018\u2018\r\n&nbsp;&nbsp;&nbsp;&nbsp;noncestr&nbsp;=&nbsp;hashlib.md5(str(random.random())).hexdigest()\r\n&nbsp;&nbsp;&nbsp;&nbsp;timestamp&nbsp;=&nbsp;str(int(time.time()))\r\n&nbsp;&nbsp;&nbsp;&nbsp;pack&nbsp;=&nbsp;\u2018Sign=WXPay\u2018\r\n\r\n&nbsp;&nbsp;&nbsp;&nbsp;\u2018\u2018\u2018\u83b7\u53d6token\u2018\u2018\u2018\r\n&nbsp;&nbsp;&nbsp;&nbsp;access_token&nbsp;=&nbsp;weixinRequestHandler.getAccessToken()\r\n&nbsp;&nbsp;&nbsp;&nbsp;logging.info(\"get&nbsp;token:&nbsp;%s\"&nbsp;%&nbsp;access_token)\r\n&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;access_token:\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\u2018\u2018\u2018\u8bbe\u7f6epackage\u53c2\u6570\u2018\u2018\u2018\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;packageParams&nbsp;=&nbsp;{}\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;packageParams[\u2018bank_type\u2018]&nbsp;=&nbsp;\u2018WX\u2018&nbsp;&nbsp;#\u652f\u4ed8\u7c7b\u578b\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;packageParams[\u2018body\u2018]&nbsp;=&nbsp;product_name&nbsp;#\u5546\u54c1\u540d\u79f0\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;packageParams[\u2018fee_type\u2018]&nbsp;=&nbsp;\u20181\u2018&nbsp;&nbsp;&nbsp;#\u4eba\u6c11\u5e01&nbsp;fen\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;packageParams[\u2018input_charset\u2018]&nbsp;=&nbsp;\u2018GBK\u2018&nbsp;#GBK\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;packageParams[\u2018notify_url\u2018]&nbsp;=&nbsp;config[\u2018notify_url\u2018]&nbsp;#post\u5f02\u6b65\u6d88\u606f\u901a\u77e5\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;packageParams[\u2018out_trade_no\u2018]&nbsp;=&nbsp;str(out_trade_no)&nbsp;#\u8ba2\u5355\u53f7\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;packageParams[\u2018partner\u2018]&nbsp;=&nbsp;config[\u2018partnerId\u2018]&nbsp;#\u5546\u6237\u53f7\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;packageParams[\u2018total_fee\u2018]&nbsp;=&nbsp;str(int(order_price*100))&nbsp;&nbsp;#\u8ba2\u5355\u91d1\u989d,\u5355\u4f4d\u662f\u5206\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;packageParams[\u2018spbill_create_ip\u2018]&nbsp;=&nbsp;remote_addr&nbsp;#IP\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;packageParams[\u2018time_start\u2018]&nbsp;=&nbsp;order_create_time&nbsp;#\u8ba2\u5355\u751f\u6210\u65f6\u95f4\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;packageParams[\u2018time_expire\u2018]&nbsp;=&nbsp;order_deadline&nbsp;#\u8ba2\u5355\u5931\u6548\u65f6\u95f4\r\n\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\u2018\u2018\u2018\u83b7\u53d6package\u2018\u2018\u2018\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;package&nbsp;=&nbsp;weixinRequestHandler.getPackage(packageParams)\r\n\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\u2018\u2018\u2018\u8bbe\u7f6e\u652f\u4ed8\u53c2\u6570\u2018\u2018\u2018\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;signParams&nbsp;=&nbsp;{}\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;signParams[\u2018appid\u2018]&nbsp;=&nbsp;config[\u2018appId\u2018]\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;signParams[\u2018appkey\u2018]&nbsp;=&nbsp;config[\u2018paySignKey\u2018]&nbsp;#delete\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;signParams[\u2018noncestr\u2018]&nbsp;=&nbsp;noncestr\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;signParams[\u2018package\u2018]&nbsp;=&nbsp;package\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;signParams[\u2018timestamp\u2018]&nbsp;=&nbsp;timestamp\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;signParams[\u2018traceid\u2018]&nbsp;=&nbsp;\u2018mytraceid_001\u2018\r\n\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\u2018\u2018\u2018\u751f\u6210\u652f\u4ed8\u7b7e\u540d\u2018\u2018\u2018\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;app_signature&nbsp;=&nbsp;weixinRequestHandler.createSHA1Signature(signParams)\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\u2018\u2018\u2018\u589e\u52a0\u4e0d\u53c2\u4e0e\u7b7e\u540d\u7684\u989d\u5916\u53c2\u6570\u2018\u2018\u2018\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;signParams[\u2018sign_method\u2018]&nbsp;=&nbsp;\u2018sha1\u2018\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;signParams[\u2018app_signature\u2018]&nbsp;=&nbsp;app_signature\r\n\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\u2018\u2018\u2018\u5254\u9664appKey\u2018\u2018\u2018\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;del&nbsp;signParams[\u2018appkey\u2018]\r\n\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\u2018\u2018\u2018\u83b7\u53d6prepayid\u2018\u2018\u2018\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;prepayid&nbsp;=&nbsp;weixinRequestHandler.gerPrepayId(access_token,&nbsp;signParams)\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;prepayid:\r\n\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\u2018\u2018\u2018\u4f7f\u7528\u62ff\u5230\u7684prepayid\u518d\u6b21\u51c6\u5907\u7b7e\u540d\u2018\u2018\u2018\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pack&nbsp;=&nbsp;\u2018sign=WXPay\u2018\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;prepayParams&nbsp;=&nbsp;{}\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;prepayParams[\u2018appid\u2018]&nbsp;=&nbsp;config[\u2018appId\u2018]\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;prepayParams[\u2018appkey\u2018]&nbsp;=&nbsp;config[\u2018paySignKey\u2018]\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;prepayParams[\u2018noncestr\u2018]&nbsp;=&nbsp;noncestr\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;prepayParams[\u2018package\u2018]&nbsp;=&nbsp;pack\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;prepayParams[\u2018partnerid\u2018]&nbsp;=&nbsp;config[\u2018partnerId\u2018]\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;prepayParams[\u2018prepayid\u2018]&nbsp;=&nbsp;prepayid\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;prepayParams[\u2018timestamp\u2018]&nbsp;=&nbsp;timestamp\r\n\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\u2018\u2018\u2018\u751f\u6210\u7b7e\u540d\u2018\u2018\u2018\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sign&nbsp;=&nbsp;weixinRequestHandler.createSHA1Signature(prepayParams)\r\n\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\u2018\u2018\u2018\u51c6\u5907\u8f93\u51fa\u53c2\u6570\u2018\u2018\u2018\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;returnParams&nbsp;=&nbsp;{}\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;returnParams[\u2018status\u2018]&nbsp;=&nbsp;0\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;returnParams[\u2018retmsg\u2018]&nbsp;=&nbsp;\u2018success\u2018\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;returnParams[\u2018appid\u2018]&nbsp;=&nbsp;config[\u2018appId\u2018]\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;returnParams[\u2018noncestr\u2018]&nbsp;=&nbsp;noncestr\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;returnParams[\u2018package\u2018]&nbsp;=&nbsp;pack\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;returnParams[\u2018prepayid\u2018]&nbsp;=&nbsp;prepayid\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;returnParams[\u2018timestamp\u2018]&nbsp;=&nbsp;timestamp\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;returnParams[\u2018sign\u2018]&nbsp;=&nbsp;sign\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;returnParams[\u2018partnerId\u2018]&nbsp;=&nbsp;config[\u2018partnerId\u2018]\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;returnParams[\u2018addtion\u2018]&nbsp;=&nbsp;addtion\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else:\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\u2018\u2018\u2018prepayid\u83b7\u53d6\u5931\u8d25\u2018\u2018\u2018\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;returnParams&nbsp;=&nbsp;{}\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;returnParams[\u2018status\u2018]&nbsp;=&nbsp;-1\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;returnParams[\u2018retmsg\u2018]&nbsp;=&nbsp;\u2018prepayid\u83b7\u53d6\u5931\u8d25\u2018\r\n&nbsp;&nbsp;&nbsp;&nbsp;else:&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\u2018\u2018\u2018token\u83b7\u53d6\u5931\u8d25\u2018\u2018\u2018\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;returnParams&nbsp;=&nbsp;{}\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;returnParams[\u2018status\u2018]&nbsp;=&nbsp;-1\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;returnParams[\u2018retmsg\u2018]&nbsp;=&nbsp;\u2018token\u83b7\u53d6\u5931\u8d25\u2018\r\n\r\n&nbsp;&nbsp;&nbsp;&nbsp;\u2018\u2018\u2018\u751f\u6210json\u683c\u5f0f\u6587\u672c\uff0c\u7136\u540e\u8fd4\u56de\u7ed9APP\u2018\u2018\u2018\r\n&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;returnParams<\/pre>\n<p> \u767b\u5f55\u540e\u590d\u5236 <\/p>\n<p><strong>\u540e\u53f0\u5f02\u6b65\u901a\u77e5<\/strong><\/p>\n<p>\u5fae\u4fe1\u670d\u52a1\u5668\u53d1\u6765\u7684notify\u5f02\u6b65\u901a\u77e5\uff0c\u624d\u662f\u652f\u4ed8\u6210\u529f\u7684\u6700\u7ec8\u6807\u5fd7\uff0c\u8fd9\u4e00\u6b65\u5904\u4e8e\u8d77\u89c1\uff0c\u6211\u4eec\u5fc5\u987b\u8fdb\u884c\u5ef6\u7b7e\uff1a<\/p>\n<p>\u5ef6\u7b7e\u4ee3\u7801\u5982\u4e0b\uff1a<\/p>\n<\/p>\n<pre>def&nbsp;isTenpaySign(self,&nbsp;params):\r\n&nbsp;&nbsp;&nbsp;&nbsp;helper&nbsp;=&nbsp;WeixinRequestHandler()\r\n&nbsp;&nbsp;&nbsp;&nbsp;sign&nbsp;=&nbsp;helper.createMD5Signature(params)\r\n&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;params[\u2018sign\u2018]&nbsp;==&nbsp;sign<\/pre>\n<p> \u767b\u5f55\u540e\u590d\u5236 <\/p>\n<p>\u6574\u4f53\u6d41\u7a0b\u5982\u4e0b\uff1a<\/p>\n<\/p>\n<pre>\u2018\u2018\u2018\u5fae\u4fe1\u670d\u52a1\u5668\u5411\u540e\u53f0\u53d1\u9001\u7684\u5f02\u6b65\u901a\u77e5\u2018\u2018\u2018\r\nclass&nbsp;WeixinAppNotifyHandler(BasicTemplateHandler):\r\n&nbsp;&nbsp;def&nbsp;initialize(self):\r\n&nbsp;&nbsp;&nbsp;&nbsp;self.weixinResponseHandler&nbsp;=&nbsp;WeixinResponseHandler()\r\n\r\n&nbsp;&nbsp;def&nbsp;post(self):\r\n&nbsp;&nbsp;&nbsp;&nbsp;\u2018\u2018\u2018\u89e3\u6790\u53c2\u6570\u2018\u2018\u2018\r\n&nbsp;&nbsp;&nbsp;&nbsp;params&nbsp;=&nbsp;self.parseQueryString()\r\n\r\n&nbsp;&nbsp;&nbsp;&nbsp;\u2018\u2018\u2018\u9a8c\u8bc1\u662f\u5426\u662fweixin\u670d\u52a1\u5668\u53d1\u56de\u7684\u6d88\u606f\u2018\u2018\u2018\r\n&nbsp;&nbsp;&nbsp;&nbsp;verifyWeixinSign&nbsp;=&nbsp;self.weixinResponseHandler.isTenpaySign(params)\r\n&nbsp;&nbsp;&nbsp;&nbsp;\u2018\u2018\u2018\u5904\u7406\u8ba2\u5355\u2018\u2018\u2018\r\n&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;verifyWeixinSign:\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\u2018\u2018\u2018\u8ba2\u5355\u903b\u8f91\u2018\u2018\u2018\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;order_no&nbsp;=&nbsp;str(params[\u2018out_trade_no\u2018])\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;order_no&nbsp;=&nbsp;order_no[0:-2]\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;\u2018%s&nbsp;paied&nbsp;successfully\u2018&nbsp;%&nbsp;order_no\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.saveWeixinReceipt(params)\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;updateOrdersPaidByWeixin(order_no)&nbsp;#\u66f4\u65b0\u8ba2\u5355\u4f7f\u7528\u72b6\u6001\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;consumeCouponByOrderNo(order_no)&nbsp;#\u4f18\u60e0\u5238\u5df2\u7ecf\u4f7f\u7528\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.write(\"success\")\r\n&nbsp;&nbsp;&nbsp;&nbsp;else:\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.write(\"fail\")\r\n\r\n&nbsp;&nbsp;def&nbsp;parseQueryString(self):\r\n&nbsp;&nbsp;&nbsp;&nbsp;\u2018\u2018\u2018\u83b7\u53d6url\u4e2d\u6240\u6709\u7684\u53c2\u6570\u2018\u2018\u2018\r\n&nbsp;&nbsp;&nbsp;&nbsp;uri&nbsp;=&nbsp;self.request.uri\r\n&nbsp;&nbsp;&nbsp;&nbsp;\u2018\u2018\u2018\u89e3\u6790\u51faURI\u4e2d\u7684query\u5b57\u7b26\u4e32\u2018\u2018\u2018\r\n&nbsp;&nbsp;&nbsp;&nbsp;parseResult&nbsp;=&nbsp;urlparse.urlparse(uri)&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;query&nbsp;=&nbsp;parseResult.query\r\n&nbsp;&nbsp;&nbsp;&nbsp;\u2018\u2018\u2018\u89e3\u6790query\u5b57\u7b26\u4e32\u2018\u2018\u2018\r\n&nbsp;&nbsp;&nbsp;&nbsp;params&nbsp;=&nbsp;urlparse.parse_qs(query)\r\n&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;item&nbsp;in&nbsp;params:\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;params[item]&nbsp;=&nbsp;params[item][0].strip()\r\n&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;params<\/pre>\n<p> \u767b\u5f55\u540e\u590d\u5236 <\/p>\n<p>\u6700\u540e\u8bf4\u660e\u4e00\u70b9\uff0c\u7528\u6237\u5728\u624b\u673a\u4e0a\u4ed8\u5b8c\u6b3e\uff0c\u5e76\u4e0d\u7b97\u652f\u4ed8\u6210\u529f\uff0c\u53ea\u6709weixin\u670d\u52a1\u5668\u6536\u5230notify\u901a\u77e5\u8fd4\u56de\u7684success\u65f6\uff0c\u624d\u7b97\u4ea4\u6613\u6700\u7ec8\u6210\u529f\uff0c\u6b64\u65f6\u6211\u4eec\u7684\u624b\u673a\u53ef\u4ee5\u6536\u5230\u5fae\u4fe1\u5b98\u65b9\u53d1\u6765\u7684\u4e00\u6761\u6d88\u606f\u3002<\/p>\n<p>\u4ee5\u4e0a\u5c31\u662f\u5bf9\u5fae\u4fe1\u652f\u4ed8\u5f00\u53d1\u6d41\u7a0b\u7684\u8d44\u6599\u6574\u7406\uff0c\u540e\u7eed\u7ee7\u7eed\u8865\u5145\u76f8\u5173\u8d44\u6599\uff0c\u8c22\u8c22\u5927\u5bb6\u5bf9\u672c\u7ad9\u7684\u652f\u6301\uff01<\/p>\n<p>\u4ee5\u4e0a\u5c31\u662f\u5fae\u4fe1\u652f\u4ed8\u7684\u5f00\u53d1\u6d41\u7a0b\u8be6\u7ec6\u4ecb\u7ecd\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>\u8fd9\u7bc7\u6587\u7ae0\u4e3b\u8981\u4ecb\u7ecd\u4e86\u5fae\u4fe1\u652f\u4ed8\u7684\u5f00\u53d1\u6d41\u7a0b\u7684\u76f8\u5173\u8d44\u6599,\u9700\u8981\u7684\u670b\u53cb\u53ef\u4ee5\u53c2\u8003\u4e0b \u6ce8\u610f\uff0c\u6211\u4f7f\u7528\u7684\u662f\u5fae\u4fe1\u5f00\u653e\u5e73\u53f0\u7684\u652f\u4ed8\uff0c\u4e0e\u624b\u673aapp\u76f8\u5173\uff0c\u800c\u4e0e\u516c\u4f17\u8d26\u53f7\u65e0\u5173\u3002 \u5fae\u4fe1\u652f\u4ed8\u7684\u4e3b\u8981\u64cd\u4f5c\u6d41\u7a0b 1.\u7528\u6237\u6d4f\u89c8app\uff0c\u9009\u5b9a\u5546\u54c1\u7136\u540e\u4e0b\u5355\u3002 2.\u670d\u52a1\u5668\u5904\u7406\u8ba2\u5355\u903b\u8f91\uff0c\u5f00\u59cb\u6b63\u5f0f\u53d1\u8d77\u652f\u4ed8\u6d41\u7a0b 3.\u9996\u5148\uff0c\u540e\u53f0\u670d\u52a1\u5668\u5411weixin\u670d\u52a1\u5668\u53d1\u8d77\u8bf7\u6c42\uff0c\u83b7\u53d6\u4e00\u4e2atoken\u3002 4.\u540e\u53f0\u670d\u52a1\u5668\u62ff\u5230token\uff0c\u4f7f\u7528\u548c\u5176\u4ed6\u53c2\u6570\u52a0\u5bc6\uff0c\u518d\u6b21\u5411weixin\u670d\u52a1\u5668\u53d1\u8d77\u8bf7\u6c42\uff0c\u83b7\u53d6\u4e00\u4e2a\u9884\u652f\u4ed8prepayid 5.\u540e\u53f0\u670d\u52a1\u5668\u5c06\u8be5prepayid\u8fd4\u56de\u7ed9app\u5ba2\u6237\u7aef 6.app\u8c03\u7528\u624b\u673a\u4e0a\u7684\u5fae\u4fe1\uff0c\u5b8c\u6210\u4ed8\u6b3e\u6d41\u7a0b\u3002 7.app\u5411\u540e\u53f0\u670d\u52a1\u5668\u53d1\u8d77\u4e00\u4e2a\u56de\u8c03\u8bf7\u6c42\uff0c\u901a\u77e5\u670d\u52a1\u5668\u4ea4\u6613\u5b8c\u6210\u3002 8.weixin\u670d\u52a1\u5668\u5904\u7406\u5b8c\u6240\u6709\u7684\u6d41\u7a0b\u540e\uff0c\u5411\u540e\u53f0\u670d\u52a1\u5668\u53d1\u8d77\u4e00\u4e2a\uff0c\u6b63\u5f0f\u901a\u77e5\u540e\u53f0\u670d\u52a1\u5668\u4ea4\u6613\u5b8c\u6bd5 \u4e0a\u9762\u6d41\u7a0b\u7684\u4e00\u4e9b\u6ce8\u610f\u70b9\uff1a 1.\u6bcf\u6b21\u83b7\u53d6\u7684token\u662f\u6709\u65f6\u6548\u7684\uff0c\u9ed8\u8ba4\u662f7200s\uff0c\u800c\u4e14\u6bcf\u5929\u6700\u591a\u83b7\u53d6200\u6b21\uff0c\u56e0\u6b64\u6700\u597d\u653e\u5230\u4e2d\u8d77\u6765\uff0c\u7b49\u5931\u6548\u540e\u518d\u53bb\u91cd\u65b0\u83b7\u53d6 2.app\u53d1\u8d77\u7684\u56de\u8c03\u9ed8\u8ba4\u662f\u4e0d\u53ef\u9760\u7684\uff0c\u540e\u53f0\u5e94\u8be5\u5c3d\u53ef\u80fd\uff08\u4e0d\u662f\u5fc5\u987b\uff09\u5411\u5fae\u4fe1\u670d\u52a1\u5668\u53d1\u8d77\u8ba2\u5355\uff0c\u67e5\u8be2\u672c\u6b21\u4ea4\u6613\u7684\u7ed3\u679c\u3002 3.weixin\u670d\u52a1\u5668\u5411\u540e\u53f0\u53d1\u8d77\u7684noty\uff0c\u624d\u662f\u786e\u4fdd\u4ea4\u6613\u5b8c\u6210\u7684\u6700\u540e\u5c4f\u969c\u3002\u540e\u53f0\u670d\u52a1\u5668\u786e\u8ba4\u540e\u5fc5\u987b\u8fd4\u56de\u201csuccess\u201d\uff0c\u5426\u5219weixin\u670d\u52a1\u5668\u4f1a\u5c1d\u8bd5\u91cd\u53d1\u8bf7\u6c42\u3002 \u83b7\u53d6token \u8fd9\u6b65\u5f88\u7b80\u5355\uff0c\u53d1\u9001\u4e00\u4e2aget\u8bf7\u6c42\u5373\u53ef\u3002\u53ea\u9700\u914d\u7f6e\u6b63\u786e\u53c2\u6570\u3002 \u2018\u2018\u2018\u4ece\u5fae\u4fe1\u670d\u52a1\u5668\u83b7\u53d6token\u2018\u2018\u2018 &nbsp;&nbsp;def&nbsp;_getAccessTokenFromWeixin(self): &nbsp;&nbsp;&nbsp;&nbsp;response&nbsp;=&nbsp;requests.get(self.tokenUrl&nbsp;%&nbsp;(self.appId,&nbsp;self.appSecret)) &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;response.status_code&nbsp;==&nbsp;200: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;text&nbsp;=&nbsp;response.text &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tokenInfo&nbsp;=&nbsp;json.loads(text) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;token&nbsp;=&nbsp;tokenInfo[\u2018access_token\u2018] &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;expires_in&nbsp;=&nbsp;tokenInfo[\u2018expires_in\u2018] &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self._writeWeixinTokenLog(token,&nbsp;self.order_no) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;token &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;except&nbsp;KeyError: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;None&nbsp;#token\u83b7\u53d6\u5931\u8d25 &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;None&nbsp;#http\u8bf7\u6c42\u5931\u8d25 \u767b\u5f55\u540e\u590d\u5236 \u83b7\u53d6prepayid \u5728\u5fae\u4fe1\u652f\u4ed8\u7684\u5f00\u53d1\u6d41\u7a0b\u4e2d\uff0c\u6700\u7e41\u7410\u7684\u5c31\u662f\u83b7\u53d6prepayid\u3002 \u8fd9\u4e00\u6b65\u6211\u4eec\u9700\u8981\u7ec4\u88c5\u8fd9\u6837\u4e00\u4e2a\u53c2\u6570\uff1a { &#8220;appid&#8221;:&#8221;wxd930ea5d5a258f4f&#8221;, &#8220;traceid&#8221;:&#8221;test_1399514976&#8243;, &#8220;noncestr&#8221;:&#8221;e7d161ac8d8a76529d39d9f5b4249ccb&nbsp;&#8220;, &#8220;timestamp&#8221;:1399514976,&nbsp;&#8220;package&#8221;:&#8221;bank_type=WX&amp;amp;body=%E6%94%AF%E4%BB%98%E6%B5%8B%E8%AF% 95&amp;amp;fee_type=1&amp;amp;input_charset=UTF-8&amp;amp;notify_url=http%3A%2F%2Fweixin.qq.com&amp;amp;out_trade_&nbsp;no=7240b65810859cbf2a8d9f76a638c0a3&amp;amp;partner=1900000109&amp;amp;spbill_create_ip=196.168.1.1&amp;amp;&nbsp;total_fee=1&amp;amp;sign=7F77B507B755B3262884291517E380F8&#8243;, &#8220;sign_method&#8221;:&#8221;sha1&#8243;,&nbsp;&#8220;app_signature&#8221;:&#8221;7f77b507b755b3262884291517e380f8&#8243; } \u767b\u5f55\u540e\u590d\u5236 \u7ec4\u88c5package \u8fd9\u91cc\u7684\u7b2c\u4e00\u6b65\u5c31\u662f\u7ec4\u88c5package\uff1a &#8220;package&#8221;:&#8221;bank_type=WX&amp;amp;body=%E6%94%AF%E4%BB%98%E6%B5%8B%E8%AF% 95&amp;amp;fee_type=1&amp;amp;input_charset=UTF-8&amp;amp;notify_url=http%3A%2F%2Fweixin.qq.com&amp;amp;out_trade_&nbsp;no=7240b65810859cbf2a8d9f76a638c0a3&amp;amp;partner=1900000109&amp;amp;spbill_create_ip=196.168.1.1&amp;amp;&nbsp;total_fee=1&amp;amp;sign=7F77B507B755B3262884291517E380F8&#8243;, \u767b\u5f55\u540e\u590d\u5236 \u7ec4\u88c5package\u9700\u8981\u7684\u53c2\u6570\u5982\u4e0a\u9762\u4ee3\u7801\u6240\u793a\uff0c\u6240\u4ee5\u6211\u4eec\u9700\u8981\u51c6\u5907\u4e00\u4e2aparams\uff0c\u7136\u540e\u51c6\u5907\u7b7e\u540d\uff0c\u7b7e\u540d\u6d41\u7a0b\u5982\u4e0b\uff1a 1.\u6309\u7167key\u7684\u5b57\u5178\u5e8f\uff0c\u5bf9params\u8fdb\u884c\u6392\u5e8f\uff0c\u7136\u540e\u62fc\u63a5\u6210\uff0c\u6ce8\u610f\u8fd9\u4e9bkey\u4e0d\u5305\u62ecsign 2.\u5728\u4e0a\u9762\u7684\u5b57\u7b26\u4e32\u540e\u9762\u62fc\u63a5key=paternerKey\uff0c\u7136\u540e\u5bf9\u6574\u4e2a\u5b57\u7b26\u4e32\u8fdb\u884c\u7b7e\u540d\uff0c\u7136\u540e\u8f6c\u6362\u6210\u5927\u5199\uff0c\u6b64\u65f6\u6211\u4eec\u5c31\u5f97\u5230\u4e86\u7b7e\u540d \u7136\u540e\u6211\u4eec\u5c06\u6240\u6709params\u7684value\u8fdb\u884curlencode\u8f6c\u7801\uff0c\u7136\u540e\u540e\u9762\u62fc\u63a5\u4e0asign=signValue\uff0c\u5c31\u5f97\u5230\u4e86package\u5b57\u7b26\u4e32\u3002 \u8fd9\u91cc\u521b\u5efaMD5\u7684\u8fc7\u5982\u4e0b\uff1a def&nbsp;createMD5Signature(self,&nbsp;signParams): [&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-29038","post","type-post","status-publish","format-standard","hentry","category-19"],"_links":{"self":[{"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/posts\/29038","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=29038"}],"version-history":[{"count":0,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/posts\/29038\/revisions"}],"wp:attachment":[{"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/media?parent=29038"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/categories?post=29038"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/tags?post=29038"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}