微信支付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 MapwxCallback(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(); }
大概就是这样了,希望能帮到有需要的人