本文最后更新于 2024年1月13日 晚上
解析微信请求及响应消息
目录
- 微信公众号开发(一)——申请微信公众号以及配置流程简介
- 微信公众号开发(二)——解析微信请求及响应消息
- 微信公众号开发(三)——解析微信事件XML数据消息及响应
- 微信公众号开发(四)——公众号按钮设置及自己的微信按钮编辑器
- 微信公众号开发(五)——微信网页授权获取用户openId
微信开发第一步即为配置我方服务器的接口地址,为了成功配置,需要在配置前先将此接口根据微信的调用流程来开发完成,才可能成功的配置到微信后台。
搭建环境
在开始写接口前, 先准备好开发环境, 我是用Python+Flask搭建的, 具体版本如下:
- Python: 3.10.0
- Flask: 3.0.0 - web框架
- lxml: 5.1.0 - 解析微信发来的xml数据
- 自己的云服务器(或者自己电脑内网穿透): 我的是阿里云的ECS服务器(Alibaba Cloud Linux3) - 用来跑自己的后端项目
开始搭建
配置 Nginx
Nginx 配置目录在 /etc/nginx/conf.d ,在此目录下创建一个配置文件 wechat.conf :
1 2 3 4 5 6 7 8
| server { listen 80; server_name 【你的域名】;
location / { proxy_pass http://127.0.0.1:8000; } }
|
创建一个Flask项目
写好一个基本框架, 用来处理微信的请求.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| from flask import Flask, request, make_response import hashlib
app = Flask(__name__)
@app.route('/wechat', methods=['GET', 'POST']) def idnex(): pass
def def validate(timestamp, nonce, token, signature): pass
def handle_message(): pass
if __name__ == '__main__': app.run(port=8000)
|
获取微信配置参数
阅读了上一篇文章微信公众号开发(一)——申请微信公众号以及配置流程简介便可知道,在微信后台配置时,微信发送过来的请求是GET方式.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| @app.route('/wechat', methods=['GET', 'POST']) def index(): token = 'XXXXX'
data = request.args signature = data.get('signature') timestamp = data.get('timestamp') nonce = data.get('nonce') echostr = data.get('echostr')
...
...
def validate(timestamp, nonce, token, signature): pass
|
进行加密参数比对
将获取到的参数组成列表, 进行字典排序, 拼接成字符串, 然后进行sha1加密, 和signature进行比对, 代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| def validate(timestamp, nonce, token, signature): """ 验证服务器地址有效性 :param timestamp:时间戳 :param nonce: 随机数 :param token: 自定义的token :param signature: 微信服务器发来的验证参数 :return: 是否能验证成功 """ temp = [timestamp, nonce, token] temp = sorted(temp) temp = ''.join(temp)
sha1 = hashlib.sha1() sha1.update(temp.encode('utf8')) hashcode = sha1.hexdigest()
return hashcode == signature
|
返回响应
如果校验不通过,直接返回失败文字。校验通过就会继续后面的代码,检测到这是配置请求,就返回原样传入的随机字符串。最终,完整的接口方法代码是:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| @app.route('/wechat', methods=['GET', 'POST']) def index(): token = 'XXXXXXXX'
data = request.args signature = data.get('signature') timestamp = data.get('timestamp') nonce = data.get('nonce') echostr = data.get('echostr')
if echostr: return echostr if validate() else ''
...
@app.route('/wechat', methods=['GET']) def validate(timestamp, nonce, token, signature): """ 验证服务器地址有效性 :param timestamp:时间戳 :param nonce: 随机数 :param token: 自定义的token :param signature: 微信服务器发来的验证参数 :return: 是否能验证成功 """ temp = [timestamp, nonce, token] temp = sorted(temp) temp = ''.join(temp)
sha1 = hashlib.sha1() sha1.update(temp.encode('utf8')) hashcode = sha1.hexdigest()
return hashcode == signature
|
到此, 就可以在基础页面点击提交按钮, 测试是否成功, 如果成果, 会返回配置成功
字样
![配置成功](/./../img/post_img/image-20240113165906949.png)
继续开发
完成了接口配置,才真正是步入微信开发的大门。下一篇将介绍如何响应用户发送的消息。