使用python几行代码解决在一台云服务器实现微信公众号服务器配置。
文章目录
前言
准备需要
一、了解微信公众号与服务器配置连接过程
第一步:填写服务器配置
第二步:验证消息的确来自微信服务器
二、配置URL与连接
三、python实现
1.初步了解web.py
2.代码实现
1.main.py运行函数
2.Handle.py 验证函数
3.部署到服务器
前言
微信公众号服务器配置,对公众号的部分功能实现有着基石作用。本文章将用python的一款轻量级的Web应用框架web.py实现url接口的配置。
准备需要
需要工具:一台云服务器、云服务器上的python3+、web.py、微信公众号(测试号)。
云服务器的选择配置、python的配置和微信公众号测试号的申请注册可参考的前面的博客《Python实现公众号每日自动发早/晚安消息(详细教程)》的第一节和第四节。
一、了解微信公众号与服务器配置连接过程
第一步:填写服务器配置
登录微信公众平台官网后,在公众平台官网的开发 - 基本设置页面,勾选协议成为开发者,点击“修改配置”按钮,填写服务器地址(URL)、Token和EncodingAESKey,其中 URL 是开发者用来接收微信消息和事件的接口URL。Token可由开发者可以任意填写,用作生成签名(该 Token 会和接口 URL 中包含的 Token 进行比对,从而验证安全性)。EncodingAESKey由开发者手动填写或随机生成,将用作消息体加解密密钥。
同时,开发者可选择消息加解密方式:明文模式、兼容模式和安全模式。模式的选择与服务器配置在提交后都会立即生效,请开发者谨慎填写及选择。加解密方式的默认状态为明文模式,选择兼容模式和安全模式需要提前配置好相关加解密代码,详情请参考消息体签名及加解密部分的文档 。
测试号画面如下(只有URL和Token):
第二步:验证消息的确来自微信服务器
开发者提交信息后,微信服务器将发送 GET 请求到填写的服务器地址 URL 上,GET请求携带参数如下表所示:
参数 | 描述 |
signature | 微信加密签名,signature结合了开发者填写的 token 参数和请求中的 timestamp 参数、nonce参数。 |
timestamp | 时间戳 |
nonce | 随机数 |
echostr | 随机字符串 |
开发者通过检验 signature 对请求进行校验(下面有校验方式)。若确认此次 GET 请求来自微信服务器,请原样返回 echostr 参数内容,则接入生效,成为开发者成功,否则接入失败。加密/校验流程如下:
1)将token、timestamp、nonce三个参数进行字典序排序 2)将三个参数字符串拼接成一个字符串进行sha1加密 3)开发者获得加密后的字符串可与 signature 对比,标识该请求来源于微信。
二、配置URL与连接
配置大致分为四步:
1)首先需要用云服务器创建一个接收外来访问的web服务器
2)web服务器对微信服务器发送的GET请求进行解析提取对应字段
3)将web服务器的token、timestamp、nonce字典排序,拼接排序
4)判断自己的字符串是否与signature一致,一致则成功,不一致则不处理。
图解:
三、python实现
1.初步了解web.py
web.py的下载(注意是web.py,不是只有一个web)
0.62
版本支持 Python >= 3.5。版本0.51
是支持 Python 2.7 的最后一个版本。
pip3 install web.py
import web
#------------------
# 第一部分
urls = (
'/', 'index'
)
#------------------
# 第二部分
class index:
def GET(self):
return "Hello, Get!"
def POST(self):
return "Hello, Post!"
#------------------
if __name__ == "__main__":
app = web.application(urls, globals())
app.run()
第一部分是匹配URL的正则表达式,像/、/help/faq、/item/(\d+)等(\d+将匹配数字)。圆括号表示捕捉对应的数据以便后面使用。第二部分是接受请求的类名称,像index、view、welcomes.hello (welcomes模块的hello类),或者get_\1。\1 会被正则表达式捕捉到的内容替换,剩下来捕捉的的内容将被传递到你的函数中去。
第二部分是web.py有明确区分的get和post方法,当用不同的请求访问时,返回不一样的内容。
ps:Web.py的更多详细使用方法可去官网新手指南阅读学习。
2.代码实现
1.main.py运行函数
建立服务器
# -*- coding: utf-8 -*-
# filename: main.py
import web
urls = (
'/wx', 'Handle',
)
if __name__ == '__main__':
app = web.application(urls, globals())
app.run()
2.Handle.py 验证函数
get方法验证数据,返回数据
import web
import hashlib
class Handle(object):
def GET(self):
try:
data = web.input()
print(data)
if len(data) == 0:
return "hello,congratulations on finding me"
signature = data.signature
timestamp = data.timestamp
nonce = data.nonce
echostr = data.echostr
# 自己填写自己token
token = ""
list = [token, timestamp, nonce]
list.sort()
s = list[0] + list[1] + list[2]
hashcode = hashlib.sha1(s.encode('utf-8')).hexdigest()
print("handle/GET func: hashcode, signature: ", hashcode, signature)
if hashcode == signature:
return echostr
except Exception as Argument:
return Argument
#消息自动回复、菜单连接等、将有post方法解决
# def POST(self):
3.部署到服务器
服务器的配置、宝塔面板的配置进入和python的云服务器布置 见我之前的博客Python实现公众号每日自动发早/晚安消息(详细教程)》的第一节和第四节。
进入宝塔面板,先进入终端,下载web.py。
pip3 install web.py
随后在文件创建一个GongZhongHao(名字可以自己拟定)的文件夹,上传文件到刚刚创建的文件夹下。
http://0.0.0.0:80/http://0.0.0.0:80/
http://0.0.0.0:80/(80是端口号,因为微信公众号接口必须以http://或https://开头,分别支持80端口和443端口)
python3 main.py 80
不要关闭终端窗口,来到测试号,填写你的url和token,并提交。(你的url是:http://服务器公网ip:80/wx)
如果成功则有:
就这样服务器url接口就配置好了。虽然url接口配置好了,但是现在公众号的服务器并没有加功能,公众号并不能做什么,需要后面再添加内容。