wechatpay-apiv3 / wechatpay-java

微信支付 APIv3 的官方 Java Library
Apache License 2.0
870 stars 195 forks source link

很奇怪的bug #232

Closed sharkbb closed 9 months ago

sharkbb commented 10 months ago

错误描述

今天在改其他功能时 测试发现uat的微信支付突然报错了com.wechat.pay.contrib.apache.httpclient.exception.HttpCodeException: 下载平台证书返回状态码异常,状态码为:401 我马上检查生产环境发现生产环境没问题 当时很奇怪 以为有其他人改了微信支付的代码 但是我去看git历史没有提交记录 除了回调的url不一样其他都一样 感到很奇怪于是重新打了一下包 还是一样的报错:下载平台证书返回状态码异常,状态码为:401,我再检查了几遍还是没有发现问题于是重新打了几次包结果都是一样的报错。实在没办法 就问了微信支付的在线支持 我贴出了代码他具体报错在这一行: certificatesManager.putMerchant(mchId, new WechatPay2Credentials(mchId, new PrivateKeySigner(mchSerialNo, merchantPrivateKey)), apiV3Key.getBytes(StandardCharsets.UTF_8)); 他说只有可能是三个参数mchId mchSerialNo apiV3Key其中一个有问题,我感到很困惑因为支付的代码从没动过 不可能参数有问题啊 于是在上面+了一句代码想打出这三个参数的值再看问题: log.info("mchId ="+mchId," mchSerialNo ="+mchSerialNo, " apiV3Key="+apiV3Key); 加完这句代码再打到uat发现 马上又好了 就搞得我云里雾里有点害怕隐藏bug不敢打生产了 如果可以麻烦你们检查一下是否有隐藏的bug 今天这个确实迷惑到我了 谢谢

重现bug的步骤

正常打开 没动过代码 不知道如何触发的这个bug 无法重现

预期行为

没动过代码 不知道如何触发的这个bug 很迷惑 导致现在不敢动生产环境的order服务

导致错误的代码片段

public CloseableHttpClient getWxPayClient() throws IOException {
        try {
            //根据地址构建私钥
            PrivateKey merchantPrivateKey= WxPayTestConfig.getPrivateKey();
            // 定时更新平台证书功能
            CertificatesManager certificatesManager=CertificatesManager.getInstance();
            // 向证书管理器增加需要自动更新平台证书的商户信息
            log.info("mchId ="+mchId," mchSerialNo ="+mchSerialNo, " apiV3Key="+apiV3Key);
            certificatesManager.putMerchant(mchId, new WechatPay2Credentials(mchId,
                    new PrivateKeySigner(mchSerialNo, merchantPrivateKey)), apiV3Key.getBytes(StandardCharsets.UTF_8));
            // ... 若有多个商户号,可继续调用putMerchant添加商户信息

            // 从证书管理器中获取verifier
            Verifier verifier = certificatesManager.getVerifier(mchId);

            WechatPay2Validator wechatPay2Validator = new WechatPay2Validator(verifier);

            WechatPayHttpClientBuilder builder=WechatPayHttpClientBuilder.create()
                    .withMerchant(mchId,mchSerialNo,merchantPrivateKey)
                    .withValidator(new WechatPay2Validator(verifier));
            CloseableHttpClient httpClient = builder.build();
            return httpClient;
        }catch (GeneralSecurityException e){
            e.printStackTrace();
        }catch (HttpCodeException e){
            e.printStackTrace();
        }catch (NotFoundException e){
            e.printStackTrace();
        }
        return null;
    }

操作系统

linuxcentos7

Java 版本

java8

wechatpay-java 版本

0.4.2

其他信息

如果有什么不清楚的 可以电联17324280943

xy-peng commented 10 months ago

具体出错的日志呢?最好是提供下请求和应答的完整报文

sharkbb commented 10 months ago

body = {"code":"SIGN_ERROR", "detail":{ "detail": {"issue":"sign not match"}, "field":"signature", "location":"authorization", "sign_information":{"method":"GET","sign_message_length":66,"truncated_sign_message":"GET\n/v3/certificates\n1695709854\nNjqCvW8x0GmpdtWmPbfzxBsHEONf67K5\n\n","url":"/v3/certificates"}} ,"message":"错误的签名,验签失败"} 这是当时返回的resp,日志被清理了 出错就是拿不到CloseableHttpClient 对象 具体出错就在这句 certificatesManager.putMerchant(mchId, new WechatPay2Credentials(mchId, new PrivateKeySigner(mchSerialNo, merchantPrivateKey)), apiV3Key.getBytes(StandardCharsets.UTF_8));

xy-peng commented 9 months ago

你是用的 wechatpay-apache-httpclient ?

xy-peng commented 9 months ago

暂时先关闭,如果遇到请提到 wechatpay-apache-httpclient