前段时间申请了一个微信公共账号,想要在服务器端编程实现自动回复,同时也接触一下关于django编程,以继续发扬我在python的web道路。终于到如今,我才有时间将这个过程记录下来,具体以下:php
首先明确目标——成为微信公众号第三方开发者,经过消息API认证。html
使用的语言和框架 :python的djangopython
主机的平台: sae云平台web
微信平台: 微信公众账号django
固然,先要阅读微信的消息接口,其是经过微信服务器获取用户的回复,用get请求发送到个人服务器,而后我给予回应。因此只须要简单的编程就能够完成验证了。编程
步骤1:申请微信公众账号,须要填写若干资料,传送门http://mp.weixin.qq.com ,填写好后,则能够阅读其开放API文档,里面有提到如何验证: 发送一个echochar, 原样返回就能够了。可是其中要验证该get请求是否来自微信服务器,则须要详细核对生成的hash值。文档里面有范例php文件,能够直接下载研读。安全
步骤2:在sae上搭建应用,先有账号,而后新建一个app,选择python或者php,若是选择了php可使用微信提供的代码,google一下也会有很详细的教程。若是选用python,也能够参考本文或者文章后面的连接。服务器
在sae上搭建应用,须要在本地新建一个版本库,因此要在sae管理平台上先初始化第一个版本,这个版本什么代码都没有,只有两个配置文件config.yaml,index.wsgi,用svn check out到本地的工做目录。就能够看到有一个名为"1"的文件夹,也就是第一个版本。而后咱们能够在该文件夹内构建django应用了,若是你安装好了django,那么能够到目录"1"下,而后在命令行运行 微信
- django-admin.py startproject mysite
mysite是你的应用的名字,运行命令时要予以更换。app
而后就建立了本地工做目录,但是这个适合建立的目录处于1下面,咱们最终要达到下面这个样子:tree命令察看目录树
因此要将mysite下的文件或目录所有移动到1之下,由于mysite/暂时未归入版本控制,因此能够手动拷贝后用svn将文件或目录归入svn目录。故而造成manage.py在1之下,其余django文件在mysite(这里是scnuwriter)之下。
步骤3: 在本地架设好django应用,而后用svn commit 命令上传到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 -*-
from
django.http
import
HttpResponse
from
django.template
import
RequestContext, Template
from
django.views.decorators.csrf
import
csrf_exempt
from
django.utils.encoding
import
smart_str, smart_unicode
import
hashlib
TOKEN
=
"mytoken"
# to verify the API server
def
checkSignature(request):
global
TOKEN
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()
if
tmpstr
=
=
signature:
return
HttpResponse(echoStr)
else
:
return
None
|
固然若是不怕安全性的损失,能够不验证这是微信服务器发来的get请求,而直接在第17行后面return HttpResponse(echoStr) 就能够了。从微信的示例php文件中能够看出来,它将验证封装在一个专门的函数中供调用。但其实验证的内容与返回的东西无关。不少教程里面写的是return echoStr,我搞了半天才发现不行,返回的不是一个http响应,故而须要对echoStr作一个HttpResponse的包装。
另外须要在url设置里面进行设置,而后在微信发送验证时填写url的时候填写对应的url。例如,在django工做目录下面修改url.py以下:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
from
django.conf.urls
import
patterns, include, url
# Uncomment the next two lines to enable the admin:
# from django.contrib import admin
# admin.autodiscover()
from
scnuwriter.views
import
*
urlpatterns
=
patterns('',
# Examples:
# url(r'^$', 'scnuwriter.views.home', name='home'),
# url(r'^scnuwriter/', include('scnuwriter.foo.urls')),
url(r
'^$'
, checkSignature),
)
|
第12行表示,在url中什么也不加,如http://scnuwriter.sinaapp.com 这样就能够访问checkSignature了。每次在本地目录作了更改,都须要在终端中用svn命令commit一下,这个就不用多说了。
步骤4:验证
验证的原理很简单,就是确认这个东西是微信服务器发来的,并且把这个东西原样返回就好了。登录微信公众平台,填写url和token(在本例子中就是程序中的TOKEN,也就是"mytoken"),按验证就能够了。
成功会提示成功成为开发者,若是失败,会提示你你的服务器响应不正确。
ok,搞定。结果以下,能够进行下一步的微信公众账号的开发了!
参考连接:
by bibodeng 2013-4-14