微信公众帐号验证

 前段时间申请了一个微信公共帐号,想要在服务器端编程实现自动回复,同时也接触一下关于django编程,以继续发扬我在python的web道路。终于到现在,我才有时间​将这个过程记录下来,具体如下:

首先明确目标——成为微信公众号第三方开发者,通过消息API认证。

使用的语言和框架 :python的django

主机的平台:             sae云平台

微信平台:                 微信公众帐号

 

当然,先要阅读微信的消息接口,其是通过微信服务器获取用户的回复,用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"下,然后在命令行运行 

 

  
  
  
  
  1. django-admin.py startproject mysite 

mysite是你的应用的名字,运行命令时要予以更换。

 

然后就创建了本地工作目录,可是这个适合创建的目录处于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,搞定。结果如下,可以进行下一步的微信公众帐号的开发了!

 

参考链接:

 微信接口文档 

启用接口(php),通过微信验证

微信机器人python

django 手册

sae python部署

 

by bibodeng 2013-4-14

你可能感兴趣的:(sae)