微信公众平台官方手册:http://mp.weixin.qq.com/wiki/home/index.html
Python版本:2.7.10
Django版本:1.5
开发平台:新浪SAE
前提:了解django基本创建应用的步骤。根据微信公众平台官方手册一步步完成。
公众号:今天做了没
我把这个微信功能增加到了我以前在SAE上用django搭建的博客上
微信公众开发者文档中的第一步:接入
http://mp.weixin.qq.com/wiki/16/1e87586a83e0e121cc3e808014375b74.html
1. 直接增加了wechat模块:
python manage.py startapp wechat
2. 在settings.py文件中INSTALL_APPS中增加'wechat',别忘了后面有逗号
3. 在和settings.py同级目录中的urls.py中增加:
url(r'^wechat/', include('wechat.urls')), #这里也别忘了后面加上逗号
4. 现在进入wechat目录,在里面创建urls.py,并增加如下内容:
from django.conf.urls import patterns, include, url from .views import WeChat urlpatterns = patterns('', url(r'^$', WeChat.as_view()), )
这里面注意:WeChat就是我们要在views.py中创建的自己的类。因为我在url这里使用的是WeChat.as_view(),所以我是要使用django中的视图类来完成。当然这里完全可以把WeChat定义成视图函数,也就是类似这样的写:
from django.conf.urls import patterns, include, url from .views import WeChat urlpatterns = patterns('', url(r'^$', WeChat), )
在这里我其实在使用视图类完成时,遇到了一个问题,因为我也是刚开始学习python和django。这个问题后面会提到。
现在我们可以认真的到views.py中去完成我们的WeChat了,不论是把它实现成视图类还是一个视图函数。
5. 在wechat目录的views.py中增加如下内容:
# -*- coding: utf-8 -*- from django.http import HttpResponse from django.views.decorators.csrf import csrf_exempt from django.views.generic.base import View from django.template import loader, Context from xml.etree import ElementTree as ET import time import hashlib class WeChat(View): #这里我当时写成了防止跨站请求伪造,其实不是这样的,恰恰相反。因为django默认是开启了csrf防护中间件的 #所以这里使用@csrf_exempt是单独为这个函数去掉这个防护功能。 @csrf_exempt def dispatch(self, *args, **kwargs): return super(WeChat, self).dispatch(*args, **kwargs) def get(self, request): #下面这四个参数是在接入时,微信的服务器发送过来的参数 signature = request.GET.get('signature', None) timestamp = request.GET.get('timestamp', None) nonce = request.GET.get('nonce', None) echostr = request.GET.get('echostr', None) #这个token是我们自己来定义的,并且这个要填写在开发文档中的Token的位置 token = '这里的token需要自己设定,主要是和微信的服务器完成验证使用' #把token,timestamp, nonce放在一个序列中,并且按字符排序 hashlist = [token, timestamp, nonce] hashlist.sort() #将上面的序列合成一个字符串 hashstr = ''.join([s for s in hashlist]) #通过python标准库中的sha1加密算法,处理上面的字符串,形成新的字符串。 hashstr = hashlib.sha1(hashstr).hexdigest() #把我们生成的字符串和微信服务器发送过来的字符串比较, #如果相同,就把服务器发过来的echostr字符串返回去 if hashstr == signature: return HttpResponse(echostr)
现在就要提到我前面说过遇到的一个问题,我使用了视图类,然后里面定义了get方法,一会还会定义post方法,注意这里的@csrf_exempt这个装饰器,我是放到了dispatch的上面,但刚开始的时候我是分别放在了get和post方法上,这就导致了我实现接收到用户文本信息,并返回一个文本消息给用户这个功能,一直出现“该公众号暂时无法提供服务,请稍后再试”的问题。后来在网上找了好久解决办法,终于有一位兄弟也遇到了并且解决了:就是把@csrf_exempt放到dispatch上面,因为django在使用视图类的时候,会先由dispatch这个方法来分派。如果你没有使用视图类,只是定义了wechat方法的话,那么就只用把@csrf_exempt放到你的wechat方法上面就可以了,当然这里的wechat只是我起的名字,你完成可以用你自己起的名字,只要和urls.py中使用的一样就可以了。
下面说一下在微信公众平台->开发者中心,怎么配置:
1. URL:
我的SAE上的地址是:http://nowtodo.sinaapp.com
然后我在django中给wechat配置的url映射关系是:url(r'^wechat/', include('wechat.urls')),
所以在我的SAE地址上增加/wechat/,我填写的URL就是:
http://nowtodo.sinaapp.com/wechat/
2. Token
Token就是我们get方法中配置的:
token = '这里的token需要自己设定,主要是和微信的服务器完成验证使用'
注意文档中的提示:必须为英文或数字,长度为3-32字符
3. EncodingAESKey
这个值是不用管的,当然你也可以点一下“随机生成”当就会另外重新生成一次。
4. 消息加解密方式
这里消息加密方式:我使用的是明文模式。
现在如果你配置完成了,点击“提交”应该就可以完成验证了。