微信公众平台开发接入概述
接入微信公众平台开发,开发者需要按照如下步骤完成:
1、填写服务器配置
2、验证服务器地址的有效性
3、依据接口文档实现业务逻辑
一、填写服务器配置
填写服务器地址(URL)、Token和EncodingAESKey,
- URL是开发者用来接收微信消息和事件的接口URL。
- Token可由开发者可以任意填写,用作生成签名(该Token会和接口URL中包含的Token进行比对,从而验证安全性)。
- EncodingAESKey由开发者手动填写或随机生成,将用作消息体加解密密钥。
二、验证消息的确来自微信服务器
开发者提交信息后,微信服务器将发送GET请求到填写的服务器地址URL上,GET请求携带参数如下表所示:
参数 | 描述 |
---|---|
signature | 微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。 |
timestamp | 时间戳 |
nonce | 随机数 |
echostr | 随机字符串 |
开发者通过检验signature对请求进行校验(下面有校验方式)。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。
加密/校验流程如下:
- 将token、timestamp、nonce三个参数进行字典序排序
- 将三个参数字符串拼接成一个字符串进行sha1加密
- 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
注:返回值需要是HTMLResponse,刚开始直接返回echostr一直返回token验证失败
FastAPI实现消息认证
# conding=gbk
from fastapi import APIRouter, Depends
from fastapi.responses import HTMLResponse
from starlette.requests import Request
from app.utils.responses import ResponsesExampleVale
from extensions.logger import logger
import hashlib
router = APIRouter()
WINXIN_TOKEN = "你的token"
@router.get(
"/verify/",
tags=["验证服务器地址的有效性"],
responses=ResponsesExampleVale(
"随机字符串"
)
)
async def check_signature(
request: Request,
signature: str,
timestamp: str,
nonce: str,
echostr: str,
):
"""
signature 微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
timestamp 时间戳
nonce 随机数
echostr 随机字符串
开发者通过检验signature对请求进行校验(下面有校验方式)。
若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。
加密/校验流程如下:
1)将token、timestamp、nonce三个参数进行字典序排序
2)将三个参数字符串拼接成一个字符串进行sha1加密
3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
"""
logger.info(f"signature: {signature}")
logger.info(f"timestamp: {timestamp}")
logger.info(f"nonce: {nonce}")
logger.info(f"echostr: {echostr}")
_ = "".join(sorted([WINXIN_TOKEN, timestamp, nonce]))
sign = hashlib.sha1(_.encode('UTF-8')).hexdigest()
return HTMLResponse(content=echostr if sign == signature else "error")
三、依据接口文档实现业务逻辑
前提条件:
获取AppSecret 需要 注册微信扫码,然后输入公众号登录密码。
pass