Django之微信公众号开发接入三步设置
要开发微信公众号,首先需要和微信公众号做接入,实现数据间的交互。
接入微信公众平台开发需要按照如下步骤完成:
1、填写服务器配置
2、验证服务器地址的有效性
3、依据接口文档实现业务逻辑
第一步:填写服务器配置
登录微信公众平台官网后,在公众平台官网的开发-基本设置页面,勾选协议成为开发者,点击“修改配置”按钮,填写服务器地址(URL)、Token和EncodingAESKey,其中URL是开发者用来接收微信消息和事件的接口URL。Token可由开发者可以任意填写,用作生成签名(该Token会和接口URL中包含的Token进行比对,从而验证安全性)。EncodingAESKey由开发者手动填写或随机生成,将用作消息体加解密密钥。
同时,开发者可选择消息加解密方式:明文模式、兼容模式和安全模式。模式的选择与服务器配置在提交后都会立即生效,请开发者谨慎填写及选择。加解密方式的默认状态为明文模式,选择兼容模式和安全模式需要提前配置好相关加解密代码,详情请参考消息体签名及加解密部分的文档 。
第二步:验证消息的确来自微信服务器
开发者提交信息后,微信服务器将发送GET请求到填写的服务器地址URL上,GET请求携带参数如下表所示:
参数 | 描述 |
---|---|
signature | 微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。 |
timestamp | 时间戳 |
nonce | 随机数 |
echostr | 随机字符串 |
开发者通过检验signature对请求进行校验(下面有校验方式)。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。加密/校验流程如下:
1)将token、timestamp、nonce三个参数进行字典序排序
2)将三个参数字符串拼接成一个字符串进行sha1加密
3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
第三步 准备好服务器进入开发
创建django应用配置好外网访问,这里直接上代码和效果
#views.py
# -*- coding: utf-8 -*-
from django.shortcuts import render
import hashlib
import requests
import xmltodict
from django.http.response import HttpResponse
def djwechat(request):
if request.method == 'GET':
signature = request.GET.get('signature','')
print('test',signature)
timestamp = request.GET.get('timestamp', '')
nonce = request.GET.get('nonce', '')
echo_str = request.GET.get('echostr', '')
token='你的token'
# ckeck_res = signature_check(WECHAT_TOKEN, timestamp, nonce)
hashlist = [token, timestamp, nonce]
hashlist.sort()
list2 = ''.join(hashlist)
sha1 = hashlib.sha1()
sha1.update(list2.encode('utf-8'))
hashcode = sha1.hexdigest()
print(hashcode,"rrr",signature)
if hashcode == signature:
return HttpResponse(echo_str, content_type="text/plain")
else:
return HttpResponse('error', content_type="text/plain")
elif request.method == 'POST':
dict_xml = request.body.decode('utf-8')
xmlData = xmltodict.parse(dict_xml)
msg_type = xmlData['xml']['MsgType']
if msg_type == 'text':
resp_data = {
"xml": {"ToUserName": xmlData['xml']['FromUserName'],
"FromUserName": xmlData['xml']['ToUserName'],
"CreateTime": int(time.time()),
"MsgType": 'news',
"ArticleCount": 1,
"Articles": {
"item": {
"Title": "Python与Django历史发布的文章",
"Description": "查阅历史消息请直接点击",
"PicUrl": "http://wx.qlogo.cn/mmhead/Q3auHgzwzM6nwqlzLmsK41HXF7Y7qiccib5T9uicNCByWdibEv8t46Hsag/132",
"Url": "https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz=MzAwNjE5MTE3Mw==&scene=124#wechat_redirect"
}
},
}
}
xmltodict.unparse(resp_data)
response = HttpResponse(xmltodict.unparse(resp_data), content_type="text/plain")
return response
在url增加一条记录
path('djwechat', views.djwechat, name='djwechat'),#python与django学习
测试
最终形成的服务端地址http://xxxx.com.cn/djwechat,填进第一步服务器配置地址里。
提交成功即说明正确。接下来进行测试,实现与微信公众号的交互。
如果配置不正确出现失败时,会提醒:“该公众号提供的服务出现故障,请稍后再试”
成功的的时候它就会反馈预制的内容。
写在最后
不过也有专门开发微信公众号和小程序的python第三方包,我推荐使用wechatpy,里边功能齐全,初学者可以结合第三方包和自己写的去学习,第三方包有些地方不够灵活。接下来我将使用django和一些常规包写微信公众号相关的开发,包括网页以及小程序开发。
WeChatpy地址
https://www.wechatpy.org/