package com.ruoyi.web.controller.api; import com.alibaba.fastjson2.JSONObject; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.fasterxml.jackson.core.type.TypeReference; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.utils.CodeGenerateUtils; import com.ruoyi.framework.web.service.TokenService; import com.ruoyi.system.model.TCourseOrder; import com.ruoyi.system.model.TInsurance; import com.ruoyi.system.model.TInsuranceOrder; import com.ruoyi.system.service.TCourseOrderService; import com.ruoyi.system.service.TInsuranceOrderService; import com.ruoyi.system.wxPay.enums.RefundEnum; import com.ruoyi.system.wxPay.enums.TradeStateEnum; import com.ruoyi.system.wxPay.model.WeixinPayProperties; import com.ruoyi.system.wxPay.utils.WxTimeUtils; import com.ruoyi.system.wxPay.utils.WxV3Pay; import com.wechat.pay.contrib.apache.httpclient.util.AesUtil; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.apache.poi.ss.formula.functions.T; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.BufferedReader; import java.io.IOException; import java.io.PrintWriter; import java.math.BigDecimal; import java.nio.charset.StandardCharsets; import java.time.LocalDateTime; import java.util.Date; import java.util.Map; import java.util.Objects; /** * 微信相关接口 */ @Slf4j @RestController @CrossOrigin @RequestMapping("/wx/") @Api(tags = {"微信支付相关接口"}) public class WxPayController { @Autowired private WxV3Pay wxV3Pay; @Autowired private TokenService tokenService; @Autowired private WeixinPayProperties weixinPayProperties; @Autowired private TCourseOrderService courseOrderService; @Autowired private TInsuranceOrderService tInsuranceOrderService; /** * 支付回调 */ @PostMapping("pay/notify") @ApiOperation("订单回调") public void payNotify(HttpServletRequest request, HttpServletResponse response) throws Exception { try { System.err.println("微信回调"); BufferedReader reader = request.getReader(); StringBuilder requestBody = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { requestBody.append(line); } System.err.println("全部请求体" + requestBody); JSONObject jsonObject = JSONObject.parseObject(requestBody.toString()); JSONObject resource = jsonObject.getJSONObject("resource"); AesUtil aesUtil = new AesUtil(weixinPayProperties.getV3().getApiKey().getBytes(StandardCharsets.UTF_8)); String decryptedData = aesUtil.decryptToString(resource.getString("associated_data").getBytes(StandardCharsets.UTF_8), resource.getString("nonce").getBytes(StandardCharsets.UTF_8), resource.getString("ciphertext")); System.err.println("微信解密的字符串信息" + decryptedData); JSONObject jsonInfo = JSONObject.parse(decryptedData); String out_trade_no = jsonInfo.getString("out_trade_no"); String transaction_id = jsonInfo.getString("transaction_id"); String trade_state = jsonInfo.getString("trade_state"); String success_time = jsonInfo.getString("success_time"); // 查询订单 TCourseOrder order = courseOrderService.getOne(Wrappers.lambdaQuery(TCourseOrder.class) .eq(TCourseOrder::getOrderNumber, out_trade_no).last("LIMIT 1")); if (trade_state.equals(TradeStateEnum.SUCCESS.name())) { log.info("回调成功"); // 订单号查询订单 order.setPayStatus(2); order.setPayTime(WxTimeUtils.dateToLocalDateTime(WxTimeUtils.toRfc3339Date(success_time))); order.setTransactionId(transaction_id); courseOrderService.updateById(order); PrintWriter out = response.getWriter(); out.print("SUCCESS"); out.flush(); out.close(); } } catch (Exception e) { log.error("支付回调异常:{}", e, e); wxV3Pay.ack(false, e.getMessage()); } } /** * 支付回调 */ @PostMapping("pay/notifyInsurance") @ApiOperation("保险订单回调") public void notifyInsurance(HttpServletRequest request, HttpServletResponse response) throws Exception { try { System.err.println("微信回调"); BufferedReader reader = request.getReader(); StringBuilder requestBody = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { requestBody.append(line); } System.err.println("全部请求体" + requestBody); JSONObject jsonObject = JSONObject.parseObject(requestBody.toString()); JSONObject resource = jsonObject.getJSONObject("resource"); AesUtil aesUtil = new AesUtil(weixinPayProperties.getV3().getApiKey().getBytes(StandardCharsets.UTF_8)); String decryptedData = aesUtil.decryptToString(resource.getString("associated_data").getBytes(StandardCharsets.UTF_8), resource.getString("nonce").getBytes(StandardCharsets.UTF_8), resource.getString("ciphertext")); System.err.println("微信解密的字符串信息" + decryptedData); JSONObject jsonInfo = JSONObject.parse(decryptedData); String out_trade_no = jsonInfo.getString("out_trade_no"); String transaction_id = jsonInfo.getString("transaction_id"); String trade_state = jsonInfo.getString("trade_state"); String success_time = jsonInfo.getString("success_time"); // 查询订单 TInsuranceOrder order = tInsuranceOrderService.getOne(Wrappers.lambdaQuery(TInsuranceOrder.class) .eq(TInsuranceOrder::getPayNo, out_trade_no).last("LIMIT 1")); if (trade_state.equals(TradeStateEnum.SUCCESS.name())) { log.info("回调成功"); // 订单号查询订单 order.setStatus(2); order.setPayTime(LocalDateTime.now()); order.setTransactionId(transaction_id); tInsuranceOrderService.updateById(order); PrintWriter out = response.getWriter(); out.print("SUCCESS"); out.flush(); out.close(); } } catch (Exception e) { log.error("支付回调异常:{}", e, e); wxV3Pay.ack(false, e.getMessage()); } } /** * 退款回调 */ // @PostMapping("refund/notify") // @ApiOperation("退款回调") // public void refundNotify(HttpServletRequest request, HttpServletResponse response) throws Exception { // try { //// System.err.println("微信回调"); //// BufferedReader reader = request.getReader(); //// StringBuilder requestBody = new StringBuilder(); //// String line; //// while ((line = reader.readLine()) != null) { //// requestBody.append(line); //// } //// System.err.println("全部请求体" + requestBody); //// JSONObject jsonObject = JSONObject.parseObject(requestBody.toString()); //// JSONObject resource = jsonObject.getJSONObject("resource"); //// AesUtil aesUtil = new AesUtil(weixinPayProperties.getV3().getApiKey().getBytes(StandardCharsets.UTF_8)); //// String decryptedData = aesUtil.decryptToString(resource.getString("associated_data").getBytes(StandardCharsets.UTF_8), resource.getString("nonce").getBytes(StandardCharsets.UTF_8), resource.getString("ciphertext")) // } // } @PostMapping("refund/notify") public void refundNotify(HttpServletRequest request) throws IOException { try { System.err.println("微信退款回调"); BufferedReader reader = request.getReader(); StringBuilder requestBody = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { requestBody.append(line); } System.err.println("全部请求体" + requestBody); JSONObject jsonObject = JSONObject.parseObject(requestBody.toString()); JSONObject resource = jsonObject.getJSONObject("resource"); AesUtil aesUtil = new AesUtil(weixinPayProperties.getV3().getApiKey().getBytes(StandardCharsets.UTF_8)); String decryptedData = aesUtil.decryptToString(resource.getString("associated_data").getBytes(StandardCharsets.UTF_8), resource.getString("nonce").getBytes(StandardCharsets.UTF_8), resource.getString("ciphertext")); System.err.println("微信解密的字符串信息" + decryptedData); JSONObject params = JSONObject.parseObject(decryptedData); System.out.println("退款返回参数"+params); // 商户订单号 String out_trade_no = params.get("out_trade_no").toString(); // 商户退款单号 String out_refund_no = params.get("out_refund_no").toString(); // 退款状态 String tradeState = params.get("refund_status").toString(); // 微信支付订单号 String transaction_id = params.get("transaction_id").toString(); if (tradeState.equals(RefundEnum.SUCCESS.name())) { TCourseOrder order = courseOrderService.getOne(Wrappers.lambdaQuery(TCourseOrder.class) .eq(TCourseOrder::getRefundNumber, out_refund_no).last("LIMIT 1")); order.setPayStatus(3); order.setRefundStatus(2); order.setRefundTransactionId(transaction_id); courseOrderService.updateById(order); wxV3Pay.ack(); }else { TCourseOrder order = courseOrderService.getOne(Wrappers.lambdaQuery(TCourseOrder.class) .eq(TCourseOrder::getRefundNumber, out_refund_no).last("LIMIT 1")); order.setRefundStatus(1); courseOrderService.updateById(order); wxV3Pay.ack(); } }catch (Exception e){ wxV3Pay.ack(false, "不是成功的退款状态"); } } @PostMapping("refund/notifyInsurance") public void notifyInsurance(HttpServletRequest request) throws IOException { try { System.err.println("微信退款回调"); BufferedReader reader = request.getReader(); StringBuilder requestBody = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { requestBody.append(line); } System.err.println("全部请求体" + requestBody); JSONObject jsonObject = JSONObject.parseObject(requestBody.toString()); JSONObject resource = jsonObject.getJSONObject("resource"); AesUtil aesUtil = new AesUtil(weixinPayProperties.getV3().getApiKey().getBytes(StandardCharsets.UTF_8)); String decryptedData = aesUtil.decryptToString(resource.getString("associated_data").getBytes(StandardCharsets.UTF_8), resource.getString("nonce").getBytes(StandardCharsets.UTF_8), resource.getString("ciphertext")); System.err.println("微信解密的字符串信息" + decryptedData); JSONObject params = JSONObject.parseObject(decryptedData); // 商户订单号 String out_trade_no = params.get("out_trade_no").toString(); // 商户退款单号 String out_refund_no = params.get("out_refund_no").toString(); // 退款状态 String tradeState = params.get("refund_status").toString(); // 微信支付订单号 String transaction_id = params.get("transaction_id").toString(); if (tradeState.equals(RefundEnum.SUCCESS.name())) { TInsuranceOrder order = tInsuranceOrderService.getOne(Wrappers.lambdaQuery(TInsuranceOrder.class) .eq(TInsuranceOrder::getRefundNumber, out_refund_no).last("LIMIT 1")); order.setStatus(1); order.setRefundStatus(2); order.setRefundTransactionId(transaction_id); tInsuranceOrderService.updateById(order); wxV3Pay.ack(true, "退款成功"); } }catch (Exception e){ wxV3Pay.ack(false, "不是成功的退款状态"); } } }