收藏
回答

微信商家转账到个人,验证应答签名一直不通过,不知道是哪里传的不对?

我现在做的功能是微信商家转账到个人微信,然后用证书的方式验签,因为之后还有充值
现在开通的是平台证书,然后这是我的请求代码:// ========== 内部请求方法 ==========


private static TransferResponse doRequest(TransferRequest request) {
    String uri = "/v3/fund-app/mch-transfer/transfer-bills";
    String reqBody = new Gson().toJson(request);

    Request.Builder builder = new Request.Builder()
            .url(HOST + uri)
            .addHeader("Accept", "application/json")
            .addHeader("Wechatpay-Serial", WECHAT_PAY_PUBLIC_KEY_ID)
            .addHeader("Authorization", WXPayUtility.buildAuthorization(
                    MCHID, CERT_SERIAL_NO, PRIVATE_KEY, "POST", uri, reqBody))
            .addHeader("Content-Type", "application/json")
            .post(RequestBody.create(reqBody, JSON));

    Request httpRequest = builder.build();

    try (Response response = HTTP_CLIENT.newCall(httpRequest).execute()) {
        String respBody = WXPayUtility.extractBody(response);
        if (response.code() >= 200 && response.code() < 300) {
            // 2XX 成功,验证应答签名
            WXPayUtility.validateResponse(WECHAT_PAY_PUBLIC_KEY_ID,WECHAT_PAY_PUBLIC_KEY,
                    response.headers(), respBody);
            return WXPayUtility.fromJson(respBody, TransferResponse.class);
        } else {
            throw new WXPayUtility.ApiException(response.code(), respBody, response.headers());
        }
    } catch (IOException e) {
        throw new RuntimeException("网络请求失败", e);
    }
现在是String respBody = WXPayUtility.extractBody(response);这里能正常返回,返回的是需要用户确认收款,看着数据是正常的,但是走到// 2XX 成功,验证应答签名
WXPayUtility.validateResponse(WECHAT_PAY_PUBLIC_KEY_ID,WECHAT_PAY_PUBLIC_KEY,
        response.headers(), respBody);这里的时候就报错了,Validate response failed,the WechatPay signature is incorrect.
下面是打印出来的信息:
Validate response failed,the WechatPay signature is incorrect.
Request-ID[08C7CBBFCD0610B3031895A2E7AE0120EE6928E063-0]	responseHeader[Server: nginx
Date: Tue, 10 Mar 2026 09:35:04 GMT
Content-Type: application/json; charset=utf-8
Connection: keep-alive
Keep-Alive: timeout=8
Cache-Control: no-cache, must-revalidate
X-Content-Type-Options: nosniff
Request-ID: 08C7CBBFCD0610B3031895A2E7AE0120EE6928E063-0
Content-Language: zh-CN
Wechatpay-Nonce: a4a4b2e90ef65b6e3b6dacdaeca63fb8
Wechatpay-Signature: oHDL1TeXWCqnK4QAMGgoWx9UrLPdHMwA8XKMqEM/Mb/eMVuL8iOPrUIUsos/BH7AsIdq43Vh22MDgUm1xoQG/6cNol9QZGs7uaewzSedLHwFKTBIU4LDcgQvqA665u96oETQm0TN7BXaHU4MIxp83uVGOlqcM1V2aivKBLLHb64HkmSbCkt6rU43MvnZSqdYIxzaJmDgFkyO++xY+02x7alUwELRQPWIdDZWhHI1f02/QVpnfQOqitOhMv2D5Yzzit54+mQUH34CQyggAjK7c3RA3oC5RLqDS/7m5KinzAz7KOByWpRpaTk0mwg==
Wechatpay-Timestamp: 1773135304
Wechatpay-Serial: 6DC460738B90CABC5DE03A6AB571DA5C3B6706EF
Wechatpay-Signature-Type: WECHATPAY2-SHA256-RSA2048
]	responseBody[{"create_time":"2026-03-10T17:35:03+08:00","out_bill_no":"2031302779488616450","package_info":"ABBQO+oYAAABAAAAAABCF7MimPkG7pRNyOWvaRAAAADnGpersQufepexx7NdSGndT6G2jJFI+z7WJgopxEJwc8JOIahG27WxYVOJ+HTqdtgqFUmS79YjsIEMgHuWXGQ=","state":"WAIT_USER_CONFIRM","transfer_bill_no":"1330007938065842603100047147535391"}]
我现在不知道哪里有问题,一直调用不成功


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

2 个回答

  • Memory (私信不回复)
    Memory (私信不回复)
    03-10

    你应答的Wechatpay-Serial 是平台证书序列号,你代码取值是微信支付公钥 ID

    03-10
    有用 1
    回复 2
    • 一直在
      一直在
      发表于移动端
      03-10
      老师,是这里吗? WXPayUtility.validateResponse(WECHAT_PAY_PUBLIC_KEY_ID,WECHAT_PAY_PUBLIC_KEY, response.headers(), respBody); 这个值WECHAT_PAY_PUBLIC_KEY_ID是需要传序列号?后面那个值呢?
      03-10
      回复
    • Memory (私信不回复)
      Memory (私信不回复)
      03-11回复一直在
      你应该用对应的平台证书去验证签名,看你提供的代码用错了,你配置的是微信支付公钥
      03-11
      回复
  • loaf
    loaf
    03-11
    代码响应的证书是这个Wechatpay-Serial: 6DC460738B90CABC5DE03A6AB571DA5C3B6706EF你验签要用对应的这个证书验
    
    03-11
    有用
    回复
登录 后发表内容