public static String calcSignature(String postBody, String sessionKey) {
// 输入验证
if (postBody == null || postBody.isEmpty() || sessionKey == null || sessionKey.isEmpty()) {
return null;
}
try {
// 准备签名消息
byte[] needSignMsg = postBody.getBytes("UTF-8");
// 创建HMAC-SHA256实例
Mac sha256Hmac = Mac.getInstance("HmacSHA256");
SecretKeySpec secretKey = new SecretKeySpec(sessionKey.getBytes("UTF-8"), "HmacSHA256");
sha256Hmac.init(secretKey);
// 生成签名
byte[] hash = sha256Hmac.doFinal(needSignMsg);
// 将字节数组转换为十六进制字符串
StringBuilder hexString = new StringBuilder();
for (byte b : hash) {
String hex = Integer.toHexString(0xFF & b);
if (hex.length() == 1) {
hexString.append('0');
}
hexString.append(hex);
}
// 返回签名
return hexString.toString();
} catch (NoSuchAlgorithmException | InvalidKeyException | java.io.UnsupportedEncodingException e) {
System.err.println("生成签名时发生错误: " + e.getMessage());
return null;
}
}
String signature = calcSignature(JSON.toJSONString(signData), sessionKey);
为什么还是签名校验失败,返回requestCommonPayment:fail webapi_wxa_createmidasorder:fail invalid signature" 702002。
哪里需要修改呢?
我也遇到了同样的报错,咋搞?
最好不要接这个支付,b2b支付完全不明确,搞得乱乱的
calcSignature(JSON.toJSONString(signData), sessionKey);
这里的signData就是传给小程序接口的signData字段