图像

微信公众号第三方平台开发python教程 Part 8

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
这个我们对照https://open.weixin.qq.com上的要求一步步来。

微信针对每个第三方接入应用会给出不同的测试公众号,我获取的如下。
自动化测试的专用测试公众号的信息如下:
(1)appid: wx570bc396a51b8ff8
(2)Username: gh_3c884a361561
专用测试公众号自动授权给第三方平台时,将推送query_auth_code给服务方

我们根据要求实现该号对应的测试。

反馈event消息

代码实现如下:

    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)
回复TESTCOMPONENT_MSG_TYPE_TEXT消息

代码实现如下:

    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)
QUERY_AUTH_CODE第一次回复空串
        elif Content.startswith('QUERY_AUTH_CODE'):
            return send_bank_response()
QUERY_AUTH_CODE发送客服消息
            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)

在上面的代码中我的实现又有一个小的缺陷,就是异步回复的问题,我们看看回复要求:

模拟粉丝发送文本消息给专用测试公众号,第三方平台方需在5秒内返回空串表明暂时不回复,然后再立即使用客服消息接口发送消息回复粉丝
Django里面怎么异步操作?自己先想想,我在下节会给出答案

上面的代码我们调用了几个方法,代码如下:

# send all text msg
def send_text_cont(fromu, tou, cont, nonce):
    wxu = WxUtils()
    reply_xml = """
    <xml>
    <ToUserName><![CDATA[%s]]></ToUserName>
    <FromUserName><![CDATA[%s]]></FromUserName>
    <CreateTime>%d</CreateTime>
    <MsgType><![CDATA[text]]></MsgType>
    <Content><![CDATA[%s]]></Content>
    </xml>"""
% (fromu, tou, int(time.time()), cont)
    encrypt_xml = wxu.get_encrypt_xml(reply_xml=reply_xml, nonce=nonce)
    return HttpResponse(encrypt_xml)


# send bank msg
def send_bank_response():
    return HttpResponse('')


# send custom text msg
def post_custom_text_msg(touser, content, stoken):
    url = 'https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=%s' % stoken
    payload = {
        "touser": touser,
        "msgtype": "text",
        "text":
        {
             "content": content
        }
    }
    headers = {'content-type': 'application/json'}
    response = requests.post(url, data=json.dumps(payload), headers=headers)
    logger.info(get_time()+'post_custom_text_msg return: ' + response.text)

现在我们的《全网发布接入检测》代码整体如下:

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'):
            return send_bank_response()
            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)

其实没有多少行代码,因为我对代码进行了重构。
好了,以后的八节是对整个微信公众号第三方平台第三方开发接入python版本实现的一系列步骤的介绍,最后的第九节,我将把他们全部串联起来,呈现给大家。
第九节请看微信公众号第三方平台开发python教程 Part 9

发表评论