1.在企业-数据集成中新建Webhook自建应用。
2.审核成功后编辑该应用,配置第三方回调接口地址及参数类型。
3.在具体业务逻辑插入使用该Webhook功能。根据该Webhook自建应用参数配置封装对应参数并请求Webhook服务http接口:webhook服务地址+/api/webhook/hook
4.第三方回调接口。
webhook服务向第三方回调接口发送请求(Post请求)时,会使用授权密钥生成消息内容的 hmac sha256 hex 摘要签名,携带在 header 中。
签名生成方法
- 所有请求参数(不包括signature,秘钥使用该Webhook自建应用密钥secret), 根据参数名称进行字典递增排序(按照第一个字符的键值ASCII码递增排序, 如果遇到相同字符则按照第二个字符的键值ASCII码递增排序, 以此类推)
- 将排序后的参数与其对应值, 组合成"参数=参数值"的形式, 然后用'&'字符连接起来, 作为待签名字符串
将待签名字符串使用hmac sha256 hex算法处理, 结果作为signature(签名)的值
注意事项
secret只在待签名字符串中使用,请求接口时,请勿带上secret参数
鉴权代码参考
以java代码为例
代码块 | ||||
---|---|---|---|---|
| ||||
/**
* 生成signature方法 CHARSET=utf-8
*/
public static String HmacSha256(SortedMap<String, Object> data, String secrect) {
byte[] hash = new byte[0];
try {
String stringToSign = canonicalize(data);
Mac mac = Mac.getInstance(HmacSHA256);
SecretKeySpec secretKeySpec = new SecretKeySpec(secrect.getBytes(CHARSET), mac.getAlgorithm());
mac.init(secretKeySpec);
hash = mac.doFinal(stringToSign.getBytes(CHARSET));
} catch (Exception e) {
logger.error("HmacSha256 error!", e);
}
return DatatypeConverter.printBase64Binary(hash);
}
public static String canonicalize(SortedMap<String, Object> sortedParamMap) {
if (sortedParamMap.isEmpty()) {
return "";
}
StringBuffer buffer = new StringBuffer();
Iterator<Entry<String, Object>> iter = sortedParamMap.entrySet().iterator();
while (iter.hasNext()) {
Entry<String, Object> kvpair = iter.next();
buffer.append(percentEncodeRfc3986(kvpair.getKey()));
buffer.append("=");
buffer.append(kvpair.getValue());
if (iter.hasNext()) {
buffer.append("&");
}
}
return buffer.toString();
} |