微信支付回调签名错误(使用的微信公钥)

Verify WechatPay notification parameters, serialNumber is empty.RequestParam

微信支付文档中有个坑

显示都是大写字母开头,但是返回的头部的代码都是小写

一开始我的代码是:

@Override
    public ResponseEntity<String> handlePayNotify(String requestBody, Map<String, String> headers) {
        String wechatpaySerial = headers.get("Wechatpay-Serial");
        String wechatpaySignature = headers.get("Wechatpay-Signature");
        String wechatpayTimestamp = headers.get("Wechatpay-Timestamp");
        String wechatpayNonce = headers.get("Wechatpay-Nonce");
        log.info("支付通知回调:{}",requestBody);
        log.info("支付通知回调头部:{}",headers);
        log.info("wechatpaySerial:{}",wechatpaySerial);
        log.info("wechatpaySignature:{}",wechatpaySignature);
        log.info("wechatpayTimestamp:{}",wechatpayTimestamp);
        log.info("wechatpayNonce:{}",wechatpayNonce);
        RequestParam requestParam = new RequestParam.Builder()
                .serialNumber(wechatpaySerial)
                .nonce(wechatpayNonce)
                .signature(wechatpaySignature)
                .timestamp(wechatpayTimestamp)
                .body(requestBody)
                .build();
        /* 通知回调配置类 该类仅在商户由平台证书切换为平台公钥的灰度阶段使用,灰度完成后请切换为RSAPublicKey,NotificationConfig */
        NotificationConfig config = new RSACombinedNotificationConfig.Builder()
                .merchantId(wechatPayConfig.getSpMchId())
                .privateKeyFromPath(wechatPayConfig.getPrivateKeyFilePath())
                .merchantSerialNumber(wechatPayConfig.getMchSerialNo())
                .publicKeyFromPath(wechatPayConfig.getPublicKeyPath())
                .publicKeyId(wechatPayConfig.getPublicKeyId())
                .apiV3Key(wechatPayConfig.getApiV3Key())
                .build();
        // 验证签名
        // 初始化 NotificationParser
        NotificationParser parser = new NotificationParser(config);
        log.info("支付通知回调:验签、解密并转换成 Transaction对象:-------{}",parser);
        Transaction transaction = null;
        try {
            // 支付通知回调,验签、解密并转换成 Transaction
            log.info("transaction = parser.parse");
            transaction = parser.parse(requestParam, Transaction.class);
            //记录日志信息
            log.info("Transaction.TradeStateEnum state =");
            Transaction.TradeStateEnum state = transaction.getTradeState();
            //变订单状态,派送话费
            if (StringUtils.equals("SUCCESS", state.toString())) {
            //支付成功,改变订单状态
            log.info("支付成功,改变订单状态");
            //这里根据自己的业务编写

            return ResponseEntity.status(HttpStatus.OK).build();

        } catch (ValidationException e) {
            // 签名验证失败,返回 401 UNAUTHORIZED 状态码
            log.info("微信回调失败,JsapiPayController.payNotify.transaction:{}", e.getMessage());
            //通知微信回调失败
            String responseJson = "{\n"
                    + "    \"code\": \"FAIL\",\n"
                    + "    \"message\": \"失败\"\n"
                    + "}";
            return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(responseJson);
        }
    }

改完之后:

@Override
    public ResponseEntity<String> handlePayNotify(String requestBody, Map<String, String> headers) {
        String wechatpaySerial = headers.get("wechatpay-serial");
        String wechatpaySignature = headers.get("wechatpay-signature");
        String wechatpayTimestamp = headers.get("wechatpay-timestamp");
        String wechatpayNonce = headers.get("wechatpay-nonce");
       
        RequestParam requestParam = new RequestParam.Builder()
                .serialNumber(wechatpaySerial)
                .nonce(wechatpayNonce)
                .signature(wechatpaySignature)
                .timestamp(wechatpayTimestamp)
                .body(requestBody)
                .build();
        /* 通知回调配置类 该类仅在商户由平台证书切换为平台公钥的灰度阶段使用,灰度完成后请切换为RSAPublicKey,NotificationConfig */
        NotificationConfig config = new RSACombinedNotificationConfig.Builder()
                .merchantId(wechatPayConfig.getSpMchId())
                .privateKeyFromPath(wechatPayConfig.getPrivateKeyFilePath())
                .merchantSerialNumber(wechatPayConfig.getMchSerialNo())
                .publicKeyFromPath(wechatPayConfig.getPublicKeyPath())
                .publicKeyId(wechatPayConfig.getPublicKeyId())
                .apiV3Key(wechatPayConfig.getApiV3Key())
                .build();
        // 验证签名
        // 初始化 NotificationParser
        NotificationParser parser = new NotificationParser(config);
        log.info("支付通知回调:验签、解密并转换成 Transaction对象:-------{}",parser);
        Transaction transaction = null;
        try {
            // 支付通知回调,验签、解密并转换成 Transaction
            log.info("transaction = parser.parse");
            transaction = parser.parse(requestParam, Transaction.class);
            //记录日志信息
            log.info("Transaction.TradeStateEnum state =");
            Transaction.TradeStateEnum state = transaction.getTradeState();
            //变订单状态,派送话费
            if (StringUtils.equals("SUCCESS", state.toString())) {
            //支付成功,改变订单状态
            log.info("支付成功,改变订单状态");
            //这里根据自己的业务编写

            return ResponseEntity.status(HttpStatus.OK).build();

        } catch (ValidationException e) {
            // 签名验证失败,返回 401 UNAUTHORIZED 状态码
            log.info("微信回调失败,JsapiPayController.payNotify.transaction:{}", e.getMessage());
            //通知微信回调失败
            String responseJson = "{\n"
                    + "    \"code\": \"FAIL\",\n"
                    + "    \"message\": \"失败\"\n"
                    + "}";
            return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(responseJson);
        }
    }

注意呀!都是小写

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值