目录

一、问题分析

 二、问题分析

三、解决案例


一、问题分析

按惯例上问题:

2025-04-25 11:17:30.263 [http-nio-8034-exec-22] ERROR com.hz.utils.WechatPayUtils - 微信支付V3回调验签失败 java.lang.IllegalArgumentException: Last unit does not have enough valid bits

 二、问题分析

出现在微信支付 V3 的回调验签过程中,通常是 Base64 解码失败 导致的。这种错误一般是由于传入的字符串不是合法的 Base64 编码格式。

思路解析:

 1. 回调头部签名字段 Wechatpay-Signature 是否格式正确

验签时需要使用微信返回的以下 HTTP 头部字段:

  • Wechatpay-Timestamp

  • Wechatpay-Nonce

  • Wechatpay-Signature 

  • Wechatpay-Serial

其中最容易出错的是 Wechatpay-Signature ——它必须是 标准 Base64 字符串,长度一般在 342 字符左右。如果这个字段有空格、截断、字符缺失,都会导致 Base64 解码时报错。

2. 代码中是否正确处理了 Base64 解码 

Base64.getDecoder().decode(signature)

 这个方法会抛出现在看到的 IllegalArgumentException,如果 signature 不是合法 Base64

3. 有中间件或网关对微信的回调请求进行了篡改 

使用了网关(如 nginx、API 网关、安全设备),某些设置可能会自动修改或转码 header,比如把 + 转成空格 ,这会造成签名字段 Base64 解码失败。 

三、解决案例

String signature = request.getHeader("Wechatpay-Signature");
if (signature == null || signature.trim().isEmpty()) {
    throw new RuntimeException("签名为空");
}

try {
    byte[] decodedSignature = Base64.getDecoder().decode(signature);
    // 继续验签流程
} catch (IllegalArgumentException e) {
    log.error("Base64 解码失败,签名内容:{}", signature);
    throw e;
}

 

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐