Python+Django开发微信公众号后台

源代码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地址添加到白名单中

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章