微信公衆賬號驗證

 前段時間申請了一個微信公共賬號,想要在服務器端編程實現自動回覆,同時也接觸一下關於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

相關文章
相關標籤/搜索