本文档介绍内容定制输出内容发生变更时的通知机制。
当内容定制侧输出的内容发生变更时,内容定制侧将推送变更事件到客户侧配置的回调地址。客户侧根据通知可以调用接口更新内容信息。
接入内容定制对外内容推送,客户侧需要按照如下步骤完成:
在【内容定制平台-内容同步】的【回调配置】中生成并获取鉴权密钥
在上述相同页面中配置回调接收地址
依据接口文档和平台相关配置开发实现业务逻辑
在上述相同页面中点击“测试”以发送测试数据,测试接口连通性
在保证接口连通之后,开始内容输出的推送
上述过程如图所示:
HTTPS method:POST Content-Type:application/json
客户侧通过检验 signature 对请求进行校验(下面有校验方式),以确认请求来自内容定制系统。
参数 | 描述 |
---|---|
timestamp | unix时间戳,单位:秒。为保证安全,与当前时间戳绝对值不要超过3600s。 |
nonce | 请求随机串。随机串长度为6-32位数字和字母的组合,大小写敏感。 |
signature | 签名字符串。 |
payload | 业务数据。请求体body字节流。 |
secret_key | 鉴权密钥。客户侧可以在内容定制平台的【内容同步】页面,点击【同步配置】的【回调配置】查看。 |
Hmac_SHA256算法
将 timestamp、nonce 和 payload 依次进行拼接;
使用 secret_key 对上述拼接的字符串进行 hmac sha256 加密,然后转成十六进制字符串 ;
得到加密后的字符串可与 signature 对比,标识该请求来源于内容定制的内容事件推送。
检验signature的Go示例代码:
func GenSignature(timestamp, nonce, body, secretKey string) string { // 按照timestamp,nonce,body 顺序拼接签名字符串 signatureStr := timestamp + nonce + body hmacSha256 := hmac.New(sha256.New, []byte(secretKey)) hmacSha256.Write([]byte(signatureStr)) // 将sha256转成16进制字符串 signature := fmt.Sprintf("%x", hmacSha256.Sum(nil)) return signature }
请求方指“火山引擎-内容定制”。
KEY | VALUE/说明 |
---|---|
method | POST |
Content-Type | application/json |
X-Content-Timestamp | unix时间戳(单位:秒) |
X-Content-Nonce | 随机串(6-32位数字、字母组成) |
X-Content-Signature | 回调签名(生成逻辑见上文) |
字段名 | 字段类型 | 说明 |
---|---|---|
event_id | string | 事件ID |
event_type | string | 事件类型 |
group_id | string | 文章ID |
event_data | string | 事件详情,按事件类型区分(json格式,需要客户侧进行解码) |
uniq_key | string | 幂等键,客户侧可使用该字段做幂等处理,保证唯一性 |
event_time | number | 事件产生时间戳(unixtime,单位:秒) |
枚举 | 事件详情类型 | 说明 |
---|---|---|
status_change | StatusChangeEventData | 文章状态变更 |
字段名 | 字段类型 | 说明 |
---|---|---|
is_available | bool | 文章当前是否可访问 |
响应方指“客户侧”。
字段名 | 字段类型 | 说明 |
---|---|---|
ret | number | 响应状态码。0-成功;非0-失败,并在msg中补充说明。 |
msg | string | 响应信息。例如:成功时提供"success";失败时提供失败相关信息。 |
POST / HTTP/1.1 Host: xxx.xxx.xxx Content-Type: application/json X-Content-Timestamp: 1689585543 X-Content-Nonce: kfcv50 X-Content-Signature: 2d3891cee3dcc777ba27a29f70758c581e93f21f3dad1deeaadf11aa440fe4b2 { "event_id": "177165499009xxxx", "event_type": "status_change", "group_id": "690150925257885xxxx", "event_data": "{\"is_available\":false}", "uniq_key": "56b74c26a28699e1829a4390dca58f89e54a507dcf8df6a49a4246039c31c190", "event_time": 1689585542 }
客户侧服务端返回给火山引擎侧的响应数据。
{ "ret": 0, // 响应状态码 "msg": "success" // 响应信息 }
注意
【必须】需要客户侧保证对变更消息的幂等性(回调请求中已经提供了幂等键 uniq_key)。
【必须】事件推送后,客户侧需要使用 MGetSyncArticles 接口再拉一次内容,以获取当前内容的详情和状态。
【约定】内容定制侧默认会做3次请求尝试,即1次不成功会再次请求,满3次即停。3次请求尝试都失败,则视为该次请求失败。
【约定】一次请求尝试的超时时间为5秒。
【约定】当该渠道的回调配置“测试”连通后,即满足推送条件,推送近半年内已同步内容发生的变更。
【建议】如果推送过去的事件已经过时了1分钟(参考event_time),建议忽略这条变更消息。
【建议】如果客户侧收到变更消息处理比较耗时,建议采用异步的方式处理。