收藏
回答

调用queryVerifyInfo接口时生成的cert_hash为什么总报错?

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


回答关注问题邀请回答
收藏

2 个回答

  • 白日梦_Y
    白日梦_Y
    05-09

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

    05-09
    有用
    回复
  • 智能回答 智能回答 本次回答由AI生成
    05-08
    有用
    回复
登录 后发表内容