diff --git a/doc/v4.sql b/doc/v4.sql index dd4d4af0..682dc9ec 100644 --- a/doc/v4.sql +++ b/doc/v4.sql @@ -5,15 +5,18 @@ ALTER TABLE `cai_account` CREATE TABLE `cai_pay_trd_config` ( - `id` bigint NOT NULL AUTO_INCREMENT, - `type` varchar(100) NOT NULL COMMENT '第三方支付类型', - `name` varchar(100) NOT NULL COMMENT '第三方支付名称', - `gateway_url` varchar(100) DEFAULT NULL COMMENT '请求域名', - `notify_url` varchar(100) NOT NULL COMMENT '回调域名', - `mch_id` varchar(100) NOT NULL COMMENT '商户ID', - `sign` varchar(200) NOT NULL COMMENT '秘钥', - `delete_flag` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否删除', - `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `id` bigint NOT NULL AUTO_INCREMENT, + `type` varchar(100) NOT NULL COMMENT '第三方支付类型', + `name` varchar(100) NOT NULL COMMENT '第三方支付名称', + `gateway_url` varchar(100) DEFAULT NULL COMMENT '请求域名', + `notify_url` varchar(100) NOT NULL COMMENT '回调域名', + `mch_id` varchar(100) NOT NULL COMMENT '商户ID', + `sign` varchar(200) NOT NULL COMMENT '秘钥', + `ali_product_id` varchar(100) NOT NULL 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 ) ENGINE = InnoDB - AUTO_INCREMENT = 1; + AUTO_INCREMENT = 3; diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/cai/admin/init/CityController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/cai/admin/init/CityController.java index 073ce3a9..4f5aed31 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/cai/admin/init/CityController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/cai/admin/init/CityController.java @@ -4,6 +4,7 @@ package com.ruoyi.web.controller.cai.admin.init; import com.alibaba.fastjson2.JSONObject; import com.dtflys.forest.annotation.JSONBody; import com.ruoyi.cai.pay.PayOrderInfoDTO; +import com.ruoyi.cai.pay.PayReturnResp; import com.ruoyi.cai.service.CitysService; import com.ruoyi.cai.service.PayTrdConfigService; import com.ruoyi.common.core.domain.R; @@ -37,8 +38,8 @@ public class CityController { @PostMapping("/createOrder") - public R createOrder(@RequestBody PayOrderInfoDTO dto){ - String orderAli = payTrdConfigService.createOrderAli(dto); + public R createOrder(@RequestBody PayOrderInfoDTO dto){ + PayReturnResp orderAli = payTrdConfigService.createOrderAli(dto); return R.ok(orderAli); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/cai/app/PayController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/cai/app/PayController.java index 206911a0..31ada4bb 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/cai/app/PayController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/cai/app/PayController.java @@ -76,22 +76,44 @@ public class PayController { return R.ok(orderPayStatusResp); } - @PostMapping(value = "/trdAli") - @Operation(summary = "第三方支付宝支付") - @Log(title = "第三方支付宝支付", businessType = BusinessType.OTHER, isSaveDb = true) + @PostMapping(value = "/merge/ali") + @Operation(summary = "支付宝聚合支付") + @Log(title = "支付宝聚合支付", businessType = BusinessType.OTHER, isSaveDb = true) public R trdWxPay(@RequestBody PayControllerDTO dto){ PayOrderInfoDTO payOrderInfo = payManager.getOrderInfo(dto.getOrderNo()); if(payOrderInfo == null){ return R.fail(600,"支付失败,未找到订单"); } - try { - String ali = payTrdConfigService.createOrderAli(payOrderInfo); - PayReturnResp payTrdReturnResp = new PayReturnResp(); - payTrdReturnResp.setData(ali); - return R.ok(payTrdReturnResp); - }catch (Exception e){ - log.error("第三方微信支付失败!",e); - return R.fail(600,"支付失败!微信支付通道失败!"); + Long userId = LoginHelper.getUserId(); + boolean userTrdPay = trdPayManager.useTrdPay(userId); + if(userTrdPay){ + try { + PayReturnResp orderAli = payTrdConfigService.createOrderAli(payOrderInfo); + return R.ok(orderAli); + }catch (Exception e){ + 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) { try { Map params = AliPayApi.toMap(request); - log.info("第三方支付回调:{}",JSON.toJSONString(params)); + log.info("第三方支付回调V1:{}",JSON.toJSONString(params)); String mchOrderNo = params.get("mchOrderNo"); String payOrderId = params.get("payOrderId"); String productId = params.get("productId"); @@ -272,7 +294,7 @@ public class PayController { public String trdNotifyUrlV2(HttpServletRequest request) { try { Map params = AliPayApi.toMap(request); - log.info("第三方支付回调:{}",JSON.toJSONString(params)); + log.info("第三方支付回调V2:{}",JSON.toJSONString(params)); String mchOrderNo = params.get("mchOrderNo"); String payOrderId = params.get("payOrderId"); String productId = params.get("productId"); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/cai/app/SettingAppController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/cai/app/SettingAppController.java index af57a693..589b1e57 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/cai/app/SettingAppController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/cai/app/SettingAppController.java @@ -55,12 +55,16 @@ public class SettingAppController { @Operation(summary = "充值配置") @Log(title = "充值配置", businessType = BusinessType.OTHER,isPrintResponseData = false, isSaveDb = false) public R 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()); - 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 list = goodsService.list(Wrappers.lambdaQuery(Goods.class) .eq(Goods::getStatus,0) .orderByAsc(Goods::getPrice)); diff --git a/ruoyi-admin/src/test/java/com/ruoyi/test/business/PayTest.java b/ruoyi-admin/src/test/java/com/ruoyi/test/business/PayTest.java index c3972160..8a3c6cb2 100644 --- a/ruoyi-admin/src/test/java/com/ruoyi/test/business/PayTest.java +++ b/ruoyi-admin/src/test/java/com/ruoyi/test/business/PayTest.java @@ -5,6 +5,7 @@ import com.alibaba.fastjson2.JSONObject; import com.alipay.api.AlipayApiException; import com.ruoyi.cai.pay.PayManager; import com.ruoyi.cai.pay.PayOrderInfoDTO; +import com.ruoyi.cai.pay.PayReturnResp; import com.ruoyi.cai.service.PayTrdConfigService; import jdk.nashorn.internal.runtime.regexp.JoniRegExp; import lombok.extern.slf4j.Slf4j; @@ -29,8 +30,8 @@ public class PayTest { dto.setSubject("subject"); dto.setPrice(new BigDecimal("10")); dto.setOrderNo("ORSKALKLASJDKLAS"); - String orderAli = payTrdConfigService.createOrderAli(dto); - log.info(orderAli); + PayReturnResp orderAli = payTrdConfigService.createOrderAli(dto); + log.info(JSON.toJSONString(orderAli)); } @Test diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/dto/app/vo/setting/SettingGoodsVo.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/dto/app/vo/setting/SettingGoodsVo.java index 42d39c3a..406806d4 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/dto/app/vo/setting/SettingGoodsVo.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/dto/app/vo/setting/SettingGoodsVo.java @@ -14,8 +14,6 @@ public class SettingGoodsVo { private Integer hasWechatPay = 1; @Schema(description = "支付宝是否放在第一个 1-是 0-否") private Integer alipayFirst = 1; - @Schema(description = "是否使用第四方支付 1-是 0-否") - private Integer useTrdPay = 1; @Schema(description = "支付设置") private List goods; } diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/pay/PayReturnResp.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/pay/PayReturnResp.java index 9548b59a..44514525 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/pay/PayReturnResp.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/pay/PayReturnResp.java @@ -1,8 +1,25 @@ package com.ruoyi.cai.pay; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; @Data public class PayReturnResp { 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; + } } diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/PayTrdConfigService.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/PayTrdConfigService.java index 6bea2e68..d0249634 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/PayTrdConfigService.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/PayTrdConfigService.java @@ -4,6 +4,7 @@ import com.alibaba.fastjson2.JSONObject; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.cai.domain.PayTrdConfig; import com.ruoyi.cai.pay.PayOrderInfoDTO; +import com.ruoyi.cai.pay.PayReturnResp; /** * 四方支付配置Service接口 @@ -12,7 +13,7 @@ import com.ruoyi.cai.pay.PayOrderInfoDTO; * @date 2024-11-25 */ public interface PayTrdConfigService extends IService { - String createOrderAli(PayOrderInfoDTO dto); + PayReturnResp createOrderAli(PayOrderInfoDTO dto); JSONObject queryOrder(String orderNo, String trdPayType); diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/PayTrdConfigServiceImpl.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/PayTrdConfigServiceImpl.java index d700516b..a43b9212 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/PayTrdConfigServiceImpl.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/PayTrdConfigServiceImpl.java @@ -8,11 +8,13 @@ import com.ruoyi.cai.domain.PayTrdConfig; import com.ruoyi.cai.mapper.PayTrdConfigMapper; import com.ruoyi.cai.pay.PayManager; import com.ruoyi.cai.pay.PayOrderInfoDTO; +import com.ruoyi.cai.pay.PayReturnResp; import com.ruoyi.cai.pay.PayTypeEnum; import com.ruoyi.cai.service.PayTrdConfigService; import com.ruoyi.cai.trdpay.TrdPayManager; import com.ruoyi.cai.trdpay.TrdPayTypeEnum; import com.ruoyi.common.exception.ServiceException; +import com.tencentcloudapi.gme.v20180711.models.AppStatisticsItem; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -36,7 +38,7 @@ public class PayTrdConfigServiceImpl extends ServiceImpl