应用平台方可通过该服务来接收 AVATA 平台主动推送的上链交易结果异步通知消息。
注意:需保证回调地址能够被外网访问
触发回调行为时,AVATA 平台会发送回调消息到您设置的服务回调地址中,请求内容如下:
请求方式:POST
Header Parameters ( V1 版本):
参数 | 类型 | 说明 |
---|---|---|
X-Api-Key | string | 项目 API Key |
X-Signature | string | API 签名,算法为 SHA256 (Params+ApiSecret) |
{
"operation_id":"string", // 操作 ID
"type": "string", // 用户操作类型
"module": "string", // 交易模块
"tx_hash": "string", // 交易哈希
"status": 0, // 交易状态,1 成功; 2 失败
"message": "string", // 交易失败的错误描述信息
"block_height": 0, // 交易上链的区块高度
"timestamp": "string", // 交易上链时间(UTC 时间)
"nft": "{ // 对应不同操作类型的消息体 (参数值为:json字符串)
"class_id": "string"
"nft_id": "string",
}",
"mt": "{ // 对应不同操作类型的消息体(参数值为:json字符串)
"class_id": "string"
"mt_id": "string",
}",
"record": "{ // 对应不同操作类型的消息体(参数值为:json字符串)
"record_id": "string", // 区块链存证 ID
"certificate_url": "string" // 区块链存证证书的下载链接;证书下载链接并非长期有效,请您尽快将证书文件下载至本地并妥善保管。
}"
}
参数 | 类型 | 说明 |
---|---|---|
X-Api-Key | string | 项目 API Key |
X-Signature | string | API 签名,与 网关鉴权签名 方式保持一致 |
X-Timestamp | string | 时间, 1642065511000 |
{
"operation_id":"string", // 操作 ID
"module": 0, // 交易模块
"operation": 0, // 用户操作类型
"tx_hash": "string", // 交易哈希
"status": 0, // 交易状态,1 成功; 2 失败
"message": "string", // 交易失败的错误描述信息
"block_height": 0, // 交易上链的区块高度
"timestamp": "string, // 交易上链时间(UTC 时间)
"nft": { // 对应不同操作类型的消息体(参数值为:json 结构体)
"class_id": "string",
"id": "string" // 服务为 native 时,id 为字符串,服务为 evm 时,id 为 int
},
"mt": { // 对应不同操作类型的消息体(参数值为:json 结构体)
"class_id": "string",
"mt_id": "string"
},
"record": { // 对应不同操作类型的消息体(参数值为:json 结构体)
"record_id": "string", // 区块链存证 ID
"certificate_url": "string" // 区块链存证证书的下载链接;证书下载链接并非长期有效,请您尽快将证书文件下载至本地并妥善保管。
},
"kind": "string" // 区分服务,native/evm
}
签名 = sha256 (body + api_secret)
将接收到的 body 转换成 json 字符串,拼接上 api_secret ,进行 sha256 计算。可参考网关鉴权签名示例中的 sha256 的计算方法。
JSONObject jsonStr = JSON.parseObject("body参数");
String jsonStr1 = JSON.toJSONString(jsonStr, SerializerFeature.MapSortField);
// 执行签名
String signature = sha256Sum(jsonStr1 + "api_secret");
签名 = signRequest (“回调地址(去掉域名)”,null,Map<string,object> body,推送的请求头中的时间戳 (Long型),“apisecret”);
tip: 在接收到body后,需要调整部分参数类型为int型,在转换为body进行签名。否则无法验签通过。
public String huidiao(HttpServletRequest request, HttpServletResponse response,@RequestBody String data) throws Exception{
String timestamp = request.getHeader("X-Timestamp");
String qianming = request.getHeader("X-Signature");
// //v1 版本验签
// JSONObject jsonStr = JSON.parseObject("data");
// String jsonStr1 = JSON.toJSONString(jsonStr, SerializerFeature.MapSortField);
// // 执行签名
// String signature = sha256Sum(jsonStr1 + "api_secret");
// if(!signature.equals(qianming)){
// return "failed";
// }
// Map map = new HashMap<>();//map是data转换成json格式后将数据组装到map中
// //v2 v3 版本验签
// String signature=signRequest("设置的回调地址去掉域名", null, map, Integer.valueOf(timestamp), "api-secret");
// if(!signature.equals(qianming)){
// return "failed";
// }
return "SUCCESS";
}