美文网首页微信开发运营Flask
自定义服务端接收微信消息

自定义服务端接收微信消息

作者: 老胡聊聊天 | 来源:发表于2018-10-22 12:53 被阅读26次

    如上图所示,微信公众号自带一些自动回复的功能,但是很弱,通常我们需要接收用户发给公众号的消息,并做一些个性化的相应。

    1、配置部分

    打开“开发”》“基本配置”


    image.png

    找到服务器配置,点修改配置


    image.png

    设置一个接收微信请求的url,这个是我们提前开发好的一个服务,等下说这个服务需要做什么。token随便填一个。key随机生成。然后提交,就绑定成功了。


    image.png

    2、代码部分

    服务怎么开发呢?微信有说明,在这里
    https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421135319
    我这里简述一下:
    点击提交的时候,微信会发送几个参数给你:

    timestamp=1540176606
    echostr=3892692869596528638
    nonce=1854606751
    signature=6a62fc79ddf83b3ff96e5cbd068b983f88f192ba
    

    你需要校验一下,如果这个请求是微信来的(而不是某个黑客假冒的),就给微信返回他发过来的echostr。

    校验规则是这样的的:1)将token、timestamp、nonce三个参数进行字典序排序 2)将三个参数字符串拼接成一个字符串进行sha1加密 3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信

    当然如果你只是个人demo,懒得校验可以无脑直接返回echostr就行了

    python-flask示例代码(不校验的):

    @app.route('/msg',methods=['GET'])
    def msg():
        return request.args['echostr']
    

    python-flask示例代码(带校验的):

    @app.route('/msg',methods=['GET'])
    def msg():
        #获取参数
        timestamp = request.args['timestamp']
        nonce = request.args['nonce']
        signature = request.args['signature']
        echostr = request.args['echostr']
        token = 'weixin'
    
        #排序
        sortedlist = sorted((timestamp,nonce,token))
        #连接字符串
        s = ''.join(sortedlist)
        #sha1加密
        s1 = hashlib.sha1(s.encode('utf8')).hexdigest()
        if(s1==signature):
            return echostr
        else:
            return "error"
    

    上面的校验可以有效防止别人非法调用你的接口,所以提供给微信调用的所有接口,大家也都务必要加上验证。

    3、最后有个跟本文无关的彩蛋

    微信调用接口只能在服务器端,无法调用局域网地址,为了方便调试可以加一个log,把微信传的params、headers都记录到log里面:

    
    def logRequest():
        with codecs.open("wechat.log",'w','utf-8') as f:
            for obj in request.args:
                f.write("%s=%s"%(obj, request.args[obj]))
                f.write("\r\n")
            f.write("\r\n")
            f.write("\r\n")
            for obj in request.headers:
                f.writelines("%s=%s"%(obj[0], obj[1]))
                f.write("\r\n")
    

    相关文章

      网友评论

      • Javen205:文章最后……
        本地可以做端口映射使用局域网被外网访问。
        Ngrok、Frp了解一下
        老胡聊聊天:多谢大大 :smiley:

      本文标题:自定义服务端接收微信消息

      本文链接:https://www.haomeiwen.com/subject/rlwwzftx.html