收藏
回答

v3小程序支付,回调一直提示验签不通?

微信v3支付,怎么就这么烦, 开发对接了3次,每次问题都不一样

前2个月帮客户开发一个小程序, 对接微信支付, 用的v3, 发起支付,回调都成功,没有任何问题

上个月 帮客户开发一个小程序, 对接微信支付, 用的v3, 发起支付成功, 一直收不到回调消息, 后来改成定时器去查询订单来修改状态,这个就勉强用,


这2天帮客户开发一个小程序, 对接微信支付, 用的v3, 发起支付成功,收到了 回调消息, 但是对消息进行验签,一直不通过, 折腾2天现在都没解决,

一模一样的代码, 申请证书,设置公钥pub_key.pem, 设置v3秘钥, 为啥遇到到的问题 总是让人 头疼


这个支付号1320509601 麻烦帮我查询一下原因, 实在找不到问题, 证书设置很多遍了, v3也设置很多次了, 总是提示验签不通过


    @Override

    public PayRecord  notify(HttpServletRequest request) throws Exception{

        //获取报文

        String reqBody = IOUtils.toString(request.getInputStream(), StandardCharsets.UTF_8);

        log.error("wx pay notify 获取报文: {}", reqBody);


        if (StringUtils.isEmpty(reqBody)) {

            log.error("wx pay notify 获取报文 为空");

            return null;

        }


        //随机串

        String nonceStr = request.getHeader("Wechatpay-Nonce");

        //log.info("wx pay notify  nonceStr................."+nonceStr);

        //微信传递过来的签名

        String signature = request.getHeader("Wechatpay-Signature");

        //log.info("wx pay notify  signature................."+signature);

        //证书序列号(微信平台), 验证 方法2  就用这个

        String serialNo = request.getHeader("Wechatpay-Serial");

        //log.info("wx pay notify  serialNo................."+serialNo);

        //时间戳

        String timestamp = request.getHeader("Wechatpay-Timestamp");

        //log.info("wx pay notify  timestamp................."+timestamp);



        //构造签名串  应答时间戳\n,应答随机串\n,应答报文主体\n

        String signStr = String.format("%s\n%s\n%s\n", timestamp, nonceStr, reqBody);

        log.info("wx pay notify  signStr................."+signStr);


        boolean flag = WechatPayUtils.verifyWithCertificate2(signStr.getBytes("utf-8"), signature);

        log.info("wx pay notify  验签结果................."+flag);

        if (!flag) {

            log.error("wx pay notify 验签结果 不通过");

            return null;

        }



   public static boolean verifyWithCertificate2(byte[] message, String signature) throws Exception {

        // 1. 加载微信平台公钥(非商户证书!)

        String publicKeyPem = IOUtils.toString(

                new ClassPathResource("classpath:/wxpay1715631399/pub_key.pem").getInputStream(),  //微信公钥 路径

                StandardCharsets.UTF_8

        );


        // 2. 提取公钥内容

        String publicKeyStr = publicKeyPem

                .replace("-----BEGIN PUBLIC KEY-----", "")

                .replace("-----END PUBLIC KEY-----", "")

                .replaceAll("\\s+", "");


        // 3. 构造PublicKey对象

        byte[] keyBytes = Base64.getDecoder().decode(publicKeyStr);

        X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);

        PublicKey publicKey = KeyFactory.getInstance("RSA").generatePublic(keySpec);


        // 4. 验证签名

        Signature sig = Signature.getInstance("SHA256withRSA");

        sig.initVerify(publicKey);

        sig.update(message);

        return sig.verify(Base64.getDecoder().decode(signature));

    }













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

3 个回答

  • 支付社区运营
    支付社区运营
    08-11

    你好 经查询1320509601 这个商户号目前还有平台证书,根据你的描述不同商户号出现的验签查询,回调验签失败可能是证书不对应导致的。

    建议先确认下回调请求头中的Wechatpay-Serial参数是否和使用的验证证书/公钥一致https://pay.weixin.qq.com/doc/v3/partner/4012925289

    如果一致的话建议把验签内容和签名内容打印出对照验签工具https://pay.weixin.qq.com/doc/v3/partner/4012365880验证下签名是否正确


    若仍未解决辛苦私信提供相关参数私信我(https://developers.weixin.qq.com/community/personal/oCJUsw9CJvLXfoIsy8cDn__JOfUc)协助排查

    08-11
    有用
    回复 4
    • 不忘初心
      不忘初心
      08-11
      你好,我已经私信你了, 麻烦帮我解决一下,  我搞不懂,我已经申请了 支付公钥,  为啥回调的时候,给我的证书号 是 v2的老版本证书 序号,   我发起支付 用的是 v3证书公钥,  可以通过验签,   为啥回调 就不通过验签
      08-11
      回复
    • 支付社区运营
      支付社区运营
      08-11回复不忘初心
      证书是商户号维度的,和接口规则没什么关系的。详细的已私信回复你了
      08-11
      回复
    • 不忘初心
      不忘初心
      08-11回复不忘初心
      新注册的号, 就没有这个问题, 你们就不能让我们自己选择, 可以马上切换到 支付公钥, 干嘛还搞个平滑 过度, 7天之后才自动更换支付公钥, 搞的我们一头雾水, 应该让商户自己选择,而不是你们系统控制
      08-11
      回复
    • 不忘初心
      不忘初心
      08-11
      我对接了十几个微信支付小程序了, 第一次碰到这个问题, 折腾了我3天才发现,原来是  证书秘钥切换问题
      08-11
      回复
  • Memory (私信不回复)
    Memory (私信不回复)
    08-09

    可以先从这里验证一下https://tools.aifuwu.net/wechat-pay-tools/apiv3-signature-validator

    08-09
    有用
    回复 2
    • 渐忘
      渐忘
      09-26
      这个工具校验不对啊,自己生成的,自己都校验过不去。
      09-26
      回复
    • Memory (私信不回复)
      Memory (私信不回复)
      09-26回复渐忘
      ????
      09-26
      回复
  • 智能回答 智能回答 本次回答由AI生成
    08-09
    有用
    回复
登录 后发表内容