折腾:
[已解决]Flask中如何获取微信POST发送过来的body的数据
期间,把对应的:
@app.route(‘/wechat_auth’, methods=[‘GET’, ‘POST’]) def wechat_auth(): signature = request.args.get(‘signature’, ”) timestamp = request.args.get(‘timestamp’, ”) nonce = request.args.get(‘nonce’, ”) echostr = request.args.get(‘echostr’, ”) app.logger.debug(‘signature=%s, timestamp=%s, nonce=%s, echostr=%s’, signature, timestamp, nonce, echostr) if wechat.check_signature(signature, timestamp, nonce): app.logger.debug("wechat check_signature OK") if request.method == ‘GET’ : respStr = echostr app.logger.debug(‘respStr=%s’, respStr) return make_response(respStr) else : # for POST requestMethod = request.method app.logger.debug(‘requestMethod=%s’, requestMethod) # requestMethod=POST requestData = request.data app.logger.debug(‘requestData=%s’, requestData) # <xml> # <ToUserName><![CDATA[gh_ac090a9873a8]]></ToUserName> # <Encrypt><![CDATA[6PBVvYed+IuFgEa4BuDeOaNwM3KLqv6uoWqQcSCY+SidbN2VBjWL+N88kp0GU2BvLXyzlvbGGOxvJnFIDRQCDAgBUBhk3YQMWJmR+bB3D5phuVEIFo1MoknxB4xsIi3wVQunlyljyFl43TCwCxIvBVxXeHsKSzYOxhFGL+2ZmelLp46WJRaNrrh8yLl2eK1pRCR09QAoNZISLUszfzlr4N9t4nnl8ZuQpYqEdWt4bH8xsqTRPd91TG6hSio/o46G9Ow2QA16j7l4q9HXV2fZEIdlSJma4Jepl7N9jBDwrjd4zi4MXwsJpQ0KBI3Q1LBojlipt8wk1xzuVzmyidkHzvDtfIa22ZTvEu4MDYdYa8BXRYk1EtGpW0eDCiF/NLOyQzJsFM1T7jGsxjrKUIcYPmLFbNW8qZEIEDkAhahbVCI=]]></Encrypt> # </xml> requestArgs = request.args app.logger.debug(‘requestArgs=%s’, requestArgs) # requestArgs=ImmutableMultiDict([(‘nonce’, u’1438950245′), (‘openid’, u’oswjmv4X0cCXcfkIwjoDfCkeTVVY’), (‘signature’, u’cb962992182efd9f94f09560b893b20106408e49′), (‘timestamp’, u’1471573757′), (‘encrypt_type’, u’aes’), (‘msg_signature’, u’dc3336e6f85053f3563802f4e7b5398e3930d017′)]) try: #wechat.parse_data(requestData) wechat.parse_data(requestData, signature, timestamp, nonce) app.logger.debug(‘parse post body data OK’) except ParseError: respStr = "parse post body failed" app.logger.debug(respStr) return wechat.response_text(respStr) |
中的:
wechat.parse_data(requestData) |
换成:
#wechat.parse_data(requestData) wechat.parse_data(requestData, signature, timestamp, nonce) |
结果竟然出错了:
<div–<—————————————————————————— [2016-08-19 10:44:23 +0000] [29476] [ERROR] Error handling request /wechat_auth?signature=86ac3f6fdbc0260369988f07a72935c5a7e2b4e2×tamp=1471574663&nonce=1054233353&openid=oswjmv4X0cCXcfkIwjoDfCkeTVVY&encrypt_type=aes&msg_signature=216a681558ba5fdeefd8606ac5e7f3078269e6dd Traceback (most recent call last): File "/root/Envs/SIPEvents/lib/python2.7/site-packages/gunicorn/workers/sync.py", line 135, in handle self.handle_request(listener, req, client, addr) File "/root/Envs/SIPEvents/lib/python2.7/site-packages/gunicorn/workers/sync.py", line 176, in handle_request respiter = self.wsgi(environ, resp.start_response) File "/root/Envs/SIPEvents/lib/python2.7/site-packages/flask/app.py", line 2000, in __call__ return self.wsgi_app(environ, start_response) File "/root/Envs/SIPEvents/lib/python2.7/site-packages/flask/app.py", line 1991, in wsgi_app response = self.make_response(self.handle_exception(e)) File "/root/Envs/SIPEvents/lib/python2.7/site-packages/flask/app.py", line 1567, in handle_exception reraise(exc_type, exc_value, tb) File "/root/Envs/SIPEvents/lib/python2.7/site-packages/flask/app.py", line 1988, in wsgi_app response = self.full_dispatch_request() File "/root/Envs/SIPEvents/lib/python2.7/site-packages/flask/app.py", line 1641, in full_dispatch_request rv = self.handle_user_exception(e) File "/root/Envs/SIPEvents/lib/python2.7/site-packages/flask/app.py", line 1544, in handle_user_exception reraise(exc_type, exc_value, tb) File "/root/Envs/SIPEvents/lib/python2.7/site-packages/flask/app.py", line 1639, in full_dispatch_request rv = self.dispatch_request() File "/root/Envs/SIPEvents/lib/python2.7/site-packages/flask/app.py", line 1625, in dispatch_request return self.view_functions[rule.endpoint](**req.view_args) File "/usr/share/nginx/html/SIPEvents/wechat_auth.py", line 60, in wechat_auth wechat.parse_data(requestData, signature, timestamp, nonce) File "/root/Envs/SIPEvents/lib/python2.7/site-packages/wechat_sdk-0.6.4-py2.7.egg/wechat_sdk/basic.py", line 155, in parse_data nonce=nonce, File "/root/Envs/SIPEvents/lib/python2.7/site-packages/wechat_sdk-0.6.4-py2.7.egg/wechat_sdk/lib/crypto/cryptos.py", line 112, in decrypt_message return self._decrypt_message(msg, msg_signature, timestamp, nonce) File "/root/Envs/SIPEvents/lib/python2.7/site-packages/wechat_sdk-0.6.4-py2.7.egg/wechat_sdk/lib/crypto/cryptos.py", line 97, in _decrypt_message raise ValidateSignatureError() ValidateSignatureError |
搜:
wechat parse_data ValidateSignatureError
python3+flask不能解析消息 · Issue #89 · doraemonext/wechat-python-sdk
原来是SDK自己的bug。。。
去:
https://github.com/doraemonext/wechat-python-sdk/blob/master/wechat_sdk/basic.py
wechat-python-sdk/wechat_sdk/basic.py
def parse_data(self, data, msg_signature=None, timestamp=None, nonce=None):
编辑:
vim /root/Envs/SIPEvents/lib/python2.7/site-packages/wechat_sdk-0.6.4-py2.7.egg/wechat_sdk/basic.py |
注释掉:
if isinstance(data, six.text_type): # unicode to str(PY2), str to bytes(PY3) data = data.encode(‘utf-8’) |
如图:
试试。
结果错误依旧:
<div–<—————————————————————————— [2016-08-19 10:53:25 +0000] [29571] [ERROR] Error handling request /wechat_auth?signature=c6bffafce8b8d52768392e2bf66e3a1efc69862a×tamp=1471575205&nonce=1218822764&openid=oswjmv4X0cCXcfkIwjoDfCkeTVVY&encrypt_type=aes&msg_signature=741d13aa3740e3b1dceeb8731b89870de9a8fed0 Traceback (most recent call last): File "/root/Envs/SIPEvents/lib/python2.7/site-packages/gunicorn/workers/sync.py", line 135, in handle self.handle_request(listener, req, client, addr) File "/root/Envs/SIPEvents/lib/python2.7/site-packages/gunicorn/workers/sync.py", line 176, in handle_request respiter = self.wsgi(environ, resp.start_response) File "/root/Envs/SIPEvents/lib/python2.7/site-packages/flask/app.py", line 2000, in __call__ return self.wsgi_app(environ, start_response) File "/root/Envs/SIPEvents/lib/python2.7/site-packages/flask/app.py", line 1991, in wsgi_app response = self.make_response(self.handle_exception(e)) File "/root/Envs/SIPEvents/lib/python2.7/site-packages/flask/app.py", line 1567, in handle_exception reraise(exc_type, exc_value, tb) File "/root/Envs/SIPEvents/lib/python2.7/site-packages/flask/app.py", line 1988, in wsgi_app response = self.full_dispatch_request() File "/root/Envs/SIPEvents/lib/python2.7/site-packages/flask/app.py", line 1641, in full_dispatch_request rv = self.handle_user_exception(e) File "/root/Envs/SIPEvents/lib/python2.7/site-packages/flask/app.py", line 1544, in handle_user_exception reraise(exc_type, exc_value, tb) File "/root/Envs/SIPEvents/lib/python2.7/site-packages/flask/app.py", line 1639, in full_dispatch_request rv = self.dispatch_request() File "/root/Envs/SIPEvents/lib/python2.7/site-packages/flask/app.py", line 1625, in dispatch_request return self.view_functions[rule.endpoint](**req.view_args) File "/usr/share/nginx/html/SIPEvents/wechat_auth.py", line 60, in wechat_auth wechat.parse_data(requestData, signature, timestamp, nonce) File "/root/Envs/SIPEvents/lib/python2.7/site-packages/wechat_sdk-0.6.4-py2.7.egg/wechat_sdk/basic.py", line 155, in parse_data nonce=nonce, File "/root/Envs/SIPEvents/lib/python2.7/site-packages/wechat_sdk-0.6.4-py2.7.egg/wechat_sdk/lib/crypto/cryptos.py", line 112, in decrypt_message return self._decrypt_message(msg, msg_signature, timestamp, nonce) File "/root/Envs/SIPEvents/lib/python2.7/site-packages/wechat_sdk-0.6.4-py2.7.egg/wechat_sdk/lib/crypto/cryptos.py", line 97, in _decrypt_message raise ValidateSignatureError() ValidateSignatureError |
所以取消刚才的注释。
不过再去看看解密的代码:
(SIPEvents) ➜ SIPEvents vim /root/Envs/SIPEvents/lib/python2.7/site-packages/wechat_sdk-0.6.4-py2.7.egg/wechat_sdk/lib/crypto/cryptos.py |
把解密代码加了注释:
timestamp = to_binary(timestamp) print ‘timestamp=’,timestamp nonce = to_binary(nonce) print ‘nonce=’,nonce if isinstance(msg, six.string_types): try: textMsg = to_text(msg) print ‘textMsg=’,textMsg #msg = xmltodict.parse(to_text(msg))[‘xml’] parsedTextMsg = xmltodict.parse(textMsg) print ‘parsedTextMsg=’,parsedTextMsg msg = parsedTextMsg[‘xml’] print ‘msg=’,msg except Exception as e: raise ParseError(e) |
再去测试,
输出:
<div–<—————————————————————————— DEBUG in wechat_auth [/usr/share/nginx/html/SIPEvents/wechat_auth.py:55]: requestArgs=ImmutableMultiDict([(‘nonce’, u’1016329670′), (‘openid’, u’oswjmv4X0cCXcfkIwjoDfCkeTVVY’), (‘signature’, u’ad99cbe7358671d0196af9a6c9c715aa5df3080c’), (‘timestamp’, u’1471576208′), (‘encrypt_type’, u’aes’), (‘msg_signature’, u’81892b198e7618a03bd7f2f1e70f2959e3881f5a’)]) <div–<—————————————————————————— data= <xml> <ToUserName><![CDATA[gh_ac090a9873a8]]></ToUserName> <Encrypt><![CDATA[hzHkhFI5q09PDKr3yPAtm0/No8/Rh0UCzlf7V806GjyDNFUxyoaR8LSJJHHyHg6dhV2b3FNntWJRYsyr1cO7mWie0JHVf04kknF8TTgssfviR8efSK6Na+9L+78GewknZlp/WbK+fh+upVQyLriTN9gxc8xDywrN0ZdHdB7tnh4xLVotBOHqLhqB58E2qRrJbkqpo7s32wkA25wMZ3R4dACmVpClYPQ8ASQTromFmb0FEb2F00XZKDH0WoRS6D6GqFfIa6S8OXre6fIWX08ouRk/oRbFMDFpN8T4HL7L50bQq/eNBCUNkR3ACsX60CMBc8JSDWNKDPRlBK13g5mJVSD88DLbS6ari5EjM+CboNlY3WBWUaB20M+zPr3ARbeYTXeZ7CIdf6V5rt2H8kZTo2kFdGA0jCpQo3MGHyCcbwBBpZtWYyhMIDQdJEO4DkU3z7fA60FB4L3g4hkC4iNNbQ==]]></Encrypt> </xml> self.conf.encrypt_mode= safe timestamp= 1471576208 nonce= 1016329670 textMsg= <xml> <ToUserName><![CDATA[gh_ac090a9873a8]]></ToUserName> <Encrypt><![CDATA[hzHkhFI5q09PDKr3yPAtm0/No8/Rh0UCzlf7V806GjyDNFUxyoaR8LSJJHHyHg6dhV2b3FNntWJRYsyr1cO7mWie0JHVf04kknF8TTgssfviR8efSK6Na+9L+78GewknZlp/WbK+fh+upVQyLriTN9gxc8xDywrN0ZdHdB7tnh4xLVotBOHqLhqB58E2qRrJbkqpo7s32wkA25wMZ3R4dACmVpClYPQ8ASQTromFmb0FEb2F00XZKDH0WoRS6D6GqFfIa6S8OXre6fIWX08ouRk/oRbFMDFpN8T4HL7L50bQq/eNBCUNkR3ACsX60CMBc8JSDWNKDPRlBK13g5mJVSD88DLbS6ari5EjM+CboNlY3WBWUaB20M+zPr3ARbeYTXeZ7CIdf6V5rt2H8kZTo2kFdGA0jCpQo3MGHyCcbwBBpZtWYyhMIDQdJEO4DkU3z7fA60FB4L3g4hkC4iNNbQ==]]></Encrypt> </xml> parsedTextMsg= OrderedDict([(u’xml’, OrderedDict([(u’ToUserName’, u’gh_ac090a9873a8′), (u’Encrypt’, u’hzHkhFI5q09PDKr3yPAtm0/No8/Rh0UCzlf7V806GjyDNFUxyoaR8LSJJHHyHg6dhV2b3FNntWJRYsyr1cO7mWie0JHVf04kknF8TTgssfviR8efSK6Na+9L+78GewknZlp/WbK+fh+upVQyLriTN9gxc8xDywrN0ZdHdB7tnh4xLVotBOHqLhqB58E2qRrJbkqpo7s32wkA25wMZ3R4dACmVpClYPQ8ASQTromFmb0FEb2F00XZKDH0WoRS6D6GqFfIa6S8OXre6fIWX08ouRk/oRbFMDFpN8T4HL7L50bQq/eNBCUNkR3ACsX60CMBc8JSDWNKDPRlBK13g5mJVSD88DLbS6ari5EjM+CboNlY3WBWUaB20M+zPr3ARbeYTXeZ7CIdf6V5rt2H8kZTo2kFdGA0jCpQo3MGHyCcbwBBpZtWYyhMIDQdJEO4DkU3z7fA60FB4L3g4hkC4iNNbQ==’)]))]) msg= OrderedDict([(u’ToUserName’, u’gh_ac090a9873a8′), (u’Encrypt’, u’hzHkhFI5q09PDKr3yPAtm0/No8/Rh0UCzlf7V806GjyDNFUxyoaR8LSJJHHyHg6dhV2b3FNntWJRYsyr1cO7mWie0JHVf04kknF8TTgssfviR8efSK6Na+9L+78GewknZlp/WbK+fh+upVQyLriTN9gxc8xDywrN0ZdHdB7tnh4xLVotBOHqLhqB58E2qRrJbkqpo7s32wkA25wMZ3R4dACmVpClYPQ8ASQTromFmb0FEb2F00XZKDH0WoRS6D6GqFfIa6S8OXre6fIWX08ouRk/oRbFMDFpN8T4HL7L50bQq/eNBCUNkR3ACsX60CMBc8JSDWNKDPRlBK13g5mJVSD88DLbS6ari5EjM+CboNlY3WBWUaB20M+zPr3ARbeYTXeZ7CIdf6V5rt2H8kZTo2kFdGA0jCpQo3MGHyCcbwBBpZtWYyhMIDQdJEO4DkU3z7fA60FB4L3g4hkC4iNNbQ==’)]) [2016-08-19 11:10:08 +0000] [29772] [ERROR] Error handling request /wechat_auth?signature=ad99cbe7358671d0196af9a6c9c715aa5df3080c×tamp=1471576208&nonce=1016329670&openid=oswjmv4X0cCXcfkIwjoDfCkeTVVY&encrypt_type=aes&msg_signature=81892b198e7618a03bd7f2f1e70f2959e3881f5a Traceback (most recent call last): File "/root/Envs/SIPEvents/lib/python2.7/site-packages/gunicorn/workers/sync.py", line 135, in handle self.handle_request(listener, req, client, addr) File "/root/Envs/SIPEvents/lib/python2.7/site-packages/gunicorn/workers/sync.py", line 176, in handle_request respiter = self.wsgi(environ, resp.start_response) File "/root/Envs/SIPEvents/lib/python2.7/site-packages/flask/app.py", line 2000, in __call__ return self.wsgi_app(environ, start_response) File "/root/Envs/SIPEvents/lib/python2.7/site-packages/flask/app.py", line 1991, in wsgi_app response = self.make_response(self.handle_exception(e)) File "/root/Envs/SIPEvents/lib/python2.7/site-packages/flask/app.py", line 1567, in handle_exception reraise(exc_type, exc_value, tb) File "/root/Envs/SIPEvents/lib/python2.7/site-packages/flask/app.py", line 1988, in wsgi_app response = self.full_dispatch_request() File "/root/Envs/SIPEvents/lib/python2.7/site-packages/flask/app.py", line 1641, in full_dispatch_request rv = self.handle_user_exception(e) File "/root/Envs/SIPEvents/lib/python2.7/site-packages/flask/app.py", line 1544, in handle_user_exception reraise(exc_type, exc_value, tb) File "/root/Envs/SIPEvents/lib/python2.7/site-packages/flask/app.py", line 1639, in full_dispatch_request rv = self.dispatch_request() File "/root/Envs/SIPEvents/lib/python2.7/site-packages/flask/app.py", line 1625, in dispatch_request return self.view_functions[rule.endpoint](**req.view_args) File "/usr/share/nginx/html/SIPEvents/wechat_auth.py", line 60, in wechat_auth wechat.parse_data(requestData, signature, timestamp, nonce) File "/root/Envs/SIPEvents/lib/python2.7/site-packages/wechat_sdk-0.6.4-py2.7.egg/wechat_sdk/basic.py", line 160, in parse_data nonce=nonce, File "/root/Envs/SIPEvents/lib/python2.7/site-packages/wechat_sdk-0.6.4-py2.7.egg/wechat_sdk/lib/crypto/cryptos.py", line 120, in decrypt_message return self._decrypt_message(msg, msg_signature, timestamp, nonce) File "/root/Envs/SIPEvents/lib/python2.7/site-packages/wechat_sdk-0.6.4-py2.7.egg/wechat_sdk/lib/crypto/cryptos.py", line 105, in _decrypt_message raise ValidateSignatureError() ValidateSignatureError |
然后加了注释,调试发现:
最后的,解码出来的signature不一样:
DEBUG in wechat_auth [/usr/share/nginx/html/SIPEvents/wechat_auth.py:45]: requestMethod=POST <div–<—————————————————————————— <div–<—————————————————————————— DEBUG in wechat_auth [/usr/share/nginx/html/SIPEvents/wechat_auth.py:48]: requestData=<xml> <ToUserName><![CDATA[gh_ac090a9873a8]]></ToUserName> <Encrypt><![CDATA[/dFR+g9YW7asjHUuZ/z0V+OHqx083HFQmhMtn7QJEqBT62rMKii+/dpYIqoxoQa0Mx41StSJA+lXVqWtQQfyddPNrvAoqBhEFGgjlpaeiOYnwwaymCcNO1nk6HR6ZjU9baBRO1VgiPCFL6b1nwBGCa5FzU2Dv0qzfD2ydd5KQxBvhA8vnZP4ETnYuZDc9SnqSnLR0F/dwqzwK8/JH3FA0Z5AEvdUvT50JVNlBIb7DbIuvBIoO88IoYW1DvlzRZAjb9ffQQzp0G2qoGuxINNWWANf/WLynT33pe95WXo22Uye1Bv8BCN9/NFs4XfC9bngVQyu8xutkL/PPlsExpRKbMGX6rVS8SNtITTwM24IBNj1Pdqr2JM/9JHGQtqe2lD0WYpYEo5FGDOkkWIuEPZ0L6vmGTCkDrhqXkjVr3+ugtU=]]></Encrypt> </xml> <div–<—————————————————————————— <div–<—————————————————————————— DEBUG in wechat_auth [/usr/share/nginx/html/SIPEvents/wechat_auth.py:55]: requestArgs=ImmutableMultiDict([(‘nonce’, u’153496074′), (‘openid’, u’oswjmv4X0cCXcfkIwjoDfCkeTVVY’), (‘signature’, u’3424841cf93ac1e59763baaacaae287fc9079abf’), (‘timestamp’, u’1471576521′), (‘encrypt_type’, u’aes’), (‘msg_signature’, u’506d340023b7e1a7878064ccf9c0ce38e7915c41′)]) <div–<—————————————————————————— data= <xml> <ToUserName><![CDATA[gh_ac090a9873a8]]></ToUserName> <Encrypt><![CDATA[/dFR+g9YW7asjHUuZ/z0V+OHqx083HFQmhMtn7QJEqBT62rMKii+/dpYIqoxoQa0Mx41StSJA+lXVqWtQQfyddPNrvAoqBhEFGgjlpaeiOYnwwaymCcNO1nk6HR6ZjU9baBRO1VgiPCFL6b1nwBGCa5FzU2Dv0qzfD2ydd5KQxBvhA8vnZP4ETnYuZDc9SnqSnLR0F/dwqzwK8/JH3FA0Z5AEvdUvT50JVNlBIb7DbIuvBIoO88IoYW1DvlzRZAjb9ffQQzp0G2qoGuxINNWWANf/WLynT33pe95WXo22Uye1Bv8BCN9/NFs4XfC9bngVQyu8xutkL/PPlsExpRKbMGX6rVS8SNtITTwM24IBNj1Pdqr2JM/9JHGQtqe2lD0WYpYEo5FGDOkkWIuEPZ0L6vmGTCkDrhqXkjVr3+ugtU=]]></Encrypt> </xml> self.conf.encrypt_mode= safe timestamp= 1471576521 nonce= 153496074 textMsg= <xml> <ToUserName><![CDATA[gh_ac090a9873a8]]></ToUserName> <Encrypt><![CDATA[/dFR+g9YW7asjHUuZ/z0V+OHqx083HFQmhMtn7QJEqBT62rMKii+/dpYIqoxoQa0Mx41StSJA+lXVqWtQQfyddPNrvAoqBhEFGgjlpaeiOYnwwaymCcNO1nk6HR6ZjU9baBRO1VgiPCFL6b1nwBGCa5FzU2Dv0qzfD2ydd5KQxBvhA8vnZP4ETnYuZDc9SnqSnLR0F/dwqzwK8/JH3FA0Z5AEvdUvT50JVNlBIb7DbIuvBIoO88IoYW1DvlzRZAjb9ffQQzp0G2qoGuxINNWWANf/WLynT33pe95WXo22Uye1Bv8BCN9/NFs4XfC9bngVQyu8xutkL/PPlsExpRKbMGX6rVS8SNtITTwM24IBNj1Pdqr2JM/9JHGQtqe2lD0WYpYEo5FGDOkkWIuEPZ0L6vmGTCkDrhqXkjVr3+ugtU=]]></Encrypt> </xml> parsedTextMsg= OrderedDict([(u’xml’, OrderedDict([(u’ToUserName’, u’gh_ac090a9873a8′), (u’Encrypt’, u’/dFR+g9YW7asjHUuZ/z0V+OHqx083HFQmhMtn7QJEqBT62rMKii+/dpYIqoxoQa0Mx41StSJA+lXVqWtQQfyddPNrvAoqBhEFGgjlpaeiOYnwwaymCcNO1nk6HR6ZjU9baBRO1VgiPCFL6b1nwBGCa5FzU2Dv0qzfD2ydd5KQxBvhA8vnZP4ETnYuZDc9SnqSnLR0F/dwqzwK8/JH3FA0Z5AEvdUvT50JVNlBIb7DbIuvBIoO88IoYW1DvlzRZAjb9ffQQzp0G2qoGuxINNWWANf/WLynT33pe95WXo22Uye1Bv8BCN9/NFs4XfC9bngVQyu8xutkL/PPlsExpRKbMGX6rVS8SNtITTwM24IBNj1Pdqr2JM/9JHGQtqe2lD0WYpYEo5FGDOkkWIuEPZ0L6vmGTCkDrhqXkjVr3+ugtU=’)]))]) msg= OrderedDict([(u’ToUserName’, u’gh_ac090a9873a8′), (u’Encrypt’, u’/dFR+g9YW7asjHUuZ/z0V+OHqx083HFQmhMtn7QJEqBT62rMKii+/dpYIqoxoQa0Mx41StSJA+lXVqWtQQfyddPNrvAoqBhEFGgjlpaeiOYnwwaymCcNO1nk6HR6ZjU9baBRO1VgiPCFL6b1nwBGCa5FzU2Dv0qzfD2ydd5KQxBvhA8vnZP4ETnYuZDc9SnqSnLR0F/dwqzwK8/JH3FA0Z5AEvdUvT50JVNlBIb7DbIuvBIoO88IoYW1DvlzRZAjb9ffQQzp0G2qoGuxINNWWANf/WLynT33pe95WXo22Uye1Bv8BCN9/NFs4XfC9bngVQyu8xutkL/PPlsExpRKbMGX6rVS8SNtITTwM24IBNj1Pdqr2JM/9JHGQtqe2lD0WYpYEo5FGDOkkWIuEPZ0L6vmGTCkDrhqXkjVr3+ugtU=’)]) encrypt= /dFR+g9YW7asjHUuZ/z0V+OHqx083HFQmhMtn7QJEqBT62rMKii+/dpYIqoxoQa0Mx41StSJA+lXVqWtQQfyddPNrvAoqBhEFGgjlpaeiOYnwwaymCcNO1nk6HR6ZjU9baBRO1VgiPCFL6b1nwBGCa5FzU2Dv0qzfD2ydd5KQxBvhA8vnZP4ETnYuZDc9SnqSnLR0F/dwqzwK8/JH3FA0Z5AEvdUvT50JVNlBIb7DbIuvBIoO88IoYW1DvlzRZAjb9ffQQzp0G2qoGuxINNWWANf/WLynT33pe95WXo22Uye1Bv8BCN9/NFs4XfC9bngVQyu8xutkL/PPlsExpRKbMGX6rVS8SNtITTwM24IBNj1Pdqr2JM/9JHGQtqe2lD0WYpYEo5FGDOkkWIuEPZ0L6vmGTCkDrhqXkjVr3+ugtU= self.__token= sipevents singnature= 506d340023b7e1a7878064ccf9c0ce38e7915c41 msg_signature= 3424841cf93ac1e59763baaacaae287fc9079abf [2016-08-19 11:15:21 +0000] [29843] [ERROR] Error handling request /wechat_auth?signature=3424841cf93ac1e59763baaacaae287fc9079abf×tamp=1471576521&nonce=153496074&openid=oswjmv4X0cCXcfkIwjoDfCkeTVVY&encrypt_type=aes&msg_signature=506d340023b7e1a7878064ccf9c0ce38e7915c41 Traceback (most recent call last): File "/root/Envs/SIPEvents/lib/python2.7/site-packages/gunicorn/workers/sync.py", line 135, in handle self.handle_request(listener, req, client, addr) File "/root/Envs/SIPEvents/lib/python2.7/site-packages/gunicorn/workers/sync.py", line 176, in handle_request respiter = self.wsgi(environ, resp.start_response) File "/root/Envs/SIPEvents/lib/python2.7/site-packages/flask/app.py", line 2000, in __call__ return self.wsgi_app(environ, start_response) File "/root/Envs/SIPEvents/lib/python2.7/site-packages/flask/app.py", line 1991, in wsgi_app response = self.make_response(self.handle_exception(e)) File "/root/Envs/SIPEvents/lib/python2.7/site-packages/flask/app.py", line 1567, in handle_exception reraise(exc_type, exc_value, tb) File "/root/Envs/SIPEvents/lib/python2.7/site-packages/flask/app.py", line 1988, in wsgi_app response = self.full_dispatch_request() File "/root/Envs/SIPEvents/lib/python2.7/site-packages/flask/app.py", line 1641, in full_dispatch_request rv = self.handle_user_exception(e) File "/root/Envs/SIPEvents/lib/python2.7/site-packages/flask/app.py", line 1544, in handle_user_exception reraise(exc_type, exc_value, tb) File "/root/Envs/SIPEvents/lib/python2.7/site-packages/flask/app.py", line 1639, in full_dispatch_request rv = self.dispatch_request() File "/root/Envs/SIPEvents/lib/python2.7/site-packages/flask/app.py", line 1625, in dispatch_request return self.view_functions[rule.endpoint](**req.view_args) File "/usr/share/nginx/html/SIPEvents/wechat_auth.py", line 60, in wechat_auth wechat.parse_data(requestData, signature, timestamp, nonce) File "/root/Envs/SIPEvents/lib/python2.7/site-packages/wechat_sdk-0.6.4-py2.7.egg/wechat_sdk/basic.py", line 160, in parse_data nonce=nonce, File "/root/Envs/SIPEvents/lib/python2.7/site-packages/wechat_sdk-0.6.4-py2.7.egg/wechat_sdk/lib/crypto/cryptos.py", line 123, in decrypt_message return self._decrypt_message(msg, msg_signature, timestamp, nonce) File "/root/Envs/SIPEvents/lib/python2.7/site-packages/wechat_sdk-0.6.4-py2.7.egg/wechat_sdk/lib/crypto/cryptos.py", line 108, in _decrypt_message raise ValidateSignatureError() ValidateSignatureError |
singnature= 506d340023b7e1a7878064ccf9c0ce38e7915c41 msg_signature= 3424841cf93ac1e59763baaacaae287fc9079abf
对应着代码:
signature = get_sha1_signature(self.__token, timestamp, nonce, encrypt) print ‘singnature=’,signature,’ msg_signature=’,msg_signature if signature != msg_signature: raise ValidateSignatureError() |
搜源码中的get_sha1_signature:
只有:
from wechat_sdk.lib.crypto.utils import get_sha1_signature
所以要去搞清楚:
搜:
get_sha1_signature not work
crypto get_sha1_signature
注意到:
python3+flask不能解析消息 · Issue #89 · doraemonext/wechat-python-sdk
中的:
pycrypto==2.6.1
难道是版本不同的原因?
抽空再去看看我此处的wechat_sdk.lib.crypto的版本是多少
green/utils.py at master · liuwons/green
然后去看此处,本地的代码:
vim /root/Envs/SIPEvents/lib/python2.7/site-packages/wechat_sdk-0.6.4-py2.7.egg/wechat_sdk/lib/crypto/utils.py
# -*- coding: utf-8 -*- import hashlib from wechat_sdk.lib.crypto.exceptions import CryptoComputeSignatureError from wechat_sdk.utils import to_binary def get_sha1_signature(token, timestamp, nonce, encrypt): """ 用 SHA1 算法生成安全签名 @param token: 票据 @param timestamp: 时间戳 @param encrypt: 密文 @param nonce: 随机字符串 @return: 安全签名 """ try: sortlist = [token, timestamp, nonce, to_binary(encrypt)] sortlist.sort() sha = hashlib.sha1() sha.update(to_binary("").join(sortlist)) return sha.hexdigest() except Exception as e: raise CryptoComputeSignatureError(e) |
然后看到此处的校验算法,和之前的:
wechat-python-sdk/basic.py at master · doraemonext/wechat-python-sdk
def check_signature(self, signature, timestamp, nonce): """ 验证微信消息真实性 :param signature: 微信加密签名 :param timestamp: 时间戳 :param nonce: 随机数 :return: 通过验证返回 True, 未通过验证返回 False """ if not signature or not timestamp or not nonce: return False tmp_list = [self.conf.token, timestamp, nonce] tmp_list.sort() tmp_str = ”.join(tmp_list) if signature != hashlib.sha1(tmp_str.encode(‘utf-8’)).hexdigest(): return False return True |
好像不一致啊。
而此处的:
signature, timestamp, nonce
之前调用:
check_signature
都是通过的
此处调用:
get_sha1_signature
就是不通过的
-》只能说明:
get_sha1_signature
的算法,有问题。
需要修正。
此处注意到:
get_sha1_signature
比:
check_signature
多了个
encrypt
参数。
不过后来看到:
vim /root/Envs/SIPEvents/lib/python2.7/site-packages/wechat_sdk-0.6.4-py2.7.egg/wechat_sdk/lib/crypto/cryptos.py
from wechat_sdk.exceptions import ParseError from wechat_sdk.lib.crypto.base import BaseCrypto from wechat_sdk.lib.crypto.utils import get_sha1_signature from wechat_sdk.lib.crypto.exceptions import ValidateSignatureError, ValidateAESKeyError, DecryptAESError from wechat_sdk.utils import to_binary, to_text class WechatBaseCrypto(object): """微信加密解密基类""" def __init__(self, token, encoding_aes_key, _id): """构造函数 :param token: 公众平台上,开发者设置的Token :param encoding_aes_key: 公众平台上,开发者设置的EncodingAESKey :param _id: 公众号的 appid 或企业号的 corpid """ self.__key = base64.b64decode(to_binary(encoding_aes_key) + to_binary(‘=’)) if len(self.__key) != 32: raise ValidateAESKeyError(encoding_aes_key) self.__token = to_binary(token) self.__id = to_binary(_id) self.__pc = BaseCrypto(self.__key) def _check_signature(self, msg_signature, timestamp, nonce, echostr): """验证签名有效性 :param msg_signature: 签名串,对应URL参数的msg_signature :param timestamp: 时间戳,对应URL参数的timestamp :param nonce: 随机串,对应URL参数的nonce :param echostr: 随机串,对应URL参数的echostr :return: 解密之后的echostr :raise ValidateSignatureError: 签名无效异常 """ signature = get_sha1_signature(self.__token, timestamp, nonce, echostr) if not signature == msg_signature: raise ValidateSignatureError() try: return self.__pc.decrypt(echostr, self.__id) except DecryptAESError as e: raise ValidateSignatureError(e) def _encrypt_message(self, msg, nonce, timestamp=None): |
中的_check_signature
也是类似的
内部调用了:get_sha1_signature
然后注意到此处的类是:
WechatBaseCrypto
难道是:
如果最开始定义了加密的话,不是用官网实例代码的:
WechatBasic
而应该换用此处的:
WechatBaseCrypto
??
去试试
不过在此之前,为了便于查看代码,先去:
[记录]Mac中尝试使用PyCharm打开Python的微信库wechat_sdk的源码
都怀疑,是否真的有人用了:
wechat-sdk
搜:
python wechat-sdk safe模式
参考:
Python快速搭建自动回复微信公众号 – ^-^ – 博客频道 – CSDN.NET
Python开发之快速搭建自动回复微信公众号功能_小组_ThinkSAAS
-》
liuwons/green: 微信公众号源码 – 微信号Ms_haoqi
结果发现用的是:
"mode": "normal",
-》明文模式。。。
“ ‘encrypt_mode’: 加解密模式 (‘normal’: 明文模式, ‘compatible’: 兼容模式, ‘safe’: 安全模式(默认))
”
3. WechatConf 详解 – wechat-python-sdk
python wechat-sdk safe mode
然后换用代码:
# from wechat_sdk import WechatBasic from wechat_sdk. import WechatBaseCrypto # wechat = WechatBasic(conf=wechatConf) wechat = WechatBaseCrypto(conf=wechatConf) #if wechat.check_signature(signature, timestamp, nonce): if wechat.check_signature(signature, timestamp, nonce, echostr): |
结果运行出错:
(SIPEvents) ➜ SIPEvents gunicorn -w 4 -b 127.0.0.1:8080 wechat_auth:app [2016-08-19 12:11:16 +0000] [30387] [INFO] Starting gunicorn 19.6.0 [2016-08-19 12:11:16 +0000] [30387] [INFO] Listening at: http://127.0.0.1:8080 (30387) [2016-08-19 12:11:16 +0000] [30387] [INFO] Using worker: sync [2016-08-19 12:11:16 +0000] [30392] [INFO] Booting worker with pid: 30392 [2016-08-19 12:11:16 +0000] [30393] [INFO] Booting worker with pid: 30393 [2016-08-19 12:11:16 +0000] [30396] [INFO] Booting worker with pid: 30396 [2016-08-19 12:11:16 +0000] [30399] [INFO] Booting worker with pid: 30399 [2016-08-19 12:11:16 +0000] [30393] [ERROR] Exception in worker process Traceback (most recent call last): File "/root/Envs/SIPEvents/lib/python2.7/site-packages/gunicorn/arbiter.py", line 557, in spawn_worker worker.init_process() File "/root/Envs/SIPEvents/lib/python2.7/site-packages/gunicorn/workers/base.py", line 126, in init_process self.load_wsgi() File "/root/Envs/SIPEvents/lib/python2.7/site-packages/gunicorn/workers/base.py", line 136, in load_wsgi self.wsgi = self.app.wsgi() File "/root/Envs/SIPEvents/lib/python2.7/site-packages/gunicorn/app/base.py", line 67, in wsgi self.callable = self.load() File "/root/Envs/SIPEvents/lib/python2.7/site-packages/gunicorn/app/wsgiapp.py", line 65, in load return self.load_wsgiapp() File "/root/Envs/SIPEvents/lib/python2.7/site-packages/gunicorn/app/wsgiapp.py", line 52, in load_wsgiapp return util.import_app(self.app_uri) File "/root/Envs/SIPEvents/lib/python2.7/site-packages/gunicorn/util.py", line 357, in import_app __import__(module) File "/usr/share/nginx/html/SIPEvents/wechat_auth.py", line 6, in <module> from wechat_sdk import WechatBaseCrypto ImportError: cannot import name WechatBaseCrypto |
搜:
import WechatBaseCrypto
green/__init__.py at master · liuwons/green
换成:
# from wechat_sdk import WechatBaseCrypto from wechat_sdk.lib.crypto.crypto import WechatBaseCrypto |
试试:
(SIPEvents) ➜ SIPEvents gunicorn -w 4 -b 127.0.0.1:8080 wechat_auth:app [2016-08-19 12:14:38 +0000] [30451] [INFO] Starting gunicorn 19.6.0 [2016-08-19 12:14:38 +0000] [30451] [INFO] Listening at: http://127.0.0.1:8080 (30451) [2016-08-19 12:14:38 +0000] [30451] [INFO] Using worker: sync [2016-08-19 12:14:38 +0000] [30456] [INFO] Booting worker with pid: 30456 [2016-08-19 12:14:38 +0000] [30457] [INFO] Booting worker with pid: 30457 [2016-08-19 12:14:38 +0000] [30458] [INFO] Booting worker with pid: 30458 [2016-08-19 12:14:38 +0000] [30460] [INFO] Booting worker with pid: 30460 [2016-08-19 12:14:38 +0000] [30456] [ERROR] Exception in worker process Traceback (most recent call last): File "/root/Envs/SIPEvents/lib/python2.7/site-packages/gunicorn/arbiter.py", line 557, in spawn_worker worker.init_process() File "/root/Envs/SIPEvents/lib/python2.7/site-packages/gunicorn/workers/base.py", line 126, in init_process self.load_wsgi() File "/root/Envs/SIPEvents/lib/python2.7/site-packages/gunicorn/workers/base.py", line 136, in load_wsgi self.wsgi = self.app.wsgi() File "/root/Envs/SIPEvents/lib/python2.7/site-packages/gunicorn/app/base.py", line 67, in wsgi self.callable = self.load() File "/root/Envs/SIPEvents/lib/python2.7/site-packages/gunicorn/app/wsgiapp.py", line 65, in load return self.load_wsgiapp() File "/root/Envs/SIPEvents/lib/python2.7/site-packages/gunicorn/app/wsgiapp.py", line 52, in load_wsgiapp return util.import_app(self.app_uri) File "/root/Envs/SIPEvents/lib/python2.7/site-packages/gunicorn/util.py", line 357, in import_app __import__(module) File "/usr/share/nginx/html/SIPEvents/wechat_auth.py", line 7, in <module> from wechat_sdk.lib.crypto.crypto import WechatBaseCrypto ImportError: No module named crypto |
用:
from wechat_sdk.lib.crypto import WechatBaseCrypto |
结果:
(SIPEvents) ➜ SIPEvents [2016-08-19 12:15:39 +0000] [30506] [ERROR] Exception in worker process Traceback (most recent call last): File "/root/Envs/SIPEvents/lib/python2.7/site-packages/gunicorn/arbiter.py", line 557, in spawn_worker worker.init_process() File "/root/Envs/SIPEvents/lib/python2.7/site-packages/gunicorn/workers/base.py", line 126, in init_process self.load_wsgi() File "/root/Envs/SIPEvents/lib/python2.7/site-packages/gunicorn/workers/base.py", line 136, in load_wsgi self.wsgi = self.app.wsgi() File "/root/Envs/SIPEvents/lib/python2.7/site-packages/gunicorn/app/base.py", line 67, in wsgi self.callable = self.load() File "/root/Envs/SIPEvents/lib/python2.7/site-packages/gunicorn/app/wsgiapp.py", line 65, in load return self.load_wsgiapp() File "/root/Envs/SIPEvents/lib/python2.7/site-packages/gunicorn/app/wsgiapp.py", line 52, in load_wsgiapp return util.import_app(self.app_uri) File "/root/Envs/SIPEvents/lib/python2.7/site-packages/gunicorn/util.py", line 357, in import_app __import__(module) File "/usr/share/nginx/html/SIPEvents/wechat_auth.py", line 25, in <module> wechat = WechatBaseCrypto(conf=wechatConf) TypeError: __init__() got an unexpected keyword argument ‘conf’ [2016-08-19 12:15:39 +0000] [30506] [INFO] Worker exiting (pid: 30506) |
去看源码,果然是没有conf参数:
class WechatBaseCrypto(object): """微信加密解密基类""" def __init__(self, token, encoding_aes_key, _id): """构造函数 :param token: 公众平台上,开发者设置的Token :param encoding_aes_key: 公众平台上,开发者设置的EncodingAESKey :param _id: 公众号的 appid 或企业号的 corpid """ self.__key = base64.b64decode(to_binary(encoding_aes_key) + to_binary(‘=’)) if len(self.__key) != 32: raise ValidateAESKeyError(encoding_aes_key) self.__token = to_binary(token) self.__id = to_binary(_id) self.__pc = BaseCrypto(self.__key) |
参考:
/Users/crifan/dev/dev_src/Weixin/wechat-python-sdk-master/tests/test_basic.py
中的:
def test_parse_data_text_message(self): message = """<xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[fromUser]]></FromUserName> <CreateTime>1348831860</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[this is a test]]></Content> <MsgId>1234567890123456</MsgId> </xml>""" wechat = WechatBasic() wechat.parse_data(data=message) message = wechat.message self.assertIsInstance(message, TextMessage) self.assertEqual(message.id, 1234567890123456) self.assertEqual(message.target, ‘toUser’) self.assertEqual(message.source, ‘fromUser’) self.assertEqual(message.time, 1348831860) self.assertEqual(message.type, ‘text’) self.assertEqual(message.content, ‘this is a test’) |
可以看出,此处的:
WechatBasic的wechat,去parse_data的message是没有加密的。
而对于加了密的message,则参考:
/Users/crifan/dev/dev_src/Weixin/wechat-python-sdk-master/tests/core/test_conf.py
中的:
safe_request_message = """<xml> <ToUserName><![CDATA[gh_1b2959761a7d]]></ToUserName> <Encrypt><![CDATA[JCqIUfe7GJ84SQdp7M4y2xrnsqUp9ihcNZrAErcA8KSc5ewTAYCX1CtAiZqntANyYmFdQqwNAQXMU3vQGbJms/rXSjz4vN77kc9SbIDphNKRYXyaEI5P8iuQHlAjyfUE2kXnWjusYEPnKaB5RLkanwbNwhWVzgYbV4OVst9hSMepv3WpVzOBZlj8CpqhklqwHJuOda4X7unQzwRWyLA8M/lzPDCdN3rcRqz2wH9SlEc0JfjKXKk1RmBFYhHbJ2boeLFc7dIg0Sc3JNMCBw7MU4tBWAEuD+wedUSy45zZ0u1HeQSe13d6QSlVOoC9Ta0InwnlL28VpngEMru4YGeDGoyRKgDOYbDr71dI0sp/kInAKwPXWbOcqd0LFQ9P9Y+BxW4z5BNkYo9LFubXbilnO/VzU8++zuAhFSED11baYFs=]]></Encrypt> </xml>""" def test_init_with_safe_encrypt_mode(self): """ 测试安全模式下的初始化 """ conf = WechatConf(token=self.token, appid=self.appid, appsecret=self.appsecret, encrypt_mode=‘safe’, encoding_aes_key=self.encoding_aes_key) self.assertEqual(conf.token, self.token) self.assertEqual(conf.appid, self.appid) self.assertEqual(conf.appsecret, self.appsecret) self.assertEqual(conf.encoding_aes_key, self.encoding_aes_key) self.assertIsNotNone(conf.crypto) # 测试解密微信服务器的请求消息 req = conf.crypto.decrypt_message(msg=self.safe_request_message, msg_signature=self.msg_signature, timestamp=self.timestamp, nonce=self.nonce) self.assertEqual(xmltodict.parse(req), xmltodict.parse(self.normal_request_message)) # 测试加密返回信息 origin_crypto = conf.crypto._WechatBaseCrypto__pc conf.crypto._WechatBaseCrypto__pc = TestBaseCrypto(key=conf.crypto._WechatBaseCrypto__key) resp = conf.crypto.encrypt_message(msg=self.response_message, nonce=self.nonce, timestamp=self.timestamp) self.assertEqual(xmltodict.parse(resp), xmltodict.parse(self.response_encrypted_message)) conf.crypto._WechatBaseCrypto__pc = origin_crypto |
则是需要:
调用:
conf.crypto.decrypt_message
去解码后,才可以得到,普通的message:
normal_request_message
一样。
结果试了试:
#!/usr/bin/python # -*- coding: UTF-8 -*- from flask import Flask, g, request, make_response from wechat_sdk import WechatConf from wechat_sdk import WechatBasic # from wechat_sdk import WechatBaseCrypto # from wechat_sdk.lib.crypto.crypto import WechatBaseCrypto # from wechat_sdk.lib.crypto import WechatBaseCrypto from wechat_sdk.exceptions import ParseError app = Flask(__name__) app.debug=True wechatConf = WechatConf( token=‘aaaa’, appid=’wx00000′, appsecret=’8310asjdlkjgjdgkldjgjglddd’, # 可选项:normal/compatible/safe,分别对应于 明文/兼容/安全 模式 encrypt_mode=’safe’, # 如果传入此值则必须保证同时传入 token, appid encoding_aes_key=’b7NCPES6jasshgasdfadfdsfd3eT6Z0EoSf2cLpt’ ) wechat = WechatBasic(conf=wechatConf) # wechat = WechatBaseCrypto(conf=wechatConf) @app.route("/") def hello(): return "Hello SIPEvents!" @app.route(‘/wechat_auth’, methods=[‘GET’, ‘POST’]) def wechat_auth(): signature = request.args.get(‘signature’, ”) timestamp = request.args.get(‘timestamp’, ”) nonce = request.args.get(‘nonce’, ”) echostr = request.args.get(‘echostr’, ”) app.logger.debug(‘signature=%s, timestamp=%s, nonce=%s, echostr=%s’, signature, timestamp, nonce, echostr) if wechat.check_signature(signature, timestamp, nonce): # if wechat.check_signature(signature, timestamp, nonce, echostr): app.logger.debug("wechat check_signature OK") if request.method == ‘GET’ : respStr = echostr app.logger.debug(‘respStr=%s’, respStr) return make_response(respStr) else : # for POST requestMethod = request.method app.logger.debug(‘requestMethod=%s’, requestMethod) # requestMethod=POST encryptedReqData = request.data app.logger.debug(‘encryptedReqData=%s’, encryptedReqData) # <xml> # <ToUserName><![CDATA[gh_ac090a9873a8]]></ToUserName> # <Encrypt><![CDATA[6PBVvYed+IuFgEa4BuDeOaNwM3KLqv6uoWqQcSCY+SidbN2VBjWL+N88kp0GU2BvLXyzlvbGGOxvJnFIDRQCDAgBUBhk3YQMWJmR+bB3D5phuVEIFo1MoknxB4xsIi3wVQunlyljyFl43TCwCxIvBVxXeHsKSzYOxhFGL+2ZmelLp46WJRaNrrh8yLl2eK1pRCR09QAoNZISLUszfzlr4N9t4nnl8ZuQpYqEdWt4bH8xsqTRPd91TG6hSio/o46G9Ow2QA16j7l4q9HXV2fZEIdlSJma4Jepl7N9jBDwrjd4zi4MXwsJpQ0KBI3Q1LBojlipt8wk1xzuVzmyidkHzvDtfIa22ZTvEu4MDYdYa8BXRYk1EtGpW0eDCiF/NLOyQzJsFM1T7jGsxjrKUIcYPmLFbNW8qZEIEDkAhahbVCI=]]></Encrypt> # </xml> requestArgs = request.args app.logger.debug(‘requestArgs=%s’, requestArgs) # requestArgs=ImmutableMultiDict([(‘nonce’, u’1438950245′), (‘openid’, u’oswjmv4X0cCXcfkIwjoDfCkeTVVY’), (‘signature’, u’cb962992182efd9f94f09560b893b20106408e49′), (‘timestamp’, u’1471573757′), (‘encrypt_type’, u’aes’), (‘msg_signature’, u’dc3336e6f85053f3563802f4e7b5398e3930d017′)]) try: decryptedReqData = wechat.conf.crypto.decrypt_message(encryptedReqData, signature, timestamp, nonce) app.logger.debug(‘decryptedReqData=%s’, decryptedReqData) app.logger.debug(‘decrypt post body data OK’) wechat.parse_data(decryptedReqData) # wechat.parse_data(encryptedReqData, signature, timestamp, nonce) app.logger.debug(‘parse post body data OK’) except ParseError: respStr = "parse post body failed" app.logger.debug(respStr) return wechat.response_text(respStr) messageId = wechat.message.id # 对应于 XML 中的 MsgId messageTarget = wechat.message.target # 对应于 XML 中的 ToUserName messageSource = wechat.message.source # 对应于 XML 中的 FromUserName messageTime = wechat.message.time # 对应于 XML 中的 CreateTime messageType = wechat.message.type # 对应于 XML 中的 MsgType messageRaw = wechat.message.raw # 原始 XML 文本,方便进行其他分析 app.logger.debug(‘messageId=%s, messageTarget=%s, messageSource=%s, messageTime=%s, messageType=%s, messageRaw=%s’, messageId, messageTarget, messageSource, messageTime, messageType, messageRaw) if isinstance(wechat.message, TextMessage) : msgContent = wechat.message.content app.logger.debug(‘msgContent=%s’, msgContent) return wechat.response_text(msgContent) else : respStr = "Not Support type of POST" app.logger.debug(‘respStr=%s’, respStr) return wechat.response_text(respStr) else : app.logger.debug("wechat check_signature wrong") return wechat.response_text("wechat auth failed") if __name__ == ‘__main__’: app.run(debug=True) |
问题依旧。
参考:
jxtech/wechatpy: WeChat SDK for Python
去下载源码,看看其是如何解码的。
看起来:
/Users/crifan/dev/dev_src/Weixin/wechatpy-master/wechatpy/utils.py
中的:
class WeChatSigner(object): """WeChat data signer""" def __init__(self, delimiter=b”): self._data = [] self._delimiter = to_binary(delimiter) def add_data(self, *args): """Add data to signer""" for data in args: self._data.append(to_binary(data)) @property def signature(self): """Get data signature""" self._data.sort() str_to_sign = self._delimiter.join(self._data) return hashlib.sha1(str_to_sign).hexdigest() |
也和上面的代码,没多大区别
貌似是同样的解密和加密,生成SHA1的算法
此处,最终是把:
Flask服务器中的:
vim /root/Envs/SIPEvents/lib/python2.7/site-packages/wechat_sdk-0.6.4-py2.7.egg/wechat_sdk/lib/crypto/cryptos.py
中的:
def _decrypt_message(self, msg, msg_signature, timestamp, nonce):
中的获取sh1的部分注释掉了:
#signature = get_sha1_signature(self.__token, timestamp, nonce, encrypt) #print ‘singnature=’,signature,’ msg_signature=’,msg_signature #if signature != msg_signature: # raise ValidateSignatureError() |
然后最后就可以正常解密了:
然后微信端输入内容,此处至少解密是没问题的
然后加了密返回内容,看起来也是没问题的:
(SIPEvents) ➜ SIPEvents gunicorn -w 4 -b 127.0.0.1:8080 wechat_auth:app [2016-08-19 20:51:14 +0000] [2812] [INFO] Starting gunicorn 19.6.0 [2016-08-19 20:51:14 +0000] [2812] [INFO] Listening at: http://127.0.0.1:8080 (2812) [2016-08-19 20:51:14 +0000] [2812] [INFO] Using worker: sync [2016-08-19 20:51:14 +0000] [2817] [INFO] Booting worker with pid: 2817 [2016-08-19 20:51:14 +0000] [2818] [INFO] Booting worker with pid: 2818 [2016-08-19 20:51:14 +0000] [2819] [INFO] Booting worker with pid: 2819 [2016-08-19 20:51:14 +0000] [2824] [INFO] Booting worker with pid: 2824 <div–<—————————————————————————— DEBUG in wechat_auth [/usr/share/nginx/html/SIPEvents/wechat_auth.py:49]: signature=c8bc7e2cd5b828a9a267dbc5a66287fd40993634, timestamp=1471611078, nonce=1607653060, echostr= <div–<—————————————————————————— tmp_list= [‘sipevents’, u’1471611078′, u’1607653060′] after sort: tmp_list= [u’1471611078′, u’1607653060′, ‘sipevents’] tmp_str= 14716110781607653060sipevents tmp_str_encoded= 14716110781607653060sipevents tmp_str_sha1= <sha1 HASH object @ 0x7f8467727120> tmp_str_hexdigest= c8bc7e2cd5b828a9a267dbc5a66287fd40993634 signature= c8bc7e2cd5b828a9a267dbc5a66287fd40993634 signature OK <div–<—————————————————————————— DEBUG in wechat_auth [/usr/share/nginx/html/SIPEvents/wechat_auth.py:53]: wechat check_signature OK <div–<—————————————————————————— <div–<—————————————————————————— DEBUG in wechat_auth [/usr/share/nginx/html/SIPEvents/wechat_auth.py:61]: requestMethod=POST <div–<—————————————————————————— <div–<—————————————————————————— DEBUG in wechat_auth [/usr/share/nginx/html/SIPEvents/wechat_auth.py:64]: encryptedReqData=<xml> <ToUserName><![CDATA[gh_ac090a9873a8]]></ToUserName> <Encrypt><![CDATA[5RAqolinMihDIozBqEM6GCOJmAxfTF0L62V7l6oLgI/YKhTfeBwZlRVdZseuObbl2yiBD6aPCGApcw6bDWISUWe3EpE0D7kCXErBeuqiFVsCODsyit3iyHfkqXmnRD6xz7ZGNWIcMeRnS+DfNiIZnAwrvNbYbscBVC72EKW6knYzDWNBYm+HrxdvoiuvPqy7VhvpqMBmz3S33JJ0LAxnbOCbfHsC/RktYeouSKztDnW349MV0t5EhKawAP1mw87v7iQhp+cEfK9Dw52UjejAYKHr4l9b92YGfGHYdJ1ik2rjxVxgOphpkMReLpik43JcRvDsnLvrvRglJCKym2Hlt4Z4zkZ6N/TUi+GwfmUTl7FLCz9UQBlIFt0kdSVNFsiuFFNc0ZTPy4aQJfDqGFfqn1PlB/zk5vtomiy7WT8lYtFlU9eSvhLP8pCzVMmiQ6j2skPjPKG18CsSqEpNuBMvsA==]]></Encrypt> </xml> <div–<—————————————————————————— <div–<—————————————————————————— DEBUG in wechat_auth [/usr/share/nginx/html/SIPEvents/wechat_auth.py:71]: requestArgs=ImmutableMultiDict([(‘nonce’, u’1607653060′), (‘openid’, u’oswjmv4X0cCXcfkIwjoDfCkeTVVY’), (‘signature’, u’c8bc7e2cd5b828a9a267dbc5a66287fd40993634′), (‘timestamp’, u’1471611078′), (‘encrypt_type’, u’aes’), (‘msg_signature’, u’ee1632e53c230858db7966bce9eae509bb93bc8c’)]) <div–<—————————————————————————— timestamp= 1471611078 nonce= 1607653060 textMsg= <xml> <ToUserName><![CDATA[gh_ac090a9873a8]]></ToUserName> <Encrypt><![CDATA[5RAqolinMihDIozBqEM6GCOJmAxfTF0L62V7l6oLgI/YKhTfeBwZlRVdZseuObbl2yiBD6aPCGApcw6bDWISUWe3EpE0D7kCXErBeuqiFVsCODsyit3iyHfkqXmnRD6xz7ZGNWIcMeRnS+DfNiIZnAwrvNbYbscBVC72EKW6knYzDWNBYm+HrxdvoiuvPqy7VhvpqMBmz3S33JJ0LAxnbOCbfHsC/RktYeouSKztDnW349MV0t5EhKawAP1mw87v7iQhp+cEfK9Dw52UjejAYKHr4l9b92YGfGHYdJ1ik2rjxVxgOphpkMReLpik43JcRvDsnLvrvRglJCKym2Hlt4Z4zkZ6N/TUi+GwfmUTl7FLCz9UQBlIFt0kdSVNFsiuFFNc0ZTPy4aQJfDqGFfqn1PlB/zk5vtomiy7WT8lYtFlU9eSvhLP8pCzVMmiQ6j2skPjPKG18CsSqEpNuBMvsA==]]></Encrypt> </xml> parsedTextMsg= OrderedDict([(u’xml’, OrderedDict([(u’ToUserName’, u’gh_ac090a9873a8′), (u’Encrypt’, u’5RAqolinMihDIozBqEM6GCOJmAxfTF0L62V7l6oLgI/YKhTfeBwZlRVdZseuObbl2yiBD6aPCGApcw6bDWISUWe3EpE0D7kCXErBeuqiFVsCODsyit3iyHfkqXmnRD6xz7ZGNWIcMeRnS+DfNiIZnAwrvNbYbscBVC72EKW6knYzDWNBYm+HrxdvoiuvPqy7VhvpqMBmz3S33JJ0LAxnbOCbfHsC/RktYeouSKztDnW349MV0t5EhKawAP1mw87v7iQhp+cEfK9Dw52UjejAYKHr4l9b92YGfGHYdJ1ik2rjxVxgOphpkMReLpik43JcRvDsnLvrvRglJCKym2Hlt4Z4zkZ6N/TUi+GwfmUTl7FLCz9UQBlIFt0kdSVNFsiuFFNc0ZTPy4aQJfDqGFfqn1PlB/zk5vtomiy7WT8lYtFlU9eSvhLP8pCzVMmiQ6j2skPjPKG18CsSqEpNuBMvsA==’)]))]) msg= OrderedDict([(u’ToUserName’, u’gh_ac090a9873a8′), (u’Encrypt’, u’5RAqolinMihDIozBqEM6GCOJmAxfTF0L62V7l6oLgI/YKhTfeBwZlRVdZseuObbl2yiBD6aPCGApcw6bDWISUWe3EpE0D7kCXErBeuqiFVsCODsyit3iyHfkqXmnRD6xz7ZGNWIcMeRnS+DfNiIZnAwrvNbYbscBVC72EKW6knYzDWNBYm+HrxdvoiuvPqy7VhvpqMBmz3S33JJ0LAxnbOCbfHsC/RktYeouSKztDnW349MV0t5EhKawAP1mw87v7iQhp+cEfK9Dw52UjejAYKHr4l9b92YGfGHYdJ1ik2rjxVxgOphpkMReLpik43JcRvDsnLvrvRglJCKym2Hlt4Z4zkZ6N/TUi+GwfmUTl7FLCz9UQBlIFt0kdSVNFsiuFFNc0ZTPy4aQJfDqGFfqn1PlB/zk5vtomiy7WT8lYtFlU9eSvhLP8pCzVMmiQ6j2skPjPKG18CsSqEpNuBMvsA==’)]) encrypt= 5RAqolinMihDIozBqEM6GCOJmAxfTF0L62V7l6oLgI/YKhTfeBwZlRVdZseuObbl2yiBD6aPCGApcw6bDWISUWe3EpE0D7kCXErBeuqiFVsCODsyit3iyHfkqXmnRD6xz7ZGNWIcMeRnS+DfNiIZnAwrvNbYbscBVC72EKW6knYzDWNBYm+HrxdvoiuvPqy7VhvpqMBmz3S33JJ0LAxnbOCbfHsC/RktYeouSKztDnW349MV0t5EhKawAP1mw87v7iQhp+cEfK9Dw52UjejAYKHr4l9b92YGfGHYdJ1ik2rjxVxgOphpkMReLpik43JcRvDsnLvrvRglJCKym2Hlt4Z4zkZ6N/TUi+GwfmUTl7FLCz9UQBlIFt0kdSVNFsiuFFNc0ZTPy4aQJfDqGFfqn1PlB/zk5vtomiy7WT8lYtFlU9eSvhLP8pCzVMmiQ6j2skPjPKG18CsSqEpNuBMvsA== self.__token= sipevents self.__id= wx906274ff0f9165dd <div–<—————————————————————————— DEBUG in wechat_auth [/usr/share/nginx/html/SIPEvents/wechat_auth.py:76]: decryptedReqData=<xml><ToUserName><![CDATA[gh_ac090a9873a8]]></ToUserName> <FromUserName><![CDATA[oswjmv4X0cCXcfkIwjoDfCkeTVVY]]></FromUserName> <CreateTime>1471611077</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[你好啊]]></Content> <MsgId>6320521448554901304</MsgId> </xml> <div–<—————————————————————————— <div–<—————————————————————————— DEBUG in wechat_auth [/usr/share/nginx/html/SIPEvents/wechat_auth.py:77]: decrypt post body data OK <div–<—————————————————————————— data= <xml> <ToUserName><![CDATA[gh_ac090a9873a8]]></ToUserName> <Encrypt><![CDATA[5RAqolinMihDIozBqEM6GCOJmAxfTF0L62V7l6oLgI/YKhTfeBwZlRVdZseuObbl2yiBD6aPCGApcw6bDWISUWe3EpE0D7kCXErBeuqiFVsCODsyit3iyHfkqXmnRD6xz7ZGNWIcMeRnS+DfNiIZnAwrvNbYbscBVC72EKW6knYzDWNBYm+HrxdvoiuvPqy7VhvpqMBmz3S33JJ0LAxnbOCbfHsC/RktYeouSKztDnW349MV0t5EhKawAP1mw87v7iQhp+cEfK9Dw52UjejAYKHr4l9b92YGfGHYdJ1ik2rjxVxgOphpkMReLpik43JcRvDsnLvrvRglJCKym2Hlt4Z4zkZ6N/TUi+GwfmUTl7FLCz9UQBlIFt0kdSVNFsiuFFNc0ZTPy4aQJfDqGFfqn1PlB/zk5vtomiy7WT8lYtFlU9eSvhLP8pCzVMmiQ6j2skPjPKG18CsSqEpNuBMvsA==]]></Encrypt> </xml> self.conf.encrypt_mode= safe timestamp= 1471611078 nonce= 1607653060 textMsg= <xml> <ToUserName><![CDATA[gh_ac090a9873a8]]></ToUserName> <Encrypt><![CDATA[5RAqolinMihDIozBqEM6GCOJmAxfTF0L62V7l6oLgI/YKhTfeBwZlRVdZseuObbl2yiBD6aPCGApcw6bDWISUWe3EpE0D7kCXErBeuqiFVsCODsyit3iyHfkqXmnRD6xz7ZGNWIcMeRnS+DfNiIZnAwrvNbYbscBVC72EKW6knYzDWNBYm+HrxdvoiuvPqy7VhvpqMBmz3S33JJ0LAxnbOCbfHsC/RktYeouSKztDnW349MV0t5EhKawAP1mw87v7iQhp+cEfK9Dw52UjejAYKHr4l9b92YGfGHYdJ1ik2rjxVxgOphpkMReLpik43JcRvDsnLvrvRglJCKym2Hlt4Z4zkZ6N/TUi+GwfmUTl7FLCz9UQBlIFt0kdSVNFsiuFFNc0ZTPy4aQJfDqGFfqn1PlB/zk5vtomiy7WT8lYtFlU9eSvhLP8pCzVMmiQ6j2skPjPKG18CsSqEpNuBMvsA==]]></Encrypt> </xml> parsedTextMsg= OrderedDict([(u’xml’, OrderedDict([(u’ToUserName’, u’gh_ac090a9873a8′), (u’Encrypt’, u’5RAqolinMihDIozBqEM6GCOJmAxfTF0L62V7l6oLgI/YKhTfeBwZlRVdZseuObbl2yiBD6aPCGApcw6bDWISUWe3EpE0D7kCXErBeuqiFVsCODsyit3iyHfkqXmnRD6xz7ZGNWIcMeRnS+DfNiIZnAwrvNbYbscBVC72EKW6knYzDWNBYm+HrxdvoiuvPqy7VhvpqMBmz3S33JJ0LAxnbOCbfHsC/RktYeouSKztDnW349MV0t5EhKawAP1mw87v7iQhp+cEfK9Dw52UjejAYKHr4l9b92YGfGHYdJ1ik2rjxVxgOphpkMReLpik43JcRvDsnLvrvRglJCKym2Hlt4Z4zkZ6N/TUi+GwfmUTl7FLCz9UQBlIFt0kdSVNFsiuFFNc0ZTPy4aQJfDqGFfqn1PlB/zk5vtomiy7WT8lYtFlU9eSvhLP8pCzVMmiQ6j2skPjPKG18CsSqEpNuBMvsA==’)]))]) msg= OrderedDict([(u’ToUserName’, u’gh_ac090a9873a8′), (u’Encrypt’, u’5RAqolinMihDIozBqEM6GCOJmAxfTF0L62V7l6oLgI/YKhTfeBwZlRVdZseuObbl2yiBD6aPCGApcw6bDWISUWe3EpE0D7kCXErBeuqiFVsCODsyit3iyHfkqXmnRD6xz7ZGNWIcMeRnS+DfNiIZnAwrvNbYbscBVC72EKW6knYzDWNBYm+HrxdvoiuvPqy7VhvpqMBmz3S33JJ0LAxnbOCbfHsC/RktYeouSKztDnW349MV0t5EhKawAP1mw87v7iQhp+cEfK9Dw52UjejAYKHr4l9b92YGfGHYdJ1ik2rjxVxgOphpkMReLpik43JcRvDsnLvrvRglJCKym2Hlt4Z4zkZ6N/TUi+GwfmUTl7FLCz9UQBlIFt0kdSVNFsiuFFNc0ZTPy4aQJfDqGFfqn1PlB/zk5vtomiy7WT8lYtFlU9eSvhLP8pCzVMmiQ6j2skPjPKG18CsSqEpNuBMvsA==’)]) encrypt= 5RAqolinMihDIozBqEM6GCOJmAxfTF0L62V7l6oLgI/YKhTfeBwZlRVdZseuObbl2yiBD6aPCGApcw6bDWISUWe3EpE0D7kCXErBeuqiFVsCODsyit3iyHfkqXmnRD6xz7ZGNWIcMeRnS+DfNiIZnAwrvNbYbscBVC72EKW6knYzDWNBYm+HrxdvoiuvPqy7VhvpqMBmz3S33JJ0LAxnbOCbfHsC/RktYeouSKztDnW349MV0t5EhKawAP1mw87v7iQhp+cEfK9Dw52UjejAYKHr4l9b92YGfGHYdJ1ik2rjxVxgOphpkMReLpik43JcRvDsnLvrvRglJCKym2Hlt4Z4zkZ6N/TUi+GwfmUTl7FLCz9UQBlIFt0kdSVNFsiuFFNc0ZTPy4aQJfDqGFfqn1PlB/zk5vtomiy7WT8lYtFlU9eSvhLP8pCzVMmiQ6j2skPjPKG18CsSqEpNuBMvsA== self.__token= sipevents self.__id= wx906274ff0f9165dd <div–<—————————————————————————— DEBUG in wechat_auth [/usr/share/nginx/html/SIPEvents/wechat_auth.py:82]: parse post body data OK <div–<—————————————————————————— Traceback (most recent call last): File "/usr/local/lib/python2.7/logging/__init__.py", line 861, in emit msg = self.format(record) File "/usr/local/lib/python2.7/logging/__init__.py", line 734, in format return fmt.format(record) File "/usr/local/lib/python2.7/logging/__init__.py", line 465, in format record.message = record.getMessage() File "/usr/local/lib/python2.7/logging/__init__.py", line 329, in getMessage msg = msg % self.args UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xe4 in position 218: ordinal not in range(128) Logged from file wechat_auth.py, line 95 <div–<—————————————————————————— DEBUG in wechat_auth [/usr/share/nginx/html/SIPEvents/wechat_auth.py:99]: msgContent=你好啊 <div–<—————————————————————————— <div–<—————————————————————————— DEBUG in wechat_auth [/usr/share/nginx/html/SIPEvents/wechat_auth.py:101]: resonseTextContent=<xml> <Encrypt><![CDATA[Ci4FvnDqa01BPv2uMgXmsNnapGkOSSrMjasIVApFN07fp6JJ9t+rst9+ptL8UQNcogtq8an5A0BCGxzHhApMkrd1IlDuyoR8/q66WKafPYiaeQ4m2VIJZln1wAUpkZjE4MYpk9RPNx3c4EkM9Vk6a6RNwj5GirEJsaFGKYwWR/EnmDcjOLvmA1B2mGThrIP+46+CVAp4e1REVKwJtsJBk1RWwI+ymcYJ7Ucdj0SRVTx+vg4a7PM8O3AOsr6WlPeiNAFl+6oPhLZ8qRRKDeFzvm5AqQZ+ST0eBH0QbreJfahqGSytjzEaVlU8UBxOEcE1C482S5dg2DcuTlJVBKMX/43j+FBFBddo5t0VC+Xb80dJ4KEoqeRM8iaV+h+WSBkD7mMWV11/WTkBY7KdcvbisFYIE27tJIOlE+Mg31t/p7yOF/F8OrQKI/5ELh9DZALNWAeBP46xHWZlNLtF5ioorA==]]></Encrypt> <MsgSignature><![CDATA[f1c6497e83a823ec6cc94eb3144addd2aa890cde]]></MsgSignature> <TimeStamp>1471611078</TimeStamp> <Nonce><![CDATA[1082767148]]></Nonce> </xml> <div–<—————————————————————————— |
即返回了:
<xml> <Encrypt><![CDATA[Ci4FvnDqa01BPv2uMgXmsNnapGkOSSrMjasIVApFN07fp6JJ9t+rst9+ptL8UQNcogtq8an5A0BCGxzHhApMkrd1IlDuyoR8/q66WKafPYiaeQ4m2VIJZln1wAUpkZjE4MYpk9RPNx3c4EkM9Vk6a6RNwj5GirEJsaFGKYwWR/EnmDcjOLvmA1B2mGThrIP+46+CVAp4e1REVKwJtsJBk1RWwI+ymcYJ7Ucdj0SRVTx+vg4a7PM8O3AOsr6WlPeiNAFl+6oPhLZ8qRRKDeFzvm5AqQZ+ST0eBH0QbreJfahqGSytjzEaVlU8UBxOEcE1C482S5dg2DcuTlJVBKMX/43j+FBFBddo5t0VC+Xb80dJ4KEoqeRM8iaV+h+WSBkD7mMWV11/WTkBY7KdcvbisFYIE27tJIOlE+Mg31t/p7yOF/F8OrQKI/5ELh9DZALNWAeBP46xHWZlNLtF5ioorA==]]></Encrypt> <MsgSignature><![CDATA[f1c6497e83a823ec6cc94eb3144addd2aa890cde]]></MsgSignature> <TimeStamp>1471611078</TimeStamp> <Nonce><![CDATA[1082767148]]></Nonce> </xml> |
看起来是正常的啊
但是微信端还是显示:
该公众号暂时无法提供服务,请稍后再试
又去试了试:
(SIPEvents) ➜ SIPEvents gunicorn -w 4 -b 127.0.0.1:8080 wechat_auth:app [2016-08-19 21:04:11 +0000] [2956] [INFO] Starting gunicorn 19.6.0 [2016-08-19 21:04:11 +0000] [2956] [INFO] Listening at: http://127.0.0.1:8080 (2956) [2016-08-19 21:04:11 +0000] [2956] [INFO] Using worker: sync [2016-08-19 21:04:11 +0000] [2961] [INFO] Booting worker with pid: 2961 [2016-08-19 21:04:11 +0000] [2964] [INFO] Booting worker with pid: 2964 [2016-08-19 21:04:12 +0000] [2967] [INFO] Booting worker with pid: 2967 [2016-08-19 21:04:12 +0000] [2969] [INFO] Booting worker with pid: 2969 <div–<—————————————————————————— DEBUG in wechat_auth [/usr/share/nginx/html/SIPEvents/wechat_auth.py:49]: signature=ec3dac8605aec26f5693f8229b017f8e9c31320f, timestamp=1471611861, nonce=1331490337, echostr= <div–<—————————————————————————— tmp_list= [‘sipevents’, u’1471611861′, u’1331490337′] after sort: tmp_list= [u’1331490337′, u’1471611861′, ‘sipevents’] tmp_str= 13314903371471611861sipevents tmp_str_encoded= 13314903371471611861sipevents tmp_str_sha1= <sha1 HASH object @ 0x7f42c21d1120> tmp_str_hexdigest= ec3dac8605aec26f5693f8229b017f8e9c31320f signature= ec3dac8605aec26f5693f8229b017f8e9c31320f signature OK <div–<—————————————————————————— DEBUG in wechat_auth [/usr/share/nginx/html/SIPEvents/wechat_auth.py:53]: wechat check_signature OK <div–<—————————————————————————— <div–<—————————————————————————— DEBUG in wechat_auth [/usr/share/nginx/html/SIPEvents/wechat_auth.py:61]: requestMethod=POST <div–<—————————————————————————— <div–<—————————————————————————— DEBUG in wechat_auth [/usr/share/nginx/html/SIPEvents/wechat_auth.py:64]: encryptedReqData=<xml> <ToUserName><![CDATA[gh_ac090a9873a8]]></ToUserName> <Encrypt><![CDATA[I0OSKQ8g8KB/cFtnEvCKV6n521E1cfbkb6kEOhAstCcG+wWa+A7PbEHDI+21VoeR+LngfjfDbk/uY4JRpaPzga0umS7cliglIV97i0Zq9lCiZAFKIdRxBYWNPLCkKVMNiFerJChGJ8TH4Hl1yri47ipjsNjPv1Xu9xeUeXWEPumAFiTlHAiPtRKxvfKbtCiVsSJ4jiXXxbq2zixW502UQWXmXf3y5DtMJQ4GITQtEmMBF032NNA0prMzBGlMdJsATTHuD/WGHHUalKtfy/EXAy5a2lqOpUYYQmOwa9CJggm0/vDdy9Sjds/vSYqLeTsocQhP6n4Jw08mfo0EHzhYElhgq39WVgFMluzVhETG1z2z9NNsE1Zz96kwsEv8qymeiAFgciqbK66l5HaBLwpWjySrzE5vy0GfiP/WFIhiUew=]]></Encrypt> </xml> <div–<—————————————————————————— <div–<—————————————————————————— DEBUG in wechat_auth [/usr/share/nginx/html/SIPEvents/wechat_auth.py:71]: requestArgs=ImmutableMultiDict([(‘nonce’, u’1331490337′), (‘openid’, u’oswjmv4X0cCXcfkIwjoDfCkeTVVY’), (‘signature’, u’ec3dac8605aec26f5693f8229b017f8e9c31320f’), (‘timestamp’, u’1471611861′), (‘encrypt_type’, u’aes’), (‘msg_signature’, u’f506ba4659a772c2194ca49ea66e20eb17927960′)]) <div–<—————————————————————————— timestamp= 1471611861 nonce= 1331490337 textMsg= <xml> <ToUserName><![CDATA[gh_ac090a9873a8]]></ToUserName> <Encrypt><![CDATA[I0OSKQ8g8KB/cFtnEvCKV6n521E1cfbkb6kEOhAstCcG+wWa+A7PbEHDI+21VoeR+LngfjfDbk/uY4JRpaPzga0umS7cliglIV97i0Zq9lCiZAFKIdRxBYWNPLCkKVMNiFerJChGJ8TH4Hl1yri47ipjsNjPv1Xu9xeUeXWEPumAFiTlHAiPtRKxvfKbtCiVsSJ4jiXXxbq2zixW502UQWXmXf3y5DtMJQ4GITQtEmMBF032NNA0prMzBGlMdJsATTHuD/WGHHUalKtfy/EXAy5a2lqOpUYYQmOwa9CJggm0/vDdy9Sjds/vSYqLeTsocQhP6n4Jw08mfo0EHzhYElhgq39WVgFMluzVhETG1z2z9NNsE1Zz96kwsEv8qymeiAFgciqbK66l5HaBLwpWjySrzE5vy0GfiP/WFIhiUew=]]></Encrypt> </xml> parsedTextMsg= OrderedDict([(u’xml’, OrderedDict([(u’ToUserName’, u’gh_ac090a9873a8′), (u’Encrypt’, u’I0OSKQ8g8KB/cFtnEvCKV6n521E1cfbkb6kEOhAstCcG+wWa+A7PbEHDI+21VoeR+LngfjfDbk/uY4JRpaPzga0umS7cliglIV97i0Zq9lCiZAFKIdRxBYWNPLCkKVMNiFerJChGJ8TH4Hl1yri47ipjsNjPv1Xu9xeUeXWEPumAFiTlHAiPtRKxvfKbtCiVsSJ4jiXXxbq2zixW502UQWXmXf3y5DtMJQ4GITQtEmMBF032NNA0prMzBGlMdJsATTHuD/WGHHUalKtfy/EXAy5a2lqOpUYYQmOwa9CJggm0/vDdy9Sjds/vSYqLeTsocQhP6n4Jw08mfo0EHzhYElhgq39WVgFMluzVhETG1z2z9NNsE1Zz96kwsEv8qymeiAFgciqbK66l5HaBLwpWjySrzE5vy0GfiP/WFIhiUew=’)]))]) msg= OrderedDict([(u’ToUserName’, u’gh_ac090a9873a8′), (u’Encrypt’, u’I0OSKQ8g8KB/cFtnEvCKV6n521E1cfbkb6kEOhAstCcG+wWa+A7PbEHDI+21VoeR+LngfjfDbk/uY4JRpaPzga0umS7cliglIV97i0Zq9lCiZAFKIdRxBYWNPLCkKVMNiFerJChGJ8TH4Hl1yri47ipjsNjPv1Xu9xeUeXWEPumAFiTlHAiPtRKxvfKbtCiVsSJ4jiXXxbq2zixW502UQWXmXf3y5DtMJQ4GITQtEmMBF032NNA0prMzBGlMdJsATTHuD/WGHHUalKtfy/EXAy5a2lqOpUYYQmOwa9CJggm0/vDdy9Sjds/vSYqLeTsocQhP6n4Jw08mfo0EHzhYElhgq39WVgFMluzVhETG1z2z9NNsE1Zz96kwsEv8qymeiAFgciqbK66l5HaBLwpWjySrzE5vy0GfiP/WFIhiUew=’)]) encrypt= I0OSKQ8g8KB/cFtnEvCKV6n521E1cfbkb6kEOhAstCcG+wWa+A7PbEHDI+21VoeR+LngfjfDbk/uY4JRpaPzga0umS7cliglIV97i0Zq9lCiZAFKIdRxBYWNPLCkKVMNiFerJChGJ8TH4Hl1yri47ipjsNjPv1Xu9xeUeXWEPumAFiTlHAiPtRKxvfKbtCiVsSJ4jiXXxbq2zixW502UQWXmXf3y5DtMJQ4GITQtEmMBF032NNA0prMzBGlMdJsATTHuD/WGHHUalKtfy/EXAy5a2lqOpUYYQmOwa9CJggm0/vDdy9Sjds/vSYqLeTsocQhP6n4Jw08mfo0EHzhYElhgq39WVgFMluzVhETG1z2z9NNsE1Zz96kwsEv8qymeiAFgciqbK66l5HaBLwpWjySrzE5vy0GfiP/WFIhiUew= self.__token= sipevents self.__id= wx906274ff0f9165dd <div–<—————————————————————————— DEBUG in wechat_auth [/usr/share/nginx/html/SIPEvents/wechat_auth.py:76]: decryptedReqData=<xml><ToUserName><![CDATA[gh_ac090a9873a8]]></ToUserName> <FromUserName><![CDATA[oswjmv4X0cCXcfkIwjoDfCkeTVVY]]></FromUserName> <CreateTime>1471611861</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[但是]]></Content> <MsgId>6320524815809261568</MsgId> </xml> <div–<—————————————————————————— <div–<—————————————————————————— DEBUG in wechat_auth [/usr/share/nginx/html/SIPEvents/wechat_auth.py:77]: decrypt post body data OK <div–<—————————————————————————— data= <xml> <ToUserName><![CDATA[gh_ac090a9873a8]]></ToUserName> <Encrypt><![CDATA[I0OSKQ8g8KB/cFtnEvCKV6n521E1cfbkb6kEOhAstCcG+wWa+A7PbEHDI+21VoeR+LngfjfDbk/uY4JRpaPzga0umS7cliglIV97i0Zq9lCiZAFKIdRxBYWNPLCkKVMNiFerJChGJ8TH4Hl1yri47ipjsNjPv1Xu9xeUeXWEPumAFiTlHAiPtRKxvfKbtCiVsSJ4jiXXxbq2zixW502UQWXmXf3y5DtMJQ4GITQtEmMBF032NNA0prMzBGlMdJsATTHuD/WGHHUalKtfy/EXAy5a2lqOpUYYQmOwa9CJggm0/vDdy9Sjds/vSYqLeTsocQhP6n4Jw08mfo0EHzhYElhgq39WVgFMluzVhETG1z2z9NNsE1Zz96kwsEv8qymeiAFgciqbK66l5HaBLwpWjySrzE5vy0GfiP/WFIhiUew=]]></Encrypt> </xml> self.conf.encrypt_mode= safe timestamp= 1471611861 nonce= 1331490337 textMsg= <xml> <ToUserName><![CDATA[gh_ac090a9873a8]]></ToUserName> <Encrypt><![CDATA[I0OSKQ8g8KB/cFtnEvCKV6n521E1cfbkb6kEOhAstCcG+wWa+A7PbEHDI+21VoeR+LngfjfDbk/uY4JRpaPzga0umS7cliglIV97i0Zq9lCiZAFKIdRxBYWNPLCkKVMNiFerJChGJ8TH4Hl1yri47ipjsNjPv1Xu9xeUeXWEPumAFiTlHAiPtRKxvfKbtCiVsSJ4jiXXxbq2zixW502UQWXmXf3y5DtMJQ4GITQtEmMBF032NNA0prMzBGlMdJsATTHuD/WGHHUalKtfy/EXAy5a2lqOpUYYQmOwa9CJggm0/vDdy9Sjds/vSYqLeTsocQhP6n4Jw08mfo0EHzhYElhgq39WVgFMluzVhETG1z2z9NNsE1Zz96kwsEv8qymeiAFgciqbK66l5HaBLwpWjySrzE5vy0GfiP/WFIhiUew=]]></Encrypt> </xml> parsedTextMsg= OrderedDict([(u’xml’, OrderedDict([(u’ToUserName’, u’gh_ac090a9873a8′), (u’Encrypt’, u’I0OSKQ8g8KB/cFtnEvCKV6n521E1cfbkb6kEOhAstCcG+wWa+A7PbEHDI+21VoeR+LngfjfDbk/uY4JRpaPzga0umS7cliglIV97i0Zq9lCiZAFKIdRxBYWNPLCkKVMNiFerJChGJ8TH4Hl1yri47ipjsNjPv1Xu9xeUeXWEPumAFiTlHAiPtRKxvfKbtCiVsSJ4jiXXxbq2zixW502UQWXmXf3y5DtMJQ4GITQtEmMBF032NNA0prMzBGlMdJsATTHuD/WGHHUalKtfy/EXAy5a2lqOpUYYQmOwa9CJggm0/vDdy9Sjds/vSYqLeTsocQhP6n4Jw08mfo0EHzhYElhgq39WVgFMluzVhETG1z2z9NNsE1Zz96kwsEv8qymeiAFgciqbK66l5HaBLwpWjySrzE5vy0GfiP/WFIhiUew=’)]))]) msg= OrderedDict([(u’ToUserName’, u’gh_ac090a9873a8′), (u’Encrypt’, u’I0OSKQ8g8KB/cFtnEvCKV6n521E1cfbkb6kEOhAstCcG+wWa+A7PbEHDI+21VoeR+LngfjfDbk/uY4JRpaPzga0umS7cliglIV97i0Zq9lCiZAFKIdRxBYWNPLCkKVMNiFerJChGJ8TH4Hl1yri47ipjsNjPv1Xu9xeUeXWEPumAFiTlHAiPtRKxvfKbtCiVsSJ4jiXXxbq2zixW502UQWXmXf3y5DtMJQ4GITQtEmMBF032NNA0prMzBGlMdJsATTHuD/WGHHUalKtfy/EXAy5a2lqOpUYYQmOwa9CJggm0/vDdy9Sjds/vSYqLeTsocQhP6n4Jw08mfo0EHzhYElhgq39WVgFMluzVhETG1z2z9NNsE1Zz96kwsEv8qymeiAFgciqbK66l5HaBLwpWjySrzE5vy0GfiP/WFIhiUew=’)]) encrypt= I0OSKQ8g8KB/cFtnEvCKV6n521E1cfbkb6kEOhAstCcG+wWa+A7PbEHDI+21VoeR+LngfjfDbk/uY4JRpaPzga0umS7cliglIV97i0Zq9lCiZAFKIdRxBYWNPLCkKVMNiFerJChGJ8TH4Hl1yri47ipjsNjPv1Xu9xeUeXWEPumAFiTlHAiPtRKxvfKbtCiVsSJ4jiXXxbq2zixW502UQWXmXf3y5DtMJQ4GITQtEmMBF032NNA0prMzBGlMdJsATTHuD/WGHHUalKtfy/EXAy5a2lqOpUYYQmOwa9CJggm0/vDdy9Sjds/vSYqLeTsocQhP6n4Jw08mfo0EHzhYElhgq39WVgFMluzVhETG1z2z9NNsE1Zz96kwsEv8qymeiAFgciqbK66l5HaBLwpWjySrzE5vy0GfiP/WFIhiUew= self.__token= sipevents self.__id= wx906274ff0f9165dd <div–<—————————————————————————— DEBUG in wechat_auth [/usr/share/nginx/html/SIPEvents/wechat_auth.py:82]: parse post body data OK <div–<—————————————————————————— Traceback (most recent call last): File "/usr/local/lib/python2.7/logging/__init__.py", line 861, in emit msg = self.format(record) File "/usr/local/lib/python2.7/logging/__init__.py", line 734, in format return fmt.format(record) File "/usr/local/lib/python2.7/logging/__init__.py", line 465, in format record.message = record.getMessage() File "/usr/local/lib/python2.7/logging/__init__.py", line 329, in getMessage msg = msg % self.args UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xe4 in position 218: ordinal not in range(128) Logged from file wechat_auth.py, line 95 <div–<—————————————————————————— DEBUG in wechat_auth [/usr/share/nginx/html/SIPEvents/wechat_auth.py:99]: msgContent=但是 <div–<—————————————————————————— text response= <xml> <ToUserName><![CDATA[oswjmv4X0cCXcfkIwjoDfCkeTVVY]]></ToUserName> <FromUserName><![CDATA[gh_ac090a9873a8]]></FromUserName> <CreateTime>1471611861</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[但是]]></Content> </xml> <div–<—————————————————————————— DEBUG in wechat_auth [/usr/share/nginx/html/SIPEvents/wechat_auth.py:101]: resonseTextContent=<xml> <Encrypt><![CDATA[zntVmgenZucDR/mnfhW3R14NOv/xCMsEYSdOMh5LU+iNTY04RjFLvH7/aykF/ob2eWsaw+94yEiHYg1TSLqXPiG8qjw0Y6BGDXGpDWr2X129TebxSIwLGlfTPVYl1dZbl69AeBXJ3rReSD3R5CDNc4XKqEI0mTL9Ips0WwkxEBXCsH+DzMJAXfykQAvAU9g4GuFKwU3c+UuzP555BM5//Ff9a11eqfsncV1kTbGKp7nyKYWwgiEHe3oPcPG6RXpjDKLQlgnOhfBtQ7bVmQjmHIjzTHYXef2r0efRtV/pxRTo9e9UGuAHGNVa7ZvzyogzjWku7qQnqmQuoJOOK3XaE2Fm0+UH1hXQx9ziy36YuDitzFQBpEPpl2kDRGGLqA8PoT4Z5Q8vHrfOGlazJZBOq3sRipeth0Ug8yftx/lei3Y=]]></Encrypt> <MsgSignature><![CDATA[098b00c2fb816a4a69afbb575bfd1f9063863077]]></MsgSignature> <TimeStamp>1471611861</TimeStamp> <Nonce><![CDATA[1266049743]]></Nonce> </xml> <div–<—————————————————————————— |
看到了:
返回的,加了密之前的text的xml:
<xml> <ToUserName><![CDATA[oswjmv4X0cCXcfkIwjoDfCkeTVVY]]></ToUserName> <FromUserName><![CDATA[gh_ac090a9873a8]]></FromUserName> <CreateTime>1471611861</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[但是]]></Content> </xml> |
搜:
wechat response_text 不工作
response_text wechat
wechat 返回加了密的文本消息
参考:
wechat-sdk3版本中微信加密消息接口的小问题 · Issue #64 · doraemonext/wechat-python-sdk
和微信官网比:
好像没有错误啊。
也好像看起来一致,没问题啊。
然后,换了另外一种办法:
不去注释掉之前的:
vim /root/Envs/SIPEvents/lib/python2.7/site-packages/wechat_sdk-0.6.4-py2.7.egg/wechat_sdk/lib/crypto/cryptos.py
中的:
def _decrypt_message(self, msg, msg_signature, timestamp, nonce):
中的get_sha1_signature那个部分:
signature = get_sha1_signature(self.__token, timestamp, nonce, encrypt) print ‘singnature=’,signature,’ msg_signature=’,msg_signature if signature != msg_signature: raise ValidateSignatureError() |
而是,把中的获取sha1的函数get_sha1_signature改为,和
/Users/crifan/dev/dev_src/Weixin/wechat-python-sdk-master/wechat_sdk/basic.py
中的check_signature一样的逻辑:
即,去修改:
vim /root/Envs/SIPEvents/lib/python2.7/site-packages/wechat_sdk-0.6.4-py2.7.egg/wechat_sdk/lib/crypto/utils.py
为:
def get_sha1_signature(token, timestamp, nonce, encrypt): #sortlist = [token, timestamp, nonce, to_binary(encrypt)] sortlist = [token, timestamp, nonce] |
即,去掉了encrypt,这个(要加密的)密文
则就是使得,在get_sha1_signature之后再去比较,就可以成功了。
即:
(SIPEvents) ➜ SIPEvents gunicorn -w 4 -b 127.0.0.1:8080 wechat_auth:app [2016-08-19 21:25:44 +0000] [3178] [INFO] Starting gunicorn 19.6.0 [2016-08-19 21:25:44 +0000] [3178] [INFO] Listening at: http://127.0.0.1:8080 (3178) [2016-08-19 21:25:44 +0000] [3178] [INFO] Using worker: sync [2016-08-19 21:25:44 +0000] [3183] [INFO] Booting worker with pid: 3183 [2016-08-19 21:25:44 +0000] [3186] [INFO] Booting worker with pid: 3186 [2016-08-19 21:25:44 +0000] [3187] [INFO] Booting worker with pid: 3187 [2016-08-19 21:25:44 +0000] [3191] [INFO] Booting worker with pid: 3191 <div–<—————————————————————————— DEBUG in wechat_auth [/usr/share/nginx/html/SIPEvents/wechat_auth.py:49]: signature=2b305611c2bee0228d5abe720b119993a0863bad, timestamp=1471613148, nonce=2017910665, echostr= <div–<—————————————————————————— tmp_list= [‘sipevents’, u’1471613148′, u’2017910665′] after sort: tmp_list= [u’1471613148′, u’2017910665′, ‘sipevents’] tmp_str= 14716131482017910665sipevents tmp_str_encoded= 14716131482017910665sipevents tmp_str_sha1= <sha1 HASH object @ 0x7f158d6ec0d0> tmp_str_hexdigest= 2b305611c2bee0228d5abe720b119993a0863bad signature= 2b305611c2bee0228d5abe720b119993a0863bad signature OK <div–<—————————————————————————— DEBUG in wechat_auth [/usr/share/nginx/html/SIPEvents/wechat_auth.py:53]: wechat check_signature OK <div–<—————————————————————————— <div–<—————————————————————————— DEBUG in wechat_auth [/usr/share/nginx/html/SIPEvents/wechat_auth.py:61]: requestMethod=POST <div–<—————————————————————————— <div–<—————————————————————————— DEBUG in wechat_auth [/usr/share/nginx/html/SIPEvents/wechat_auth.py:64]: encryptedReqData=<xml> <ToUserName><![CDATA[gh_ac090a9873a8]]></ToUserName> <Encrypt><![CDATA[wb3SSzSLgl76O0eUhAcsqeMXINMDWLD0M2q81uQs0sqCG82T4kUzGycmkaNVdmnu2hY32j/yVtR+4lK+Ewf/649l+r0+xM+lZbBH1plGOm9VDcrHmC1gOKU87K05i/CYSmHHSOYqflu41MvVDQf3TiKKatmCTgAELZ2Ub0tS5E8/oBkYa/vjym2iiqbjtmgSxfIw0ZW1P1glgBAepuakzI3AH4paaH6377LUhq4zl/NGuZgO7Iqv2a48K1BYx7x/Mvp7xTAAn6blpJcLcKF6F8QBgjSE9zhz/xdTCG0Ad2NPsfr2HV0w9GZbaQJ0EHRJU0Fk8d0W02Jsnu+olcV3IHA+262HCtQh1eBvVHEKZfoIGN9ucOUlOzNmEJhupaTDdWqAI2Dmq4Dt+5lV82LbvktL1QrL1+4AU88LiKHhwfExWF2BiIGzQdIJ+KDtJvalNSI+ZrwZ4UIQmqUkdsE2sg==]]></Encrypt> </xml> <div–<—————————————————————————— <div–<—————————————————————————— DEBUG in wechat_auth [/usr/share/nginx/html/SIPEvents/wechat_auth.py:71]: requestArgs=ImmutableMultiDict([(‘nonce’, u’2017910665′), (‘openid’, u’oswjmv4X0cCXcfkIwjoDfCkeTVVY’), (‘signature’, u’2b305611c2bee0228d5abe720b119993a0863bad’), (‘timestamp’, u’1471613148′), (‘encrypt_type’, u’aes’), (‘msg_signature’, u’9efbedde0421e474d8e95a77d9ca0c3d332205d2′)]) <div–<—————————————————————————— timestamp= 1471613148 nonce= 2017910665 textMsg= <xml> <ToUserName><![CDATA[gh_ac090a9873a8]]></ToUserName> <Encrypt><![CDATA[wb3SSzSLgl76O0eUhAcsqeMXINMDWLD0M2q81uQs0sqCG82T4kUzGycmkaNVdmnu2hY32j/yVtR+4lK+Ewf/649l+r0+xM+lZbBH1plGOm9VDcrHmC1gOKU87K05i/CYSmHHSOYqflu41MvVDQf3TiKKatmCTgAELZ2Ub0tS5E8/oBkYa/vjym2iiqbjtmgSxfIw0ZW1P1glgBAepuakzI3AH4paaH6377LUhq4zl/NGuZgO7Iqv2a48K1BYx7x/Mvp7xTAAn6blpJcLcKF6F8QBgjSE9zhz/xdTCG0Ad2NPsfr2HV0w9GZbaQJ0EHRJU0Fk8d0W02Jsnu+olcV3IHA+262HCtQh1eBvVHEKZfoIGN9ucOUlOzNmEJhupaTDdWqAI2Dmq4Dt+5lV82LbvktL1QrL1+4AU88LiKHhwfExWF2BiIGzQdIJ+KDtJvalNSI+ZrwZ4UIQmqUkdsE2sg==]]></Encrypt> </xml> parsedTextMsg= OrderedDict([(u’xml’, OrderedDict([(u’ToUserName’, u’gh_ac090a9873a8′), (u’Encrypt’, u’wb3SSzSLgl76O0eUhAcsqeMXINMDWLD0M2q81uQs0sqCG82T4kUzGycmkaNVdmnu2hY32j/yVtR+4lK+Ewf/649l+r0+xM+lZbBH1plGOm9VDcrHmC1gOKU87K05i/CYSmHHSOYqflu41MvVDQf3TiKKatmCTgAELZ2Ub0tS5E8/oBkYa/vjym2iiqbjtmgSxfIw0ZW1P1glgBAepuakzI3AH4paaH6377LUhq4zl/NGuZgO7Iqv2a48K1BYx7x/Mvp7xTAAn6blpJcLcKF6F8QBgjSE9zhz/xdTCG0Ad2NPsfr2HV0w9GZbaQJ0EHRJU0Fk8d0W02Jsnu+olcV3IHA+262HCtQh1eBvVHEKZfoIGN9ucOUlOzNmEJhupaTDdWqAI2Dmq4Dt+5lV82LbvktL1QrL1+4AU88LiKHhwfExWF2BiIGzQdIJ+KDtJvalNSI+ZrwZ4UIQmqUkdsE2sg==’)]))]) msg= OrderedDict([(u’ToUserName’, u’gh_ac090a9873a8′), (u’Encrypt’, u’wb3SSzSLgl76O0eUhAcsqeMXINMDWLD0M2q81uQs0sqCG82T4kUzGycmkaNVdmnu2hY32j/yVtR+4lK+Ewf/649l+r0+xM+lZbBH1plGOm9VDcrHmC1gOKU87K05i/CYSmHHSOYqflu41MvVDQf3TiKKatmCTgAELZ2Ub0tS5E8/oBkYa/vjym2iiqbjtmgSxfIw0ZW1P1glgBAepuakzI3AH4paaH6377LUhq4zl/NGuZgO7Iqv2a48K1BYx7x/Mvp7xTAAn6blpJcLcKF6F8QBgjSE9zhz/xdTCG0Ad2NPsfr2HV0w9GZbaQJ0EHRJU0Fk8d0W02Jsnu+olcV3IHA+262HCtQh1eBvVHEKZfoIGN9ucOUlOzNmEJhupaTDdWqAI2Dmq4Dt+5lV82LbvktL1QrL1+4AU88LiKHhwfExWF2BiIGzQdIJ+KDtJvalNSI+ZrwZ4UIQmqUkdsE2sg==’)]) encrypt= wb3SSzSLgl76O0eUhAcsqeMXINMDWLD0M2q81uQs0sqCG82T4kUzGycmkaNVdmnu2hY32j/yVtR+4lK+Ewf/649l+r0+xM+lZbBH1plGOm9VDcrHmC1gOKU87K05i/CYSmHHSOYqflu41MvVDQf3TiKKatmCTgAELZ2Ub0tS5E8/oBkYa/vjym2iiqbjtmgSxfIw0ZW1P1glgBAepuakzI3AH4paaH6377LUhq4zl/NGuZgO7Iqv2a48K1BYx7x/Mvp7xTAAn6blpJcLcKF6F8QBgjSE9zhz/xdTCG0Ad2NPsfr2HV0w9GZbaQJ0EHRJU0Fk8d0W02Jsnu+olcV3IHA+262HCtQh1eBvVHEKZfoIGN9ucOUlOzNmEJhupaTDdWqAI2Dmq4Dt+5lV82LbvktL1QrL1+4AU88LiKHhwfExWF2BiIGzQdIJ+KDtJvalNSI+ZrwZ4UIQmqUkdsE2sg== self.__token= sipevents singnature= 2b305611c2bee0228d5abe720b119993a0863bad msg_signature= 2b305611c2bee0228d5abe720b119993a0863bad self.__id= wx906274ff0f9165dd <div–<—————————————————————————— DEBUG in wechat_auth [/usr/share/nginx/html/SIPEvents/wechat_auth.py:76]: decryptedReqData=<xml><ToUserName><![CDATA[gh_ac090a9873a8]]></ToUserName> <FromUserName><![CDATA[oswjmv4X0cCXcfkIwjoDfCkeTVVY]]></FromUserName> <CreateTime>1471613148</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[好好好]]></Content> <MsgId>6320530343432171852</MsgId> </xml> <div–<—————————————————————————— <div–<—————————————————————————— DEBUG in wechat_auth [/usr/share/nginx/html/SIPEvents/wechat_auth.py:77]: decrypt post body data OK <div–<—————————————————————————— data= <xml> <ToUserName><![CDATA[gh_ac090a9873a8]]></ToUserName> <Encrypt><![CDATA[wb3SSzSLgl76O0eUhAcsqeMXINMDWLD0M2q81uQs0sqCG82T4kUzGycmkaNVdmnu2hY32j/yVtR+4lK+Ewf/649l+r0+xM+lZbBH1plGOm9VDcrHmC1gOKU87K05i/CYSmHHSOYqflu41MvVDQf3TiKKatmCTgAELZ2Ub0tS5E8/oBkYa/vjym2iiqbjtmgSxfIw0ZW1P1glgBAepuakzI3AH4paaH6377LUhq4zl/NGuZgO7Iqv2a48K1BYx7x/Mvp7xTAAn6blpJcLcKF6F8QBgjSE9zhz/xdTCG0Ad2NPsfr2HV0w9GZbaQJ0EHRJU0Fk8d0W02Jsnu+olcV3IHA+262HCtQh1eBvVHEKZfoIGN9ucOUlOzNmEJhupaTDdWqAI2Dmq4Dt+5lV82LbvktL1QrL1+4AU88LiKHhwfExWF2BiIGzQdIJ+KDtJvalNSI+ZrwZ4UIQmqUkdsE2sg==]]></Encrypt> </xml> self.conf.encrypt_mode= safe timestamp= 1471613148 nonce= 2017910665 textMsg= <xml> <ToUserName><![CDATA[gh_ac090a9873a8]]></ToUserName> <Encrypt><![CDATA[wb3SSzSLgl76O0eUhAcsqeMXINMDWLD0M2q81uQs0sqCG82T4kUzGycmkaNVdmnu2hY32j/yVtR+4lK+Ewf/649l+r0+xM+lZbBH1plGOm9VDcrHmC1gOKU87K05i/CYSmHHSOYqflu41MvVDQf3TiKKatmCTgAELZ2Ub0tS5E8/oBkYa/vjym2iiqbjtmgSxfIw0ZW1P1glgBAepuakzI3AH4paaH6377LUhq4zl/NGuZgO7Iqv2a48K1BYx7x/Mvp7xTAAn6blpJcLcKF6F8QBgjSE9zhz/xdTCG0Ad2NPsfr2HV0w9GZbaQJ0EHRJU0Fk8d0W02Jsnu+olcV3IHA+262HCtQh1eBvVHEKZfoIGN9ucOUlOzNmEJhupaTDdWqAI2Dmq4Dt+5lV82LbvktL1QrL1+4AU88LiKHhwfExWF2BiIGzQdIJ+KDtJvalNSI+ZrwZ4UIQmqUkdsE2sg==]]></Encrypt> </xml> parsedTextMsg= OrderedDict([(u’xml’, OrderedDict([(u’ToUserName’, u’gh_ac090a9873a8′), (u’Encrypt’, u’wb3SSzSLgl76O0eUhAcsqeMXINMDWLD0M2q81uQs0sqCG82T4kUzGycmkaNVdmnu2hY32j/yVtR+4lK+Ewf/649l+r0+xM+lZbBH1plGOm9VDcrHmC1gOKU87K05i/CYSmHHSOYqflu41MvVDQf3TiKKatmCTgAELZ2Ub0tS5E8/oBkYa/vjym2iiqbjtmgSxfIw0ZW1P1glgBAepuakzI3AH4paaH6377LUhq4zl/NGuZgO7Iqv2a48K1BYx7x/Mvp7xTAAn6blpJcLcKF6F8QBgjSE9zhz/xdTCG0Ad2NPsfr2HV0w9GZbaQJ0EHRJU0Fk8d0W02Jsnu+olcV3IHA+262HCtQh1eBvVHEKZfoIGN9ucOUlOzNmEJhupaTDdWqAI2Dmq4Dt+5lV82LbvktL1QrL1+4AU88LiKHhwfExWF2BiIGzQdIJ+KDtJvalNSI+ZrwZ4UIQmqUkdsE2sg==’)]))]) msg= OrderedDict([(u’ToUserName’, u’gh_ac090a9873a8′), (u’Encrypt’, u’wb3SSzSLgl76O0eUhAcsqeMXINMDWLD0M2q81uQs0sqCG82T4kUzGycmkaNVdmnu2hY32j/yVtR+4lK+Ewf/649l+r0+xM+lZbBH1plGOm9VDcrHmC1gOKU87K05i/CYSmHHSOYqflu41MvVDQf3TiKKatmCTgAELZ2Ub0tS5E8/oBkYa/vjym2iiqbjtmgSxfIw0ZW1P1glgBAepuakzI3AH4paaH6377LUhq4zl/NGuZgO7Iqv2a48K1BYx7x/Mvp7xTAAn6blpJcLcKF6F8QBgjSE9zhz/xdTCG0Ad2NPsfr2HV0w9GZbaQJ0EHRJU0Fk8d0W02Jsnu+olcV3IHA+262HCtQh1eBvVHEKZfoIGN9ucOUlOzNmEJhupaTDdWqAI2Dmq4Dt+5lV82LbvktL1QrL1+4AU88LiKHhwfExWF2BiIGzQdIJ+KDtJvalNSI+ZrwZ4UIQmqUkdsE2sg==’)]) encrypt= wb3SSzSLgl76O0eUhAcsqeMXINMDWLD0M2q81uQs0sqCG82T4kUzGycmkaNVdmnu2hY32j/yVtR+4lK+Ewf/649l+r0+xM+lZbBH1plGOm9VDcrHmC1gOKU87K05i/CYSmHHSOYqflu41MvVDQf3TiKKatmCTgAELZ2Ub0tS5E8/oBkYa/vjym2iiqbjtmgSxfIw0ZW1P1glgBAepuakzI3AH4paaH6377LUhq4zl/NGuZgO7Iqv2a48K1BYx7x/Mvp7xTAAn6blpJcLcKF6F8QBgjSE9zhz/xdTCG0Ad2NPsfr2HV0w9GZbaQJ0EHRJU0Fk8d0W02Jsnu+olcV3IHA+262HCtQh1eBvVHEKZfoIGN9ucOUlOzNmEJhupaTDdWqAI2Dmq4Dt+5lV82LbvktL1QrL1+4AU88LiKHhwfExWF2BiIGzQdIJ+KDtJvalNSI+ZrwZ4UIQmqUkdsE2sg== self.__token= sipevents singnature= 2b305611c2bee0228d5abe720b119993a0863bad msg_signature= 2b305611c2bee0228d5abe720b119993a0863bad self.__id= wx906274ff0f9165dd <div–<—————————————————————————— DEBUG in wechat_auth [/usr/share/nginx/html/SIPEvents/wechat_auth.py:82]: parse post body data OK <div–<—————————————————————————— Traceback (most recent call last): File "/usr/local/lib/python2.7/logging/__init__.py", line 861, in emit msg = self.format(record) File "/usr/local/lib/python2.7/logging/__init__.py", line 734, in format return fmt.format(record) File "/usr/local/lib/python2.7/logging/__init__.py", line 465, in format record.message = record.getMessage() File "/usr/local/lib/python2.7/logging/__init__.py", line 329, in getMessage msg = msg % self.args UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xe5 in position 218: ordinal not in range(128) Logged from file wechat_auth.py, line 95 <div–<—————————————————————————— DEBUG in wechat_auth [/usr/share/nginx/html/SIPEvents/wechat_auth.py:99]: msgContent=好好好 <div–<—————————————————————————— text response= <xml> <ToUserName><![CDATA[oswjmv4X0cCXcfkIwjoDfCkeTVVY]]></ToUserName> <FromUserName><![CDATA[gh_ac090a9873a8]]></FromUserName> <CreateTime>1471613148</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[好好好]]></Content> </xml> <div–<—————————————————————————— DEBUG in wechat_auth [/usr/share/nginx/html/SIPEvents/wechat_auth.py:101]: resonseTextContent=<xml> <Encrypt><![CDATA[+X7JrrxP+8cu+DvrZMmiPuUxHwOFZlohJWKlOXBOkAUGnaYxf05ZxG3VvtqPSlRrkMgc11xVsYHF587/GqUQZtv3xoNaksqJcyj2rDM/2Jn+a2sdL+9Qkwrp2S+SLU9rRaHry4RG0vg9GyX5NoCh479mw5zCez7vBqNXqAuBtR6VC1LcCvBl/kiXUgR9aD2aaJZGkKWB0DkUxfOyZUbgtETH6PTmR05fFZZZUanRLxabSDrgPx6gsqc96iSaXE91K0iVhMQBkOMtpUm5auHGgitlhevnGhWQeCjuu1vRXXdPq6v7r0FRbPTRS39hO67ed/zoFJNcMdCIVxtYJDyMeHP90bu3Z9uQy6T3hWIdmWG4+JvN47K3aF8QxCDPSf5celBpDBFBSugICjefY4+o2vJ7sf4AvOhk1zeucVb6QPVIAM6AikXl71pp1twoOY4eKiR0DtqRop70shPuNio7JQ==]]></Encrypt> <MsgSignature><![CDATA[05353167e25b78f7e3c46d19d012ebe47cc75911]]></MsgSignature> <TimeStamp>1471613148</TimeStamp> <Nonce><![CDATA[1834786501]]></Nonce> </xml> <div–<—————————————————————————— |
中的:
singnature= 2b305611c2bee0228d5abe720b119993a0863bad msg_signature= 2b305611c2bee0228d5abe720b119993a0863bad
但是,即使是这样,最后微信公众号那边,还是问题依旧:
回复文本,服务器还是出错,显示:
该公众号暂时无法提供服务,请稍后再试
去调试看看:
然后去测试,发现是:
请求地址: http://xxxx/wechat_auth 成功或失败: Decrypt Fail! 错误原因: Compare signature error, the singnature WeiXin computed:cbc29f9cb6cba1291cc1bbd8fd1d166d627e3e2d, The use uf token:sipevents |
搜:
Compare signature error, the singnature WeiXin
Compare signature error, the signature WeiXin
Decrypt Fail! Compare signature error, the singnature WeiXin
微信 Decrypt Fail! Compare signature error
消息体签名及加解密使用报错 · Issue #140 · node-webot/wechat
测试消息回复竟然成这样了 – 微信源码专区 – 【9秒社团】-中国最大的移动开源技术社区
微信公众平台开发者中心安全模式消息体加解密实现 – 方倍工作室 – 博客园
转载请注明:在路上 » [未解决]用Python的微信SDK wechat-sdk中parse_data时出错:ValidateSignatureError