谷歌云 tornado+nginx+python 微信公众号接入配置(学习笔记2018.11.11)
目前已有环境介绍:
谷歌云vm实例 centos7 外币卡首次注册送300美金,可用于购买
宝塔面板,宝塔面板可用功能很多,支持一键配置源码,功能很多
nginx 版本1.12 通过宝塔面板的编译安装的
python3环境
通过下面命令安装,安装模块基本操作
pip install tornado
之前学django的时候,也没有具体在主机上配置过,在这里坑了很久
其实这里主要是需要编辑nginx.conf文件在server里面增加一个location 路由配置 ,我是通过宝塔面板编译安装的,nginx配置路径是/www/server/nginx/conf/nginx.conf
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
开发者提交信息后,微信服务器将发送GET请求到填写的服务器地址URL上,GET请求携带四个参数:
开发者通过检验signature对请求进行校验。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。
校验流程:
将token、timestamp、nonce三个参数进行字典序排序
将三个参数字符串拼接成一个字符串进行sha1加密,进行加密前需要encode为utf-8
开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
具体见微信公众号开发文档https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421135319
# coding:utf-8
import tornado.web
import tornado.options
import tornado.httpserver
import tornado.ioloop
import hashlib
from tornado.web import RequestHandler
from tornado.options import options, define
WECHAT_TOKEN = 'test'
define('port', default=8000, type=int, help='')
class WechatHandler(RequestHandler):
'''
对接微信服务器
将token、timestamp、nonce三个参数进行字典序排序
将三个参数字符串拼接成一个字符串进行sha1加密,encode为utf-8
开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
'''
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)
# TypeError: Unicode-objects must be encoded before hashing
# 需要encode
real_signature = hashlib.sha1(tmp.encode()).hexdigest()
if signature == real_signature:
self.write(echostr)
else:
self.send_error(403)
def main():
tornado.options.parse_command_line()
app = tornado.web.Application(
[
(r'/wechat8000', WechatHandler),
]
)
http_server = tornado.httpserver.HTTPServer(app)
http_server.listen(options.port)
tornado.ioloop.IOLoop.current().start()
if __name__ == '__main__':
main()
这里使用lrzsz将代码上传到云主机,当然你也可以使用scp
yum install lrzsz
我是使用xshell远程连接的云主机,输入rz选择python文件即可上传
将我们的代码跑起来
python 文件名.py
url 为http://你的云主机ip/wechat8000
token 为验证代码中的那个 全局变量
验证成功后会返回200的标识,失败404,没有反应的话基本就是nginx配置出错了