源代码Github地址:https://github.com/2637977081/workspace-django/tree/master/HelloWorld
一、微信公众号注册配置
1、进入https://mp.weixin.qq.com注册账号密码,(个人开发)选择订阅号
2、注册成功后,进入管理页面=》开发=》基本配置
公众号开发信息
1、开发者ID(AppID)
开发者ID是公众号开发识别码,配合开发者密码可调用公众号的接口能力。
2、开发者密码(AppSecret)重置 【生成后复制保存】
开发者密码是校验公众号开发者身份的密码,具有极高的安全性。切记勿把密码直接交给第三方开发者或直接存储在代码中。如需第三方代开发公众号,请使用授权方式接入。
3、IP白名单查看
通过开发者ID及密码调用获取access_token接口时,需要设置访问来源IP为白名单。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
服务器配置(已启用)
1、服务器地址(URL) 服务器api接口
2、令牌(Token) 自定义,这里token验证的时候需要你提供的服务器URL【api】可以访问,这在Python部分会讲述
3、消息加解密密钥(EncodingAESKey) 加密秘钥
4、消息加解密方式 建议直接使用明文模式,不需要使用到加密秘钥
二、Python+Django
1、创建Django项目以及接口
1、接口需要满足token验证 get请求
2、接口需要满足我们公众号平台的简单回复响应 post请求
所以我们接口格式应该是这个样子:
if request.method == 'GET':
# token 验证
xxxx
elif request.method == 'POST':
# 公众号业务逻辑消息处理
xxx
2、token验证,微信平台会发生get请求到服务url上,我们需要对其校验返回。完成这部分代码开发后,我们就可以完成token验证了
接收参数:signature、echostr、timestamp、nonce
hash加密规则(python3):【这部分代码是根据腾讯api及网上查询修改的,吐槽腾讯api文档】
def token_verification(token, timestamp, nonce):
list = [token, timestamp, nonce]
list.sort()
sha1 = hashlib.sha1()
sha1.update(list[0].encode('utf-8'))
sha1.update(list[1].encode('utf-8'))
sha1.update(list[2].encode('utf-8'))
hashcode = sha1.hexdigest()
return hashcode
我们需要验证返回的hashcode,验证成功返回echostr,这样可以校验成功token
if hashcode==signature:
message = echostr
return HttpResponse(message)
3、初始化对象
使用wechat_sdk,Django版本:
from wechat_sdk import WechatBasic
初始化:
WECHAT_TOKEN = '你服务配置的token'
WEIXIN_APPID = '公众号平台上的多appid'
WEIXIN_APPSECRET = '生成的秘钥'
wechat = WechatBasic(token=WECHAT_TOKEN, appid=WEIXIN_APPID,appsecret=WEIXIN_APPSECRET)
4、接收消息
【还有其它如ShortVideoMessage、LinkMessage、LinkMessage、EventMessage等】
from wechat_sdk.messages import TextMessage, ImageMessage, VoiceMessage, VideoMessage,LocationMessage
【注】
文本类我们可以直接接收context内容处理
媒体类我们使用mediaId可以指明缓存数据,用于下载或者上传
使用wechat的jdk转换数据
wechat.parse_data(data=request.body)
message = wechat.get_message()
if isinstance(message, TextMessage):# isinstance 可以比较两个对象,用于识别message是什么类型数据
xx业务逻辑xx
5、返回消息
【注】同接收消息
文本类我们可以直接发送context内容处理
媒体类我们使用mediaId可以指明缓存数据
result = wechat.response_text(context)
result = wechat.response_image(mediaId)
最终返回http响应类型为xml
return HttpResponse(result, content_type='application/xml
6、上传下载图片
上传照片
img = open(path, 'rb')
we_img = wechat.upload_media(media_file=img, media_type='image')
下载照片
we_img_bytes=wechat.download_media(we_img['media_id'])
bytes_stream = BytesIO(we_img_bytes.content)
img_file = Image.open(bytes_stream)
三、踩坑
1、token验证失败
检查服务器url是否有效,是否返回进行token验证,是否返回echostr
2、Invalid HTTP_HOST header
Invalid HTTP_HOST header: 'xxx'. You may need to add 'xx' to ALLOWED_HOSTS.
在settings.py中添加 ALLOWED_HOSTS = ['xxxx']
3、ip禁止
wechat_sdk.exceptions.OfficialAPIError: 40164: invalid ip xxx ipv6 ::ffff:xxx, not in whitelist hint: [Qv4aVa0443e508]
ip禁止,将该ip地址添加到白名单中