微信公众账号验证

 前段时间申请了一个微信公共账号,想要在服务器端编程实现自动回复,同时也接触一下关于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"下,而后在命令行运行 微信

 

  
  
  
  
  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,搞定。结果以下,能够进行下一步的微信公众账号的开发了!

 

参考连接:

 微信接口文档 

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

微信机器人python

django 手册

sae python部署

 

by bibodeng 2013-4-14

相关文章
相关标签/搜索