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

配置环境:腾讯主机 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请求携带四个参数

tornado+nginx+python 微信公众号接入配置插图
开发者通过检验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)
        real_signature = hashlib.sha1(tmp.encode('utf8')).hexdigest() # 需要转码的情加上.encode('utf8')
        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里面的配置想对应,配置完点击提交,成功后会出现配置成功的提示

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

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

tornado+nginx+python 微信公众号接入配置插图2
恭喜你,对接验证完成,可以进行微信的其他开发了

THE END
分享
二维码
< <上一篇
下一篇>>