Django微信开发
来源:互联网 发布:数据库管理员要求 编辑:程序博客网 时间:2024/06/06 03:46
背景
博客开发完之后,想找一些其他的东西来练手,我知道Python开发微信公众号,那么Django肯定也是可以的,所以简单的写一个微信个人订阅号吧,每个人都应该有自己的一个主页,包括博客、微博、微信等门户,既然学了Django,就给自己也写一个吧。
版本相关
操作系统:Mac OS X EI Caption
Python版本:2.7
Django版本:1.9
IDE:PyCharm
为什么我的Python用2.7,因为我使用的第三方包只支持2.7,所以就用低版本的Python来写了,不过差距不大,并不存在语法不通用的情况。
微信相关
微信公众平台需要自己去申请,和申请SAE差不多,我自己是申请了个人订阅号,功能比较少,本来也就是自己的门户嘛,不用整的太复杂了。
微信公众号有两种模式,一种是普通模式,就是自己设置一些信息的模式。另一种是开发者模式,也就是我们今天要动手做的这个模式
整个处理流程
详细的内容可以参考微信的官方文档,这里只做一个简单的描述,微信公众号的大致处理流程是这样的,用户对公众号发出一条信息,此时微信会收到这条信息,然后用xml格式封装成一个包,发送到我们的服务端,我们的服务端根据这个包的内容做一些处理,处理之后要给微信回复一个xml包,微信根据我们服务端回复的xml包,解析出相关要素后,再返回给用户,整个流程图如下:
其实看起来并不复杂。
Django处理
首先你必须要有一个服务端咯,我用的是SAE的服务端,也就是把微信公众号集成到我的博客里了。专门给微信加一个url就行了。比如这样:url(r’^weixin/’, include(‘WechatApp.urls’))。我使用的是第三方包,因此需要安装wechat_sdk和requests这两个包,具体方法可以参考《Django开发博客(八)——部署在SAE》。
token认证
微信和我们服务端的第一次通讯需要设置token,使用的是GET方法,因此我们需要为这个认证写一个方法(除了第一次认证使用GET,其他时候都是POST),代码如下:
@csrf_exemptdef index(request): if request.method == 'GET': # 检验合法性 # 从 request 中提取基本信息 (signature, timestamp, nonce, xml) signature = request.GET.get('signature') timestamp = request.GET.get('timestamp') nonce = request.GET.get('nonce') if not wechat_instance.check_signature( signature=signature, timestamp=timestamp, nonce=nonce): return HttpResponseBadRequest('Verify Failed') return HttpResponse( request.GET.get('echostr', ''), content_type="text/plain")
注意,最上方的@csrf_exempt装饰器是取消Django的csrf标记的,毕竟微信不会有这种标记。这次认证通过之后,这个方法你注销了都行,除非你再次认证,不然不会再使用这个方法了。
添加关注回复
wechat_sdk的使用方法可以参考wechat_sdk的官方文档,在之后的view代码中加入
# 解析本次请求的 XML 数据 try: wechat_instance.parse_data(data=request.body) except ParseError: return HttpResponseBadRequest('Invalid XML Data') # 获取解析好的微信请求信息 message = wechat_instance.get_message() # 关注事件的默认回复 response = wechat_instance.response_text( content=( '感谢您的关注!\n回复【help】查看支持的功能' '\n【<a href="http://www.ddhbblog.sinaapp.com">我的博客</a>】' ))
用来处理关注的内容。
被动消息回复
最后加上被动回复的内容,代码如下:
if isinstance(message, TextMessage): # 当前会话内容 content = message.content.strip() if content == 'help': reply_text = ( '目前支持的功能:\n1. 输入【博客】来查看我的博客\n' '2. 回复【随机】来随机展示文章\n' '还有更多功能正在开发中哦 ^_^\n' '【<a href="http://www.ddhbblog.sinaapp.com">我的博客</a>】' ) elif content == '博客': reply_text = '我的博客地址是http://www.ddhbblog.sinaapp.com' elif content == '随机': reply_text = '随机功能还在开发中噢,亲可以先查看【<a href="http://www.ddhbblog.sinaapp.com">我的博客</a>】' else: reply_text = '功能还在开发中哦,亲可以提出您宝贵的意见' response = wechat_instance.response_text(content=reply_text) return HttpResponse(response, content_type="application/xml")
我们的简单的微信公众号就完成了。
效果图
完整的代码
# ecoding:utf-8from __future__ import unicode_literalsfrom django.http.response import HttpResponse, HttpResponseBadRequestfrom django.views.decorators.csrf import csrf_exemptfrom wechat_sdk.basic import WechatBasicfrom wechat_sdk.exceptions import ParseErrorfrom wechat_sdk.messages import TextMessageWECHAT_TOKEN = 你的token# APP_ID = 你的app id# APP_SECRET = 你的app secret# 实例化 WechatBasicwechat_instance = WechatBasic(token=WECHAT_TOKEN)@csrf_exemptdef index(request): if request.method == 'GET': # 检验合法性 # 从 request 中提取基本信息 (signature, timestamp, nonce, xml) signature = request.GET.get('signature') timestamp = request.GET.get('timestamp') nonce = request.GET.get('nonce') if not wechat_instance.check_signature( signature=signature, timestamp=timestamp, nonce=nonce): return HttpResponseBadRequest('Verify Failed') return HttpResponse( request.GET.get('echostr', ''), content_type="text/plain") # 解析本次请求的 XML 数据 try: wechat_instance.parse_data(data=request.body) except ParseError: return HttpResponseBadRequest('Invalid XML Data') # 获取解析好的微信请求信息 message = wechat_instance.get_message() # 关注事件的默认回复 response = wechat_instance.response_text( content=( '感谢您的关注!\n回复【help】查看支持的功能' '\n【<a href="http://www.ddhbblog.sinaapp.com">我的博客</a>】' )) if isinstance(message, TextMessage): # 当前会话内容 content = message.content.strip() if content == 'help': reply_text = ( '目前支持的功能:\n1. 输入【博客】来查看我的博客\n' '2. 回复【随机】来随机展示文章\n' '还有更多功能正在开发中哦 ^_^\n' '【<a href="http://www.ddhbblog.sinaapp.com">我的博客</a>】' ) elif content == '博客': reply_text = '我的博客地址是http://www.ddhbblog.sinaapp.com' elif content == '随机': reply_text = '随机功能还在开发中噢,亲可以先查看【<a href="http://www.ddhbblog.sinaapp.com">我的博客</a>】' else: reply_text = '功能还在开发中哦,亲可以提出您宝贵的意见' response = wechat_instance.response_text(content=reply_text) return HttpResponse(response, content_type="application/xml")
我的微信公众号
你可以在微信中搜索:点点微资讯
或是扫描下方的二维码来添加关注
- Django微信开发
- django+python微信开发
- django开发微信简单消息交互
- 微信开发(一)Django框架
- django开发整合微信API
- Django开发微信公众平台
- 微信开发(四)Django问答类微信号开发
- 微信开发(二)Django自媒体订阅号开发
- 微信开发(三)Django查询类订阅号开发
- django+sae微信开发-简单的鹦鹉学舌功能
- Django+OpenShift微信公众号开发(一)
- Django+Openshift微信公众号开发(二)
- Django 微信公众号对接开发demo
- 使用Django进行微信公众号开发
- 基于Django的微信公众号开发(3) -- 通过微信公众号开发者认证
- Python+Django开发微信公众号验证通过但微信推送信息接收不到的问题解答
- 微信开发 python django 多客服接口发送到客户端的消息乱码
- django学习之路(四)开发微信公众号
- PHP获得真实客户端的真实IP REMOTE_ADDR,HTTP_CLIENT_IP,HTTP_X_FORWARDED_FOR
- Spring的声明式事务管理
- 1月22日--1月31日(剩3195小时)
- C语言:位运算
- Simple Java—Compiler and JVM(一)Java对象运行时的内存结构
- Django微信开发
- Python Closure 闭包
- 基于OpenWrt防火墙配置(作为二级路由)
- 基于直方图的图像增强算法(HE、CLAHE、Retinex)之(一)
- DockerTool在Windows上的配置和运行
- hdu 2137 circumgyrate the string
- 给 spine slot 绑定node
- 有弹性的ListView
- Android-Day2-Property动画