跳到主要内容

数据推送

数据推送 是ice-run根据相关配置和触发场景向服务商发起的接口请求。


数据安全

ice-run请求服务商的接口,和服务商请求ice-run的接口是一样的安全流程。

注意

按照合规要求,必须要有 加密 解密加签 验签 的防抵赖和防篡改的 安全流程

参考:Security - 安全规范

危险

走完安全流程,ice-run的系统才会判定此次推送数据是成功的。

才不会发起重试,或者由于多次重试且持续失败,而导致的误判为需要接口降级处理。


推送地址

推送地址推送地址前缀推送场景尾缀 拼接组成。

服务商需要请ice-run的运营客服或者产品经理在我司的运营平台进行配置:

  • 开启数据推送
  • 推送地址前缀
  • 启用推送场景

ice-run会根据 推送地址前缀推送场景尾缀 ,拼接出完整的 推送地址

提示

推送地址前缀只允许有一个。如果服务商有多个系统承接推送数据,请自行在服务商的系统内部进行转发和分发。


推送场景

不同的推送场景,使用不同的 推送场景尾缀

目前支持的 推送场景

每个场景的 推送地址 = 推送地址前缀 + 推送场景尾缀

示例:

如果配置的 推送地址前缀

${prefix} = https://test-agency.ice.run/pull/api/

示例 -- demo推送场景尾缀 约定为

${suffix} = demo

示例 -- demo 完整 推送地址 为:

${push_url} = ${prefix} + ${suffix} = https://test-agency.ice.run/pull/api/demo

开发测试联调阶段,请测试同事协助关注推送服务的日志和数据推送管理功能,用于验证推送的请求流程和安全校验。

注意

建议服务商首先尝试调试 示例 -- demo 场景,验证推送地址的配置和推送场景的配置是否正确。


推送机制

由ice-run产品经理协助接收方(服务商)维护数据推送的推送地址,开启数据推送,并勾选需要接收的推送数据的场景。

由服务商根据推送场景的文档实现相应的接口。

ice-run会将推送数据发送至服务商的推送地址和接口,服务商接收数据后需要正常响应成功的消息回执。

数据交互需要进行安全验证,与网关的安全流程一致,只是请求方和响应方身份反转。

数据推送时,成功一次即为成功。

如果失败,则会放入延迟队列中,等待发起多次重试。

默认的重试的间隔频率为:0s,5m,10m,30m,1h,2h。

不同的场景,可能存在不同的重试策略,将会在对应的文档中体现。


推送请求

数据推送的请求形式为 http + json

推送的请求:

header

属性类型说明
X-Signstring(1024)对密文 ${cipher} 加签得到的签名 ${sign}

body

属性类型说明
paramstring(10240)请求参数的明文(参数对象的 json 序列化的字符串)加密得到的密文 ${cipher}

示例:

header

Content-Type: application/json
X-Sign: ${sign: 密文字符串 `${cipher}` 的签名}

body

{
"param": "${cipher: 参数对象 json 字符串 '{...}' 的 密文}"
}

各个推送场景的明文的数据结构,请查阅对应的文档。


成功判定

数据推送的成功判定需要满足以下条件:

  • http 状态为 200
  • Content-Type = application/json
  • response body 中的 code == 000000
  • 完整的加密加签和解密验签的安全流程
    • 对响应数据的明文(json 序列化字符串)进行加密得到密文 ${cipher} ,赋值给 body 中的 data
    • 对密文 ${cipher} 加签得到签名 ${sign} ,赋值给响应的 header 中的 X-Sign

服务商的响应:

header

属性类型说明
X-Signstring(1024)对密文 ${cipher} 加签得到的签名 ${sign}

body

属性类型说明
codestring(6)000000 表示成功,其他表示失败
messagestring(64)如果失败,此处应赋值失败的原因
datastring(10240)响应数据的密文 ${cipher} :(若仅为表示成功响应,则可以返回空对象 {} 的 json 序列化字符串的密文)

示例

header

Content-Type: application/json
X-Sign: ${sign: 密文字符串 `${cipher}` 的签名}

body

{
"code": "000000",
"message": "OK",
"data": "${cipher: 空对象 json 字符串 `{}` 的 密文}"
}