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();  
}




  • 无标签