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