Django+阿里雲伺服器+微信開發公眾號
Django端:
根目錄下開啟powershell新建專案:
django-admin startproject weixinproject
開啟weixinproject資料夾下,powershell新建app:
python manage.py startapp weixin
用 tree /F命令看看檔案結構:專案資料夾(weixinpro)和app資料夾(weixin)在同一目錄下。
開啟weixinproject資料夾,setting中installed_apps新增你剛才新建專案的名稱。
並且注意把setting中的ALLOWED_HOSTS = []改成ALLOWED_HOSTS = ['*']
好了,setting中先就這樣。
先把Django跑起來吧
python manage.py runserver 0.0.0.0:80
接下來,我們先緩一緩,去看看微信連線第三方伺服器是怎麼說的。
WeChat端:
再申請完公眾號後,開啟微信公眾平臺 https://mp.weixin.qq.com/,下拉找到基本配置,看到伺服器配置(未啟用),點選修改配置。url填寫http://伺服器外網ip 即可,微信連線伺服器只能用http80埠。
寫自己的token,待會需要。隨機生成一串EncodingAEKey,加密方式先選擇明文吧。
現在寫完個倘若點提交會彈出一個訊息,token不匹配。
在這裡講一下原理,微信伺服器用GET的方法請求你的伺服器併發送一個timestamp,一個nonce,一個echostr,一個signature去你的伺服器上,你需要在你的伺服器後臺程式碼中,加上你剛剛在微信中加的token,你的這串token將與timestamp和nonce進行排序,並連線成一個字串。這串字串的編碼要轉換成utf-8的格式後,進行hash的sha1加密,加密後返回的字串要與傳送到你的伺服器上的signature對比,如果一模一樣就返回echostr,那麼配置就完成啦。接下來再去配置我們的Django。
Django端:
原理是什麼樣的呢,開啟後臺之後呢,專案內的urls.py要先發揮作用,新增路由,所以我們需要改一個urls.py,增加一個urls.py。
請把你的專案資料夾下(startproject命令後產生的資料夾)的urls.py改為
"""weixinpro URL Configuration
The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/2.0/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: path('', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path
from django.conf.urls import url, include
urlpatterns = [
path('admin/', admin.site.urls),
path(r'',include("weixin.urls")),
]
我在原來的基礎上增加了 from django.conf.urls import url,include
目的是用include函式。include等於是把weixin app資料夾內的urls.py所有的url打包進來。因為一個app內不止有一個頁面,一個事件,這樣做是防止app多了之後亂起來。雖然現在頁面少,但這樣做是個好習慣。對的,這個時候weixin資料夾還沒有urls.py,我複製這個urls.py過去,放在weixin資料夾內。
因為與微信連線類似前後端分離,所以不需要建立templates資料夾放網頁。我把與該urls.py在同一個資料夾下的views.py import進來,因為要用裡面的函式。r''代表我能直接用 http://外網ip 訪問到。必須from . import views意思就是引用該資料夾中的views,現在程式碼環境越來越嚴苛了,import views都是錯的,因為它的名稱與一個模組衝突。path中的第二個引數是訪問http://外網ip 時預設執行的函式,即views裡面的wx_main函式。
from django.contrib import admin
from django.urls import path
from . import views
urlpatterns = [
path(r'',views.wx_main),
]
下面展示我的views.py函式。
from django.shortcuts import render
from django.http import HttpResponse
import json
import hashlib
def wx_main(request):
if request.method=="GET":
#獲取微信伺服器上傳來的幾個引數
signature=str(request.GET.get("signature",None))
timestamp=str(request.GET.get("timestamp",None))
nonce = str(request.GET.get('nonce', None))
echostr = str(request.GET.get('echostr', None))
token="wodetoken112233"
#將要排序加密的引數放在一個數組中
hashlist = [token, timestamp, nonce]
hashlist.sort()
hashstr=''
#連線
for i in hashlist:
hashstr+=i
#加密 sha1
hashstr = hashlib.sha1(hashstr.encode(encoding="UTF-8")).hexdigest()
#驗證
if hashstr==signature:
return HttpResponse(echostr)
else:
return HttpResponse("error")
有的時候不報錯卻出錯了可能是因為你的hashlib包沒裝。
這樣就ok了,我一共改了一個setting.py,一個urls.py,增加了一個urls.py,改了一個views.py,現在訪問 http://外網ip 應該得到的是一個error字串。然後提交一下就會顯示提交成功啦。再點選啟用就一切ok了