Django搭建微信公众平台详解 一

微信公众平台官方手册: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. 消息加解密方式

这里消息加密方式:我使用的是明文模式。


现在如果你配置完成了,点击“提交”应该就可以完成验证了。

Django搭建微信公众平台详解 一












你可能感兴趣的:(python,django,微信公众平台接入)