消息推送
接入陌陌小程序消息推送服务网站怎么启动小程序,您可以选择以下三种方式中的第二种:
开发者服务器接收推送消息
开发者需要完成以下步骤:
填写服务器配置并验证服务器地址的有效性。 根据socket文档,实现业务逻辑,接收消息和事件。 第一步:填写服务器配置
登录小程序后台后网站怎么启动小程序,在“开发”-“开发设置”-“消息推送”中,管理员扫码启用消息服务,并填写服务器地址(URL)、令牌(Token)以及消息加密密钥(EncodingAESKey)等信息。
同时,开发者可以选择消息加解密模式:明文模式(默认)、兼容模式和安全模式。 您可以选择消息数据格式:XML 格式(默认)或 JSON 格式。
模式选择和服务器配置将在提交后立即生效。 请开发者认真填写、选择。 如需切换加密方式和数据格式,需要提前配置相关代码。 详情请参阅资料及揭秘说明。
步骤2:验证消息确实来自Momo服务器
开发者提交信息后,微信服务器会向填写的服务器地址的URL发送GET请求。 GET请求携带的参数如下表所示:
参数说明
签名
微信加密签名,签名结合了开发者填写的token参数和请求中的时间戳参数和nonce参数。
时间戳
时间戳
随机数
随机数
回声
随机字符串
开发者通过检查签名来校准请求(下面有校准方法)。 如果确认GET请求来自Momo服务器,请原样返回echostr参数的内容,则访问生效,成功成为开发者,否则访问失败。 加密/验证过程如下:
将token、timestamp、nonce三个参数按照字典顺序排序,并将三个参数字符串拼接成一个字符串进行sha1加密。 开发者得到的加密字符串可以与签名进行比对,表明该请求来自Momo
验证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请求,开发者可以根据自己的业务逻辑进行响应。
微信服务器将用户的消息发送到开发者的服务器地址后,如果五秒内微信服务器没有收到响应,就会断开连接并重新发起请求,总共重试3次。 如果在调试过程中,发现用户很难收到响应消息,可以检测消息处理是否超时。 关于重试消息的去重,对于带有msgid的消息,建议使用msgid去重。 对于事件类型消息,建议使用 FromUserName + CreateTime。
服务器收到请求后必须做出如下回复,这样Momo服务器就不会做任何事情,也不会发起重试,否则会出现严重的错误信息。 详情请参见下文:
直接回复成功(推荐方式) 直接回复空字符串(指字节宽度为0的空字符串,而不是结构体中content数组的内容为空) 如果socket文档有指定返回内容,应根据文档描述返回
对于客服消息,一旦遇到以下情况,微信会在小程序会话中向用户发出系统提示“该小程序客服暂时无法使用,请稍后重试”:
开发者5秒内未回复任何内容 开发者回复数据异常
如果开发者想要提高安全性,可以在开发者中心启用消息加密。 这样,用户向小程序发送的消息以及小程序被动回复用户的消息将继续被加密。 具体请参见为消息添加Secret的描述。
云函数接收消息推送
需要开发工具版本至少为 1.02.1906252
已启用云开发的小程序可以使用云功能接收消息推送。 目前仅支持客服消息推送。
接入步骤如下:
台北云开发中心填写配置并上传云函数处理消息第一步:开发者工具台北云开发中心下配置
进入路径“云开发”-“设置”-“其他设置”-“消息推送”,选择推送方式为云功能;
添加消息推送配置。 消息类型对应预收包的MsgType,事件类型对应预收包的Event。 同一个二元组只能推送到一个环境中的一个云函数。 例如,客服消息文本消息对应的消息类型为文本,事件类型为空。 具体取值请参考每条消息的消息格式。
为多种消息类型和事件类型添加多种消息推送配置。
注:如果云功能中配置了某类消息,则该类消息将不再推送到“微信官方平台-开发设置-消息推送”中配置的域名。
第二步:在云函数中处理消息
云函数触发时,其事件参数为socket定义的JSON结构的对象(统一JSON格式,不支持XML格式)。
以客服消息为例,当收到客服消息时,事件结构如下:
{
"FromUserName": "ohl4L0Rnhq7vmmbT_DaNQa4ePaz0",
"ToUserName": "wx3d289323f5900f8e",
"Content": "测试",
"CreateTime": 1555684067,
"MsgId": "49d72d67b16d115e7935ac386f2f0fa41535298877_1555684067",
"MsgType": "text"
}
此时可以调用客服消息发送socket来回复消息。 收到消息后统一回复“已收到”的简单例子如下:
// 云函数入口文件
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'
}
微信云托管接收消息推送
陌陌云托管的小程序/公众号可以使用云托管服务接收消息推送,只需配置一台云托管服务即可支持所有类型的消息推送。
接入步骤如下:
微信云主机控制台北填写配置云主机服务处理消息步骤1云主机控制台填写配置
进入路径“微信云托管”-“设置”-“其他设置”-“消息推送”进行配置;
点击配置,选择目标云开发环境,填写对应的云托管服务路径(路径可在“云托管”-“服务列表”-“路径数组”中复制),选择推送类型;
配置完成后,云托管服务即可接收当前小程序/公众号下所有类型的消息推送。
配置测试
配置消息推送时,微信后台会向配置的服务发起检查请求。
当配置格式为JSON时,请求体为:
{ "action": "CheckContainerPath"}
当配置格式为XML时,请求体为:
CheckContainerPath
开发者可以回复成功,也可以回复空。
确认来源
如果云主机不支持网段访问,您可以信任所有消息推送。 如果云主机开启了网段访问,则需要验证消息推送的请求头,带x-wx-sources的请求就是陌陌发起的推送。
第二步是在云托管服务中处理消息
下面的例子展示了如何使用云托管结合消息推送来实现客服消息回复。 注意:您需要先部署以下镜像,然后在设置-其他设置-消息推送中填写对应服务的路径和环境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}`)
配置成功后,使用类型按钮激活客户服务会话,并发送任何消息以查看云托管处理的回复。