Django+阿里云服务器+微信开发公众号

Django端:

根目录下打开powershell新建项目:

django-admin startproject weixinproject

打开weixinproject文件夹下,powershell新建app:

python manage.py startapp weixin

用 tree /F命令看看文件结构:项目文件夹(weixinpro)和app文件夹(weixin)在同一目录下。

Django+阿里云服务器+微信开发公众号

打开weixinproject文件夹,setting中installed_apps添加你刚才新建项目的名称。

Django+阿里云服务器+微信开发公众号

并且注意把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,加密方式先选择明文吧。

Django+阿里云服务器+微信开发公众号

现在写完个倘若点提交会弹出一个消息,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了