消息推送

消息推送是开放平台推出的一种主动推送服务,基于该推送服务,开发者可以及时获取开放平台的相关信息,无需调用API。 目前提供三种方式接入:

  • 开发者服务器接收消息推送
  • 云函数接收消息推送
  • 微信云托管服务接收消息推送

开发者服务器接收消息推送

总数据链路如图所示:

消息推送服务器配置

消息推送服务于微信小程序、公众号、小游戏、视频号小店、第三方平台,这里介绍微信小程序平台的配置。

填写相关信息

登录微信小程序管理后台,在「开发」-「开发管理」-「消息推送配置」中,需要填写以下信息:

  1. URL服务器地址:开发者用来接收微信消息和事件的接口 URL,必须以 http:// 或 https:// 开头,分别支持 80 端口和 443 端口。
  2. Token令牌:用于签名处理,下文会介绍相关流程。
  3. EncodingAESKey:将用作消息体加解密密钥。
  4. 消息加解密方式:
    • 明文模式:不使用消息加解密,明文发送,安全系数较低,不建议使用。
    • 兼容模式:明文和密文共存,不建议使用。
    • 安全模式:使用消息加解密,纯密文,安全系数高,强烈推荐使用。
  5. 数据格式:消息体的格式,可以选择 XML 或 JSON。

发起验证

点击“提交”后,微信服务器会对开发者服务器发起验证,请在提交前按以下方式开发: 微信服务器将发送 GET 请求到填写的服务器地址 URL 上,GET 请求携带的参数如下表所示:

参数 描述
signature 签名
timestamp 时间戳
nonce 随机数
echostr 随机字符串

其中,signature 签名的生成方式是:

  1. 将 Token、timestamp、nonce 三个参数进行字典序排序。
  2. 将三个参数字符串拼接成一个字符串,然后进行 sha1 计算签名,即可获得 signature。 开发者需要校验 signature 是否正确,以判断请求是否来自微信服务器,验签通过后,请原样返回 echostr 字符串。

举例:假设填写的 URL=”https://www.qq.com/revice”,Token=”AAAAA”。

  1. 推送的 URL 链接:https://www.qq.com/revice?signature=f464b24fc39322e44b38aa78f5edd27bd1441696&echostr=4375120948345356249&timestamp=1714036504&nonce=1514711492
  2. 将 token、timestamp、nonce 三个参数进行字典序排序,排序后结果为:[“1514711492″,”1714036504″,”AAAAA”]。
  3. 将三个参数字符串拼接成一个字符串:”15147114921714036504AAAAA”
  4. 进行 sha1 计算签名:f464b24fc39322e44b38aa78f5edd27bd1441696
  5. 与 URL 链接中的 signature 参数进行对比,相等说明请求来自微信服务器,合法。
  6. 构造回包返回微信,回包消息体内容为 URL 链接中的 echostr 参数 4375120948345356249。

为了方便开发者调试,我们提供了 URL 验证工具供开发者使用。 开发者需要填写 AccessToken、URL 地址、Token,点击“检查参数并发起验证”后,调试工具会发送 GET 请求到 URL 所指的服务器,并返回相关调试信息。

接收消息推送

当特定消息或事件触发时,微信服务器会将消息(或事件)的数据包以 POST 请求发送到开发者配置的 URL,下面以“debug_demo”事件为例,详细介绍整个过程:

消息解密方式为明文模式

  1. 假设 URL 配置为 https://www.qq.com/revice,数据格式为 JSON,Token=”AAAAA”。
  2. 推送的 URL 链接:https://www.qq.com/recive?signature=899cf89e464efb63f54ddac96b0a0a235f53aa78&timestamp=1714037059&nonce=486452656
  3. 推送的包体:
{
    "ToUserName": "gh_97417a04a28d",
    "FromUserName": "o9AgO5Kd5ggOC-bXrbNODIiE3bGY",
    "CreateTime": 1714037059,
    "MsgType": "event",
    "Event": "debug_demo",
    "debug_str": "hello world"
}
  1. 校验 signature 签名是否正确,以判断请求是否来自微信服务器。
    1. 将 token、timestamp(URL 参数中的)、nonce(URL 参数中的)三个参数进行字典序排序,排序后结果为:[“1714037059″,”486452656″,”AAAAA”]
    2. 将三个参数字符串拼接成一个字符串:”1714037059486452656AAAAA”
    3. 进行 sha1 计算签名:899cf89e464efb63f54ddac96b0a0a235f53aa78
    4. 与 URL 链接中的 signature 参数进行对比,相等说明请求来自微信服务器,合法。
  2. 回包给微信,具体回包内容取决于特定接口文档要求,如果没有特定要求,回复空串或者 success 即可。