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了