请选择 进入手机版 | 继续访问电脑版
帖子
帖子
用户
博客
课程
显示全部楼层
139
帖子
3
勋章
1452
Y币

幂等key,resubmitCheckKey使用

[复制链接]
发表于 2022-11-3 11:52:01
本帖最后由 我也理解倪 于 2023-7-20 17:31 编辑

开放平台接口为防止数据重复提交,加入了幂等校验,通过幂等参数,resubmitCheckKey字段进行控制。
建议resubmitCheckKey有两种方式:MD5(请求JSON)+时间维度、MD5(请求JSON)

MD5(请求JSON)+时间维度 :
一、应用场景
当数据保存成功后,如果在YS/YB平台页面、API接口对数据进行删除操作。 网关层存储的幂等key不会同步进行删除。 所以如果再次使用相同的幂等key(resubmitCheckKey)进行提交相同数据,
如果在第一次成功调用请求1小时内又重复调用,网关会返回第一次请求成功的返回结果。(注意返回的是第一次成功的响应结果,code也是200,并不是说本次调用成功)
如果超过一个小时就会提示
  1. {
  2.         "code": "100004",
  3.         "message": "数据重复提交; resubmitCheckKey:OPENAPI_f579353b15e64144bb68acd175c2abc7_j815cx4i_ACCDH2204270027#1581160745236168704#",
  4.         "data": {
  5.                 "id": "1581160745236168704"
  6.         }
  7. }
复制代码

因此需要添加时间维度来保证一定时间范围内幂等key相同,从而避免重复保存数据, 一定时间后,由于时间发生变化,幂等key不同,从而可以再次进行保存。


二、生成建议:
第一部分 MD5(请求JSON):如果数据有调整加密出来的结果就会变化,从而幂等key就不会相同。
第二部分 时间维度: 这个时间维度需要根据客户的业务进行确定, 最小精确到天即可。 如果到秒、分或小时幂等key的存在就没有意义了。

三、示例:

通常MD5加密生成出来的是32位,也就是幂等key的最大字符。那么加上日期就会报错。 所以建议md5_32.substring(8, 24)。 截取MD5结果出16位,然后再加上时间维度
时间维度业务周期为日: MD5(请求JAON)截取16位+YYYYMMDD :  7fad6660ae09e89720221123
时间维度业务周期为月:   MD5(请求JAON)截取16位+YYYYMM:fad6660ae09e897202211
不加时间维度:               MD5(请求JAON):f16a95297fad6660ae09e897f88a3237










您需要登录后才可以回帖 登录

本版积分规则