This commit is contained in:
77
2024-11-25 20:41:43 +08:00
parent fa1d6df347
commit 904dbbe37b
9 changed files with 93 additions and 38 deletions

View File

@@ -5,15 +5,18 @@ ALTER TABLE `cai_account`
CREATE TABLE `cai_pay_trd_config` CREATE TABLE `cai_pay_trd_config`
( (
`id` bigint NOT NULL AUTO_INCREMENT, `id` bigint NOT NULL AUTO_INCREMENT,
`type` varchar(100) NOT NULL COMMENT '第三方支付类型', `type` varchar(100) NOT NULL COMMENT '第三方支付类型',
`name` varchar(100) NOT NULL COMMENT '第三方支付名称', `name` varchar(100) NOT NULL COMMENT '第三方支付名称',
`gateway_url` varchar(100) DEFAULT NULL COMMENT '请求域名', `gateway_url` varchar(100) DEFAULT NULL COMMENT '请求域名',
`notify_url` varchar(100) NOT NULL COMMENT '回调域名', `notify_url` varchar(100) NOT NULL COMMENT '回调域名',
`mch_id` varchar(100) NOT NULL COMMENT '商户ID', `mch_id` varchar(100) NOT NULL COMMENT '商户ID',
`sign` varchar(200) NOT NULL COMMENT '秘钥', `sign` varchar(200) NOT NULL COMMENT '秘钥',
`delete_flag` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否删除', `ali_product_id` varchar(100) NOT NULL COMMENT '支付宝产品号',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `ali_pay_type` varchar(10) NOT NULL DEFAULT 'H5' COMMENT '支付宝支付方式',
`enable_status` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否开启',
`delete_flag` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否删除',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`) USING BTREE PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB ) ENGINE = InnoDB
AUTO_INCREMENT = 1; AUTO_INCREMENT = 3;

View File

@@ -4,6 +4,7 @@ package com.ruoyi.web.controller.cai.admin.init;
import com.alibaba.fastjson2.JSONObject; import com.alibaba.fastjson2.JSONObject;
import com.dtflys.forest.annotation.JSONBody; import com.dtflys.forest.annotation.JSONBody;
import com.ruoyi.cai.pay.PayOrderInfoDTO; import com.ruoyi.cai.pay.PayOrderInfoDTO;
import com.ruoyi.cai.pay.PayReturnResp;
import com.ruoyi.cai.service.CitysService; import com.ruoyi.cai.service.CitysService;
import com.ruoyi.cai.service.PayTrdConfigService; import com.ruoyi.cai.service.PayTrdConfigService;
import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.domain.R;
@@ -37,8 +38,8 @@ public class CityController {
@PostMapping("/createOrder") @PostMapping("/createOrder")
public R<String> createOrder(@RequestBody PayOrderInfoDTO dto){ public R<Object> createOrder(@RequestBody PayOrderInfoDTO dto){
String orderAli = payTrdConfigService.createOrderAli(dto); PayReturnResp orderAli = payTrdConfigService.createOrderAli(dto);
return R.ok(orderAli); return R.ok(orderAli);
} }

View File

@@ -76,22 +76,44 @@ public class PayController {
return R.ok(orderPayStatusResp); return R.ok(orderPayStatusResp);
} }
@PostMapping(value = "/trdAli") @PostMapping(value = "/merge/ali")
@Operation(summary = "第三方支付宝支付") @Operation(summary = "支付宝聚合支付")
@Log(title = "第三方支付宝支付", businessType = BusinessType.OTHER, isSaveDb = true) @Log(title = "支付宝聚合支付", businessType = BusinessType.OTHER, isSaveDb = true)
public R<PayReturnResp> trdWxPay(@RequestBody PayControllerDTO dto){ public R<PayReturnResp> trdWxPay(@RequestBody PayControllerDTO dto){
PayOrderInfoDTO payOrderInfo = payManager.getOrderInfo(dto.getOrderNo()); PayOrderInfoDTO payOrderInfo = payManager.getOrderInfo(dto.getOrderNo());
if(payOrderInfo == null){ if(payOrderInfo == null){
return R.fail(600,"支付失败,未找到订单"); return R.fail(600,"支付失败,未找到订单");
} }
try { Long userId = LoginHelper.getUserId();
String ali = payTrdConfigService.createOrderAli(payOrderInfo); boolean userTrdPay = trdPayManager.useTrdPay(userId);
PayReturnResp payTrdReturnResp = new PayReturnResp(); if(userTrdPay){
payTrdReturnResp.setData(ali); try {
return R.ok(payTrdReturnResp); PayReturnResp orderAli = payTrdConfigService.createOrderAli(payOrderInfo);
}catch (Exception e){ return R.ok(orderAli);
log.error("第三方微信支付失败!",e); }catch (Exception e){
return R.fail(600,"支付失败!微信支付通道失败"); log.error("第三方支付宝支付失败!",e);
return R.fail(600,"第三方支付宝支付失败!");
}
}else{
try {
boolean b = payConfigManager.initAliPay();
if(!b){
log.error("支付失败,未找到可用的支付宝配置");
return R.fail(600,"支付失败!未开通支付宝支付!");
}
AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
model.setBody(payOrderInfo.getBody());
model.setSubject(payOrderInfo.getSubject());
model.setOutTradeNo(payOrderInfo.getOrderNo());
model.setTimeoutExpress("30m");
model.setTotalAmount(payOrderInfo.getPrice().toString());
String notifyUrl = AliPayApiConfigKit.getAliPayApiConfig().getDomain();
String orderInfo = AliPayApi.appPayToResponse(model, notifyUrl+NOTIFY_ALI_URL).getBody();
return R.ok(PayReturnResp.createApp(orderInfo));
} catch (AlipayApiException e) {
log.error("支付宝支付失败",e);
return R.fail("支付宝支付失败,请联系客服");
}
} }
} }
@@ -252,7 +274,7 @@ public class PayController {
public String trdNotifyUrlV1(HttpServletRequest request) { public String trdNotifyUrlV1(HttpServletRequest request) {
try { try {
Map<String, String> params = AliPayApi.toMap(request); Map<String, String> params = AliPayApi.toMap(request);
log.info("第三方支付回调:{}",JSON.toJSONString(params)); log.info("第三方支付回调V1:{}",JSON.toJSONString(params));
String mchOrderNo = params.get("mchOrderNo"); String mchOrderNo = params.get("mchOrderNo");
String payOrderId = params.get("payOrderId"); String payOrderId = params.get("payOrderId");
String productId = params.get("productId"); String productId = params.get("productId");
@@ -272,7 +294,7 @@ public class PayController {
public String trdNotifyUrlV2(HttpServletRequest request) { public String trdNotifyUrlV2(HttpServletRequest request) {
try { try {
Map<String, String> params = AliPayApi.toMap(request); Map<String, String> params = AliPayApi.toMap(request);
log.info("第三方支付回调:{}",JSON.toJSONString(params)); log.info("第三方支付回调V2:{}",JSON.toJSONString(params));
String mchOrderNo = params.get("mchOrderNo"); String mchOrderNo = params.get("mchOrderNo");
String payOrderId = params.get("payOrderId"); String payOrderId = params.get("payOrderId");
String productId = params.get("productId"); String productId = params.get("productId");

View File

@@ -55,12 +55,16 @@ public class SettingAppController {
@Operation(summary = "充值配置") @Operation(summary = "充值配置")
@Log(title = "充值配置", businessType = BusinessType.OTHER,isPrintResponseData = false, isSaveDb = false) @Log(title = "充值配置", businessType = BusinessType.OTHER,isPrintResponseData = false, isSaveDb = false)
public R<SettingGoodsVo> goods(){ public R<SettingGoodsVo> goods(){
SettingGoodsVo vo = new SettingGoodsVo();
vo.setHasAlipayPay(systemConfigManager.getSystemConfigOfInt(SystemConfigEnum.OPEN_ALI_PAY));
vo.setHasWechatPay(systemConfigManager.getSystemConfigOfInt(SystemConfigEnum.OPEN_WX_PAY));
vo.setAlipayFirst(systemConfigManager.getSystemConfigOfInt(SystemConfigEnum.ALI_PAY_FIRST));
boolean useTrdPay = trdPayManager.useTrdPay(LoginHelper.getUserId()); boolean useTrdPay = trdPayManager.useTrdPay(LoginHelper.getUserId());
vo.setUseTrdPay(useTrdPay?1:0); SettingGoodsVo vo = new SettingGoodsVo();
if(useTrdPay){ // 使用第三方支付
vo.setHasAlipayPay(systemConfigManager.getSystemConfigOfInt(SystemConfigEnum.OPEN_ALI_PAY));
vo.setHasWechatPay(0);
}else{
vo.setHasAlipayPay(systemConfigManager.getSystemConfigOfInt(SystemConfigEnum.OPEN_ALI_PAY));
vo.setHasWechatPay(systemConfigManager.getSystemConfigOfInt(SystemConfigEnum.OPEN_WX_PAY));
}
vo.setAlipayFirst(systemConfigManager.getSystemConfigOfInt(SystemConfigEnum.ALI_PAY_FIRST));
List<Goods> list = goodsService.list(Wrappers.lambdaQuery(Goods.class) List<Goods> list = goodsService.list(Wrappers.lambdaQuery(Goods.class)
.eq(Goods::getStatus,0) .eq(Goods::getStatus,0)
.orderByAsc(Goods::getPrice)); .orderByAsc(Goods::getPrice));

View File

@@ -5,6 +5,7 @@ import com.alibaba.fastjson2.JSONObject;
import com.alipay.api.AlipayApiException; import com.alipay.api.AlipayApiException;
import com.ruoyi.cai.pay.PayManager; import com.ruoyi.cai.pay.PayManager;
import com.ruoyi.cai.pay.PayOrderInfoDTO; import com.ruoyi.cai.pay.PayOrderInfoDTO;
import com.ruoyi.cai.pay.PayReturnResp;
import com.ruoyi.cai.service.PayTrdConfigService; import com.ruoyi.cai.service.PayTrdConfigService;
import jdk.nashorn.internal.runtime.regexp.JoniRegExp; import jdk.nashorn.internal.runtime.regexp.JoniRegExp;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@@ -29,8 +30,8 @@ public class PayTest {
dto.setSubject("subject"); dto.setSubject("subject");
dto.setPrice(new BigDecimal("10")); dto.setPrice(new BigDecimal("10"));
dto.setOrderNo("ORSKALKLASJDKLAS"); dto.setOrderNo("ORSKALKLASJDKLAS");
String orderAli = payTrdConfigService.createOrderAli(dto); PayReturnResp orderAli = payTrdConfigService.createOrderAli(dto);
log.info(orderAli); log.info(JSON.toJSONString(orderAli));
} }
@Test @Test

View File

@@ -14,8 +14,6 @@ public class SettingGoodsVo {
private Integer hasWechatPay = 1; private Integer hasWechatPay = 1;
@Schema(description = "支付宝是否放在第一个 1-是 0-否") @Schema(description = "支付宝是否放在第一个 1-是 0-否")
private Integer alipayFirst = 1; private Integer alipayFirst = 1;
@Schema(description = "是否使用第四方支付 1-是 0-否")
private Integer useTrdPay = 1;
@Schema(description = "支付设置") @Schema(description = "支付设置")
private List<Goods> goods; private List<Goods> goods;
} }

View File

@@ -1,8 +1,25 @@
package com.ruoyi.cai.pay; package com.ruoyi.cai.pay;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
@Data @Data
public class PayReturnResp { public class PayReturnResp {
private String data; private String data;
@Schema(description = "H5,APP")
private String appType;
public static PayReturnResp createH5(String data){
PayReturnResp resp = new PayReturnResp();
resp.setData(data);
resp.setAppType("H5");
return resp;
}
public static PayReturnResp createApp(String data){
PayReturnResp resp = new PayReturnResp();
resp.setData(data);
resp.setAppType("APP");
return resp;
}
} }

View File

@@ -4,6 +4,7 @@ import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.cai.domain.PayTrdConfig; import com.ruoyi.cai.domain.PayTrdConfig;
import com.ruoyi.cai.pay.PayOrderInfoDTO; import com.ruoyi.cai.pay.PayOrderInfoDTO;
import com.ruoyi.cai.pay.PayReturnResp;
/** /**
* 四方支付配置Service接口 * 四方支付配置Service接口
@@ -12,7 +13,7 @@ import com.ruoyi.cai.pay.PayOrderInfoDTO;
* @date 2024-11-25 * @date 2024-11-25
*/ */
public interface PayTrdConfigService extends IService<PayTrdConfig> { public interface PayTrdConfigService extends IService<PayTrdConfig> {
String createOrderAli(PayOrderInfoDTO dto); PayReturnResp createOrderAli(PayOrderInfoDTO dto);
JSONObject queryOrder(String orderNo, String trdPayType); JSONObject queryOrder(String orderNo, String trdPayType);

View File

@@ -8,11 +8,13 @@ import com.ruoyi.cai.domain.PayTrdConfig;
import com.ruoyi.cai.mapper.PayTrdConfigMapper; import com.ruoyi.cai.mapper.PayTrdConfigMapper;
import com.ruoyi.cai.pay.PayManager; import com.ruoyi.cai.pay.PayManager;
import com.ruoyi.cai.pay.PayOrderInfoDTO; import com.ruoyi.cai.pay.PayOrderInfoDTO;
import com.ruoyi.cai.pay.PayReturnResp;
import com.ruoyi.cai.pay.PayTypeEnum; import com.ruoyi.cai.pay.PayTypeEnum;
import com.ruoyi.cai.service.PayTrdConfigService; import com.ruoyi.cai.service.PayTrdConfigService;
import com.ruoyi.cai.trdpay.TrdPayManager; import com.ruoyi.cai.trdpay.TrdPayManager;
import com.ruoyi.cai.trdpay.TrdPayTypeEnum; import com.ruoyi.cai.trdpay.TrdPayTypeEnum;
import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.exception.ServiceException;
import com.tencentcloudapi.gme.v20180711.models.AppStatisticsItem;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@@ -36,7 +38,7 @@ public class PayTrdConfigServiceImpl extends ServiceImpl<PayTrdConfigMapper, Pay
private PayManager payManager; private PayManager payManager;
@Override @Override
public String createOrderAli(PayOrderInfoDTO dto){ public PayReturnResp createOrderAli(PayOrderInfoDTO dto){
PayTrdConfig payTrdConfig = getEnableStatus(); PayTrdConfig payTrdConfig = getEnableStatus();
if(payTrdConfig == null){ if(payTrdConfig == null){
throw new ServiceException("未开启支付,请联系客服"); throw new ServiceException("未开启支付,请联系客服");
@@ -55,13 +57,19 @@ public class PayTrdConfigServiceImpl extends ServiceImpl<PayTrdConfigMapper, Pay
log.info("第三方支付失败 V1统一支付失败失败 dto={}, payTrdConfig={}, typeEnum={}", JSON.toJSONString(dto), JSON.toJSONString(payTrdConfig),JSON.toJSONString(typeEnum)); log.info("第三方支付失败 V1统一支付失败失败 dto={}, payTrdConfig={}, typeEnum={}", JSON.toJSONString(dto), JSON.toJSONString(payTrdConfig),JSON.toJSONString(typeEnum));
throw new ServiceException("调用支付失败"); throw new ServiceException("调用支付失败");
} }
return jsonObject.getJSONObject("payParams").getString("payUrl"); String payUrl = jsonObject.getJSONObject("payParams").getString("payUrl");
return PayReturnResp.createH5(payUrl);
}else if(typeEnum == TrdPayTypeEnum.V2){ }else if(typeEnum == TrdPayTypeEnum.V2){
if(!"0".equals(jsonObject.getString("retCode"))){ if(!"0".equals(jsonObject.getString("retCode"))){
log.info("第三方支付失败 V2统一支付失败失败 dto={}, payTrdConfig={}, typeEnum={}", JSON.toJSONString(dto), JSON.toJSONString(payTrdConfig),JSON.toJSONString(typeEnum)); log.info("第三方支付失败 V2统一支付失败失败 dto={}, payTrdConfig={}, typeEnum={}", JSON.toJSONString(dto), JSON.toJSONString(payTrdConfig),JSON.toJSONString(typeEnum));
throw new ServiceException("调用支付失败"); throw new ServiceException("调用支付失败");
} }
return JSON.toJSONString(jsonObject); String payMethod = jsonObject.getString("payMethod");
if("alipayApp".equals(payMethod)){
String appStr = jsonObject.getJSONObject("payParams").getString("appStr");
return PayReturnResp.createApp(appStr);
}
return PayReturnResp.createH5(JSON.toJSONString(jsonObject));
} }
return null; return null;
} }