webhook服务向第三方回调接口发送请求(Post请求)时,会使用授权密钥生成消息内容的 hmac sha256 hex 摘要签名,携带在 header 中。
将待签名字符串使用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(); } |