這幾天藉著學習的機會,開通了雲伺服器、完成了實名認證、註冊了微信公眾平臺,準備動手實踐實踐,把整個過程記錄下來和大家交流學習,可以分3個步驟: 1.準備雲伺服器,因為微信在做接入的時候要填寫公網的IP地址 2.配置web伺服器,在伺服器端用nginx做了一個代理,把請求轉發給後端 3.後端服務採用的 ...
這幾天藉著學習的機會,開通了雲伺服器、完成了實名認證、註冊了微信公眾平臺,準備動手實踐實踐,把整個過程記錄下來和大家交流學習,可以分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字元串。
最後點擊提交,返回成功。