| | |
| | | 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; |
| | | |
| | | /** |
| | | * 微信相关接口 |
| | |
| | | @Autowired |
| | | private WeixinPayProperties weixinPayProperties; |
| | | |
| | | @Autowired |
| | | private TCourseOrderService courseOrderService; |
| | | |
| | | @Autowired |
| | | private TInsuranceOrderService tInsuranceOrderService; |
| | | |
| | | |
| | | /** |
| | | * 按实际修改 |
| | | */ |
| | | @ApiOperation("订单支付") |
| | | @PostMapping("orderPay") |
| | | public R<Map<String, Object>> orderPay(@RequestParam(value = "inspectionId") String inspectionId) { |
| | | |
| | | // TSysOtherConfig sysOtherConfig = sysOtherConfigService.getById(1); |
| | | // if (Objects.isNull(sysOtherConfig.getAiPrice())) { |
| | | // return R.fail("系统未配置AI支付价格"); |
| | | // } |
| | | // |
| | | // String userId = tokenService.getLoginUserApplet().getUserId(); |
| | | // TSysAppUser sysAppUser = sysAppUserService.getById(userId); |
| | | // // 价格 |
| | | // Long totalPrice = sysOtherConfig.getAiPrice().multiply(new BigDecimal(100)).longValue(); |
| | | // // 生成订单号 |
| | | // String orderNo = CodeGenerateUtils.generateOrderSn(); |
| | | // // 查询用户信息 用户openid |
| | | // String openId = sysAppUser.getOpenId(); |
| | | // // 存储支付记录 |
| | | // sysPayRecordService.saveData(orderNo, userId, sysOtherConfig.getAiPrice(), 1); |
| | | // // 调用支付方法 |
| | | // Map<String, Object> result = wxV3Pay.jsApi(orderNo, totalPrice, openId,"AI检测报告支付",""); |
| | | // log.info("支付参数:{}", result); |
| | | return R.ok(); |
| | | } |
| | | |
| | | /** |
| | | * 支付回调 |
| | |
| | | String trade_state = jsonInfo.getString("trade_state"); |
| | | String success_time = jsonInfo.getString("success_time"); |
| | | // 查询订单 |
| | | // TSysPayRecord sysPayRecord = sysPayRecordService.getOne(Wrappers.lambdaQuery(TSysPayRecord.class) |
| | | // .eq(TSysPayRecord::getOrderNo, out_trade_no).last("LIMIT 1")); |
| | | |
| | | 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("回调成功"); |
| | | // 订单号查询订单 |
| | | // sysPayRecord.setPayState(2); |
| | | // sysPayRecord.setPayTime(WxTimeUtils.dateToLocalDateTime(WxTimeUtils.toRfc3339Date(success_time))); |
| | | // sysPayRecord.setTransactionId(transaction_id); |
| | | // sysPayRecordService.updateById(sysPayRecord); |
| | | // |
| | | // // 处理检测报告为可见 |
| | | // TSysInspection sysInspection = sysInspectionService.getById(sysPayRecord.getInspectionId()); |
| | | // sysInspection.setIsPay(1); |
| | | // sysInspectionService.updateById(sysInspection); |
| | | 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"); |
| | |
| | | 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(); |
| | | } |
| | | }catch (Exception e){ |
| | | wxV3Pay.ack(false, "不是成功的退款状态"); |
| | | } |
| | | } |
| | | } |