# 消息推送
微信云托管支持接收微信消息推送,走内网链路,无需加解密和签名。
当微信云托管消息推送开启时,消息不会推送到开发者服务器上,而是会推送到开发者指定的云托管服务中。
# 配置方式
配置时需要的信息解释如下:
- 环境ID:选择微信云托管的哪个环境接收消息推送
- 服务名称:选择接收消息推送的服务,只需配置1个服务即可接收所有类型消息;
- path:服务下哪个接口接收即写该接口在服务内的路径即可,比如根路径填写
/
- 推送模式:支持
JSON
、XML
两种模式,根据自己的项目实际情况选择,一般是JSON
# 资源复用配置
如果当前环境有配置资源复用给其他小程序/公众号,则配置窗口会变成如下:
你可以选择其他已复用的小程序/公众号,配置推送路径。
需要注意的是:配置确认的扫码,需要是目标「小程序/公众号」的管理员,而不是环境的管理员或者环境所属的账号管理员。
# 配置解绑
当想要取消消息推送时,直接在控制台列表选择操作解绑。
如果你的公众号/小程序,之前配置过服务器路径接收消息,配置消息推送后,将会覆盖服务器路径。
但解绑后,原有的服务器路径不会生效,需要先在开发者后台停用,再启用,就可以恢复正常了。
# 配置测试
配置消息推送时,微信后台会向配置的服务发起一个检测请求。
当配置格式为 JSON 时,请求体为:
{ "action": "CheckContainerPath" }
当配置格式为 XML 时,请求体为:
<xml> <action>CheckContainerPath</action> </xml>
开发者回复 success 或回复空即可完成测试。
需要注意,路径返回的 Status
需要为200,如果是非200将会导致路径配置检查失败
# 确认消息来源
若云托管未开启公网访问,则可以信任所有消息推送。
若云托管开启了公网访问,需要验证消息推送的请求头,带 x-wx-source 的请求才是微信侧发起的推送。
消息推送如果是JSON形式,则收到的信息格式如下:
{ "ToUserName": "gh_919b00572d95", // 小程序/公众号的原始ID,资源复用配置多个时可以区别消息是给谁的 "FromUserName": "oVneZ57wJnV-ObtCiGv26PRrOz2g", // 该小程序/公众号的用户身份openid "CreateTime": 1651049934, // 消息时间 "MsgType": "text", // 消息类型 "Content": "回复文本", // 消息内容 "MsgId": 23637352235060880 // 唯一消息ID,可能发送多个重复消息,需要注意用此ID去重 }
# 消息回复
消息推送有两种,被动回复和主动回复。
# 1. 被动回复
原理可以参考此文档,发送被动响应消息其实并不是一种接口,而是对微信服务器发过来消息的一次回复。
需要注意,被动回复只支持公众号,小程序需要使用主动回复。公众号具体的回复格式可参考开发指引。
# 2. 主动回复
小程序,以及公众号无法即时回复场景,可以使用API异步发送来完成,这也是微信团队推荐的做法。
比如接收到了「小程序/公众号」的客服消息,可以在请求体中得到发送者openid,unionid,以及发送的内容。
接下来就可以通过开放接口服务方式,发送客服消息来完成回复操作。
详细的主动回复例子请参考开发指引
代码如下:
const request = require('request') return new Promise((resolve, reject) => { request({ method: 'POST', url: 'http://api.weixin.qq.com/cgi-bin/message/custom/send', // 资源复用情况下,参数from_appid应写明发起方appid // url: 'http://api.weixin.qq.com/cgi-bin/message/custom/send?from_appid=wxxxxx' body: JSON.stringify({ touser: "OPENID", // 一般是消息推送body的FromUserName值,为用户的openid msgtype: "text", text: { content: "Hello World" } }) },function (error, response) { console.log('接口返回内容', response.body) resolve(JSON.parse(response.body)) }) })
在使用前请开启「开放接口服务」,并配置 cgi-bin/message/custom/send
到云调用白名单接口,具体参考文档
# 代码示例
以下演示使用 node.js
来构建接收消息的服务,共三个文件。详细的包含回复的代码示例可以参考开发指引
index.js
文件
const express = require('express') const app = express() app.use(express.json()) app.post('/', async (req, res) => { console.log('消息推送', req.body) res.send('success') // 不进行任何回复,直接返回success,告知微信服务器已经正常收到。 }); app.listen(80, function(){ console.log('服务启动成功!') })
Dockerfile
文件
FROM node:12-slim WORKDIR /usr/src/app COPY package*.json ./ RUN npm install COPY . ./ CMD [ "node", "index.js"]
package.json
文件
{ "name": "cloudbase-push", "version": "1.0.0", "description": "call push server", "main": "index.js", "scripts": {}, "author": "", "license": "ISC", "dependencies": { "express": "^4.16.4" } }
将3个文件组成文件夹,版本创建上传,端口填写 80
,创建版本成功后,部署发布。
在消息推送配置填写对应的服务,路径填写 /
填写后在控制台-日志中可以看到如下
