Files
cai-server/ruoyi-cai/src/main/java/com/ruoyi/cai/pay/PayManager.java
2026-01-12 23:17:40 +08:00

335 lines
15 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package com.ruoyi.cai.pay;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alipay.api.AlipayApiException;
import com.alipay.api.domain.AlipayTradeQueryModel;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.ijpay.alipay.AliPayApi;
import com.ijpay.alipay.AliPayApiConfig;
import com.ijpay.alipay.AliPayApiConfigKit;
import com.ijpay.core.enums.SignType;
import com.ijpay.core.kit.WxPayKit;
import com.ijpay.wxpay.WxPayApi;
import com.ijpay.wxpay.model.OrderQueryModel;
import com.ruoyi.cai.domain.*;
import com.ruoyi.cai.dto.ConsumeResp;
import com.ruoyi.cai.dto.app.vo.pay.OrderPayStatusResp;
import com.ruoyi.cai.dto.commom.consumer.RechargeConsumerResp;
import com.ruoyi.cai.enums.SystemConfigEnum;
import com.ruoyi.cai.manager.AwardManager;
import com.ruoyi.cai.manager.ConsumerManager;
import com.ruoyi.cai.manager.SystemConfigManager;
import com.ruoyi.cai.pay.model.PayQueryModel;
import com.ruoyi.cai.service.*;
import com.ruoyi.cai.trdpay.TrdPayTypeEnum;
import com.ruoyi.common.exception.ServiceException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
import java.util.Map;
@Component
@Slf4j
public class PayManager {
@Autowired
private VipOrderService vipOrderService;
@Autowired
private ConsumerManager consumerManager;
@Autowired
private RechargeOrderService rechargeOrderService;
@Autowired
private AwardManager awardManager;
@Autowired
private PayTotalService payTotalService;
@Autowired
private PayConfigService payConfigService;
@Autowired
private PayConfigManager payConfigManager;
@Autowired
private GoodsService goodsService;
@Autowired
private SystemConfigManager systemConfigManager;
public String getNotifyDomain(String notifyUrl) {
if(!StringUtils.isBlank(notifyUrl)){
return notifyUrl;
}else{
String baseNotifyUrl = systemConfigManager.getSystemConfig(SystemConfigEnum.PAY_NOTIFY_URL);
return baseNotifyUrl;
}
}
public String getNotifyUrl(PayTrdConfig config, TrdPayTypeEnum type,boolean wx) {
if(!StringUtils.isBlank(config.getNotifyUrl())){
return type.getNotifyUrl(config.getNotifyUrl(),wx);
}else{
String notifyUrl = systemConfigManager.getSystemConfig(SystemConfigEnum.PAY_NOTIFY_URL);
return type.getNotifyUrl(notifyUrl,wx);
}
}
public PayQueryModel queryOrder(PayConfig payConfig,String orderNo,String appid) throws AlipayApiException {
if(PayTypeEnum.ALI.getCode().equals(payConfig.getPayType())){
boolean bool = payConfigManager.initAliPayConfig(payConfig);
if(!bool){
log.error("订单查询 初始化支付宝失败 payConfig={}",JSON.toJSONString(payConfig));
return PayQueryModel.fail();
}
AlipayTradeQueryModel model = new AlipayTradeQueryModel();
model.setOutTradeNo(orderNo);
String body = AliPayApi.tradeQueryToResponse(model).getBody();
log.info("订单查询 body={}",body);
JSONObject jsonObject = JSON.parseObject(body);
JSONObject response = jsonObject.getJSONObject("alipay_trade_query_response");
String code = response.getString("code");
String tradeStatus = response.getString("trade_status");
if(!"10000".equals(code)){
log.error("订单查询- 异常 resultBody={}",body);
return PayQueryModel.fail();
}
if("TRADE_SUCCESS".equals(tradeStatus)){
log.error("订单查询- 成功-已支付 resultBody={}",body);
return PayQueryModel.ok(null,payConfig.getAppid(),PayTypeEnum.ALI);
}
}else if(PayTypeEnum.WX.getCode().equals(payConfig.getPayType())){
Map<String, String> params = OrderQueryModel.builder()
.appid(appid)
.mch_id(payConfig.getWxMcid())
.out_trade_no(orderNo)
.nonce_str(WxPayKit.generateStr())
.build()
.createSign(payConfig.getWxKey(), SignType.MD5);
String query = WxPayApi.orderQuery(params);
Map<String, String> result = WxPayKit.xmlToMap(query);
log.info("订单查询 query={}",query);
String state = result.get("trade_state");
String returnCode = result.get("return_code");
String returnMsg = result.get("return_msg");
String resultCode = result.get("result_code");
if (!WxPayKit.codeIsOk(returnCode)) {
log.error("订单查询- 异常 returnMsg={}",returnMsg);
return PayQueryModel.fail();
}
if (!"SUCCESS".equals(resultCode)) {
log.error("订单查询- 异常 query={}",query);
return PayQueryModel.fail();
}
if("SUCCESS".equals(state)){
log.error("订单查询- 成功-已支付 query={}",query);
return PayQueryModel.ok(params, appid,PayTypeEnum.WX);
}
}
return PayQueryModel.fail();
}
public PayQueryModel checkOrderPayStatus(String orderNo, String appid) {
List<PayConfig> list = payConfigService.list(Wrappers.lambdaQuery(PayConfig.class).eq(PayConfig::getEnableStatus, 1));
for (PayConfig payConfig : list) {
try {
PayQueryModel paySuccess = this.queryOrder(payConfig, orderNo, appid);
if(paySuccess.isPayStatus()){
return paySuccess;
}
}catch (Exception e){
log.error("订单查询 -异常",e);
}
}
return PayQueryModel.fail();
}
public void queryAndUpdateCallbackPayStatus(String orderNo, String appId) {
OrderTypeEnum orderTypeEnum = OrderNoUtil.getType(orderNo);
if (orderTypeEnum == null) {
log.error("订单查询 订单类型有误orderNo={}", orderNo);
throw new ServiceException("订单类型有误,请检查订单号");
}
switch (orderTypeEnum) {
case VIP_ORDER_SUB:
VipOrder vipOrder = vipOrderService.getByOrderNo(orderNo);
if (vipOrder == null) {
throw new ServiceException("订单不存在,请检查订单状态");
}
if (!PayStatusEnum.READY_PAY.getCode().equals(vipOrder.getPayStatus())) {
throw new ServiceException("订单状态有误,请检查订单状态");
}
PayQueryModel vipPayStatus = checkOrderPayStatus(orderNo, appId);
if(!vipPayStatus.isPayStatus()){
log.info("订单查询 VIP支付失败orderNo={}",orderNo);
break;
}
this.callBack(orderNo,null,vipPayStatus.getParams(),vipPayStatus.getAppId(),vipPayStatus.getPayTypeEnum());
case RECHARGE_ORDER_SUB:
RechargeOrder rechargeOrder = rechargeOrderService.getByOrderNo(orderNo);
if (rechargeOrder == null) {
throw new ServiceException("订单查询 订单不存在,请重新下单支付");
}
if (!PayStatusEnum.READY_PAY.getCode().equals(rechargeOrder.getPayStatus())) {
throw new ServiceException("订单查询 订单状态有误,请重新下单支付");
}
PayQueryModel rechargePayStatus = checkOrderPayStatus(orderNo, appId);
if(!rechargePayStatus.isPayStatus()){
log.info("订单查询 充值支付失败orderNo={}",orderNo);
break;
}
this.callBack(orderNo,null,rechargePayStatus.getParams(),rechargePayStatus.getAppId(),rechargePayStatus.getPayTypeEnum());
default:
break;
}
}
public PayOrderInfoDTO getOrderInfo(String orderNo,boolean wx){
OrderTypeEnum orderTypeEnum = OrderNoUtil.getType(orderNo);
if(orderTypeEnum == null){
log.error("订单类型有误orderNo={}",orderNo);
throw new ServiceException("支付失败,请检查订单号");
}
PayOrderInfoDTO dto = null;
switch (orderTypeEnum) {
case VIP_ORDER_SUB:
VipOrder vipOrder = vipOrderService.getByOrderNo(orderNo);
if(vipOrder == null){
throw new ServiceException("订单不存在,请重新下单支付");
}
if(!PayStatusEnum.READY_PAY.getCode().equals(vipOrder.getPayStatus())){
throw new ServiceException("订单状态有误,请重新下单支付");
}
dto = new PayOrderInfoDTO();
dto.setBody(vipOrder.getVipName());
dto.setSubject(vipOrder.getVipName());
dto.setPrice(vipOrder.getPrice());
dto.setOrderNo(vipOrder.getOrderNo());
dto.setAppid(vipOrder.getAppid());
dto.setPlatformType(vipOrder.getPlatformType());
dto.setSubjectId(vipOrder.getVipId()+"");
break;
case RECHARGE_ORDER_SUB:
RechargeOrder rechargeOrder = rechargeOrderService.getByOrderNo(orderNo);
if(rechargeOrder == null){
throw new ServiceException("订单不存在,请重新下单支付");
}
if(!PayStatusEnum.READY_PAY.getCode().equals(rechargeOrder.getPayStatus())){
throw new ServiceException("订单状态有误,请重新下单支付");
}
if(wx){
if(rechargeOrder.getRechargeId() != null){
Goods goods = goodsService.getById(rechargeOrder.getRechargeId());
if(goods != null){
rechargeOrderService.update(Wrappers.lambdaUpdate(RechargeOrder.class)
.eq(RechargeOrder::getId, rechargeOrder.getId())
.set(RechargeOrder::getRechargeCoin, goods.getWxAmount()));
}
}
}
dto = new PayOrderInfoDTO();
dto.setBody(rechargeOrder.getRechargeName());
dto.setSubject(rechargeOrder.getRechargeName());
dto.setPrice(rechargeOrder.getPrice());
dto.setOrderNo(rechargeOrder.getOrderNo());
dto.setAppid(rechargeOrder.getAppid());
dto.setPlatformType(rechargeOrder.getPlatformType());
dto.setSubjectId(rechargeOrder.getRechargeId()+"");
break;
default:
break;
}
return dto;
}
public void callBack(String orderNo){
callBack(orderNo,null,null,null,null);
}
public void callBack(String orderNo, String transId, Map<String,String> params, String appId,PayTypeEnum payTypeEnum){
OrderTypeEnum orderTypeEnum = OrderNoUtil.getType(orderNo);
if(orderTypeEnum == null){
log.error("订单类型有误orderNo={}",orderNo);
return;
}
switch (orderTypeEnum){
case VIP_ORDER_SUB:
ConsumeResp vipResp = vipOrderService.orderSuccess(orderNo,params,appId,payTypeEnum);
if(vipResp.isSuccess()){
if(appId != null){
payTotalService.incsPrice(payTypeEnum,appId,vipResp.getPrice());
}
}
break;
case RECHARGE_ORDER_SUB:
RechargeConsumerResp resp = consumerManager.rechargeOrderSuccess(orderNo,params,appId,payTypeEnum);
if(resp.isSuccess()){
// 领取首充奖励
awardManager.giveFastPayAsync(resp);
if(appId != null){
payTotalService.incsPrice(payTypeEnum,appId,resp.getPrice());
}
}
break;
default:
break;
}
}
public OrderPayStatusResp getOrderPayStatus(String orderNo) {
OrderTypeEnum orderTypeEnum = OrderNoUtil.getType(orderNo);
if(orderTypeEnum == null){
log.error("订单类型有误orderNo={}",orderNo);
return null;
}
OrderPayStatusResp resp = null;
switch (orderTypeEnum) {
case VIP_ORDER_SUB:
VipOrder vipOrder = vipOrderService.getByOrderNo(orderNo);
if(vipOrder != null){
resp = new OrderPayStatusResp();
resp.setOrderNo(vipOrder.getOrderNo());
resp.setAmount(vipOrder.getPrice());
resp.setPayStatus(vipOrder.getPayStatus());
}
break;
case RECHARGE_ORDER_SUB:
RechargeOrder rechargeOrder = rechargeOrderService.getByOrderNo(orderNo);
if(rechargeOrder != null){
resp = new OrderPayStatusResp();
resp.setOrderNo(rechargeOrder.getOrderNo());
resp.setAmount(rechargeOrder.getPrice());
resp.setPayStatus(rechargeOrder.getPayStatus());
}
break;
default:
break;
}
return resp;
}
public void updatePayType(String orderNo, String type,PlatformTypeEnum typeEnum) {
OrderTypeEnum orderTypeEnum = OrderNoUtil.getType(orderNo);
if(orderTypeEnum == null){
log.error("订单类型有误orderNo={}",orderNo);
return;
}
switch (orderTypeEnum) {
case VIP_ORDER_SUB:
vipOrderService.update(Wrappers.lambdaUpdate(VipOrder.class)
.eq(VipOrder::getOrderNo, orderNo)
.set(VipOrder::getPlatformType, typeEnum == null ? null : typeEnum.getCode())
.set(VipOrder::getAppid, type));
break;
case RECHARGE_ORDER_SUB:
rechargeOrderService.update(Wrappers.lambdaUpdate(RechargeOrder.class)
.eq(RechargeOrder::getOrderNo, orderNo)
.set(RechargeOrder::getPlatformType, typeEnum == null ? null : typeEnum.getCode())
.set(RechargeOrder::getAppid, type));
break;
default:
break;
}
}
}