New file |
| | |
| | | package com.ruoyi.web.controller.api; |
| | | |
| | | import com.baomidou.mybatisplus.core.toolkit.Wrappers; |
| | | import com.fasterxml.jackson.core.type.TypeReference; |
| | | import com.ruoyi.common.core.domain.AjaxResult; |
| | | 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.TSysAppUser; |
| | | import com.ruoyi.system.model.TSysInspection; |
| | | import com.ruoyi.system.model.TSysOtherConfig; |
| | | import com.ruoyi.system.model.TSysPayRecord; |
| | | import com.ruoyi.system.service.TSysAppUserService; |
| | | import com.ruoyi.system.service.TSysInspectionService; |
| | | import com.ruoyi.system.service.TSysOtherConfigService; |
| | | import com.ruoyi.system.service.TSysPayRecordService; |
| | | 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.model.WxPaymentRefundModel; |
| | | import com.ruoyi.system.wxPay.utils.WxTimeUtils; |
| | | import com.ruoyi.system.wxPay.utils.WxV3Pay; |
| | | import io.swagger.annotations.Api; |
| | | import io.swagger.annotations.ApiOperation; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.web.bind.annotation.*; |
| | | |
| | | import javax.servlet.http.HttpServletRequest; |
| | | import java.io.IOException; |
| | | import java.math.BigDecimal; |
| | | 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 TSysAppUserService sysAppUserService; |
| | | @Autowired |
| | | private TSysOtherConfigService sysOtherConfigService; |
| | | @Autowired |
| | | private TSysPayRecordService sysPayRecordService; |
| | | @Autowired |
| | | private WeixinPayProperties weixinPayProperties; |
| | | @Autowired |
| | | private TSysInspectionService sysInspectionService; |
| | | |
| | | |
| | | |
| | | /** |
| | | * 按实际修改 |
| | | */ |
| | | @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); |
| | | // 价格 |
| | | Integer totalPrice = sysOtherConfig.getAiPrice().multiply(new BigDecimal(100)).intValue(); |
| | | // 生成订单号 |
| | | 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(result); |
| | | } |
| | | |
| | | /** |
| | | * 微信v3支付-订单退款 |
| | | * |
| | | * @return |
| | | */ |
| | | @ApiOperation("订单退款") |
| | | @PostMapping(value = "refund-order") |
| | | public AjaxResult<String> refundOrder() { |
| | | Map<String, Object> result = wxV3Pay.refund(new WxPaymentRefundModel()); |
| | | log.info("退款结果:{}", result); |
| | | // 微信支付退款单号 |
| | | String refund_id = result.get("refund_id").toString(); |
| | | // 商户退款单号 |
| | | String out_refund_no = result.get("out_refund_no").toString(); |
| | | // 微信支付订单号 |
| | | String transaction_id = result.get("transaction_id").toString(); |
| | | // 商户订单号 tradeNo |
| | | String out_trade_no = result.get("out_trade_no").toString(); |
| | | // 退款成功时间 |
| | | String success_time = Objects.nonNull(result.get("success_time")) ? result.get("success_time").toString() : null; |
| | | // 退款状态 RefundEnum |
| | | String status = result.get("status").toString(); |
| | | // TODO 退款业务处理 |
| | | return AjaxResult.success(); |
| | | } |
| | | /** |
| | | * 支付回调 |
| | | */ |
| | | @PostMapping("pay/notify") |
| | | @ApiOperation("订单回调") |
| | | public void payNotify(HttpServletRequest request) throws Exception { |
| | | try { |
| | | Map<String, Object> params = wxV3Pay.verifyNotify(request, new TypeReference<Map<String, Object>>() {}); |
| | | log.info("支付回调:{}", params); |
| | | // 商户订单号 |
| | | String tradeNo = params.get("out_trade_no").toString(); |
| | | // 交易状态 |
| | | String trade_state = params.get("trade_state").toString(); |
| | | // 交易状态描述 |
| | | String trade_state_desc = params.get("trade_state_desc").toString(); |
| | | // 微信支付订单号 |
| | | String transaction_id = params.get("transaction_id").toString(); |
| | | // 支付完成时间 |
| | | // 时间不对的话,可以调用 WxTimeUtils.toRfc3339Date(success_time)转换一下 |
| | | String success_time = params.get("success_time").toString(); |
| | | // 附加数据 |
| | | Integer attach = Integer.parseInt(params.get("attach").toString()); |
| | | // 查询订单 |
| | | TSysPayRecord sysPayRecord = sysPayRecordService.getOne(Wrappers.lambdaQuery(TSysPayRecord.class) |
| | | .eq(TSysPayRecord::getOrderNo, tradeNo).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); |
| | | |
| | | wxV3Pay.ack(); |
| | | } |
| | | wxV3Pay.ack(); |
| | | } catch (Exception e) { |
| | | log.error("支付回调异常:{}", e, e); |
| | | wxV3Pay.ack(false, e.getMessage()); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 支付回调成功后 |
| | | */ |
| | | @PostMapping("pay/ack") |
| | | public void ack(){ |
| | | try { |
| | | wxV3Pay.ack(); |
| | | } catch (IOException e) { |
| | | throw new RuntimeException(e); |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | /** |
| | | * 退款回调 |
| | | */ |
| | | @PostMapping("refund/notify") |
| | | public void refundNotify(HttpServletRequest request) throws IOException { |
| | | try { |
| | | Map<String, Object> params = wxV3Pay.verifyNotify(request, new TypeReference<Map<String, Object>>() { |
| | | }); |
| | | // 商户订单号 |
| | | String out_trade_no = params.get("out_trade_no").toString(); |
| | | // 商户退款单号 |
| | | String out_refund_no = params.get("out_refund_no").toString(); |
| | | // 微信支付订单号 |
| | | String transaction_id = params.get("transaction_id").toString(); |
| | | // 微信支付退款单号 |
| | | String refund_id = params.get("refund_id").toString(); |
| | | // 退款状态 |
| | | String tradeState = params.get("refund_status").toString(); |
| | | // 退款成功时间 |
| | | // 时间不对的话,可以调用 WxTimeUtils.toRfc3339Date(success_time)转换一下 |
| | | String success_time = params.get("success_time").toString(); |
| | | if (tradeState.equals(RefundEnum.SUCCESS.name())) { |
| | | wxV3Pay.ack(); |
| | | } else { |
| | | wxV3Pay.ack(false, "不是成功的退款状态"); |
| | | } |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | wxV3Pay.ack(false, e.getMessage()); |
| | | } |
| | | } |
| | | |
| | | } |