美文网首页微信小程序开发生活不易 我用pythonpython
tornado+nginx+python 微信公众号接入配置

tornado+nginx+python 微信公众号接入配置

作者: udhga | 来源:发表于2018-07-18 16:14 被阅读11次

    配置环境:腾讯主机 Ubuntu Server 16.04.1 LTS 64位
    需要用到的软件或者包:nginx,tornado框架 xshell6(非必需)
    微信公众号测试平台:http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login
    如果使用虚拟环境的还需要配置virtualenv和virtualenvwrapper,请看我的这篇教程python安装virtualenv和virtualenvwrapper

    昨晚折腾了好久,还是卡在接口配置信息那里,对接不成功,微信公众号没有响应,查了好多教程,也没有仔细说到我遇到的问题,终于今天找到了问题的根本了,是nginx配置的问题,其实我也对nginx和端口的问题不是很清楚的,这个还是需要深入研究的,毕竟我也是小白,一切都是刚刚开始,但是把必须的参数配置一下,居然成功了,也总结了一下自己的粗心。
    1.nginx配置
    先说一下这个配置文件的路径问题,源码安装和pip安装的配置文件的路径是不一样的,名字也不一样,我是使用命令安装的,所以配置文件路径为:/etc/nginx/sites-available/default
    源码安装的网上的教程说是在nginx里面的nginx.conf
    腾讯默认的nginx配置文件内容为(为了省长度我把注释删除了,源文件可以自行安装查看)

    server {
            listen 80 default_server;
            listen [::]:80 default_server;
            root /var/www/html;
     
            index index.html index.htm index.nginx-debian.html;
     
            server_name _;
     
            location / {
       
                    try_files $uri $uri/ =404;
     
            }
    

    要在server里面增加一个location 路由配置

    location /wechat8000{
            proxy_pass_header Server;
            proxy_set_header Host $http_host;
            proxy_redirect off;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Scheme $scheme;  
            proxy_pass http://127.0.0.1:8000;
        }
    

    先说一下主要的,/wechat8000这个是路由配置,你想写啥写啥,这个要和微信公众号接口配置信息的url对应

    http://主机ip/wechat8000
    

    2.tornado框架+python代码
    开发者提交信息后,微信服务器将发送GET请求到填写的服务器地址URL上,GET请求携带四个参数


    参数对照.png

    开发者通过检验signature对请求进行校验。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。

    校验流程:

    将token、timestamp、nonce三个参数进行字典序排序
    将三个参数字符串拼接成一个字符串进行sha1加密
    开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
    详细资料请看微信官方文档

    验证服务器地址的有效性测试代码01_wechat.py

    # coding:utf8
    import tornado.web
    import tornado.ioloop
    import tornado.httpserver
    import hashlib
     
    from tornado.options import options, define
    from tornado.web import RequestHandler
     
    WECHAT_TOKEN = "amtest" # 这个是接口配置信息的token,随便写
     
     
    define('port', default=8000, type=int, help="")
     
     
    class WechatHandler(RequestHandler):
        def get(self):
            signature = self.get_argument("signature")
            timestamp = self.get_argument("timestamp")
            nonce = self.get_argument("nonce")
            echostr = self.get_argument("echostr")
            tmp = [WECHAT_TOKEN, timestamp, nonce]
            tmp.sort()
            tmp = "".join(tmp)
           # 需要转码的情加上.encode('utf8')
            real_signature = hashlib.sha1(tmp.encode('utf8')).hexdigest() 
            if signature == real_signature:
                self.write(echostr)
            else:
                self.send_error("error")
     
     
    def main():
        tornado.options.parse_command_line()
        app = tornado.web.Application(
            [
                (r"/wechat8000", WechatHandler),
            ], debug=True,
        )
        http_server = tornado.httpserver.HTTPServer(app)
        http_server.listen(options.port)
        tornado.ioloop.IOLoop.current().start()
     
     
    if __name__ == "__main__":
        main()
    

    写完把代码拷贝到你购买的主机上,然后运行,命令如下(这里我是使用scp和xshell6搭配)

    scp 本地文件 用户名@主机ip:远程主机存放文件路径
    workon tornado01 # 此处是我的虚拟环境,可以忽略
    python 01_wechat.py
    

    运行后进行 微信公众号 接口配置信息
    3.微信接口信息配置
    这里的url要和tornado代码的路由、nginx location里面的配置想对应,配置完点击提交,成功后会出现配置成功的提示


    配置成功

    此时到xshell6看看终端后台会看到对接成功微信返回来的echostr


    echostr.png

    恭喜你,对接验证完成,可以进行微信的其他开发了

    原文地址:http://www.gooboys.com/tornado-wechat/2557

    相关文章

      网友评论

        本文标题:tornado+nginx+python 微信公众号接入配置

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