消息订阅说明
一、何时需要订阅消息推送服务
薪人薪事开放平台是企业内部系统与薪人薪事后台系统之间的桥梁。在业务接口对接的基础之上,为了构建更完善的系统间信息交流机制, 我们提供了消息订阅服务。开放平台将消息及时推送到企业系统,增强了业务流程的可感知性; 同时,完善了系统间数据交互的方式,提高了数据的准确性和可读性。
二、订阅消息需要实现哪些功能
提供接收消息的URL
企业需提供一个接收消息的地址,我们会将您订阅的消息推送到这个URL。
支持post请求
订阅消息的链接需要支持post方式请求。
消息订阅的http请求的超时时间为2秒。
主动查询推送失败的消息
接收到消息之后,返回如下数据表示成功接收消息。
{"message":"success"}
除此之外,其他消息一律视为处理失败 消息推送失败之后,不会重试。
消息推送失败包含:推送失败、接收消息的链接不可访问、访问超时等等其他不可控的网络因素,
以及接收到消息之后,没有返回表示订阅成功的数据信息。
这些订阅失败的消息,可以通过失败消息接口查询。该接口只能查询最近7日的失败消息。
验证&解析消息内容
为防止订阅的消息被篡改,推送消息时,会对消息数据进行签名计算。
签名信息以链接参数(链接问号后面的参数)的形式传递,消息数据以消息体的形式传递。
一致性校验
接收到消息之后,需要对请求验签,即对消息进行签名计算。签名计算的结果如果与收到的签名值一致,则表示消息没有被篡改。
签名计算方式
- 假设需要消息为content
- 对content使用HmacSHA1算法进行加密。
- 将加密结果通过base64编码转换为加密后的字符串。
- 加密密钥为应用appSecret
Java版demo
/**
* 薪人薪事消息签名计算
*
* @param content 签名明文
* @param key 应用密钥
* @return 签名信息
* @throws Exception
*/
public static String hmacSha1Encrypt(String content, String key) throws Exception {
byte[] keyBytes = key.getBytes(StandardCharsets.UTF_8);
SecretKeySpec localSecretKeySpec = new SecretKeySpec(keyBytes, "HmacSHA1");
Mac localMac = Mac.getInstance("HmacSHA1");
localMac.init(localSecretKeySpec);
byte[] contentBytes = content.getBytes(StandardCharsets.UTF_8);
localMac.update(contentBytes);
return Base64.encodeBase64String(localMac.doFinal());
}
消息推送样例:
假设:
接收消息链接为:http://xxx.com
消息为:{"messageId":"xxxx", "type":"test"}
应用信息,appkey:app123、appSecret:123456
实际接收到消息时:
requestUrl为:http://xxx.com?sign=NZeAZ7/fHteWAcvO7Ls77AEKuFs=
requestBody为:{"messageId":"xxxx", "type":"test"}
消息处理完成后,返回如下信息表示成功:
{"message":"success"}