1. wechat-sdk
1.1. 开发者认证配置
开发者通过检验signature对请求进行校验。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。
加密/校验流程如下:
1. 将token、timestamp、nonce三个参数进行字典序排序
2. 将三个参数字符串拼接成一个字符串进行sha1加密
3. 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
from flask import Flask
from flask import request
from wechat_sdk import WechatConf
from wechat_sdk import WechatBasic
conf = WechatConf(
token='',
appid='',
appsecret='',
encrypt_mode='safe',
encoding_aes_key='',
)
wechat = WechatBasic(conf=conf)
app = Flask(__name__)
@app.route('/weixin', methods=['GET'])
def check():
args = request.args
signature = args.get('signature')
timestamp = args.get('timestamp')
nonce = args.get('nonce')
echostr = args.get('echostr')
if all([signature, timestamp, nonce, echostr]) and wechat.check_signature(signature, timestamp, nonce):
return echostr
else:
return 'error'
if __name__ == "__main__":
app.run(host='0.0.0.0', port=80)
2. 微信请求
2.1. 格式
POST /weixin?signature=92db6dae514eaec009a55926df68734815d450e9×tamp=1461049146&nonce=12030128&encrypt_type=aes&msg_signature=20b4e1f1a0e59d4cb670bc082ad2256157cad3d3
<xml><ToUserName><![CDATA[gh_e712ef998048]]></ToUserName>
<FromUserName><![CDATA[ojNiswfpvDLPxYinSkmqI3T0vDdA]]></FromUserName>
<CreateTime>1461049145</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[hi]]></Content>
<MsgId>6275158296027149334</MsgId>
</xml>
2.2. 解析请求
err_msg = 'error'
args = request.args
if request.method == 'POST':
data = request.data
print args
print data
if not parse_request(args, data):
return err_msg
def parse_request(args, data):
msg_signature = args.get('msg_signature')
timestamp = args['timestamp']
nonce = args['nonce']
try:
wechat.parse_data(data, msg_signature, timestamp, nonce)
except Parse_Error:
print 'Parse Error'
return False
return True
2.3. 被动回复消息 -- 文本消息
将文字信息组装为符合微信服务器要求的响应数据
调用方法:.response_text(content, escape=False)
参数说明:
content: 回复文字
escape: 是否转义该文本内容 (默认不转义)