抖音开放平台Logo
控制台

券消息通知

更新时间 2024-07-24 02:58:49
收藏
我的收藏
用于用户下单完以后向商家通知券消息,和订单消息区别是维度不一样,一张订单下面可能会有多张券​

使用限制

无​

接口说明

1、消息可能重复推送,请使用 Msg_Id 进行去重处理!​
2、信息推送使用说明参考:生活服务消息推送

基本信息

HTTP URL
地址由服务商提供
HTTP Method
POST
Scope
订单查询​
权限要求
需要 URL 配置,路径:配置方式

签名规则

用户可通过请求 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​

请求示例

json
复制
{
"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 版)
js
复制
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("验签失败");
}