1. 程式人生 > >Django開發微信之接入

Django開發微信之接入

申請 eth sage 機制 分享圖片 auth 訪問 跨域訪問 shortcuts

這幾天借著學習的機會,開通了雲服務器、完成了實名認證、註冊了微信公眾平臺,準備動手實踐實踐,把整個過程記錄下來和大家交流學習,可以分3個步驟:

1.準備雲服務器,因為微信在做接入的時候要填寫公網的IP地址

2.配置web服務器,在服務器端用nginx做了一個代理,把請求轉發給後端

3.後端服務采用的是python,使用了Django框架

我在https://mp.weixin.qq.com申請了一個訂閱號,登錄成功後在"開發"--》“基本配置”裏填寫服務器信息,比如我的是:

技術分享圖片

URL一欄填寫的是服務器ip地址和請求的location,token是隨意填寫的,但是要和服務器代碼裏的token保持一致,消息秘鑰是隨機生成的。

web服務器我用的是nginx,配置如下:

server {
listen 80;
server_name 0.0.0.0;

root /var/www/html;
index index.html;

location /weixin {
proxy_pass http://0.0.0.0:8888;
}
}

配置完成,檢查通過後重新加載nginx。

使用virtualenv創建python環境,進入虛擬環境安裝Django:pip install Django==1.8.6

創建一個Django項目:django-admin startproject mysite

創建應用:python manage.py startapp weixin

以下是我的目錄結構:

技術分享圖片

這樣django項目就創建好了,接下來要修改幾個地方:

1.修改mysite/settings.py

INSTALLED_APPS = (
‘django.contrib.admin‘,
‘django.contrib.auth‘,
‘django.contrib.contenttypes‘,
‘django.contrib.sessions‘,
‘django.contrib.messages‘,
‘django.contrib.staticfiles‘,
‘weixin‘,


)
把剛才創建的應用weixin添加到INSTALLED_APPS裏

2.修改mysite/urls.py 增加路由配置

from weixin import views

urlpatterns = [
url(r‘^admin/‘, include(admin.site.urls)),
url(r‘^weixin/‘, views.weixin),
]
由於nginx配置了/weixin會把請求轉發到後端,所以這裏的url配置和nginx的location配置是一個對應的關系,而weixin目錄和mysite目錄是同一級目錄,urls.py是找不到views.py的,所以需要將其引入

3.處理邏輯weixin/views.py

https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421135319提到當我們填寫完信息,點擊提交時微信背後的一些動作,它會傳入:signature、timestamp、nonce、echostr四個參數,以及後面校驗的規則,如下圖所示:

技術分享圖片

於是服務端接受參數並做邏輯處理:

from django.shortcuts import render,HttpResponse
from django.views.decorators.csrf import csrf_exempt

import hashlib

@csrf_exempt
def weixin(request):
if request.method == "GET":
signature = request.GET.get(‘signature‘)
timestamp = request.GET.get(‘timestamp‘)
nonce = request.GET.get(‘nonce‘)
echostr = request.GET.get(‘echostr‘)
token = "john"
tmpArr = [token,timestamp,nonce]
tmpArr.sort()
string = ‘‘.join(tmpArr).encode(‘utf-8‘)
string = hashlib.sha1(string).hexdigest()
if string == signature:
return HttpResponse(echostr)
else:
return HttpResponse("false")

把項目跑起來:

python manage.py runserver 0.0.0.0:8888

還要在雲服務器管理臺界面上把8888端口打開,這個端口是隨便起的,可以通過命令telnet IP地址 端口號 去驗證端口能否訪問成功

由於Django機制的原因,需要使用@csrf_exempt表示允許跨域訪問;由於要加入,所以引入hashlib;token的內容是我們在網頁上填寫的內容,兩個要保持一致;

當時自己在提交時,微信一直提示token驗證失敗,後面排查了好久,發現是拼接成新字符串的時候沒有轉化成utf-8字符串。

最後點擊提交,返回成功。

Django開發微信之接入