queryVerifyInfo生成cert_hash值,代码使用cert_info:{"cert_type":"IDENTITY_CARD","cert_name":"张三","cert_no":"310101199801011234"}生成的cert_hash值为3c241f7ff324977aeb91f173bb2a7b06569e6fd784d5573db34a636d8671108b,与官方一致,但是使用真实数据报错:{"errcode":84018,"errmsg":"invalid cert_hash, cert_hash should be [3331a18dc3fd41538ad7e98705b8ea29203f17e0589f2b83a4cb06fb7c90ca0a] hint: [IfVr3030853-0][2026-05-08 16:01:48] rid: 69fd986c-6f3ea348-1b4e7dd4"}
代码如下
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.util.Base64;
/**
* 微信 cert_hash 正确生成规则:
* 1. 直接使用原始字符串,不做 Base64 编码
* 2. 按顺序拼接:cert_type=xxx&cert_name=xxx&cert_no=xxx
* 3. 对拼接串做 SHA256 → 小写十六进制
* 40f86bf861140cee86bd3764b5212fc1e1414c706fe03c423ba7b47757614fc8
*/
public class WechatHashTest {
public static void main(String[] args) throws Exception {
// 你的真实参数
String certType = "IDENTITY_CARD";
String certName = "张三";
String certNo = "310101199801011234";
URLEncoder.encode(certName, StandardCharsets.UTF_8.name());
String joinStr = String.format("cert_type=%s&cert_name=%s&cert_no=%s",
Base64.getEncoder().encodeToString(certType.getBytes(StandardCharsets.UTF_8)),
Base64.getEncoder().encodeToString(certName.getBytes(StandardCharsets.UTF_8)),
Base64.getEncoder().encodeToString(certNo.getBytes(StandardCharsets.UTF_8)));
System.out.println("微信要求的拼接串:");
System.out.println(joinStr);
System.out.println();
// SHA256 得到最终 hash
String certHash = sha256Hex(joinStr);
System.out.println("微信要求的 cert_hash:");
System.out.println(certHash);
// 结果:3331a18dc3fd41538ad7e98705b8ea29203f17e0589f2b83a4cb06fb7c90ca0a
}
/** 3331a18dc3fd41538ad7e98705b8ea29203f17e0589f2b83a4cb06fb7c90ca0a
* 3331a18dc3fd41538ad7e98705b8ea29203f17e0589f2b83a4cb06fb7c90ca0a
* SHA256 转小写十六进制
*/
private static String sha256Hex(String data) throws Exception {
MessageDigest digest = MessageDigest.getInstance("SHA-256");
byte[] hash = digest.digest(data.getBytes());
StringBuilder hex = new StringBuilder();
for (byte b : hash) {
hex.append(String.format("%02x", b));
}
return hex.toString();
}
}

问题解决了,AI生成的代码getVerifyId时post请求参数toString成一个字符串,生成了verifyId其实是错误的,导致前端和后面queryVerifyInfo都是错的,参数改成Entity就可以了。