package com.ruoyi.web.controller.api;
|
|
import com.alibaba.fastjson2.JSONObject;
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
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.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.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.PrintWriter;
|
import java.math.BigDecimal;
|
import java.nio.charset.StandardCharsets;
|
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);
|
// 价格
|
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(result);
|
}
|
|
/**
|
* 支付回调
|
*/
|
@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");
|
// 查询订单
|
TSysPayRecord sysPayRecord = sysPayRecordService.getOne(Wrappers.lambdaQuery(TSysPayRecord.class)
|
.eq(TSysPayRecord::getOrderNo, 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);
|
|
PrintWriter out = response.getWriter();
|
out.print("SUCCESS");
|
out.flush();
|
out.close();
|
}
|
} catch (Exception e) {
|
log.error("支付回调异常:{}", e, e);
|
wxV3Pay.ack(false, e.getMessage());
|
}
|
}
|
}
|