1. 程式人生 > >Django+阿里雲伺服器+微信開發公眾號

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 = ['*']

,這樣就允許外網加ip請求頁面了。

好了,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了