券消息通知
收藏
我的收藏用于用户下单完以后向商家通知券消息,和订单消息区别是维度不一样,一张订单下面可能会有多张券
使用限制
无
接口说明
1、消息可能重复推送,请使用 Msg_Id 进行去重处理!
基本信息
HTTP URL | 地址由服务商提供 | |||
HTTP Method | POST | |||
Scope | 订单查询 | |||
权限要求 |
签名规则
用户可通过请求 header 中的 X-Douyin-Signature 字段判断该消息是否来自抖音开放平台。 抖音服务端会将应用的(client secret + 消息体)使用 sha1 哈希作为 X-Douyin-Signature header 的 value。您可以自行使用 client secret 和收到的消息体进行 sha1 哈希,与该请求头进行比对。
请求头字段
字段 | 说明 |
Msg-Id | 同一实体下同一action的msg_id相同,服务商可根据msg_id对于消息去重 |
X-Douyin-Signature | 抖音侧签名,服务商可根据签名判断该消息是否来自抖音开放平台 |
Content-Type | 固定值application/json |
请求体字段
字段 | 类型 | 说明 |
event | string | 消息类型,用于区分各类消息,券消息的event为life_trade_certificate_notify |
client_key | string | 对应服务商平台或开发者平台中的APPID,应用ID |
content | string | 消息内容,根据需要解析消息内容,不同类型的消息内容不同 |
log_id | string | 抖音内部日志id,可提供给抖音方便排查问题 |
请求参数
content 内容
字段 | 类型 | 说明 |
action | string | 枚举如下: verify:核销 verify_cancel:撤销核销 refund_success:退款成功 |
msg_time | int | 消息发送时间,秒级时间戳 |
certificate | object | 券信息 |
.order_id | string | 抖音订单号 |
.certificate_id | string | 券ID,唯一标识(非券码) |
.code | string | 券码code,三方码传,抖音码不传 |
.account_id | string | 抖音商户ID |
请求示例
{ "event": "life_trade_certificate_notify", "client_key": "axxxxxxxxxxxxx", "from_user_id": "f6e35c98-1e53-4943-ad6d-f476f869deab", "content": "{\"action\": \"verify\",\"msg_time\": 1665991178,\"certificate\": {\"certificate_id\": \"456\",\"order_id\": \"123\",\"account_id\": \"1234\"}}", "log_id": "202210101930530102281180650970B5AF" }
响应参数
响应内容可以为空。
开发者收到消息推送后,http code 响应 200 且响应时间小于 3s,抖音侧即认为推送成功。
若开发者 http 响应 code 非 200 或响应时间超过 3s,抖音侧会间隔 500ms 发起重试,最大重试次数为 3 次。
抖音侧收到成功请求时也可能会继续重复推送,请务必使用请求头中 Msg-Id 进行消息去重处理。
附录
用户可通过请求 header 中的 X-Douyin-Signature 字段判断该消息是否来自抖音开放平台。 抖音服务端会将应用的(client secret + 消息体)使用 sha1 哈希作为 X-Douyin-Signature header 的 value。您可以自行使用 client secret 和收到的消息体进行 sha1 哈希,与该请求头进行比对。
验签 demo (java 版)
import org.apache.commons.codec.digest.DigestUtils; // sha1算法库 // 获取消息中body String str, wholeStr = ""; try{ BufferedReader br = re.getReader(); while((str = br.readLine()) != null){ wholeStr += str; } } catch (Exception e){ log.warn("获取请求内容失败"); } // 获取请求头中的加签信息 String signature = re.getHeader("X-Douyin-Signature"); String data = client_secret + wholeStr; String sign = DigestUtils.sha1Hex(data); if(!sign.equals(signature)){ log.error("验签失败"); }