微信公众号开发(Python)[2]

本文最后更新于 2024年1月13日 晚上

解析微信请求及响应消息

目录

  1. 微信公众号开发(一)——申请微信公众号以及配置流程简介
  2. 微信公众号开发(二)——解析微信请求及响应消息
  3. 微信公众号开发(三)——解析微信事件XML数据消息及响应
  4. 微信公众号开发(四)——公众号按钮设置及自己的微信按钮编辑器
  5. 微信公众号开发(五)——微信网页授权获取用户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' # 填写自己自定义的token, 要和微信公众平台基本配置中填写的音一样

data = request.args
signature = data.get('signature')
timestamp = data.get('timestamp')
nonce = data.get('nonce')
# get请求中有echostr参数, post中没有, 可以通过这个来判断请求类型
echostr = data.get('echostr')

# GET请求
...

# POST请求
...

# 加密参数比对
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加密
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' # 填写自己自定义的token, 要和微信公众平台基本配置中填写的音一样

data = request.args
signature = data.get('signature')
timestamp = data.get('timestamp')
nonce = data.get('nonce')
# get请求中有echostr参数, post中没有, 可以通过这个来判断请求类型
echostr = data.get('echostr')

# GET请求
if echostr:
# 和微信传来的signature进行比对, 如果一样, 说明是从微信服务器传来的, 把echostr原样返回, 否则返回空字符串
return echostr if validate() else ''

# POST请求
...


# 验证服务器地址有效性
@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加密
sha1 = hashlib.sha1()
sha1.update(temp.encode('utf8'))
hashcode = sha1.hexdigest()

return hashcode == signature

到此, 就可以在基础页面点击提交按钮, 测试是否成功, 如果成果, 会返回配置成功字样

配置成功

继续开发

完成了接口配置,才真正是步入微信开发的大门。下一篇将介绍如何响应用户发送的消息。


微信公众号开发(Python)[2]
https://blog.noobbei.top/2024/01/13/微信公众号开发(二)/
作者
Godbei
发布于
2024年1月13日
更新于
2024年1月13日
许可协议