前段时间申请了一个微信公共帐号,想要在服务器端编程实现自动回复,同时也接触一下关于django编程,以继续发扬我在python的web道路。终于到现在,网站空间,我才有时间将这个过程记录下来,具体如下:
首先明确目标——成为微信公众号第三方开发者,通过消息API认证。
使用的语言和框架:python的django
主机的平台:sae云平台
微信平台:微信公众帐号
当然,先要阅读微信的消息接口,其是通过微信服务器获取用户的回复,用get请求发送到我的服务器,然后我给予回应。所以只需要简单的编程就可以完成验证了。
步骤1:申请微信公众帐号,需要填写若干资料,传送门,填写好后,则可以阅读其开放API文档,里面有提到如何验证:发送一个echochar,原样返回就可以了。但是其中要验证该get请求是否来自微信服务器,则需要详细核对生成的hash值。文档里面有范例php文件,可以直接下载研读。
步骤2:在sae上搭建应用,先有帐号,然后新建一个app,选择python或者php,如果选择了php可以使用微信提供的代码,google一下也会有很详细的教程。如果选用python,也可以参考本文或者文章后面的链接。
在sae上搭建应用,需要在本地新建一个版本库,所以要在sae管理平台上先初始化第一个版本,这个版本什么代码都没有,只有两个配置文件config.yaml,index.wsgi,用svncheckout到本地的工作目录。就可以看到有一个名为"1"的文件夹,也就是第一个版本。然后我们可以在该文件夹内构建django应用了,如果你安装好了django,那么可以到目录"1"下,然后在命令行运行
django-admin.pystartprojectmysite
mysite是你的应用的名字,运行命令时要予以更换。
然后就创建了本地工作目录,可是这个适合创建的目录处于1下面,我们最终要达到下面这个样子:tree命令察看目录树
所以要将mysite下的文件或目录全部移动到1之下,因为mysite/暂时未纳入版本控制,所以可以手动拷贝后用svn将文件或目录纳入svn目录。故而形成manage.py在1之下,其他django文件在mysite(这里是scnuwriter)之下。
步骤3:在本地架设好django应用,然后用svncommit命令上传到sae服务器。这里需要参考sae的文档,关于搭建python开发环境的操作。有疑问的可以察看这里。总之就是要配置好各种文件,上传代码就行了。
步骤4:编写好微信验证的代码,代码如下view.py文件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#-*-coding:utf-8-*-
fromdjango.httpimportHttpResponse
fromdjango.templateimportRequestContext,Template
fromdjango.views.decorators.csrfimportcsrf_exempt
fromdjango.utils.encodingimportsmart_str,smart_unicode
importhashlib
TOKEN="mytoken"
#toverifytheAPIserver
defcheckSignature(request):
globalTOKEN
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
tmpList=[token,timestamp,nonce]
tmpList.sort()
tmpstr="%s%s%s"%tuple(tmpList)
tmpstr=hashlib.sha1(tmpstr).hexdigest()
iftmpstr==signature:
returnHttpResponse(echoStr)
else:
returnNone
当然如果不怕安全性的损失,可以不验证这是微信服务器发来的get请求,而直接在第17行后面returnHttpResponse(echoStr)就可以了。从微信的示例php文件中可以看出来,它将验证封装在一个专门的函数中供调用。但其实验证的内容与返回的东西无关。很多教程里面写的是returnechoStr,我搞了半天才发现不行,返回的不是一个http响应,故而需要对echoStr做一个HttpResponse的包装。
另外需要在url设置里面进行设置,美国空间,然后在微信发送验证时填写url的时候填写对应的url。例如,在django工作目录下面修改url.py如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
fromdjango.conf.urlsimportpatterns,include,url
#Uncommentthenexttwolinestoenabletheadmin:
#fromdjango.contribimportadmin
#admin.autodiscover()
fromscnuwriter.viewsimport*
urlpatterns=patterns(”,
#Examples:
#url(r’^$’,’scnuwriter.views.home’,name=’home’),
#url(r’^scnuwriter/’,include(‘scnuwriter.foo.urls’)),
url(r’^$’,checkSignature),
)
第12行表示,在url中什么也不加,如这样就可以访问checkSignature了。每次在本地目录做了更改,都需要在终端中用svn命令commit一下,这个就不用多说了。
步骤4:验证
验证的原理很简单,就是确认这个东西是微信服务器发来的,而且把这个东西原样返回就行了。登陆微信公众平台,填写url和token(在本例子中就是程序中的TOKEN,也就是"mytoken"),美国服务器,按验证就可以了。
没有朋友的人生是孤独的,不完整的,可是,因为生活的忙碌,