github地址:cppfun@wechat-open-third-party-dev
这节之前你需要阅读之前的八节内容:
微信公众号第三方平台开发python教程 Part 1
微信公众号第三方平台开发python教程 Part 2
微信公众号第三方平台开发python教程 Part 3
微信公众号第三方平台开发python教程 Part 4
微信公众号第三方平台开发python教程 Part 5
微信公众号第三方平台开发python教程 Part 6
微信公众号第三方平台开发python教程 Part 7
微信公众号第三方平台开发python教程 Part 8
本节我们首先实现异步回应,用什么?当然是线程。
我们来看实现:
class WxThread
(
threading.
Thread
):
def __init__ ( self , threadID , name ):
threading. Thread. __init__ ( self )
self. threadID = threadID
self. name = name
def run ( self ):
logger. info (get_time ( )+ 'WxThread HttpResponse("")' )
return HttpResponse ( '' )
def __init__ ( self , threadID , name ):
threading. Thread. __init__ ( self )
self. threadID = threadID
self. name = name
def run ( self ):
logger. info (get_time ( )+ 'WxThread HttpResponse("")' )
return HttpResponse ( '' )
这个代码很简单,我就不解释了。
我们看看如何调用:
elif Content.
startswith
(
'QUERY_AUTH_CODE'
):
# send_bank_response()
bank_resp = WxThread ( 1 , "WxThread" )
bank_resp. start ( )
query_auth_code = Content. split ( ':' ) [ 1 ]
json_file = open ( 'com_ticket.json' )
data = json. load (json_file )
json_file. close ( )
if data [ 'ComponentVerifyTicket' ] == '':
return HttpResponse ( 'no ComponentVerifyTicket' )
ComponentVerifyTicket = data [ 'ComponentVerifyTicket' ]
wxOpenSDK = WxOpenSDK (ticket =ComponentVerifyTicket )
info = wxOpenSDK. get_authorization_info (authorization_code =query_auth_code )
authorizer_access_token = info [ 'authorizer_access_token' ]
post_cont = query_auth_code + '_from_api'
post_custom_text_msg (touser =FromUserName ,
content =post_cont ,
stoken =authorizer_access_token )
# send_bank_response()
bank_resp = WxThread ( 1 , "WxThread" )
bank_resp. start ( )
query_auth_code = Content. split ( ':' ) [ 1 ]
json_file = open ( 'com_ticket.json' )
data = json. load (json_file )
json_file. close ( )
if data [ 'ComponentVerifyTicket' ] == '':
return HttpResponse ( 'no ComponentVerifyTicket' )
ComponentVerifyTicket = data [ 'ComponentVerifyTicket' ]
wxOpenSDK = WxOpenSDK (ticket =ComponentVerifyTicket )
info = wxOpenSDK. get_authorization_info (authorization_code =query_auth_code )
authorizer_access_token = info [ 'authorizer_access_token' ]
post_cont = query_auth_code + '_from_api'
post_custom_text_msg (touser =FromUserName ,
content =post_cont ,
stoken =authorizer_access_token )
这样就可以解决异步回复问题。
下面是全网检测的整个代码:
def weixin_check
(decrypt_xml
, nonce
):
xml = etree. fromstring (decrypt_xml )
ToUserName = xml. find ( 'ToUserName' ). text
FromUserName = xml. find ( 'FromUserName' ). text
MsgType = xml. find ( 'MsgType' ). text
if MsgType == 'event':
event = xml. find ( "Event" ). text
eval_cont = event+ 'from_callback'
return send_text_cont (fromu =FromUserName , tou =ToUserName , cont =eval_cont , nonce =nonce )
elif MsgType == 'text':
Content = xml. find ( 'Content' ). text
logger. info ( 'got the content %s' % Content )
if Content == 'TESTCOMPONENT_MSG_TYPE_TEXT':
reply_cont = Content+ '_callback'
return send_text_cont (FromUserName , tou =ToUserName , cont =reply_cont , nonce =nonce )
elif Content. startswith ( 'QUERY_AUTH_CODE' ):
# send_bank_response()
bank_resp = WxThread ( 1 , "WxThread" )
bank_resp. start ( )
query_auth_code = Content. split ( ':' ) [ 1 ]
json_file = open ( 'com_ticket.json' )
data = json. load (json_file )
json_file. close ( )
if data [ 'ComponentVerifyTicket' ] == '':
return HttpResponse ( 'no ComponentVerifyTicket' )
ComponentVerifyTicket = data [ 'ComponentVerifyTicket' ]
wxOpenSDK = WxOpenSDK (ticket =ComponentVerifyTicket )
info = wxOpenSDK. get_authorization_info (authorization_code =query_auth_code )
authorizer_access_token = info [ 'authorizer_access_token' ]
post_cont = query_auth_code + '_from_api'
post_custom_text_msg (touser =FromUserName ,
content =post_cont ,
stoken =authorizer_access_token )
xml = etree. fromstring (decrypt_xml )
ToUserName = xml. find ( 'ToUserName' ). text
FromUserName = xml. find ( 'FromUserName' ). text
MsgType = xml. find ( 'MsgType' ). text
if MsgType == 'event':
event = xml. find ( "Event" ). text
eval_cont = event+ 'from_callback'
return send_text_cont (fromu =FromUserName , tou =ToUserName , cont =eval_cont , nonce =nonce )
elif MsgType == 'text':
Content = xml. find ( 'Content' ). text
logger. info ( 'got the content %s' % Content )
if Content == 'TESTCOMPONENT_MSG_TYPE_TEXT':
reply_cont = Content+ '_callback'
return send_text_cont (FromUserName , tou =ToUserName , cont =reply_cont , nonce =nonce )
elif Content. startswith ( 'QUERY_AUTH_CODE' ):
# send_bank_response()
bank_resp = WxThread ( 1 , "WxThread" )
bank_resp. start ( )
query_auth_code = Content. split ( ':' ) [ 1 ]
json_file = open ( 'com_ticket.json' )
data = json. load (json_file )
json_file. close ( )
if data [ 'ComponentVerifyTicket' ] == '':
return HttpResponse ( 'no ComponentVerifyTicket' )
ComponentVerifyTicket = data [ 'ComponentVerifyTicket' ]
wxOpenSDK = WxOpenSDK (ticket =ComponentVerifyTicket )
info = wxOpenSDK. get_authorization_info (authorization_code =query_auth_code )
authorizer_access_token = info [ 'authorizer_access_token' ]
post_cont = query_auth_code + '_from_api'
post_custom_text_msg (touser =FromUserName ,
content =post_cont ,
stoken =authorizer_access_token )
好了,教程到这里就算结束了,我这几天会把整个代码非商业部分放到github上,方便大家浏览,互相学习。