接入微信小程序消息推送服务,可以3种方式选择

2023-08-06
来源:网络整理

消息推送

接入微信小程序消息推送服务,您可以选择以下三种方式之一:

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

开发者需要完成以下步骤:

填写服务器配置并验证服务器地址的有效性。 根据接口文档实现业务逻辑,接收消息和事件。 第一步:填写服务器配置

登录小程序后台后,在“开发”-“开发设置”-“消息推送”中,管理员扫码启用消息服务,并填写服务器地址(URL)、等信息() 和消息加密密钥 () 。

同时,开发者可以选择消息加解密方式:明文模式(默认)、兼容模式和安全模式。 您可以选择消息数据格式:XML 格式(默认)或 JSON 格式。

模式选择和服务器配置将在提交后立即生效。 请开发者认真填写、选择。 如需切换加密方式和数据格式,需要提前配置相关代码。 具体请参见消息加解密说明。

第二步:验证消息是否确实来自微信服务器

开发者提交信息后,微信服务器会向填写的服务器地址的URL发送GET请求,GET请求携带的参数如下表所示:

参数说明

微信加密签名将开发者填写的参数与请求中的参数和参数结合起来。

时间戳

随机数

随机字符串

开发者通过验证来验证请求(验证方法如下所示)。 如果确认GET请求来自微信服务器小程序云开发快速启动区别,请原样返回参数内容,则访问生效,成功成为开发者,否则访问失败。 加密/验证过程如下:

按字典顺序对 、 、 和 三个参数进行排序。 将三个参数字符串拼接成一个字符串,并进行sha1加密。 开发者获取到的加密字符串与加密字符串进行比对,即可识别该请求来自微信。

验证URL合法性后,访问生效,您将成为开发者。

检查PHP示例代码:

private function checkSignature() { $signature = $_GET["signature"]; $timestamp = $_GET["timestamp"]; $nonce = $_GET["nonce"]; $token = TOKEN; $tmpArr = array($token, $timestamp, $nonce); sort($tmpArr, SORT_STRING); $tmpStr = implode( $tmpArr ); $tmpStr = sha1( $tmpStr ); if ($tmpStr == $signature ) { return true; } else { return false; } }

PHP示例代码下载:下载

步骤 3:接收消息和事件

当某些特定的用户操作触发事件推送时(例如用户向小程序客服发送消息、进入会话等),微信服务器会将消息(或事件)数据包发送到配置的URL由开发者作为POST请求,开发者可以根据自己的业务逻辑进行响应。

微信服务器将用户的消息发送到开发者的服务器地址后,如果5秒内微信服务器没有收到响应,就会断开连接,重新发起请求,总共重试3次。 如果调试时发现用户收不到响应消息,可以检查消息处理是否超时。 关于重试消息重复数据删除,有些消息建议使用重复数据删除。 对于事件类型消息,建议使用+重复数据删除。

服务器收到请求后,必须做出如下回复,这样微信服务器就不会做任何事情,也不会发起重试,否则会出现严重的错误信息。 详情请参见下文:

直接回复(推荐方式) 直接回复空字符串(指字节长度为0的空字符串,而不是结构体中字段的空内容) 如果接口文档有指定返回内容,则应该是根据文档描述返回

对于客服消息,一旦遇到以下情况,微信会在小程序会话中向用户发出系统提示“该小程序客服暂时无法使用,请稍后重试”:

开发者5秒内未回复任何内容 开发者回复数据异常

如果开发者想要增强安全性,可以在开发者中心启用消息加密。 这样,用户向小程序发送的消息以及小程序被动回复用户的消息将继续被加密。 详细信息请参见消息加密和解密说明。

云函数接收消息推送

需要开发者工具版本至少为 1.02。

已启用云开发的小程序可以使用云功能接​​收消息推送。 目前仅支持客服消息推送。

接入步骤如下:

小程序云开发快速启动区别_开启和开发的区别_微信小程序和小游戏开发区别

在云开发控制台填写配置并上传云函数中的消息处理第一步:在开发者工具云开发控制台添加配置

进入路径“云开发”-“设置”-“其他设置”-“消息推送”,选择推送方式为云功能;

添加消息推送配置。 消息类型对应于接收到的包,事件类型对应于接收到的包。 同一个二元组只能推送到一个环境中的一个云函数。 例如,客服消息文本消息对应的消息类型为文本,事件类型为空。 具体取值请参考每条消息的消息格式。

为多种消息类型和事件类型添加多种消息推送配置。

注:如果云功能中配置了某类消息,则该类消息将不再推送到“微信官方平台-开发设置-消息推送”中配置的域名。

第二步:在云函数中处理消息

云函数触发时,其参数为接口定义的JSON结构的对象(统一JSON格式,不支持XML格式)。

以客服消息为例,当收到客服消息时,结构如下:

{ "FromUserName": "ohl4L0Rnhq7vmmbT_DaNQa4ePaz0", "ToUserName": "wx3d289323f5900f8e", "Content": "测试", "CreateTime": 1555684067, "MsgId": "49d72d67b16d115e7935ac386f2f0fa41535298877_1555684067", "MsgType": "text" }

此时您可以调用客服消息发送接口回复消息。 收到消息后统一回复“已收到”的简单例子如下:

// 云函数入口文件 const cloud = require('wx-server-sdk') cloud.init() // 云函数入口函数 exports.main = async (event, context) => { const wxContext = cloud.getWXContext() await cloud.openapi.customerServiceMessage.send({ touser: wxContext.OPENID, msgtype: 'text', text: { content: '收到', }, }) return 'success' }

微信云托管接收消息推送

微信云托管的小程序/公众号可以使用云托管服务接收消息推送,只需配置一台云托管服务即可支持所有类型的消息推送。

接入步骤如下:

在微信云主机控制台填写配置 在云主机服务中处理消息第一步,在云主机控制台填写配置

微信小程序和小游戏开发区别_小程序云开发快速启动区别_开启和开发的区别

进入路径“微信云托管”-“设置”-“其他设置”-“消息推送”进行配置;

点击配置,选择目标云开发环境,填写对应的云托管服务路径(路径可在“云托管”-“服务列表”-“路径字段”中复制),选择推送类型;

配置完成后,云托管服务即可接收当前小程序/公众号下所有类型的消息推送。

配置测试

配置消息推送时,微信后台会向配置的服务发起检测请求。

当配置格式为JSON时,请求体为:

{ "action": "CheckContainerPath"}

当配置格式为XML时,请求体为:

CheckContainerPath

开发者可以回复或者回复空。

确认来源

如果云主机未开启公网访问,您可以信任所有消息推送。 如果云主机开启了公网访问,则需要验证消息推送的请求头,带x-wx-的请求为微信端发起的推送。

第二步是在云托管服务中处理消息

下面的例子展示了如何使用云托管结合消息推送来实现客服消息回复。 注意:您需要先部署以下镜像,然后在设置-其他设置-消息推送中填写对应服务的路径和环境ID。

const express = require('express') const bodyParser = require('body-parser') const axios = require('axios') const PORT = process.env.PORT || 80 const HOST = '0.0.0.0' // App const app = express() app.use(bodyParser.raw()) app.use(bodyParser.json({})) app.use(bodyParser.urlencoded({ extended: true })) const client = axios.default app.all('/', async (req, res) => { const headers = req.headers const weixinAPI = `http://api.weixin.qq.com/cgi-bin/message/custom/send` const payload = { touser: headers['x-wx-openid'], msgtype: 'text', text: { content: `云托管接收消息推送成功,内容如下:\n${JSON.stringify(req.body, null, 2)}` } } // dispatch to wx server const result = await client.post(weixinAPI, payload) console.log('received request', req.body, result.data) res.send('success') }); app.listen(PORT, HOST) console.log(`Running on http://${HOST}:${PORT}`)

配置成功后,使用 type 按钮唤起客服会话,发送任意消息即可看到云托管处理的回复。

分享