记录:使用DJANGO从0开始搭建微信公众平台(0)

1.一个服务器

进行了各方面的对比后,我选择了稳定和相对熟悉的阿里云服务器Elastic Compute Service(ECS),ECS的优点可以百度了解,这里就不赘述。
镜像选用了 ubuntu_18_04_64系统。
值得一提的是,阿里云服务器提供了服务器私钥串。 在使用SSH时,需要将私钥串配置好才可以进行SSH远程连接以修改服务器设置。
私钥配置过程参考如下链接:
https://blog.csdn.net/winhye/article/details/75221311
私钥配置完成后 SSH不再需要提供用户名密码就可以直接连接到远程云服务器。

2.申请微信公众平台。

由于我是以个人的方式来申请微信公众平台,所以我只能申请微信订阅号,但是订阅号配合上服务器,也能实现很多的功能。如果想做WX支付功能,订阅号是无法提供接口的,那需要服务号才可以。
申请完毕后,需要为订阅号进行开发者配置。
在开发者选项的基本配置中,分别确认和设置 APPID 、APPSECRET、IP白名单。
当启动开发者模式时,服务器和WX服务器的每一次数据传递,都需要APPID和APPSECRET的参与。所以APPID和APPSECRET应设置为常量储存在服务器配置文件中,方便调用和查询。
IP白名单定义了WX公众号只会接收来自白名单内来源的的数据传递。
在开发者选项的服务器配置中,分别配置URL、TOKEN、EncodingAESKey、以及设置消息的加密解密模式。
所有发送给WX公众号的用户消息,都会被转发到URL服务器,服务器只支持80或是443端口。
TOKEN为自定义内容,也会做为参数参与到服务器之间的通信中。用来识别数据的合法性。
EncodingAESKey可以随机生成。
消息的加密解密模式暂时设置成明文模式。这样做的目的是为了在开发过程用根据收到和发出的内容判断BUG出现的位置和排错。

为服务器配置MYSQL+DJANGO2.X

首先python2.7 会在2020年1月1日后停止更新, 这里使用了PYTHON3.6.8
DJANGO使用了2.2.3版本
在使用python3时,旧的MySQLdb库对Python3不支持,采用了PyMySQL库来代替,会导致出现各种BUG,特别是执行以下命令的时候:
python manage.py makemigrations
python manage.py migrate
BUG1:
无论是否执行pip3 install mysqlclient安装最新版,都会抛出:当前的mysqlclient版本过低,需要使用mysqlclient 1.3.3或以上的版本。
这时要找到python3目录中的mysql包以及mysql包中的base.py文件。将抛出这一错误的代码注释掉。
安装路径下的django\db\backends\mysql\base.py文件
可以使用pip3 show django 来显示django的安装路径
在这里插入图片描述
BUG2:
File “/usr/local/lib/python3.6/dist-packages/django/db/backends/mysql/operations.py”, line 146, in last_executed_query
query = query.decode(errors=‘replace’)
AttributeError: ‘str’ object has no attribute ‘decode’
解决方法是找到这个文件的第146行
将原本的
原本的last_executed_query代码
修改为:
修改后的代码
(记得别忘了引入force_str方法)
from django.utils.encoding import force_str

然后在mysql中创建库,并声明UTF8编码,这样做是为了方便存储中文数据。
CREATE DATABASE databasename CHARACTER SET utf8 COLLATE utf8_general_ci;

在服务器和微信平台都准备就绪后。
我们需要先用服务器接入微信公众平台。
在上一步的提交微信公众平台中的服务器配置时,微信服务器会发送GET请求到服务器配置好的URL中去。
GET请求数据图
我们需要提取到请求中的echostr参数,并原样返回给发送的来源服务器。
echostr参数内容
当来源服务器成功接收到我们返回的echostr参数时,公众平台的服务器配置才能提交成功。
DJANGO代码简单示例
在服务器配置提交成功后,所有用户发给公众号的消息,理论上会直接以POST+XML的方式被转发到我们的服务器上,但是到了这一步,我试验了很久,测试向公众号发送用户数据,期间服务器都没有收到任何的数据或是请求。
在查阅了相关资料后,得到如下结论。
我当前所配置配置的接口是不支持302重定向的!如果指向URL是http://xxx.xx/test这样的格式的话,认证是可以通过的,但是消息接口数据不走。
参考了如下链接,绕了好几个弯,直到发现这个贴子。问题才以最简单的方式解决。
https://blog.csdn.net/laven90/article/details/43965825?locationNum=8
解决方法就是在settings.py中添加新的控制开关。
APPEND_SLASH=True
到现在为止,公众号发送的信息,终于可以转发到我的服务器了。
服务器收到的消息
这时出现了新的错误。CSRF安全机制禁止了外部的POST请求。
这个错误只需要注释掉settings.py中的这一行即可。
在这里插入图片描述

现在重新测试,使用WX向公众号发送了一条test消息.
收到的消息
收到一组xml消息。
其中ToUserName代表公众号ID
FromUserName代表用户的openid (同一用户在不同公众号下的openid是不相同的)
MsgType代表消息的类型。微信的消息分为文本、语音、图片、图文等等不同类型的消息。
Content 代表内容。
当前使用的是明文传递方式。
在项目开发完成后,可以将消息的传递方式改为密文。再配合加密解密模块,可以提高安全性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值