微信支付v3接口回调

作者: adm 分类: java 发布时间: 2023-08-09

这次项目需要接入微信支付,看了下现在都是v3的版本了,但是微信支付的文档真的是一言难尽,所以把自己接入的微信支付回调给记录下来,也给需要的小伙伴参考一下

// 首先初始化平台证书的配置 后续会用到
public static void configinit(String merchantId, String privateKey, String merchantSerialNumber, String apiV3key)
    {
 
        // 使用自动更新平台证书的RSA配置
        // 一个商户号只能初始化一个配置,否则会因为重复的下载任务报错
        config =
                new RSAAutoCertificateConfig.Builder()
                        .merchantId(merchantId) // 商户号
                        //.privateKeyFromPath(privateKeyPath) // 商户API私钥路径
                        .privateKey(privateKey)
                        .merchantSerialNumber(merchantSerialNumber) // 商户证书序列号
                        .apiV3Key(apiV3key) // 商户APIV3密钥
                        .build();
    }

然后就是接收回调部分了

public Map wxCallback(HttpServletRequest request) {
        logger.info("=============微信支付回调========");
        // 初始化map,给微信响应用
        Map map = new HashMap<>(2);
        try {
            // 这一块是我的微信支付相关的参数

            // 获取设置 这里就是上面初始化的设置
            NotificationConfig config = new RSAAutoCertificateConfig.Builder()
                    .merchantId(merchantId)
                    .privateKeyFromPath(privateKeyPath)
                    .merchantSerialNumber(merchantSerialNumber)
                    .apiV3Key(apiV3Key)
                    .build();
            // 从请求头中获取信息
            // 这是微信回调固定在请求头里的参数,验签要用
            String timestamp = request.getHeader("Wechatpay-Timestamp");
            String nonce = request.getHeader("Wechatpay-Nonce");
            String signature = request.getHeader("Wechatpay-Signature");
            String singType = request.getHeader("Wechatpay-Signature-Type");
            String number = request.getHeader("Wechatpay-Serial");
            String body = getRequestBody(request);
            // 初始化解析器 NotificationParser
            // 这个解析器是微信支付SDK里的,他会帮我们做验签等一系列的事,不需要我们去做
            NotificationParser parser = new NotificationParser((NotificationConfig) config);
            RequestParam requestParam = new RequestParam.Builder().nonce(nonce).signature(signature).signType(singType)
                    .timestamp(timestamp).serialNumber(number).body(body).build();
            // 不同的API的回调有不同的参数,这里的Transaction只是微信支付接口的回调参数对象
            //.parse()方法中会做验签及resource对象的解密,Transaction对象中就是解密后的参数
            Transaction decryptObject = parser.parse(requestParam, Transaction.class);
            if (decryptObject != null) {
                // 支付成功
                logger.info("=============微信支付回调========trade_status:"+decryptObject.getTradeState());
                if (Transaction.TradeStateEnum.SUCCESS.equals(decryptObject.getTradeState())){
                    // 处理支付成功逻辑
                    logger.info("进入try catch");
                    try {
                        // 下面就是做支付成功的逻辑

                        //响应微信
                        map.put("code", "SUCCESS");
                        map.put("message", "成功");
                    } catch (Exception e) {
                        logger.error("微信回调处理失败",e);
                        e.printStackTrace();
                    }
                } else {
                    logger.info("莫名其妙");
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return map;
    }
 
 
// 获取请求头里的数据
private String getRequestBody(HttpServletRequest request) {
 
        StringBuffer sb = new StringBuffer();
 
        try (ServletInputStream inputStream = request.getInputStream();
             BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
        ) {
            String line;
 
            while ((line = reader.readLine()) != null) {
                sb.append(line);
            }
 
        } catch (IOException e) {
            logger.error("读取数据流异常:{}", e);
        }
 
        return sb.toString();
 
    }

大概就是这样了,希望能帮到有需要的人

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!