Django開發微信之接入


這幾天借着學習的機會,開通了雲服務器、完成了實名認證、注冊了微信公眾平台,准備動手實踐實踐,把整個過程記錄下來和大家交流學習,可以分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字符串。

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM