进行微信公众号开发,首先需要准备以下内容:
本文为Python微信公众号开发的第1篇文章,主要介绍环境准备(主要讲服务端环境)和微信公众号鉴权校验流程。
在进行微信公众号开发之前,需要对微信公众号进行一些配置,先来看一下需要的配置项:
(1)点击公众号后台页面中的“设置与开发” --> 基本配置
(2)在右侧“基本配置”页面,你可以看到开发者ID(AppID),启用开发者密码(AppSecret)。开发者密码需要自己记录下,平台不会记录也不会再次展示给你,如果忘了,需要点"重置"再次获取。
(3)下方服务器配置,点击“修改配置”,进入以下界面,需要填写的信息:
可以看到,微信公众要开发需要我们准备一个服务器URL。我上面将URL填写标红了,这是配置中最容易踩坑的一步,我在这里被坑了一天。。。几度想要放弃。接下来我用我血和泪的教训帮你避坑。
在准备服务器前,我们先来搞懂这里的服务器是用来干什么的。答案是用来接收微信消息和事件。
在上面服务器配置添加服务器的URL,然后在点击"提交"按钮后,微信服务器将发送GET请求到填写的服务器URL上,GET请求携带四个参数:
参数 | 描述 |
---|---|
signature | 微信加密签名,signature结合了你在上面填写的自定义的Token参数和请求中的timestamp参数、nonce参数。 |
timestamp | 时间戳 |
nonce | 随机数 |
echostr | 随机字符串 |
开发者接收到这四个参数之后,根据【一定的规则】生成一个signature,跟微信服务器发过来的signature进行对比,一致则说明此次GET请求来自微信服务器,原样返回echostr参数内容,接入生效,成为开发者成功,否则接入失败。
这个【一定的规则】如下:
- 将token、timestamp、nonce三个参数进行字典序排序
- 将三个参数字符串拼接成一个字符串进行sha1加密
- 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
让我们先把开发者接收到参数后进行校验的代码写出来,后面在服务端使用(记得在上面配置点“提交”前,先在服务器上将下面代码运行起来!):
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from flask import Flask, request
import hashlib
app = Flask(__name__)
@app.route('/')
def index():
# 设置token,开发者配置中心使用
token = '你配置的自定义Token' # <------ 修改这里
# 获取微信服务器发送过来的参数
data = request.args
signature = data.get('signature')
timestamp = data.get('timestamp')
nonce = data.get('nonce')
echostr = data.get('echostr')
# 对参数进行字典排序,拼接字符串
temp = [timestamp, nonce, token]
temp.sort()
temp = ''.join(temp)
# 加密
if (hashlib.sha1(temp.encode('utf8')).hexdigest() == signature):
return echostr
else:
return 'error', 403
if __name__ == '__main__':
app.run(host='0.0.0.0', port=80, debug=True) # <----- 这里指定80端口,不要指定其它
上面写了公众号服务器配置URL的要求:域名 或者 公网ip
刚开始我是想用本地环境来作为服务器的,这样直接在本地写代码就可以了。但是问题来了,本地IP是私网IP,无法被公众平台访问到。如果URL中填入本地的IP地址,点“提交”后会一直报错“系统发生错误,请稍后重试”。
本地运行上面的校验代码后是这样的:
将运行的本地ip地址填入服务器URL,点“提交”,报错:
这个错误的原因一般是微信公众号访问不到服务器,或者服务器内部发生错误。一般服务器内部发生错误,会在服务器终端中报错误,类似如下:
如果你的服务器终端什么都没打印,那就是微信服务器的请求无法访问到你的服务器上。
可以使用一些工具进行内网穿透,将本地的IP暴露到公网中供外部访问,例如ngrok或者cpolar工具等。因本人内网安全策略不允许内网穿透,遂放弃。如果你想用此方法,可以参考以下博文:
用Natapp(ngrok)进行微信本地开发调试 - NATAPP-内网穿透 基于ngrok的国内高速内网映射工具 https://natapp.cn/article/wechat_local_debug
微信公众号本地开发调试 - 无公网IP,内网穿透_51CTO博客_本地微信公众号运营https://blog.51cto.com/u_15565852/6643787
在微信官方文档中,提到了“小程序云开发”,可以共享开发环境给公众号,这种方式无需额外的服务器,并且用这个方式对接微信公众号,直接省去了核对token的环境,无需以上自己写的校验代码了。
1开启公众号开发者模式 | 微信开放文档微信开发者平台文档https://developers.weixin.qq.com/doc/offiaccount/Getting_Started/Getting_Started_Guide.html可惜的是,本人研究半天,没研究明白怎么用,网上教程也比较少...... 暂时搁置,后续再研究下。你如果感兴趣,欢迎指教,感激不尽!
网络上现有资料绝大多数使用这种方式进行开发。你可以自己去申请一台云服务器,例如阿里云、百度云、华为云、腾讯云。
这种方式的缺点就是:需要花钱。但好在,一般这些大公司的云服务器,都有秒杀活动或试用活动,如果只是用来学习和试验,白嫖一个月的试用期也是可以的......
我这里就白嫖了腾讯云的一个云服务器。你可以去注册一个账号试试,新用户都可以免费试用,需要完成个人实名认证。
腾讯云 产业智变·云启未来 - 腾讯腾讯云(tencent cloud)为数百万的企业和开发者提供安全稳定的云计算服务,涵盖云服务器、云数据库、云存储、视频与CDN、域名注册等全方位云服务和各行业解决方案。https://cloud.tencent.com/
(1)打开上面腾讯云链接,选择“免费试用”板块
(2)选择一款云服务器,点“立即试用”
(3)立即试用后会让你选择安装的镜像,这里选择“宝塔Linux”,操作简单
(1)进入自己的腾讯云后台,可以看到自己刚才申请的云服务器
(2)点击云服务器进入后台管理页面,“重置密码”,这个密码是后面你命令行等远程登录时候的密码。
(3)防火墙设置:“页面最上面” --> “防火墙” --> “添加规则” --> “端口号:8888” --> 确定
(4)获取宝塔面板的管理员用户名和密码:“页面最上面” --> “应用管理” --> “先复制命令” --> “登录”
(5)点击登录后你会看到用户名和密码,以及外部链接,浏览器打开外部链接,输入用户名和密码,进入宝塔界面
(6)进入后是这样的。如果没有注册过宝塔账号,需要先注册个账号,登录宝塔网页。然后再次打开上面的“外网面板地址”,就可以看到下面的界面了。
具体步骤可以参考下列文章,比较简单:
CentOS安装/卸载Anaconda(图文详解)-腾讯云开发者社区-腾讯云众所周知的原因,从官网下载Anaconda非常慢,因此为了加速下载,这里我们采取清华源下载。https://cloud.tencent.com/developer/article/2065512
具体步骤请参见我的上一篇文章:
【新人必会】远程开发可视化 - VSCode篇-CSDN博客文章浏览阅读108次,点赞3次,收藏2次。让远程开发可视化,不再只是面对黑洞洞的中断命令行窗口和vimhttps://blog.csdn.net/Attitude93/article/details/135368358?spm=1001.2014.3001.5502
使用远程VSCode开发的好处:
至此,服务器终于配好了,可以接收来自微信服务器的消息了。
回到微信公众号配置界面,点“提交”。如果不出意外,提交成功!
如果你完全按我以上的文档走下来,应该已经成功了。下面我只是列出我踩的一些坑:
(1)Token验证错误:
(2)本文代码需要提前安装的一些python包
pip install web.py
pip install flask
pip install flask_cors
(3)AttributeError: 'ThreadedDict' object has no attribute 'env'
从今天开始,持续学习,开始搞事情。踩坑不易,欢迎关注我,围观我!