接收用户消息
概述
为了能够让轻应用订阅号的开发者接收到用户在消息窗口的留言消息,开发者可以在管理后台设置消息服务器并开启接收用户对话消息模式。
设置消息服务器时接需要提供可用的接收消息的回调URL地址,为了让通信更加安全,建议使用https。
设置成功并开启了接收对话消息模式后,用户在轻应用或订阅号窗口里发送的消息会推送给设置的URL,服务器接收到消息后,可以通过异步发送消息接口给用户回复消息。
设置消息服务器
设置参数
在企业的管理后台,进入需要设置消息服务器的轻应用或订阅号管理页面,在开发者卡片处,点击“消息服务器”入口按钮,进入配置页面:
页面中要求填写回调URL、Token、密钥三个参数,其中回调URL是开发者接收轻推推送请求的访问协议和地址,支持http或https协议,需要在公网能够被访问。Token可由开发者任意填写,用于生成签名。密钥用于消息体的加密,是AES密钥的Base64编码。
设置完成后,如果要接收消息,要勾选下方的开启接收用户对话消息选项。
验证回调URL有效性
当点击“确定”提交以上信息时,轻推会发送一条验证消息到填写的URL,发送方法为GET。 接收消息的服务器接收到验证请求后,需要作出正确的响应才能通过URL验证。
开发者在获取请求时需要对参数部分做Urldecode处理,否则可能会验证不成功。
假设接收消息的回调URL设置为:https://url.server.com/, 轻推将向该地址发送如下验证请求:
请求方式:GET
请求地址: https://url.server.com/? signature=AQFASDFASDFSSASDFQWEXZCV×tamp=13500004321&nonce=123412abc&echostr=ENCRYPT_STR
参数说明:
参数 | 必须 | 说明 |
---|---|---|
signature | 是 | 加密签名,signature结合了开发者填写的Token、请求中的timestamp、nonce参数、加密的消息体 |
timestamp | 是 | 时间戳 |
nonce | 是 | 随机字符串 |
echostr | 是 | 加密的字符串 |
开发者的服务器在收到请求后,需要做如下操作:
- 对收到的请求参数做Urldecode处理
- 通过参数signature对请求进行校验,确认调用者的合法性
- 解密echostr参数得到消息内容
- 在10秒内响应GET请求,响应内容为上一步得到的明文消息内容
以上2~3步骤可以直接使用SDK中的验证URL函数一步到位。 验证通过后,如果同时开启了接收用户对话消息模式,则可以接收到轻推推送的用户消息。
接收消息
开启了接收用户对话消息模式后,轻推会将消息发送给开发者在上一步填写的回调URL,消息服务器需要做正确的响应。
接收消息协议的说明
轻推在5秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次。若连续累计失败50次,管理后台中的“开启接收用户对话消息”开关会被关闭,需要手工打开后才能再次收到轻推推送的用户消息。
当接收成功后,无需携带内容,直接http头部返回200即表示接收成功,其他错误码轻推会一律当做失败并发起重试,可以使用msg_id对消息进行排重。 目前还不支持直接携带回复内容,如果想回复用户,可以使用主动发消息接口进行异步回复。
接收消息请求的说明
假设接收消息的URL设置为https://url.server.com:
请求方式:POST
请求地址:https://url.server.com/?signature=QFASDFASDFSSASDFQWEXZCVA×tamp=13501234567&nonce=123412abc
根据不同的消息类型,轻推按照约定的消息格式封装到json串中,再对json串进行加密,然后附带到POST消息包中发送出去。
企业收到消息后,需要作如下处理:
- 对signature进行校验
- 解密POST消息包,得到明文的json串
- 响应本次请求
- 如果要做出回复,构造回复内容,主动发出消息
以上1~2步骤可以直接使用SDK中的解密函数一步到位。
消息格式
目前在消息窗口支持的消息类型有文本和图片两类,目前仅支持文本类型,后续会支持图片类型。
注:以下出现的内容为接收到的POST包体解密后的内容。
文本消息格式参数说明:
参数 | 说明 |
---|---|
domain_id | 企业id |
openid | 发送消息的用户openid |
msg_type | 消息类型,text |
time | 时间 |
content | 文本内容 |
appid | 接收消息的轻应用或订阅号appid |
id | 发送的消息id,用于排重 |
签名校验
为了让企业确认调用来自轻推,轻推在回调给接收消息url时会带上消息签名,以参数signature标识,开发者需要验证此参数的正确性后再解密。
验证步骤如下:
计算签名
dev\_signature=sha1(sort(token、timestamp、nonce、msg_encrypt))
其中msg_encrypt在验证回调URL有效性时为加密后的echostr,在接收用户消息时为加密后的json串。sort的含义是将参数值按照字母字典排序,然后从小到大拼接成一个字符串。 sha1为安全哈希算法,用于计算数字签名。
2 . 比较dev_signature和signature是否相等,相等则表示验证通过。