微信支付v3接口回调

这次项目需要接入微信支付,看了下现在都是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<String, String> wxCallback(HttpServletRequest request) {
        logger.info("=============微信支付回调========");
        // 初始化map,给微信响应用
        Map<String, String> map = new HashMap<>(2);
        try {
            // 这一块是我的微信支付相关的参数
            BloPayWay payWay = redisService.getCacheObject(UserCorrelationConstants.PAY_WAY_KEY);
            // 获取设置 这里就是上面初始化的设置
            Config config = WxPayUtil.getConfig(payWay.getPartner(), payWay.getPrivateKey(), payWay.getOtherParameter(), payWay.getApiPayKey());
            // 从请求头中获取信息
            // 这是微信回调固定在请求头里的参数,验签要用
            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();

    }

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

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值