diff --git a/README.md b/README.md
index dc3f9077..f36a56a5 100644
--- a/README.md
+++ b/README.md
@@ -53,28 +53,19 @@
### 开源版:
> 注:演示账号部分功能权限未开放。
-地址:https://admin.web.daxpay.cn
+地址:https://open.web.daxpay.cn
账号:daxpay
-密码:daxpay123
+密码:123123
### 商业版
-运营端
-https://admin.web.daxpay.cn/
-代理端
-https://agent.web.daxpay.cn/
-商户端
-https://merchant.web.daxpay.cn/
+运营端: https://admin.web.daxpay.cn/ 演示用户: csadmin/123123
-运营端演示用户: csadmin/123123
+代理端: https://agent.web.daxpay.cn/ 演示用户: csdls/123123
-代理端演示用户: csdls/123123
-
-商户端普通商户演示: cspt/123123
-
-商户端特约商户演示: csdl/123123
+商户端: https://merchant.web.daxpay.cn/ 普通商户演示: cspt/123123 特约商户演示: csdl/123123
## 核心技术栈
@@ -89,12 +80,18 @@ https://merchant.web.daxpay.cn/
## 系统截图
### 通道配置
-
+
+### 系统界面
+
+
+
+
### 收银台
-
-
+
+
+
### 聚合码牌
@@ -102,9 +99,13 @@ https://merchant.web.daxpay.cn/
-### 小程序快捷收银
-
+### 小程序(商业版)
+
+
+
+
+
## 🥪 关于我们
diff --git a/_doc/ChangeLog.md b/_doc/ChangeLog.md
deleted file mode 100644
index e69de29b..00000000
diff --git a/_doc/Task.md b/_doc/Task.md
deleted file mode 100644
index e69de29b..00000000
diff --git a/bootx-platform/bootx-platform-common/common-config/src/main/java/cn/bootx/platform/common/config/BootxConfigProperties.java b/bootx-platform/bootx-platform-common/common-config/src/main/java/cn/bootx/platform/common/config/BootxConfigProperties.java
index a7786de0..220e06a6 100644
--- a/bootx-platform/bootx-platform-common/common-config/src/main/java/cn/bootx/platform/common/config/BootxConfigProperties.java
+++ b/bootx-platform/bootx-platform-common/common-config/src/main/java/cn/bootx/platform/common/config/BootxConfigProperties.java
@@ -19,10 +19,6 @@ import java.util.List;
@ConfigurationProperties(prefix = "bootx-platform.config")
public class BootxConfigProperties {
- /** 终端编码 */
- @Deprecated
- private String clientCode = "";
-
/**
* 终端列表, 开启融合模式后才会生效, 表示当前系统集成了哪些终端模块
*/
diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/controller/allocation/AlipayAllocReceiverBindController.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/controller/allocation/AlipayAllocReceiverBindController.java
deleted file mode 100644
index fac2c3d5..00000000
--- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/controller/allocation/AlipayAllocReceiverBindController.java
+++ /dev/null
@@ -1,98 +0,0 @@
-package org.dromara.daxpay.channel.alipay.controller.allocation;
-
-import cn.bootx.platform.core.annotation.OperateLog;
-import cn.bootx.platform.core.annotation.RequestGroup;
-import cn.bootx.platform.core.annotation.RequestPath;
-import cn.bootx.platform.core.rest.Res;
-import cn.bootx.platform.core.rest.param.PageParam;
-import cn.bootx.platform.core.rest.result.PageResult;
-import cn.bootx.platform.core.rest.result.Result;
-import cn.bootx.platform.core.validation.ValidationGroup;
-import org.dromara.daxpay.channel.alipay.param.allocation.AlipayAllocReceiverBindParam;
-import org.dromara.daxpay.channel.alipay.param.allocation.AlipayAllocReceiverBindQuery;
-import org.dromara.daxpay.channel.alipay.result.allocation.AlipayAllocReceiverBindResult;
-import org.dromara.daxpay.channel.alipay.service.allocation.AlipayAllocReceiverBindService;
-import org.dromara.core.trans.anno.TransMethodResult;
-import io.swagger.v3.oas.annotations.Operation;
-import io.swagger.v3.oas.annotations.tags.Tag;
-import jakarta.validation.constraints.NotNull;
-import lombok.RequiredArgsConstructor;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.*;
-
-/**
- * 支付宝分账接收方绑定
- * @author xxm
- * @since 2025/1/27
- */
-@Validated
-@Tag(name = "支付宝分账接收方绑定")
-@RestController
-@RequestGroup(groupCode = "AlipayAllocReceiver", groupName = "支付宝分账接收方", moduleCode = "alipay")
-@RequestMapping("/alipay/allocation/receiver/bind")
-@RequiredArgsConstructor
-public class AlipayAllocReceiverBindController {
-
- private final AlipayAllocReceiverBindService receiverBindService;
-
- @TransMethodResult
- @RequestPath("分页")
- @Operation(summary = "分页")
- @GetMapping("/page")
- public Result> page(PageParam pageParam, AlipayAllocReceiverBindQuery param){
- return Res.ok(receiverBindService.page(pageParam,param));
- }
-
- @TransMethodResult
- @RequestPath("详情")
- @Operation(summary = "详情")
- @GetMapping("/findById")
- public Result findById(@NotNull(message = "主键不可为空") Long id){
- return Res.ok(receiverBindService.findById(id));
- }
-
- @RequestPath("添加")
- @Operation(summary = "添加")
- @PostMapping("/add")
- @OperateLog(title = "添加支付宝分账接收方绑定", businessType = OperateLog.BusinessType.ADD, saveParam = true)
- public Result add(@RequestBody @Validated(ValidationGroup.add.class) AlipayAllocReceiverBindParam param){
- receiverBindService.add(param);
- return Res.ok();
- }
-
- @RequestPath("编辑")
- @Operation(summary = "编辑")
- @PostMapping("/update")
- @OperateLog(title = "编辑支付宝分账接收方绑定", businessType = OperateLog.BusinessType.UPDATE, saveParam = true)
- public Result update(@RequestBody @Validated(ValidationGroup.edit.class) AlipayAllocReceiverBindParam param){
- receiverBindService.update(param);
- return Res.ok();
- }
-
- @RequestPath("绑定")
- @Operation(summary = "绑定")
- @PostMapping("/bind")
- @OperateLog(title = "绑定支付宝分账接收方绑定", businessType = OperateLog.BusinessType.UPDATE, saveParam = true)
- public Result bind(@NotNull(message = "主键不可为空") Long id){
- receiverBindService.bind(id);
- return Res.ok();
- }
-
- @RequestPath("解绑")
- @Operation(summary = "解绑")
- @PostMapping("/unbind")
- @OperateLog(title = "解绑支付宝分账接收方绑定", businessType = OperateLog.BusinessType.UPDATE, saveParam = true)
- public Result unbind(@NotNull(message = "主键不可为空") Long id){
- receiverBindService.unbind(id);
- return Res.ok();
- }
-
- @RequestPath("删除")
- @Operation(summary = "删除")
- @PostMapping("/remove")
- @OperateLog(title = "删除支付宝分账接收方绑定", businessType = OperateLog.BusinessType.DELETE, saveParam = true)
- public Result remove(@NotNull(message = "主键不可为空") Long id){
- receiverBindService.remove(id);
- return Res.ok();
- }
-}
diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/controller/allocation/AlipayAllocReceiverController.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/controller/allocation/AlipayAllocReceiverController.java
deleted file mode 100644
index 245f3c92..00000000
--- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/controller/allocation/AlipayAllocReceiverController.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package org.dromara.daxpay.channel.alipay.controller.allocation;
-
-import cn.bootx.platform.core.annotation.OperateLog;
-import cn.bootx.platform.core.annotation.RequestGroup;
-import cn.bootx.platform.core.annotation.RequestPath;
-import cn.bootx.platform.core.rest.Res;
-import cn.bootx.platform.core.rest.result.Result;
-import org.dromara.daxpay.channel.alipay.param.allocation.AlipayAllocReceiverParam;
-import org.dromara.daxpay.channel.alipay.result.allocation.AlipayAllocReceiverResult;
-import org.dromara.daxpay.channel.alipay.service.allocation.AlipayAllocReceiverService;
-import io.swagger.v3.oas.annotations.Operation;
-import io.swagger.v3.oas.annotations.tags.Tag;
-import jakarta.validation.constraints.NotNull;
-import lombok.RequiredArgsConstructor;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.*;
-
-/**
- * 支付宝分账接收方管理
- * @author xxm
- * @since 2025/1/26
- */
-@Validated
-@Tag(name = "支付宝分账接收方管理")
-@RestController
-@RequestGroup(groupCode = "AlipayAllocReceiver", moduleCode = "alipay")
-@RequestMapping("/alipay/allocation/receiver")
-@RequiredArgsConstructor
-public class AlipayAllocReceiverController {
- private final AlipayAllocReceiverService receiverService;
-
- @RequestPath("分账接收方详情")
- @Operation(summary = "分账接收方详情")
- @GetMapping("/findById")
- public Result findById(@NotNull(message = "主键不可为空") Long id) {
- return Res.ok(receiverService.findById(id));
- }
-
- @RequestPath("新增或修改分账接收方")
- @Operation(summary = "新增或修改分账接收方")
- @PostMapping("/saveOrUpdate")
- @OperateLog(title = "新增或修改支付宝分账接收方", businessType = OperateLog.BusinessType.UPDATE, saveParam = true)
- public Result saveOrUpdate(@RequestBody @Validated AlipayAllocReceiverParam param) {
- receiverService.saveOrUpdate(param);
- return Res.ok();
- }
-}
diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/controller/payment/AlipayCallbackController.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/controller/payment/AlipayCallbackController.java
index 0a28e3c4..09e06476 100644
--- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/controller/payment/AlipayCallbackController.java
+++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/controller/payment/AlipayCallbackController.java
@@ -2,7 +2,7 @@ package org.dromara.daxpay.channel.alipay.controller.payment;
import cn.bootx.platform.core.annotation.IgnoreAuth;
import org.dromara.daxpay.channel.alipay.service.payment.callback.AlipayCallbackService;
-import org.dromara.daxpay.service.service.assist.PaymentAssistService;
+import org.dromara.daxpay.service.pay.service.assist.PaymentAssistService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.servlet.http.HttpServletRequest;
@@ -15,7 +15,7 @@ import org.springframework.web.bind.annotation.RestController;
/**
* 支付宝回调通知
- * TODO 退款和支付回调都是同一个地址进行接收, 退款请求时传入的回调地址不生效,
+ * 退款和支付回调都是同一个地址进行接收, 退款请求时传入的回调地址不生效,
* @author xxm
* @since 2024/9/2
*/
@@ -23,7 +23,7 @@ import org.springframework.web.bind.annotation.RestController;
@IgnoreAuth
@Tag(name = "支付宝回调通知")
@RestController
-@RequestMapping("/unipay/callback/{AppId}")
+@RequestMapping("/unipay/callback/{mchNo}/{AppId}")
@RequiredArgsConstructor
public class AlipayCallbackController {
@@ -32,14 +32,14 @@ public class AlipayCallbackController {
@Operation(summary = "支付宝回调(普通商户)")
@PostMapping("/alipay")
- public String aliPayNotify(@PathVariable("AppId") String appId, HttpServletRequest request) {
- paymentAssistService.initMchAndApp(appId);
+ public String aliPayNotify(@PathVariable("mchNo") String mchNo, @PathVariable("AppId") String appId, HttpServletRequest request) {
+ paymentAssistService.initMchAndApp(mchNo, appId);
return payCallbackService.callbackHandle(request,false);
}
@Operation(summary = "支付宝回调(特约商户)")
@PostMapping("/alipay/isv")
- public String aliPayIsvNotify(@PathVariable("AppId") String appId, HttpServletRequest request) {
- paymentAssistService.initMchAndApp(appId);
+ public String aliPayIsvNotify(@PathVariable("mchNo") String mchNo, @PathVariable("AppId") String appId, HttpServletRequest request) {
+ paymentAssistService.initMchAndApp(mchNo, appId);
return payCallbackService.callbackHandle(request, true);
}
}
diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/controller/payment/AlipayConfigController.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/controller/payment/AlipayConfigController.java
index 360cee6a..25b8976e 100644
--- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/controller/payment/AlipayConfigController.java
+++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/controller/payment/AlipayConfigController.java
@@ -1,5 +1,6 @@
package org.dromara.daxpay.channel.alipay.controller.payment;
+import cn.bootx.platform.core.annotation.ClientCode;
import cn.bootx.platform.core.annotation.OperateLog;
import cn.bootx.platform.core.annotation.RequestGroup;
import cn.bootx.platform.core.annotation.RequestPath;
@@ -7,7 +8,9 @@ import cn.bootx.platform.core.rest.Res;
import cn.bootx.platform.core.rest.result.Result;
import org.dromara.daxpay.channel.alipay.param.config.AlipayConfigParam;
import org.dromara.daxpay.channel.alipay.result.config.AlipayConfigResult;
+import org.dromara.daxpay.channel.alipay.result.config.AlipaySubConfigResult;
import org.dromara.daxpay.channel.alipay.service.payment.config.AlipayConfigService;
+import org.dromara.daxpay.service.common.code.DaxPayCode;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.constraints.NotNull;
@@ -20,6 +23,7 @@ import org.springframework.web.bind.annotation.*;
* @author xxm
* @since 2024/6/26
*/
+@ClientCode({DaxPayCode.Client.ADMIN, DaxPayCode.Client.MERCHANT})
@Validated
@Tag(name = "支付宝支付配置控制器")
@RestController
@@ -35,7 +39,6 @@ public class AlipayConfigController {
public Result findById(@NotNull(message = "ID不可为空") Long id) {
return Res.ok(alipayConfigService.findById(id));
}
-
@RequestPath("新增或更新商户配置")
@Operation(summary = "新增或更新商户配置")
@PostMapping("/saveOrUpdate")
@@ -46,4 +49,5 @@ public class AlipayConfigController {
}
+
}
diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/controller/payment/AlipayNoticeReceiverController.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/controller/payment/AlipayNoticeReceiverController.java
index cb0aa976..0b9a5796 100644
--- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/controller/payment/AlipayNoticeReceiverController.java
+++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/controller/payment/AlipayNoticeReceiverController.java
@@ -2,7 +2,7 @@ package org.dromara.daxpay.channel.alipay.controller.payment;
import cn.bootx.platform.core.annotation.IgnoreAuth;
import org.dromara.daxpay.channel.alipay.service.payment.notice.AlipayNoticeReceiverService;
-import org.dromara.daxpay.service.service.assist.PaymentAssistService;
+import org.dromara.daxpay.service.pay.service.assist.PaymentAssistService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.servlet.http.HttpServletRequest;
@@ -22,7 +22,7 @@ import org.springframework.web.bind.annotation.RestController;
@IgnoreAuth
@Tag(name = "支付宝消息通知")
@RestController
-@RequestMapping("/unipay/notice/{AppId}")
+@RequestMapping("/unipay/notice/{mchNo}/{AppId}")
@RequiredArgsConstructor
public class AlipayNoticeReceiverController {
@@ -32,14 +32,14 @@ public class AlipayNoticeReceiverController {
@Operation(summary = "支付宝消息通知(普通商户)")
@PostMapping("/alipay")
- public String aliPay(@PathVariable("AppId") String appId, HttpServletRequest request) {
- paymentAssistService.initMchAndApp(appId);
+ public String aliPay(@PathVariable("mchNo") String mchNo, @PathVariable("AppId") String appId, HttpServletRequest request) {
+ paymentAssistService.initMchAndApp(mchNo, appId);
return aliPayNoticeReceiverService.noticeReceiver(request,false);
}
@Operation(summary = "支付宝消息通知(特约商户)")
@PostMapping("/alipay/isv")
- public String aliPayIsv(@PathVariable("AppId") String appId, HttpServletRequest request) {
- paymentAssistService.initMchAndApp(appId);
+ public String aliPayIsv(@PathVariable("mchNo") String mchNo, @PathVariable("AppId") String appId, HttpServletRequest request) {
+ paymentAssistService.initMchAndApp(mchNo, appId);
return aliPayNoticeReceiverService.noticeReceiver(request,true);
}
}
diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/controller/payment/AlipayRedirectUrlController.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/controller/payment/AlipayRedirectUrlController.java
index dac02483..035c4aec 100644
--- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/controller/payment/AlipayRedirectUrlController.java
+++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/controller/payment/AlipayRedirectUrlController.java
@@ -2,7 +2,7 @@ package org.dromara.daxpay.channel.alipay.controller.payment;
import cn.bootx.platform.core.annotation.IgnoreAuth;
import org.dromara.daxpay.channel.alipay.service.payment.redirect.AlipayRedirectUrlService;
-import org.dromara.daxpay.service.service.assist.PaymentAssistService;
+import org.dromara.daxpay.service.pay.service.assist.PaymentAssistService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.servlet.http.HttpServletRequest;
@@ -23,7 +23,7 @@ import org.springframework.web.servlet.ModelAndView;
@IgnoreAuth
@Tag(name = "支付宝同步通知")
@RestController
-@RequestMapping("/unipay/return/{AppId}")
+@RequestMapping("/unipay/return/{mchNo}/{AppId}")
@RequiredArgsConstructor
public class AlipayRedirectUrlController {
private final AlipayRedirectUrlService redirectUrlService;
@@ -31,15 +31,15 @@ public class AlipayRedirectUrlController {
@Operation(summary = "支付宝同步跳转通知")
@GetMapping("/alipay")
- public ModelAndView alipay(@PathVariable("AppId") String appId, HttpServletRequest request){
- paymentAssistService.initMchAndApp(appId);
+ public ModelAndView alipay(@PathVariable("mchNo") String mchNo, @PathVariable("AppId") String appId, HttpServletRequest request){
+ paymentAssistService.initMchAndApp(mchNo, appId);
String redirect = redirectUrlService.redirect(request,false);
return new ModelAndView("redirect:"+redirect);
}
@Operation(summary = "支付宝同步跳转通知")
@GetMapping("/alipay/isv")
- public ModelAndView alipayIsv(@PathVariable("AppId") String appId, HttpServletRequest request){
- paymentAssistService.initMchAndApp(appId);
+ public ModelAndView alipayIsv(@PathVariable("mchNo") String mchNo, @PathVariable("AppId") String appId, HttpServletRequest request){
+ paymentAssistService.initMchAndApp(mchNo, appId);
String redirect = redirectUrlService.redirect(request, true);
return new ModelAndView("redirect:"+redirect);
}
diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/AlipayAllocReceiverBindConvert.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/AlipayAllocReceiverBindConvert.java
deleted file mode 100644
index a15e5d51..00000000
--- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/AlipayAllocReceiverBindConvert.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package org.dromara.daxpay.channel.alipay.convert;
-
-import org.dromara.daxpay.channel.alipay.entity.allocation.AlipayAllocReceiverBind;
-import org.dromara.daxpay.channel.alipay.param.allocation.AlipayAllocReceiverBindParam;
-import org.dromara.daxpay.channel.alipay.result.allocation.AlipayAllocReceiverBindResult;
-import org.mapstruct.Mapper;
-import org.mapstruct.factory.Mappers;
-
-/**
- *
- * @author xxm
- * @since 2025/1/27
- */
-@Mapper
-public interface AlipayAllocReceiverBindConvert {
- AlipayAllocReceiverBindConvert CONVERT = Mappers.getMapper(AlipayAllocReceiverBindConvert.class);
-
- AlipayAllocReceiverBindResult toResult(AlipayAllocReceiverBind alipayAllocReceiverBind);
-
- AlipayAllocReceiverBind toEntity(AlipayAllocReceiverBindParam param);
-}
diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/AlipayAllocReceiverConvert.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/AlipayAllocReceiverConvert.java
deleted file mode 100644
index cf4178ad..00000000
--- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/AlipayAllocReceiverConvert.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package org.dromara.daxpay.channel.alipay.convert;
-
-import org.dromara.daxpay.channel.alipay.entity.allocation.AlipayAllocReceiver;
-import org.dromara.daxpay.channel.alipay.param.allocation.AlipayAllocReceiverParam;
-import org.dromara.daxpay.channel.alipay.result.allocation.AlipayAllocReceiverResult;
-import org.mapstruct.Mapper;
-import org.mapstruct.factory.Mappers;
-
-/**
- *
- * @author xxm
- * @since 2025/1/26
- */
-@Mapper
-public interface AlipayAllocReceiverConvert {
- AlipayAllocReceiverConvert CONVERT = Mappers.getMapper(AlipayAllocReceiverConvert.class);
-
- AlipayAllocReceiver copy(AlipayAllocReceiver aliAllocReceiver);
-
- AlipayAllocReceiver toEntity(AlipayAllocReceiverParam alipayAllocReceiverParam);
-
- AlipayAllocReceiverResult toResult(AlipayAllocReceiver aliAllocReceiver);
-}
diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/AlipayMccConstConvert.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/AlipayMccConstConvert.java
new file mode 100644
index 00000000..8493aa25
--- /dev/null
+++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/AlipayMccConstConvert.java
@@ -0,0 +1,19 @@
+package org.dromara.daxpay.channel.alipay.convert;
+
+import org.dromara.daxpay.channel.alipay.entity.assist.AlipayMccConst;
+import org.dromara.daxpay.channel.alipay.result.assist.AlipayMccConstResult;
+import org.mapstruct.Mapper;
+
+import static org.mapstruct.factory.Mappers.getMapper;
+
+/**
+ *
+ * @author xxm
+ * @since 2024/11/11
+ */
+@Mapper
+public interface AlipayMccConstConvert {
+ AlipayMccConstConvert INSTANCE = getMapper(AlipayMccConstConvert.class);
+
+ AlipayMccConstResult toResult(AlipayMccConst entity);
+}
diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/AlipaySubConfigConvert.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/AlipaySubConfigConvert.java
new file mode 100644
index 00000000..ec6d0f37
--- /dev/null
+++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/AlipaySubConfigConvert.java
@@ -0,0 +1,23 @@
+package org.dromara.daxpay.channel.alipay.convert;
+
+import org.dromara.daxpay.channel.alipay.entity.config.AlipaySubConfig;
+import org.dromara.daxpay.channel.alipay.param.config.AlipaySubConfigParam;
+import org.dromara.daxpay.channel.alipay.result.config.AlipaySubConfigResult;
+import org.mapstruct.Mapper;
+import org.mapstruct.factory.Mappers;
+
+/**
+ *
+ * @author xxm
+ * @since 2024/6/25
+ */
+@Mapper
+public interface AlipaySubConfigConvert {
+ AlipaySubConfigConvert CONVERT = Mappers.getMapper(AlipaySubConfigConvert.class);
+
+ AlipaySubConfigResult toResult(AlipaySubConfig in);
+
+ AlipaySubConfig copy(AlipaySubConfig in);
+
+ AlipaySubConfig toEntity(AlipaySubConfigParam in);
+}
diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/dao/allocation/AlipayAllocReceiverBindManager.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/dao/allocation/AlipayAllocReceiverBindManager.java
deleted file mode 100644
index c47580d4..00000000
--- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/dao/allocation/AlipayAllocReceiverBindManager.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package org.dromara.daxpay.channel.alipay.dao.allocation;
-
-import cn.bootx.platform.common.mybatisplus.impl.BaseManager;
-import cn.bootx.platform.common.mybatisplus.query.generator.QueryGenerator;
-import cn.bootx.platform.common.mybatisplus.util.MpUtil;
-import cn.bootx.platform.core.rest.param.PageParam;
-import org.dromara.daxpay.channel.alipay.entity.allocation.AlipayAllocReceiverBind;
-import org.dromara.daxpay.channel.alipay.param.allocation.AlipayAllocReceiverBindQuery;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.stereotype.Service;
-
-/**
- *
- * @author xxm
- * @since 2025/1/27
- */
-@Slf4j
-@Service
-@RequiredArgsConstructor
-public class AlipayAllocReceiverBindManager extends BaseManager {
-
-
- /**
- * 分页
- */
- public Page page(PageParam pageParam, AlipayAllocReceiverBindQuery query) {
- var mpPage = MpUtil.getMpPage(pageParam,AlipayAllocReceiverBind.class);
- QueryWrapper generator = QueryGenerator.generator(query);
- return this.page(mpPage, generator);
- }
-
-}
diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/dao/allocation/AlipayAllocReceiverBindMapper.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/dao/allocation/AlipayAllocReceiverBindMapper.java
deleted file mode 100644
index 8eb2ef8e..00000000
--- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/dao/allocation/AlipayAllocReceiverBindMapper.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package org.dromara.daxpay.channel.alipay.dao.allocation;
-
-import org.dromara.daxpay.channel.alipay.entity.allocation.AlipayAllocReceiverBind;
-import com.github.yulichang.base.MPJBaseMapper;
-import org.apache.ibatis.annotations.Mapper;
-
-/**
- *
- * @author xxm
- * @since 2025/1/27
- */
-@Mapper
-public interface AlipayAllocReceiverBindMapper extends MPJBaseMapper {
-}
diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/dao/assist/AlipayMccConstManager.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/dao/assist/AlipayMccConstManager.java
new file mode 100644
index 00000000..ed77985f
--- /dev/null
+++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/dao/assist/AlipayMccConstManager.java
@@ -0,0 +1,18 @@
+package org.dromara.daxpay.channel.alipay.dao.assist;
+
+import cn.bootx.platform.common.mybatisplus.impl.BaseManager;
+import org.dromara.daxpay.channel.alipay.entity.assist.AlipayMccConst;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Repository;
+
+/**
+ * 支付宝经营类目
+ * @author xxm
+ * @since 2024/11/11
+ */
+@Slf4j
+@Repository
+@RequiredArgsConstructor
+public class AlipayMccConstManager extends BaseManager {
+}
diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/dao/assist/AlipayMccConstMapper.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/dao/assist/AlipayMccConstMapper.java
new file mode 100644
index 00000000..be7ac0a5
--- /dev/null
+++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/dao/assist/AlipayMccConstMapper.java
@@ -0,0 +1,14 @@
+package org.dromara.daxpay.channel.alipay.dao.assist;
+
+import org.dromara.daxpay.channel.alipay.entity.assist.AlipayMccConst;
+import com.github.yulichang.base.MPJBaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ *
+ * @author xxm
+ * @since 2024/11/11
+ */
+@Mapper
+public interface AlipayMccConstMapper extends MPJBaseMapper {
+}
diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/entity/allocation/AlipayAllocReceiver.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/entity/allocation/AlipayAllocReceiver.java
deleted file mode 100644
index 40262560..00000000
--- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/entity/allocation/AlipayAllocReceiver.java
+++ /dev/null
@@ -1,88 +0,0 @@
-package org.dromara.daxpay.channel.alipay.entity.allocation;
-
-import cn.bootx.platform.common.mybatisplus.function.ToResult;
-import cn.bootx.platform.core.util.JsonUtil;
-import cn.hutool.json.JSONUtil;
-import org.dromara.daxpay.channel.alipay.convert.AlipayAllocReceiverConvert;
-import org.dromara.daxpay.channel.alipay.result.allocation.AlipayAllocReceiverResult;
-import org.dromara.daxpay.core.enums.AllocReceiverTypeEnum;
-import org.dromara.daxpay.core.enums.ChannelEnum;
-import org.dromara.daxpay.service.entity.allocation.receiver.AllocReceiver;
-import lombok.Data;
-import lombok.experimental.Accessors;
-
-/**
- * 支付宝分账接收方
- * @author xxm
- * @since 2025/1/25
- */
-@Data
-@Accessors(chain = true)
-public class AlipayAllocReceiver implements ToResult {
-
- /** 主键 */
- private Long id;
-
- /** 分账接收方编号, 需要保证唯一 */
- private String receiverNo;
-
- /** 接收方名称 */
- private String receiverName;
-
- /** 接收方账号 */
- private String receiverAccount;
-
- /**
- * 接收方类型
- * @see AllocReceiverTypeEnum
- */
- private String receiverType;
-
- /** 分账关系类型 */
- private String relationType;
-
- /** 分账关系名称 */
- private String relationName;
-
- /** 商户AppId */
- private String appId;
-
-
- /**
- * 转换为通用接收方
- */
- public AllocReceiver toReceiver(boolean isv) {
- var receiver = new AllocReceiver();
- receiver.setId(this.getId());
- receiver.setAppId(this.getAppId());
- receiver.setReceiverType(this.getReceiverType());
- receiver.setReceiverNo(this.getReceiverNo());
- receiver.setReceiverName(this.getReceiverName());
- receiver.setReceiverAccount(this.getReceiverAccount());
- receiver.setChannel(isv?ChannelEnum.ALIPAY_ISV.getCode():ChannelEnum.ALIPAY.getCode());
- var copy = AlipayAllocReceiverConvert.CONVERT.copy(this);
- // 清空不需要序列化的字段
- copy.setId(null).setReceiverNo(null).setReceiverName(null).setReceiverType(null).setReceiverAccount(null);
- String jsonStr = JsonUtil.toJsonStr(copy);
- receiver.setExt(jsonStr);
- return receiver;
- }
-
- /**
- * 转换为通道接收方
- */
- public static AlipayAllocReceiver convertChannel(AllocReceiver receiver) {
- var leshuaAllocReceiver = JSONUtil.toBean(receiver.getExt(), AlipayAllocReceiver.class);
- leshuaAllocReceiver.setId(receiver.getId())
- .setReceiverNo(receiver.getReceiverNo())
- .setReceiverName(receiver.getReceiverName())
- .setReceiverType(receiver.getReceiverType())
- .setReceiverAccount(receiver.getReceiverAccount());
- return leshuaAllocReceiver;
- }
-
- @Override
- public AlipayAllocReceiverResult toResult() {
- return AlipayAllocReceiverConvert.CONVERT.toResult(this);
- }
-}
diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/entity/allocation/AlipayAllocReceiverBind.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/entity/allocation/AlipayAllocReceiverBind.java
deleted file mode 100644
index 3c83854a..00000000
--- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/entity/allocation/AlipayAllocReceiverBind.java
+++ /dev/null
@@ -1,67 +0,0 @@
-package org.dromara.daxpay.channel.alipay.entity.allocation;
-
-import cn.bootx.platform.common.mybatisplus.function.ToResult;
-import org.dromara.daxpay.channel.alipay.convert.AlipayAllocReceiverBindConvert;
-import org.dromara.daxpay.channel.alipay.param.allocation.AlipayAllocReceiverBindParam;
-import org.dromara.daxpay.channel.alipay.result.allocation.AlipayAllocReceiverBindResult;
-import org.dromara.daxpay.core.enums.AllocReceiverTypeEnum;
-import org.dromara.daxpay.service.common.entity.MchAppBaseEntity;
-import com.baomidou.mybatisplus.annotation.FieldStrategy;
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableName;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.experimental.Accessors;
-
-/**
- * 支付宝分账接收方绑定
- * @author xxm
- * @since 2025/1/27
- */
-@EqualsAndHashCode(callSuper = true)
-@Data
-@Accessors(chain = true)
-@TableName("pay_alipay_alloc_receiver_bind")
-public class AlipayAllocReceiverBind extends MchAppBaseEntity implements ToResult {
-
- /**
- * 接收方类型
- * @see AllocReceiverTypeEnum
- */
- private String receiverType;
-
- /** 接收方账号 */
- private String receiverAccount;
-
- /** 接收方名称 */
- private String receiverName;
-
- /** 分账关系类型 */
- private String relationType;
-
- /** 分账关系名称 */
- private String relationName;
-
- /** 是否服务商模式 */
- private boolean isv;
-
- /** 是否绑定 */
- private boolean bind;
-
- /** 错误提示 */
- @TableField(updateStrategy = FieldStrategy.ALWAYS)
- private String errorMsg;
-
- /**
- * 初始化
- */
- public static AlipayAllocReceiverBind init(AlipayAllocReceiverBindParam param){
- return AlipayAllocReceiverBindConvert.CONVERT.toEntity(param);
- }
-
-
- @Override
- public AlipayAllocReceiverBindResult toResult() {
- return AlipayAllocReceiverBindConvert.CONVERT.toResult(this);
- }
-}
diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/entity/assist/AlipayMccConst.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/entity/assist/AlipayMccConst.java
new file mode 100644
index 00000000..634d9c90
--- /dev/null
+++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/entity/assist/AlipayMccConst.java
@@ -0,0 +1,38 @@
+package org.dromara.daxpay.channel.alipay.entity.assist;
+
+import cn.bootx.platform.common.mybatisplus.function.ToResult;
+import org.dromara.daxpay.channel.alipay.convert.AlipayMccConstConvert;
+import org.dromara.daxpay.channel.alipay.result.assist.AlipayMccConstResult;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+/**
+ * 支付宝经营类目
+ * @author xxm
+ * @since 2024/11/11
+ */
+@Data
+@Accessors(chain = true)
+@TableName("pay_alipay_mcc_const")
+public class AlipayMccConst implements ToResult {
+
+ /** 类目 */
+ @TableId
+ private String code;
+
+ /** 上级类目 */
+ private String parentCode;
+
+ /** 类目名称 */
+ private String name;
+
+ /** 是否需要特殊资质 */
+ private Boolean special;
+
+ @Override
+ public AlipayMccConstResult toResult() {
+ return AlipayMccConstConvert.INSTANCE.toResult(this);
+ }
+}
diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/entity/config/AliPayConfig.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/entity/config/AliPayConfig.java
index 370f23a0..e6aa430a 100644
--- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/entity/config/AliPayConfig.java
+++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/entity/config/AliPayConfig.java
@@ -1,13 +1,12 @@
package org.dromara.daxpay.channel.alipay.entity.config;
+import cn.bootx.platform.common.jackson.util.JacksonUtil;
import cn.bootx.platform.common.mybatisplus.function.ToResult;
-import cn.bootx.platform.core.util.JsonUtil;
-import cn.hutool.json.JSONUtil;
import org.dromara.daxpay.channel.alipay.code.AlipayCode;
import org.dromara.daxpay.channel.alipay.convert.AlipayConfigConvert;
import org.dromara.daxpay.channel.alipay.result.config.AlipayConfigResult;
import org.dromara.daxpay.core.enums.ChannelEnum;
-import org.dromara.daxpay.service.entity.config.ChannelConfig;
+import org.dromara.daxpay.service.pay.entity.config.ChannelConfig;
import lombok.Data;
import lombok.experimental.Accessors;
@@ -69,6 +68,9 @@ public class AliPayConfig implements ToResult {
/** 是否沙箱环境 */
private boolean sandbox;
+ /** 商户号 */
+ private String mchNo;
+
/** 商户AppId */
private String appId;
@@ -84,12 +86,13 @@ public class AliPayConfig implements ToResult {
channelConfig.setId(this.getId());
channelConfig.setOutAppId(this.getAliAppId());
channelConfig.setAppId(this.getAppId());
+ channelConfig.setMchNo(this.getMchNo());
channelConfig.setEnable(this.getEnable());
channelConfig.setChannel(this.isv?ChannelEnum.ALIPAY_ISV.getCode():ChannelEnum.ALIPAY.getCode());
var copy = AlipayConfigConvert.CONVERT.copy(this);
// 清空不需要序列化的字段
- copy.setId(null).setAppId(null).setEnable(null).setAliAppId(null);
- String jsonStr = JsonUtil.toJsonStr(copy);
+ copy.setId(null).setAppId(null).setEnable(null).setAliAppId(null).setMchNo(null);
+ String jsonStr = JacksonUtil.toJson(copy);
channelConfig.setExt(jsonStr);
return channelConfig;
}
@@ -98,10 +101,11 @@ public class AliPayConfig implements ToResult {
* 从通道配置转换为支付宝配置
*/
public static AliPayConfig convertConfig(ChannelConfig channelConfig) {
- var config = JSONUtil.toBean(channelConfig.getExt(), AliPayConfig.class);
+ var config = JacksonUtil.toBean(channelConfig.getExt(), AliPayConfig.class);
config.setId(channelConfig.getId())
.setAliAppId(channelConfig.getOutAppId())
.setAppId(channelConfig.getAppId())
+ .setMchNo(channelConfig.getMchNo())
.setEnable(channelConfig.isEnable());
return config;
}
diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/entity/config/AlipaySubConfig.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/entity/config/AlipaySubConfig.java
new file mode 100644
index 00000000..5480880d
--- /dev/null
+++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/entity/config/AlipaySubConfig.java
@@ -0,0 +1,78 @@
+package org.dromara.daxpay.channel.alipay.entity.config;
+
+import cn.bootx.platform.common.jackson.util.JacksonUtil;
+import cn.bootx.platform.common.mybatisplus.function.ToResult;
+import lombok.Data;
+import lombok.experimental.Accessors;
+import org.dromara.daxpay.channel.alipay.convert.AlipaySubConfigConvert;
+import org.dromara.daxpay.channel.alipay.result.config.AlipaySubConfigResult;
+import org.dromara.daxpay.core.enums.ChannelEnum;
+import org.dromara.daxpay.service.pay.entity.config.ChannelConfig;
+
+/**
+ * 支付宝特约商户配置
+ * @author xxm
+ * @since 2024/6/25
+ */
+@Data
+@Accessors(chain = true)
+public class AlipaySubConfig implements ToResult {
+
+ /** 主键 */
+ private Long id;
+
+ /** 支付宝特约商户Token */
+ private String appAuthToken;
+
+ /** 是否启用 */
+ private Boolean enable;
+
+ /** 商户号 */
+ private String mchNo;
+
+ /** 商户AppId */
+ private String appId;
+
+ /**
+ * 支付宝商家唯一识别码
+ * 是商家与支付宝签约后,商家获得的支付宝商家唯一识别码,以 2088 开头的 16 位数字组成,在开放平台中账户中心获取
+ */
+ private String alipayUserId;
+
+ /**
+ * 转换为通道配置
+ */
+ public ChannelConfig toChannelConfig() {
+ ChannelConfig channelConfig = new ChannelConfig();
+ channelConfig.setId(this.getId());
+ channelConfig.setAppId(this.getAppId());
+ channelConfig.setMchNo(this.getMchNo());
+ channelConfig.setEnable(this.getEnable());
+ channelConfig.setSub(true);
+ channelConfig.setChannel(ChannelEnum.ALIPAY_ISV.getCode());
+ AlipaySubConfig copy = AlipaySubConfigConvert.CONVERT.copy(this);
+ // 清空不需要序列化的字段
+ copy.setId(null).setMchNo(null).setAppId(null).setEnable(null);
+ String jsonStr = JacksonUtil.toJson(copy);
+ channelConfig.setExt(jsonStr);
+ channelConfig.setSub(true);
+ return channelConfig;
+ }
+
+ /**
+ * 从通道配置转换为支付宝配置
+ */
+ public static AlipaySubConfig convertConfig(ChannelConfig channelConfig) {
+ AlipaySubConfig config = JacksonUtil.toBean(channelConfig.getExt(), AlipaySubConfig.class);
+ config.setId(channelConfig.getId())
+ .setAppId(channelConfig.getAppId())
+ .setMchNo(channelConfig.getMchNo())
+ .setEnable(channelConfig.isEnable());
+ return config;
+ }
+
+ @Override
+ public AlipaySubConfigResult toResult() {
+ return AlipaySubConfigConvert.CONVERT.toResult(this);
+ }
+}
diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/enums/AlipayApplyTypeEnum.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/enums/AlipayApplyTypeEnum.java
new file mode 100644
index 00000000..7e6d91c1
--- /dev/null
+++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/enums/AlipayApplyTypeEnum.java
@@ -0,0 +1,20 @@
+package org.dromara.daxpay.channel.alipay.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 签约类型
+ * @author xxm
+ * @since 2024/11/5
+ */
+@Getter
+@AllArgsConstructor
+public enum AlipayApplyTypeEnum {
+ APP("app", "APP"),
+ FACE_TO_FACE("face_to_face","当面付"),
+ OTHER("other","其他");
+
+ private final String code;
+ private final String name;
+}
diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/enums/AlipayBatchStatusEnum.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/enums/AlipayBatchStatusEnum.java
new file mode 100644
index 00000000..c35d7c2f
--- /dev/null
+++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/enums/AlipayBatchStatusEnum.java
@@ -0,0 +1,22 @@
+package org.dromara.daxpay.channel.alipay.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 代商户操作事务状态
+ * @author xxm
+ * @since 2024/11/5
+ */
+@Getter
+@AllArgsConstructor
+public enum AlipayBatchStatusEnum {
+
+ /** 初始状态 */
+ INIT("init", "初始状态"),
+ /**提交状态 */
+ SUBMIT("submit","提交状态"),
+ ;
+ private final String code;
+ private final String name;
+}
diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/enums/AlipayOtherContractEnum.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/enums/AlipayOtherContractEnum.java
new file mode 100644
index 00000000..7a7021ef
--- /dev/null
+++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/enums/AlipayOtherContractEnum.java
@@ -0,0 +1,43 @@
+package org.dromara.daxpay.channel.alipay.enums;
+
+import cn.bootx.platform.core.exception.DataNotExistException;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+import java.util.Arrays;
+
+/**
+ *
+ * @author xxm
+ * @since 2024/11/6
+ */
+@Getter
+@AllArgsConstructor
+public enum AlipayOtherContractEnum {
+
+ /** JSAPI 支付 */
+ JSAPI("jsapi", "JSAPI","I1080300001000060370"),
+ /** 预授权支付 */
+ PAY_AUTH("pay_auth", "预授权支付","I1080300001000065324"),
+ /** 手机网站支付 */
+ WAP("wap", "手机网站支付", "QUICK_WAP_WAY"),
+ /** 电脑网站支付 */
+ WEB("web", "电脑网站支付", "FAST_INSTANT_TRADE_PAY"),
+ /** 订单码支付 */
+ ORDER_CODE("order_code", "订单码支付", "I1080300001000068149"),
+ /** 商家分账 */
+ ALLOCATION("allocation", "商家分账", "DOMESTIC_ALLOC"),
+ ;
+
+ private final String code;
+ private final String name;
+ /** 产品码 */
+ private final String productCode;
+
+ public static AlipayOtherContractEnum findByCode(String code){
+ return Arrays.stream(values())
+ .filter(item -> item.getCode().equals(code))
+ .findFirst()
+ .orElseThrow(() -> new DataNotExistException("该产品类型不存在"));
+ }
+}
diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/param/allocation/AlipayAllocReceiverBindParam.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/param/allocation/AlipayAllocReceiverBindParam.java
deleted file mode 100644
index f3c46dfb..00000000
--- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/param/allocation/AlipayAllocReceiverBindParam.java
+++ /dev/null
@@ -1,61 +0,0 @@
-package org.dromara.daxpay.channel.alipay.param.allocation;
-
-import cn.bootx.platform.core.validation.ValidationGroup;
-import org.dromara.daxpay.core.enums.AllocReceiverTypeEnum;
-import io.swagger.v3.oas.annotations.media.Schema;
-import jakarta.validation.constraints.NotBlank;
-import jakarta.validation.constraints.NotNull;
-import lombok.Data;
-import lombok.experimental.Accessors;
-
-/**
- * 支付宝分账接收方绑定
- * @author xxm
- * @since 2025/1/27
- */
-@Data
-@Accessors(chain = true)
-@Schema(title = "支付宝分账接收方绑定")
-public class AlipayAllocReceiverBindParam {
-
- /** 主键 */
- @NotNull(message = "id不能为空", groups = ValidationGroup.edit.class)
- @Schema(description = "主键")
- private Long id;
-
- /** 接收方账号 */
- @NotBlank(message = "接收方账号不能为空")
- @Schema(description = "接收方账号")
- private String receiverAccount;
-
- /**
- * 接收方类型
- * @see AllocReceiverTypeEnum
- */
- @NotBlank(message = "接收方类型不能为空")
- @Schema(description = "接收方类型")
- private String receiverType;
-
- /** 接收方名称 */
- @Schema(description = "接收方名称")
- private String receiverName;
-
- /** 分账关系类型 */
- @Schema(description = "分账关系类型")
- private String relationType;
-
- /** 分账关系名称 */
- @Schema(description = "分账关系名称")
- private String relationName;
-
- /** 是否服务商模式 */
- @Schema(description = "是否服务商模式")
- private boolean isv;
-
- /** 商户AppId */
- @NotBlank(message = "商户AppId不能为空")
- @Schema(description = "商户AppId")
- private String appId;
-
-
-}
diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/param/allocation/AlipayAllocReceiverBindQuery.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/param/allocation/AlipayAllocReceiverBindQuery.java
deleted file mode 100644
index d2d35728..00000000
--- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/param/allocation/AlipayAllocReceiverBindQuery.java
+++ /dev/null
@@ -1,57 +0,0 @@
-package org.dromara.daxpay.channel.alipay.param.allocation;
-
-import cn.bootx.platform.core.annotation.QueryParam;
-import org.dromara.daxpay.core.enums.AllocReceiverTypeEnum;
-import org.dromara.daxpay.service.common.param.MchQuery;
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.experimental.Accessors;
-
-/**
- * 支付宝分账接收方绑定查询
- * @author xxm
- * @since 2025/2/19
- */
-@EqualsAndHashCode(callSuper = true)
-@Data
-@Accessors(chain = true)
-@Schema(title = "支付宝分账接收方绑定查询")
-public class AlipayAllocReceiverBindQuery extends MchQuery {
-
- /**
- * 接收方类型
- * @see AllocReceiverTypeEnum
- */
- @QueryParam(type = QueryParam.CompareTypeEnum.EQ)
- @Schema(description = "接收方类型")
- private String receiverType;
-
- /** 接收方账号 */
- @Schema(description = "接收方账号")
- private String receiverAccount;
-
- /** 接收方名称 */
- @Schema(description = "接收方名称")
- private String receiverName;
-
- /** 分账关系类型 */
- @QueryParam(type = QueryParam.CompareTypeEnum.EQ)
- @Schema(description = "分账关系类型")
- private String relationType;
-
- /** 分账关系名称 */
- @Schema(description = "分账关系名称")
- private String relationName;
-
- /** 是否服务商模式 */
- @QueryParam(type = QueryParam.CompareTypeEnum.EQ)
- @Schema(description = "是否服务商模式")
- private Boolean isv;
-
- /** 是否绑定 */
- @QueryParam(type = QueryParam.CompareTypeEnum.EQ)
- @Schema(description = "是否绑定")
- private Boolean bind;
-
-}
diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/param/allocation/AlipayAllocReceiverParam.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/param/allocation/AlipayAllocReceiverParam.java
deleted file mode 100644
index d2c9667f..00000000
--- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/param/allocation/AlipayAllocReceiverParam.java
+++ /dev/null
@@ -1,61 +0,0 @@
-package org.dromara.daxpay.channel.alipay.param.allocation;
-
-import org.dromara.daxpay.core.enums.AllocReceiverTypeEnum;
-import org.dromara.daxpay.core.enums.AllocRelationTypeEnum;
-import io.swagger.v3.oas.annotations.media.Schema;
-import jakarta.validation.constraints.NotBlank;
-import lombok.Data;
-import lombok.experimental.Accessors;
-
-/**
- * 支付宝分账接收方
- * @author xxm
- * @since 2025/1/26
- */
-@Data
-@Accessors(chain = true)
-@Schema(title = "支付宝分账接收方")
-public class AlipayAllocReceiverParam {
-
- /** 主键 */
- @Schema(description = "主键")
- private Long id;
-
- /** 接收方名称 */
- @NotBlank(message = "接收方名称不能为空")
- @Schema(description = "接收方名称")
- private String receiverName;
-
- /** 接收方账号 */
- @NotBlank(message = "接收方账号不能为空")
- @Schema(description = "接收方账号")
- private String receiverAccount;
-
- /**
- * 接收方类型
- * @see AllocReceiverTypeEnum
- */
- @NotBlank(message = "接收方类型不能为空")
- @Schema(description = "接收方类型")
- private String receiverType;
-
- /**
- * 分账关系类型
- * @see AllocRelationTypeEnum
- */
- @Schema(description = "分账关系类型")
- private String relationType;
-
- /** 分账关系名称 */
- @Schema(description = "分账关系名称")
- private String relationName;
-
- /** 是否为服务商 */
- @Schema(description = "是否为服务商")
- private boolean isv;
-
- /** 商户AppId */
- @NotBlank(message = "商户AppId不能为空")
- @Schema(description = "商户AppId")
- private String appId;
-}
diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/param/config/AlipayConfigParam.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/param/config/AlipayConfigParam.java
index 80419fd7..4c5ae341 100644
--- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/param/config/AlipayConfigParam.java
+++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/param/config/AlipayConfigParam.java
@@ -82,6 +82,10 @@ public class AlipayConfigParam {
@Schema(description = "是否沙箱环境")
private boolean sandbox;
+ /** 商户号 */
+ @NotBlank(message = "商户号不可为空")
+ @Schema(description = "商户号")
+ private String mchNo;
/** 商户AppId */
@NotBlank(message = "商户AppId不可为空")
diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/param/config/AlipayIsvConfigParam.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/param/config/AlipayIsvConfigParam.java
new file mode 100644
index 00000000..0bb2ee25
--- /dev/null
+++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/param/config/AlipayIsvConfigParam.java
@@ -0,0 +1,79 @@
+package org.dromara.daxpay.channel.alipay.param.config;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+
+/**
+ * 支付宝服务商配置参数
+ * @author xxm
+ * @since 2024/10/31
+ */
+@Data
+@Accessors(chain = true)
+@Schema(title = "支付宝服务商配置参数")
+public class AlipayIsvConfigParam {
+
+ /** 主键 */
+ @Schema(description = "主键")
+ private Long id;
+
+ /** 支付宝商户appId */
+ @NotBlank(message = "支付宝AppId不可为空")
+ @Schema(description = "支付宝商户appId")
+ private String aliAppId;
+
+ /** 是否启用 */
+ @Schema(description = "是否启用")
+ @NotNull(message = "是否启用不可为空")
+ private Boolean enable;
+
+ /**
+ * 认证类型 证书/公钥
+ * @see AlipayCode.AuthType
+ */
+ @Schema(description = "认证类型")
+ @NotBlank(message = "认证类型不可为空")
+ private String authType;
+
+ /** 签名类型 RSA2 */
+ @Schema(description = "签名类型")
+ @NotBlank(message = "签名类型不可为空")
+ public String signType;
+
+ /**
+ * 是商家与支付宝签约后,商家获得的支付宝商家唯一识别码,以 2088 开头的 16 位数字组成,在开放平台中账户中心获取
+ */
+ @Schema(description = "支付宝商家唯一识别码")
+ private String alipayUserId;
+
+ /** 支付宝公钥 */
+ @Schema(description = "支付宝公钥")
+ public String alipayPublicKey;
+
+ /** 私钥 */
+ @Schema(description = "私钥")
+ private String privateKey;
+
+ /** 应用公钥证书 */
+ @Schema(description = "应用公钥证书")
+ private String appCert;
+
+ /** 支付宝公钥证书 */
+ @Schema(description = "支付宝公钥证书")
+ private String alipayCert;
+
+ /** 支付宝CA根证书 */
+ @Schema(description = "支付宝CA根证书")
+ private String alipayRootCert;
+
+ /** 是否沙箱环境 */
+ @Schema(description = "是否沙箱环境")
+ private boolean sandbox;
+
+
+}
+
diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/param/config/AlipaySubConfigParam.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/param/config/AlipaySubConfigParam.java
new file mode 100644
index 00000000..956ca320
--- /dev/null
+++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/param/config/AlipaySubConfigParam.java
@@ -0,0 +1,44 @@
+package org.dromara.daxpay.channel.alipay.param.config;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+/**
+ * 支付宝特约商户配置参数
+ * @author xxm
+ * @since 2024/6/26
+ */
+@Data
+@Accessors(chain = true)
+@Schema(title = "支付宝特约商户配置参数")
+public class AlipaySubConfigParam {
+
+ /** 主键 */
+ @Schema(description = "主键")
+ private Long id;
+
+ /** 支付宝特约商户Token */
+ @NotBlank(message = "支付宝AppAuthToken不可为空")
+ @Schema(description = "支付宝特约商户Token")
+ private String appAuthToken;
+
+ /** 是否启用 */
+ @Schema(description = "是否启用")
+ @NotNull(message = "是否启用不可为空")
+ private Boolean enable;
+
+ /** 商户号 */
+ @NotBlank(message = "商户号不可为空")
+ @Schema(description = "商户号")
+ private String mchNo;
+
+ /** 商户AppId */
+ @Schema(description = "商户AppId")
+ @NotBlank(message = "商户AppId不可为空")
+ private String appId;
+
+
+}
diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/param/pay/AlipayParam.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/param/pay/AlipayParam.java
index 299927a3..f6a415b0 100644
--- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/param/pay/AlipayParam.java
+++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/param/pay/AlipayParam.java
@@ -21,9 +21,9 @@ public class AlipayParam {
/**
* 新商户建议使用buyer_open_id替代该字段。对于新商户,buyer_id字段未来计划逐步回收,存量商户可继续使用
+ * 需要传输 buyer_open_id 字段的话,直接设置PayParam中的OpenId参数即可
*/
@Schema(description = "买家支付宝用户ID")
private String buyerId;
-
}
diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/result/allocation/AlipayAllocReceiverBindResult.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/result/allocation/AlipayAllocReceiverBindResult.java
deleted file mode 100644
index bf3e8c13..00000000
--- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/result/allocation/AlipayAllocReceiverBindResult.java
+++ /dev/null
@@ -1,59 +0,0 @@
-package org.dromara.daxpay.channel.alipay.result.allocation;
-
-import org.dromara.daxpay.core.enums.AllocReceiverTypeEnum;
-import org.dromara.daxpay.core.enums.AllocRelationTypeEnum;
-import org.dromara.daxpay.service.common.result.MchResult;
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.experimental.Accessors;
-
-/**
- * 支付宝分账接收方绑定
- * @author xxm
- * @since 2025/1/27
- */
-@EqualsAndHashCode(callSuper = true)
-@Data
-@Accessors(chain = true)
-@Schema(title = "支付宝分账接收方绑定")
-public class AlipayAllocReceiverBindResult extends MchResult {
-
- /** 接收方账号 */
- @Schema(description = "接收方账号")
- private String receiverAccount;
-
- /**
- * 接收方类型
- * @see AllocReceiverTypeEnum
- */
- @Schema(description = "接收方类型")
- private String receiverType;
-
- /** 接收方名称 */
- @Schema(description = "接收方名称")
- private String receiverName;
-
- /**
- * 分账关系类型
- * @see AllocRelationTypeEnum
- */
- @Schema(description = "分账关系类型")
- private String relationType;
-
- /** 分账关系名称 */
- @Schema(description = "分账关系名称")
- private String relationName;
-
- /** 是否服务商模式 */
- @Schema(description = "是否服务商模式")
- private boolean isv;
-
- /** 是否绑定 */
- @Schema(description = "是否绑定")
- private boolean bind;
-
- /** 错误提示 */
- @Schema(description = "错误提示")
- private String errorMsg;
-}
diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/result/allocation/AlipayAllocReceiverResult.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/result/allocation/AlipayAllocReceiverResult.java
deleted file mode 100644
index 686f1072..00000000
--- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/result/allocation/AlipayAllocReceiverResult.java
+++ /dev/null
@@ -1,52 +0,0 @@
-package org.dromara.daxpay.channel.alipay.result.allocation;
-
-import org.dromara.daxpay.core.enums.AllocRelationTypeEnum;
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-import lombok.experimental.Accessors;
-
-/**
- * 支付宝分账接收方
- * @author xxm
- * @since 2025/1/26
- */
-@Data
-@Accessors(chain = true)
-@Schema(title = "支付宝分账接收方")
-public class AlipayAllocReceiverResult {
-
- /** 主键 */
- @Schema(description = "主键")
- private Long id;
-
- /** 分账接收方编号 */
- @Schema(description = "分账接收方编号")
- private String receiverNo;
-
- /** 接收方名称 */
- @Schema(description = "接收方名称")
- private String receiverName;
-
- /** 接收方账号 */
- @Schema(description = "接收方账号")
- private String receiverAccount;
-
- /** 接收方类型 */
- @Schema(description = "接收方类型")
- private String receiverType;
-
- /**
- * 分账关系类型
- * @see AllocRelationTypeEnum
- */
- @Schema(description = "分账关系类型")
- private String relationType;
-
- /** 分账关系名称 */
- @Schema(description = "分账关系名称")
- private String relationName;
-
- /** 商户AppId */
- @Schema(description = "商户AppId")
- private String appId;
-}
diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/result/config/AlipayConfigResult.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/result/config/AlipayConfigResult.java
index 3a2a3b15..e7b57a96 100644
--- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/result/config/AlipayConfigResult.java
+++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/result/config/AlipayConfigResult.java
@@ -79,6 +79,10 @@ public class AlipayConfigResult {
@Schema(description = "是否沙箱环境")
private boolean sandbox;
+ /** 商户号 */
+ @Schema(description = "商户号")
+ private String mchNo;
+
/** 商户AppId */
@Schema(description = "商户AppId")
private String appId;
diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/result/config/AlipayIsvConfigResult.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/result/config/AlipayIsvConfigResult.java
new file mode 100644
index 00000000..6ecccb9d
--- /dev/null
+++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/result/config/AlipayIsvConfigResult.java
@@ -0,0 +1,82 @@
+package org.dromara.daxpay.channel.alipay.result.config;
+
+import cn.bootx.platform.common.jackson.sensitive.SensitiveInfo;
+import org.dromara.daxpay.channel.alipay.code.AlipayCode;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+/**
+ * 支付宝服务商配置
+ * @author xxm
+ * @since 2024/10/31
+ */
+@Data
+@Accessors(chain = true)
+@Schema(title = "支付宝服务商配置")
+public class AlipayIsvConfigResult {
+
+ /** 主键 */
+ @Schema(description = "主键")
+ private Long id;
+
+ /** 支付宝商户appId */
+ @Schema(description = "支付宝商户appId")
+ private String aliAppId;
+
+ /** 是否启用 */
+ @Schema(description = "是否启用")
+ private Boolean enable;
+
+ /**
+ * 认证类型 证书/公钥
+ * @see AlipayCode.AuthType
+ */
+ @Schema(description = "认证类型")
+ private String authType;
+
+ /** 签名类型 RSA2 */
+ @Schema(description = "签名类型")
+ public String signType;
+
+ /**
+ * 是商家与支付宝签约后,商家获得的支付宝商家唯一识别码,以 2088 开头的 16 位数字组成,在开放平台中账户中心获取
+ */
+ @Schema(description = "支付宝商家唯一识别码")
+ private String alipayUserId;
+
+ /** 支付宝公钥 */
+ @Schema(description = "支付宝公钥")
+ @SensitiveInfo
+ public String alipayPublicKey;
+
+ /** 应用私钥 */
+ @Schema(description = "应用私钥")
+ @SensitiveInfo
+ private String privateKey;
+
+ /** 应用公钥证书 */
+ @Schema(description = "应用公钥证书")
+ @SensitiveInfo
+ private String appCert;
+
+ /** 支付宝公钥证书 */
+ @Schema(description = "支付宝公钥证书")
+ @SensitiveInfo
+ private String alipayCert;
+
+ /** 支付宝CA根证书 */
+ @Schema(description = "支付宝CA根证书")
+ @SensitiveInfo
+ private String alipayRootCert;
+
+ /** 是否沙箱环境 */
+ @Schema(description = "是否沙箱环境")
+ private boolean sandbox;
+
+ /** 服务商号 */
+ @Schema(description = "服务商号")
+ private String appId;
+
+}
+
diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/result/config/AlipaySubConfigResult.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/result/config/AlipaySubConfigResult.java
new file mode 100644
index 00000000..67925d78
--- /dev/null
+++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/result/config/AlipaySubConfigResult.java
@@ -0,0 +1,41 @@
+package org.dromara.daxpay.channel.alipay.result.config;
+
+import cn.bootx.platform.common.jackson.sensitive.SensitiveInfo;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+/**
+ * 支付宝配置
+ * @author xxm
+ * @since 2024/6/25
+ */
+@Data
+@Accessors(chain = true)
+@Schema(title = "支付宝配置")
+public class AlipaySubConfigResult {
+
+ /** 主键 */
+ @Schema(description = "主键")
+ private Long id;
+
+ /** 支付宝特约商户Token */
+ @SensitiveInfo
+ @Schema(description = "支付宝特约商户Token")
+ private String appAuthToken;
+
+ /** 是否启用 */
+ @Schema(description = "是否启用")
+ private Boolean enable;
+
+ /**
+ * 是商家与支付宝签约后,商家获得的支付宝商家唯一识别码,以 2088 开头的 16 位数字组成,在开放平台中账户中心获取
+ */
+ @Schema(description = "支付宝商家唯一识别码")
+ private String alipayUserId;
+
+ /** 商户AppId */
+ @Schema(description = "商户AppId")
+ private String appId;
+
+}
diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/sdk/contract/CreatContractParam.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/sdk/contract/CreatContractParam.java
deleted file mode 100644
index 90a53aeb..00000000
--- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/sdk/contract/CreatContractParam.java
+++ /dev/null
@@ -1,63 +0,0 @@
-package org.dromara.daxpay.channel.alipay.sdk.contract;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.Data;
-import lombok.experimental.Accessors;
-
-/**
- * 开启代商户签约事务
- * @author xxm
- * @since 2024/10/31
- */
-@Data
-@Accessors(chain = true)
-public class CreatContractParam {
-
- /**
- * 【描述】isv代操作的商户账号,可以是支付宝账号,也可以是pid(2088开头)
- * 【示例值】test@alipay.com
- */
- private String account;
-
- /**
- * 【描述】商户联系人信息,包含联系人名称、手机、邮箱信息。联系人信息将用于接受签约后的重要通知,如确认协议、到期提醒等。
- */
- @JsonProperty("contact_info")
- private ContactInfo contactInfo;
-
- /**
- * 【描述】订单授权凭证。若传入本参数,则对应事务提交后进入预授权模式。
- * 【示例值】00ee2d475f374ad097ee0f1ac223fX00
- */
- @JsonProperty("order_ticket")
- private String orderTicket;
-
- /**
- * 商户联系人信息
- * @author xxm
- * @since 2024/10/31
- */
- @Data
- @Accessors(chain = true)
- public static class ContactInfo{
- /**
- * 【描述】联系人名称
- * 【示例值】张三
- */
- @JsonProperty("contact_name")
- private String contactName;
- /**
- * 【描述】联系人手机号码
- * 【示例值】18866668888
- */
- @JsonProperty("contact_mobile")
- private String contactMobile;
- /**
- * 【描述】联系人邮箱
- * 【示例值】zhangsan@alipy.com
- */
- @JsonProperty("contact_email")
- private String contactEmail;
-
- }
-}
diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/sdk/contract/QueryContractParam.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/sdk/contract/QueryContractParam.java
deleted file mode 100644
index 2b4200ed..00000000
--- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/sdk/contract/QueryContractParam.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package org.dromara.daxpay.channel.alipay.sdk.contract;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.Data;
-import lombok.experimental.Accessors;
-
-/**
- * 查询签约申请单状态参数
- * @author xxm
- * @since 2024/11/16
- */
-@Data
-@Accessors(chain = true)
-public class QueryContractParam {
- /** 操作事务编号 */
- @JsonProperty("batch_no")
- private String batchNo;
-}
diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/allocation/AlipayAllocReceiverBindService.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/allocation/AlipayAllocReceiverBindService.java
deleted file mode 100644
index dd22e732..00000000
--- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/allocation/AlipayAllocReceiverBindService.java
+++ /dev/null
@@ -1,234 +0,0 @@
-package org.dromara.daxpay.channel.alipay.service.allocation;
-
-import cn.bootx.platform.common.mybatisplus.util.MpUtil;
-import cn.bootx.platform.core.exception.DataNotExistException;
-import cn.bootx.platform.core.exception.ValidationFailedException;
-import cn.bootx.platform.core.rest.param.PageParam;
-import cn.bootx.platform.core.rest.result.PageResult;
-import org.dromara.daxpay.channel.alipay.code.AlipayCode;
-import org.dromara.daxpay.channel.alipay.dao.allocation.AlipayAllocReceiverBindManager;
-import org.dromara.daxpay.channel.alipay.entity.allocation.AlipayAllocReceiverBind;
-import org.dromara.daxpay.channel.alipay.param.allocation.AlipayAllocReceiverBindParam;
-import org.dromara.daxpay.channel.alipay.param.allocation.AlipayAllocReceiverBindQuery;
-import org.dromara.daxpay.channel.alipay.result.allocation.AlipayAllocReceiverBindResult;
-import org.dromara.daxpay.channel.alipay.service.payment.config.AlipayConfigService;
-import org.dromara.daxpay.core.enums.AllocReceiverTypeEnum;
-import org.dromara.daxpay.core.exception.ConfigErrorException;
-import org.dromara.daxpay.core.exception.DataErrorException;
-import org.dromara.daxpay.core.exception.TradeFailException;
-import org.dromara.daxpay.service.service.assist.PaymentAssistService;
-import cn.hutool.core.bean.BeanUtil;
-import cn.hutool.core.bean.copier.CopyOptions;
-import cn.hutool.core.util.StrUtil;
-import com.alipay.api.AlipayApiException;
-import com.alipay.api.AlipayConstants;
-import com.alipay.api.AlipayResponse;
-import com.alipay.api.domain.AlipayTradeRoyaltyRelationBindModel;
-import com.alipay.api.domain.AlipayTradeRoyaltyRelationUnbindModel;
-import com.alipay.api.domain.RoyaltyEntity;
-import com.alipay.api.request.AlipayTradeRoyaltyRelationBindRequest;
-import com.alipay.api.request.AlipayTradeRoyaltyRelationUnbindRequest;
-import com.alipay.api.response.AlipayTradeRoyaltyRelationBindResponse;
-import com.alipay.api.response.AlipayTradeRoyaltyRelationUnbindResponse;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.stereotype.Service;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-import java.util.Objects;
-
-/**
- * 支付宝分账接收方绑定服务类
- * @author xxm
- * @since 2025/1/27
- */
-@Slf4j
-@Service
-@RequiredArgsConstructor
-public class AlipayAllocReceiverBindService {
-
- private final AlipayConfigService alipayConfigService;
-
- private final AlipayAllocReceiverBindManager receiverBindManager;
-
- private final PaymentAssistService paymentAssistService;
-
- /**
- * 分页
- */
- public PageResult page(PageParam pageParam, AlipayAllocReceiverBindQuery query){
- return MpUtil.toPageResult(receiverBindManager.page(pageParam, query));
- }
-
- /**
- * 查询详情
- */
- public AlipayAllocReceiverBindResult findById(Long id){
- return receiverBindManager.findById(id).map(AlipayAllocReceiverBind::toResult).orElseThrow(() -> new DataNotExistException("分账接收方不存在"));
- }
-
- /**
- * 添加
- */
- public void add(AlipayAllocReceiverBindParam param){
- // 校验
- if (!this.validation(param)){
- throw new ValidationFailedException("分账接收者参数未通过校验");
- }
- paymentAssistService.initMchAndApp(param.getAppId());
- var receiverBind = AlipayAllocReceiverBind.init(param);
- receiverBindManager.save(receiverBind);
- }
-
- /**
- * 编辑
- */
- public void update(AlipayAllocReceiverBindParam param){
- var receiverBind = receiverBindManager.findById(param.getId()).orElseThrow(() -> new DataNotExistException("分账接收方不存在"));
- if (receiverBind.isBind()){
- throw new DataErrorException("分账接收方已绑定");
- }
- BeanUtil.copyProperties(param,receiverBind, CopyOptions.create().ignoreNullValue());
- receiverBindManager.updateById(receiverBind);
- }
-
- /**
- * 绑定关系
- */
- public void bind(Long id){
- var receiverBind = receiverBindManager.findById(id).orElseThrow(() -> new DataNotExistException("分账接收方不存在"));
- if (receiverBind.isBind()){
- throw new DataErrorException("分账接收方已绑定");
- }
- paymentAssistService.initMchAndApp(receiverBind.getAppId());
- var aliPayConfig = alipayConfigService.getAndCheckConfig(receiverBind.isIsv());
- var model = new AlipayTradeRoyaltyRelationBindModel();
- RoyaltyEntity entity = new RoyaltyEntity();
- var receiverTypeEnum = AllocReceiverTypeEnum.findByCode(receiverBind.getReceiverType());
- entity.setType(this.getReceiverType(receiverTypeEnum));
- entity.setAccount(receiverBind.getReceiverAccount());
- entity.setName(receiverBind.getReceiverName());
- entity.setMemo(receiverBind.getRelationName());
-
- // 不报错视为同步成功
- model.setReceiverList(Collections.singletonList(entity));
- AlipayTradeRoyaltyRelationBindRequest request = new AlipayTradeRoyaltyRelationBindRequest();
- // 特约商户调用
- if (aliPayConfig.isIsv()){
- request.putOtherTextParam(AlipayConstants.APP_AUTH_TOKEN, aliPayConfig.getAppAuthToken());
- }
- model.setOutRequestNo(String.valueOf(receiverBind.getId()));
- request.setBizModel(model);
- AlipayTradeRoyaltyRelationBindResponse response = null;
- try {
- response = alipayConfigService.execute(request,aliPayConfig);
- } catch (AlipayApiException e) {
- log.error("支付宝分账接收方绑定失败", e);
- throw new TradeFailException("支付宝分账接收方绑定失败: "+e.getMessage());
- }
- String errorMsg = this.verifyErrorMsg(response);
- if (StrUtil.isBlank(errorMsg)){
- receiverBind.setBind(true);
- }
- receiverBind.setErrorMsg(errorMsg);
- receiverBindManager.updateById(receiverBind);
- }
-
- /**
- * 解绑关系
- */
- public void unbind(Long id){
- var receiverBind = receiverBindManager.findById(id).orElseThrow(() -> new DataNotExistException("分账接收方不存在"));
- if (!receiverBind.isBind()){
- throw new DataErrorException("分账接收方已解绑");
- }
- paymentAssistService.initMchAndApp(receiverBind.getAppId());
- var aliPayConfig = alipayConfigService.getAndCheckConfig(receiverBind.isIsv());
-
- AlipayTradeRoyaltyRelationUnbindModel model = new AlipayTradeRoyaltyRelationUnbindModel();
- model.setOutRequestNo(String.valueOf(receiverBind.getId()));
-
- RoyaltyEntity entity = new RoyaltyEntity();
-
- var receiverTypeEnum = AllocReceiverTypeEnum.findByCode(receiverBind.getReceiverType());
- entity.setType(this.getReceiverType(receiverTypeEnum));
- entity.setAccount(receiverBind.getReceiverAccount());
-
- model.setReceiverList(Collections.singletonList(entity));
- AlipayTradeRoyaltyRelationUnbindRequest request = new AlipayTradeRoyaltyRelationUnbindRequest();
- // 特约商户调用
- if (aliPayConfig.isIsv()){
- request.putOtherTextParam(AlipayConstants.APP_AUTH_TOKEN, aliPayConfig.getAppAuthToken());
- }
- request.setBizModel(model);
- AlipayTradeRoyaltyRelationUnbindResponse response;
- try {
- response = alipayConfigService.execute(request,aliPayConfig);
- } catch (AlipayApiException e) {
- log.error("支付宝分账接收方解绑失败", e);
- throw new TradeFailException("支付宝分账接收方解绑失败: "+e.getMessage());
- }
- // 如果出现分账方不存在也视为成功
- if (Objects.equals(response.getSubCode(), AlipayCode.USER_NOT_EXIST)) {
- return;
- }
- String errorMsg = this.verifyErrorMsg(response);
- if (StrUtil.isBlank(errorMsg)){
- receiverBind.setBind(false);
- }
- receiverBind.setErrorMsg(errorMsg);
- receiverBindManager.updateById(receiverBind);
- }
-
- /**
- * 验证错误信息
- */
- private String verifyErrorMsg(AlipayResponse alipayResponse) {
- if (!Objects.equals(alipayResponse.getCode(), AlipayCode.ResponseCode.SUCCESS)) {
- String errorMsg = alipayResponse.getSubMsg();
- if (StrUtil.isBlank(errorMsg)) {
- errorMsg = alipayResponse.getMsg();
- }
- return errorMsg;
- }
- return null;
- }
-
- /**
- * 删除
- */
- public void remove(Long id){
- var receiverBind = receiverBindManager.findById(id)
- .orElseThrow(() -> new DataNotExistException("分账接收方不存在"));
- if (receiverBind.isBind()){
- throw new DataErrorException("分账接收方已绑定, 无法删除");
- }
- }
-
- /**
- * 获取分账接收方类型编码
- */
- private String getReceiverType(AllocReceiverTypeEnum receiverTypeEnum){
- if (receiverTypeEnum == AllocReceiverTypeEnum.USER_ID){
- return "userId";
- }
- if (receiverTypeEnum == AllocReceiverTypeEnum.OPEN_ID){
- return "openId";
- }
- if (receiverTypeEnum == AllocReceiverTypeEnum.LOGIN_NAME){
- return "loginName";
- }
- throw new ConfigErrorException("分账接收方类型错误");
- }
-
- /**
- * 校验
- */
- private boolean validation(AlipayAllocReceiverBindParam allocReceiver){
- List list = Arrays.asList(AllocReceiverTypeEnum.USER_ID.getCode(), AllocReceiverTypeEnum.OPEN_ID.getCode(), AllocReceiverTypeEnum.LOGIN_NAME.getCode());
- String receiverType = allocReceiver.getReceiverType();
- return list.contains(receiverType);
- }
-}
diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/allocation/AlipayAllocReceiverService.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/allocation/AlipayAllocReceiverService.java
deleted file mode 100644
index 91d2d3b5..00000000
--- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/allocation/AlipayAllocReceiverService.java
+++ /dev/null
@@ -1,90 +0,0 @@
-package org.dromara.daxpay.channel.alipay.service.allocation;
-
-import org.dromara.daxpay.channel.alipay.convert.AlipayAllocReceiverConvert;
-import org.dromara.daxpay.channel.alipay.entity.allocation.AlipayAllocReceiver;
-import org.dromara.daxpay.channel.alipay.param.allocation.AlipayAllocReceiverParam;
-import org.dromara.daxpay.channel.alipay.result.allocation.AlipayAllocReceiverResult;
-import org.dromara.daxpay.core.enums.ChannelEnum;
-import org.dromara.daxpay.core.exception.ConfigNotEnableException;
-import org.dromara.daxpay.service.common.local.PaymentContextLocal;
-import org.dromara.daxpay.service.dao.allocation.receiver.AllocReceiverManager;
-import org.dromara.daxpay.service.entity.allocation.receiver.AllocReceiver;
-import org.dromara.daxpay.service.service.assist.PaymentAssistService;
-import cn.hutool.core.bean.BeanUtil;
-import cn.hutool.core.bean.copier.CopyOptions;
-import cn.hutool.core.lang.UUID;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.stereotype.Service;
-
-import java.util.Objects;
-
-/**
- * 支付宝分账接收者管理
- * @author xxm
- * @since 2024/3/28
- */
-@Slf4j
-@Service
-@RequiredArgsConstructor
-public class AlipayAllocReceiverService {
-
- private final AllocReceiverManager receiverManager;
-
- private final PaymentAssistService paymentAssistService;
-
- /**
- * 获取支付宝分账接收方
- */
- public AlipayAllocReceiverResult findById(Long id){
- return receiverManager.findById(id)
- .map(AlipayAllocReceiver::convertChannel)
- .map(AlipayAllocReceiver::toResult)
- .orElseThrow(() -> new ConfigNotEnableException("乐刷分账接收方不存在"));
-
- }
-
- /**
- * 新增或修改
- */
- public void saveOrUpdate(AlipayAllocReceiverParam param){
- if(param.getId() == null){
- add(param);
- }else{
- update(param);
- }
- }
-
- /**
- * 添加
- */
- public void add(AlipayAllocReceiverParam param){
- paymentAssistService.initMchAndApp(param.getAppId());
- var mchApp = PaymentContextLocal.get().getMchAppInfo();
- AlipayAllocReceiver entity = AlipayAllocReceiverConvert.CONVERT.toEntity(param);
- AllocReceiver receiver = entity.toReceiver(param.isIsv());
- String uuid = UUID.fastUUID().toString(true);
- receiver.setReceiverNo(uuid);
- receiverManager.save(receiver);
- }
-
- /**
- * 更新
- */
- public void update(AlipayAllocReceiverParam param){
- var allocReceiver = receiverManager.findById(param.getId())
- .orElseThrow(() -> new ConfigNotEnableException("乐刷分账接收方不存在"));
- // 通道配置 --转换--> 乐刷配置 ----> 从更新参数赋值 --转换--> 通道配置 ----> 保存更新
- var leshuaConfig = AlipayAllocReceiver.convertChannel(allocReceiver);
- BeanUtil.copyProperties(param, leshuaConfig, CopyOptions.create()
- .ignoreNullValue());
-
- var receiver = leshuaConfig.toReceiver(Objects.equals(allocReceiver.getChannel(), ChannelEnum.ALIPAY_ISV.getCode()));
- // 手动清空一下默认的数据版本号
- receiver.setVersion(null);
- BeanUtil.copyProperties(receiver, allocReceiver, CopyOptions.create()
- .ignoreNullValue());
- receiverManager.updateById(allocReceiver);
- }
-
-}
diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/allocation/AlipayAllocationService.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/allocation/AlipayAllocationService.java
deleted file mode 100644
index be2d3d5b..00000000
--- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/allocation/AlipayAllocationService.java
+++ /dev/null
@@ -1,190 +0,0 @@
-package org.dromara.daxpay.channel.alipay.service.payment.allocation;
-
-import cn.bootx.platform.common.mybatisplus.base.MpIdEntity;
-import cn.bootx.platform.common.mybatisplus.function.CollectorsFunction;
-import org.dromara.daxpay.channel.alipay.code.AlipayCode;
-import org.dromara.daxpay.channel.alipay.entity.config.AliPayConfig;
-import org.dromara.daxpay.channel.alipay.service.payment.config.AlipayConfigService;
-import org.dromara.daxpay.core.enums.AllocDetailResultEnum;
-import org.dromara.daxpay.core.exception.OperationFailException;
-import org.dromara.daxpay.core.exception.TradeFailException;
-import org.dromara.daxpay.core.util.PayUtil;
-import org.dromara.daxpay.service.bo.allocation.AllocStartResultBo;
-import org.dromara.daxpay.service.bo.allocation.AllocSyncResultBo;
-import org.dromara.daxpay.service.entity.allocation.order.AllocDetail;
-import org.dromara.daxpay.service.entity.allocation.order.AllocOrder;
-import cn.hutool.core.date.LocalDateTimeUtil;
-import cn.hutool.core.util.StrUtil;
-import cn.hutool.json.JSONUtil;
-import com.alipay.api.AlipayApiException;
-import com.alipay.api.AlipayResponse;
-import com.alipay.api.domain.*;
-import com.alipay.api.request.AlipayTradeOrderSettleQueryRequest;
-import com.alipay.api.request.AlipayTradeOrderSettleRequest;
-import com.alipay.api.response.AlipayTradeOrderSettleQueryResponse;
-import com.alipay.api.response.AlipayTradeOrderSettleResponse;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.stereotype.Service;
-
-import java.time.LocalDateTime;
-import java.util.Comparator;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.function.Function;
-import java.util.stream.Collectors;
-
-/**
- * 支付宝分账服务
- * @author xxm
- * @since 2024/12/9
- */
-@Slf4j
-@Service
-@RequiredArgsConstructor
-public class AlipayAllocationService {
- private final AlipayConfigService aliPayConfigService;
-
- /**
- * 发起分账
- */
- public AllocStartResultBo start(AllocOrder allocOrder, List orderDetails, AliPayConfig aliPayConfig){
- // 分账主体参数
- AlipayTradeOrderSettleModel model = new AlipayTradeOrderSettleModel();
- model.setOutRequestNo(allocOrder.getAllocNo());
- model.setTradeNo(allocOrder.getOutOrderNo());
- model.setRoyaltyMode(AlipayCode.ALLOC_ASYNC);
-
- // 分账子参数 根据Id排序
- orderDetails.sort(Comparator.comparing(MpIdEntity::getId));
- List royaltyParameters = orderDetails.stream()
- .map(o -> {
- OpenApiRoyaltyDetailInfoPojo infoPojo = new OpenApiRoyaltyDetailInfoPojo();
- infoPojo.setAmount(PayUtil.toDecimal(o.getAmount()).toPlainString());
- infoPojo.setTransIn(o.getReceiverAccount());
- return infoPojo;
- })
- .collect(Collectors.toList());
- model.setRoyaltyParameters(royaltyParameters);
- AlipayTradeOrderSettleRequest request = new AlipayTradeOrderSettleRequest();
- request.setBizModel(model);
- AlipayTradeOrderSettleResponse response;
- try {
- response = aliPayConfigService.execute(request,aliPayConfig);
- this.verifyErrorMsg(response);
- } catch (AlipayApiException e) {
- log.error("网关返回分账失败: {}", e.getMessage());
- throw new TradeFailException(e.getMessage());
- }
- // 需要写入到分账订单中
- String settleNo = response.getSettleNo();
- return new AllocStartResultBo().setOutAllocNo(settleNo);
- }
-
- /**
- * 分账完结
- */
- public void finish(AllocOrder allocOrder, List orderDetails, AliPayConfig aliPayConfig){
- // 分账主体参数
- AlipayTradeOrderSettleModel model = new AlipayTradeOrderSettleModel();
- model.setOutRequestNo(allocOrder.getAllocNo());
- model.setTradeNo(allocOrder.getOutOrderNo());
- model.setRoyaltyMode(AlipayCode.ALLOC_ASYNC);
- // 分账完结参数
- SettleExtendParams extendParams = new SettleExtendParams();
- extendParams.setRoyaltyFinish(Boolean.TRUE.toString());
- model.setExtendParams(extendParams);
-
- // 分账子参数 根据Id排序
- orderDetails.sort(Comparator.comparing(MpIdEntity::getId));
- List royaltyParameters = orderDetails.stream()
- .map(o -> {
- OpenApiRoyaltyDetailInfoPojo infoPojo = new OpenApiRoyaltyDetailInfoPojo();
- infoPojo.setAmount(PayUtil.toDecimal(o.getAmount()).toPlainString());
- infoPojo.setTransIn(o.getReceiverAccount());
- return infoPojo;
- })
- .collect(Collectors.toList());
- model.setRoyaltyParameters(royaltyParameters);
- AlipayTradeOrderSettleRequest request = new AlipayTradeOrderSettleRequest();
- request.setBizModel(model);
- AlipayTradeOrderSettleResponse response = null;
- try {
- response = aliPayConfigService.execute(request,aliPayConfig);
- } catch (AlipayApiException e) {
- log.error("网关返回分账失败: {}", e.getMessage());
- throw new TradeFailException(e.getMessage());
- }
- this.verifyErrorMsg(response);
- }
-
- /**
- * 分账状态同步
- */
- public AllocSyncResultBo sync(AllocOrder allocOrder, List allocOrderDetails, AliPayConfig aliPayConfig){
- AlipayTradeOrderSettleQueryModel model = new AlipayTradeOrderSettleQueryModel();
- model.setOutRequestNo(allocOrder.getAllocNo());
- model.setTradeNo(allocOrder.getOutOrderNo());
- AlipayTradeOrderSettleQueryRequest request = new AlipayTradeOrderSettleQueryRequest();
- request.setBizModel(model);
- AlipayTradeOrderSettleQueryResponse response;
- try {
- response = aliPayConfigService.execute(request,aliPayConfig);
- } catch (AlipayApiException e) {
- throw new OperationFailException(e.getMessage());
- }
- // 验证
- this.verifyErrorMsg(response);
- Map detailMap = allocOrderDetails.stream()
- .collect(Collectors.toMap(AllocDetail::getReceiverAccount, Function.identity(), CollectorsFunction::retainLatest));
- List royaltyDetailList = response.getRoyaltyDetailList();
- for (RoyaltyDetail receiver : royaltyDetailList) {
- var detail = detailMap.get(receiver.getTransIn());
- if (Objects.nonNull(detail)) {
- detail.setResult(this.getDetailResultEnum(receiver.getState()).getCode());
- detail.setErrorMsg(receiver.getErrorDesc());
- detail.setOutDetailId(receiver.getDetailId());
- // 如果是完成, 更新时间
- if (AllocDetailResultEnum.SUCCESS.getCode().equals(detail.getResult())){
- LocalDateTime finishTime = LocalDateTimeUtil.of(receiver.getExecuteDt());
- detail.setFinishTime(finishTime)
- .setErrorMsg(null)
- .setErrorCode(null);
- }
- }
- }
- return new AllocSyncResultBo().setSyncInfo(JSONUtil.toJsonStr(response));
- }
-
- /**
- * 验证错误信息
- */
- private void verifyErrorMsg(AlipayResponse response) {
- if (!response.isSuccess()) {
- String errorMsg = response.getSubMsg();
- if (StrUtil.isBlank(errorMsg)) {
- errorMsg = response.getMsg();
- }
- log.error("分账处理失败 {}", errorMsg);
- throw new TradeFailException(errorMsg);
- }
- }
-
- /**
- * 转换支付宝分账类型到系统中统一的状态
- */
- private AllocDetailResultEnum getDetailResultEnum (String result){
- // 进行中
- if(Objects.equals(AlipayCode.ALLOC_PROCESSING, result)){
- return AllocDetailResultEnum.PENDING;
- }
- // 成功
- if(Objects.equals(AlipayCode.ALLOC_SUCCESS, result)){
- return AllocDetailResultEnum.SUCCESS;
- }
- // 失败
- return AllocDetailResultEnum.FAIL;
- }
-
-}
diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/callback/AlipayCallbackService.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/callback/AlipayCallbackService.java
index fac102f3..d9c17711 100644
--- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/callback/AlipayCallbackService.java
+++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/callback/AlipayCallbackService.java
@@ -1,16 +1,16 @@
package org.dromara.daxpay.channel.alipay.service.payment.callback;
import org.dromara.daxpay.channel.alipay.service.payment.config.AlipayConfigService;
+import org.dromara.daxpay.core.context.CallbackLocal;
import org.dromara.daxpay.core.enums.CallbackStatusEnum;
import org.dromara.daxpay.core.enums.ChannelEnum;
import org.dromara.daxpay.core.enums.PayStatusEnum;
import org.dromara.daxpay.core.enums.TradeTypeEnum;
import org.dromara.daxpay.core.util.PayUtil;
-import org.dromara.daxpay.core.context.CallbackLocal;
-import org.dromara.daxpay.service.common.local.PaymentContextLocal;
-import org.dromara.daxpay.service.service.record.callback.TradeCallbackRecordService;
-import org.dromara.daxpay.service.service.trade.pay.PayCallbackService;
-import org.dromara.daxpay.service.service.trade.refund.RefundCallbackService;
+import org.dromara.daxpay.service.pay.common.local.PaymentContextLocal;
+import org.dromara.daxpay.service.pay.service.record.callback.TradeCallbackRecordService;
+import org.dromara.daxpay.service.pay.service.trade.pay.PayCallbackService;
+import org.dromara.daxpay.service.pay.service.trade.refund.RefundCallbackService;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.LocalDateTimeUtil;
import cn.hutool.core.util.StrUtil;
@@ -23,6 +23,7 @@ import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.Map;
import java.util.Objects;
+import java.util.Optional;
import static org.dromara.daxpay.channel.alipay.code.AlipayCode.*;
@@ -120,7 +121,11 @@ public class AlipayCallbackService {
// 支付金额
String amountStr = callbackParam.get(ResponseParams.TOTAL_AMOUNT);
callback.setAmount(new BigDecimal(amountStr));
-
+ // 实付金额
+ callback.setRealAmount(new BigDecimal(callbackParam.get("buyer_pay_amount")));
+ // 用户ID
+ String buyId = Optional.ofNullable(callbackParam.get("buyer_user_id")).orElse(callbackParam.get("buyer_open_id"));
+ callback.setBuyerId(buyId);
// 支付时间
String gmpTime = callbackParam.get(ResponseParams.GMT_PAYMENT);
if (StrUtil.isNotBlank(gmpTime)) {
diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/close/AlipayCloseService.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/close/AlipayCloseService.java
index 9bb5ee3e..283a4100 100644
--- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/close/AlipayCloseService.java
+++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/close/AlipayCloseService.java
@@ -7,8 +7,8 @@ import org.dromara.daxpay.channel.alipay.service.payment.sync.AlipaySyncService;
import org.dromara.daxpay.core.enums.PayStatusEnum;
import org.dromara.daxpay.core.exception.OperationFailException;
import org.dromara.daxpay.core.exception.TradeStatusErrorException;
-import org.dromara.daxpay.service.bo.sync.PaySyncResultBo;
-import org.dromara.daxpay.service.entity.order.pay.PayOrder;
+import org.dromara.daxpay.service.pay.bo.sync.PaySyncResultBo;
+import org.dromara.daxpay.service.pay.entity.order.pay.PayOrder;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayConstants;
import com.alipay.api.domain.AlipayTradeCancelModel;
diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/config/AlipayConfigService.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/config/AlipayConfigService.java
index af2a229a..fb0ed048 100644
--- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/config/AlipayConfigService.java
+++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/config/AlipayConfigService.java
@@ -1,24 +1,22 @@
package org.dromara.daxpay.channel.alipay.service.payment.config;
+import cn.bootx.platform.common.jackson.util.JacksonUtil;
import cn.bootx.platform.core.util.CertUtil;
-import cn.bootx.platform.core.util.JsonUtil;
import org.dromara.daxpay.channel.alipay.code.AlipayCode;
import org.dromara.daxpay.channel.alipay.convert.AlipayConfigConvert;
import org.dromara.daxpay.channel.alipay.entity.config.AliPayConfig;
import org.dromara.daxpay.channel.alipay.param.config.AlipayConfigParam;
import org.dromara.daxpay.channel.alipay.result.config.AlipayConfigResult;
-import org.dromara.daxpay.core.context.MchAppLocal;
+import org.dromara.daxpay.core.context.PaymentReqInfoLocal;
import org.dromara.daxpay.core.enums.ChannelEnum;
-import org.dromara.daxpay.core.enums.MerchantTypeEnum;
import org.dromara.daxpay.core.exception.ChannelNotEnableException;
import org.dromara.daxpay.core.exception.ConfigNotEnableException;
import org.dromara.daxpay.core.exception.DataErrorException;
-import org.dromara.daxpay.service.common.cache.ChannelConfigCacheService;
-import org.dromara.daxpay.service.common.local.PaymentContextLocal;
-import org.dromara.daxpay.service.dao.config.ChannelConfigManager;
-import org.dromara.daxpay.service.entity.config.ChannelConfig;
-import org.dromara.daxpay.service.service.assist.PaymentAssistService;
-import org.dromara.daxpay.service.service.config.PlatformConfigService;
+import org.dromara.daxpay.service.merchant.cache.ChannelConfigCacheService;
+import org.dromara.daxpay.service.merchant.dao.config.ChannelConfigManager;
+import org.dromara.daxpay.service.pay.common.local.PaymentContextLocal;
+import org.dromara.daxpay.service.pay.entity.config.ChannelConfig;
+import org.dromara.daxpay.service.pay.service.assist.PaymentAssistService;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.bean.copier.CopyOptions;
import cn.hutool.core.util.CharsetUtil;
@@ -45,7 +43,6 @@ import java.util.Objects;
public class AlipayConfigService {
private final ChannelConfigManager channelConfigManager;
private final ChannelConfigCacheService channelConfigCacheService;
- private final PlatformConfigService platformConfigService;
private final PaymentAssistService paymentAssistService;
/**
@@ -58,6 +55,7 @@ public class AlipayConfigService {
.orElseThrow(() -> new ConfigNotEnableException("支付宝商户配置不存在"));
}
+
/**
* 新增或更新商户信息
*/
@@ -75,13 +73,10 @@ public class AlipayConfigService {
*/
public void save(AlipayConfigParam param) {
paymentAssistService.initMchAndApp(param.getAppId());
- var mchApp = PaymentContextLocal.get().getMchAppInfo();
- // 判断商户配置类型
- if (Objects.equals(mchApp.getMchType(), MerchantTypeEnum.PARTNER.getCode())){
- throw new ChannelNotEnableException("请使用特约商户配置保存");
- }
+ var mchApp = PaymentContextLocal.get().getReqInfo();
// 转换类型
var entity = AlipayConfigConvert.CONVERT.toEntity(param);
+ entity.setMchNo(mchApp.getMchNo());
ChannelConfig channelConfig = entity.toChannelConfig();
// 判断商户和应用下是否存在该配置
if (channelConfigManager.existsByAppIdAndChannel(param.getAppId(), channelConfig.getChannel())){
@@ -95,48 +90,44 @@ public class AlipayConfigService {
*/
public void update(AlipayConfigParam param){
paymentAssistService.initMchAndApp(param.getAppId());
- var mchApp = PaymentContextLocal.get().getMchAppInfo();
- // 判断商户配置类型
- if (Objects.equals(mchApp.getMchType(), MerchantTypeEnum.PARTNER.getCode())){
- throw new ChannelNotEnableException("请使用特约商户配置更新");
- }
ChannelConfig channelConfig = channelConfigManager.findById(param.getId())
.orElseThrow(() -> new ConfigNotEnableException("支付宝配置不存在"));
// 通道配置 --转换--> 支付宝配置 ----> 从更新参数赋值 --转换--> 通道配置 ----> 保存更新
AliPayConfig alipayConfig = AliPayConfig.convertConfig(channelConfig);
BeanUtil.copyProperties(param, alipayConfig, CopyOptions.create().ignoreNullValue());
ChannelConfig channelConfigParam = alipayConfig.toChannelConfig();
- // 手动清空一下默认的数据版本号
- channelConfigParam.setVersion(null);
+ // 手动写入一下原来的数据版本号
+ channelConfigParam.setVersion(channelConfig.getVersion());
BeanUtil.copyProperties(channelConfigParam, channelConfig, CopyOptions.create().ignoreNullValue());
channelConfigManager.updateById(channelConfig);
}
+
/**
* 获取异步通知地址
*/
public String getNotifyUrl(boolean isv) {
- String url = isv?"{}/unipay/callback/{}/alipay/isv":"{}/unipay/callback/{}/alipay";
- var mchAppInfo = PaymentContextLocal.get().getMchAppInfo();
- return StrUtil.format(url,mchAppInfo.getGatewayServiceUrl(),mchAppInfo.getAppId());
+ String url = isv?"{}/unipay/callback/{}/{}/alipay/isv":"{}/unipay/callback/{}/{}/alipay";
+ var reqInfo = PaymentContextLocal.get().getReqInfo();
+ return StrUtil.format(url,reqInfo.getGatewayServiceUrl(), reqInfo.getMchNo(),reqInfo.getAppId());
}
/**
* 获取同步通知地址
*/
public String getReturnUrl(boolean isv) {
- String url = isv?"{}/unipay/return/{}/alipay/isv":"{}/unipay/return/{}/alipay";
- MchAppLocal mchAppInfo = PaymentContextLocal.get().getMchAppInfo();
- return StrUtil.format(url,mchAppInfo.getGatewayServiceUrl(),mchAppInfo.getAppId());
+ String url = isv?"{}/unipay/return/{}/{}/alipay/isv":"{}/unipay/return/{}/{}/alipay";
+ PaymentReqInfoLocal reqInfo = PaymentContextLocal.get().getReqInfo();
+ return StrUtil.format(url,reqInfo.getGatewayH5Url(), reqInfo.getMchNo(),reqInfo.getAppId());
}
/**
* 获取支付宝支付配置
*/
public AliPayConfig getAliPayConfig(boolean isv){
- MchAppLocal mchAppInfo = PaymentContextLocal.get().getMchAppInfo();
- ChannelConfig channelConfig = channelConfigCacheService.getMchChannelConfig(mchAppInfo.getAppId(), isv?ChannelEnum.ALIPAY_ISV.getCode():ChannelEnum.ALIPAY.getCode());
- return AliPayConfig.convertConfig(channelConfig);
+ PaymentReqInfoLocal reqInfo = PaymentContextLocal.get().getReqInfo();
+ ChannelConfig channelConfig = channelConfigCacheService.getMchChannelConfig(reqInfo.getAppId(), isv?ChannelEnum.ALIPAY_ISV.getCode():ChannelEnum.ALIPAY.getCode());
+ return AliPayConfig.convertConfig(channelConfig);
}
/**
@@ -183,7 +174,7 @@ public class AlipayConfigService {
* 校验消息通知
*/
public boolean verifyNotify(Map params, boolean isv) {
- String callReq = JsonUtil.toJsonStr(params);
+ String callReq = JacksonUtil.toJson(params);
log.info("支付宝消息通知报文: {}", callReq);
String appId = params.get("app_id");
if (StrUtil.isBlank(appId)) {
diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/extra/AlipayAuthService.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/extra/AlipayAuthService.java
index d42473a3..7ec96ff9 100644
--- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/extra/AlipayAuthService.java
+++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/extra/AlipayAuthService.java
@@ -3,10 +3,10 @@ package org.dromara.daxpay.channel.alipay.service.payment.extra;
import cn.bootx.platform.core.exception.BizException;
import org.dromara.daxpay.channel.alipay.entity.config.AliPayConfig;
import org.dromara.daxpay.channel.alipay.service.payment.config.AlipayConfigService;
-import org.dromara.daxpay.core.context.MchAppLocal;
+import org.dromara.daxpay.core.context.PaymentReqInfoLocal;
import org.dromara.daxpay.core.result.assist.AuthResult;
import org.dromara.daxpay.core.result.assist.AuthUrlResult;
-import org.dromara.daxpay.service.common.local.PaymentContextLocal;
+import org.dromara.daxpay.service.pay.common.local.PaymentContextLocal;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.StrUtil;
import com.alipay.api.request.AlipaySystemOauthTokenRequest;
@@ -34,8 +34,8 @@ public class AlipayAuthService {
*/
public AuthUrlResult generateAuthUrl(String authPath, String channel, String appId, String aliAppId) {
String queryCode = RandomUtil.randomString(10);
- MchAppLocal mchAppInfo = PaymentContextLocal.get().getMchAppInfo();
- String serverUrl = mchAppInfo.getGatewayMobileUrl();
+ PaymentReqInfoLocal reqInfo = PaymentContextLocal.get().getReqInfo();
+ String serverUrl = reqInfo.getGatewayH5Url();
if (StrUtil.isBlank(authPath)){
authPath = StrUtil.format("/auth/alipay/{}/{}/{}/{}", appId, channel, queryCode, aliAppId);
}
diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/notice/AlipayTransferNoticeService.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/notice/AlipayTransferNoticeService.java
index c15bb06d..fe6ad115 100644
--- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/notice/AlipayTransferNoticeService.java
+++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/notice/AlipayTransferNoticeService.java
@@ -1,17 +1,16 @@
package org.dromara.daxpay.channel.alipay.service.payment.notice;
-import cn.bootx.platform.core.util.JsonUtil;
-import cn.hutool.json.JSONUtil;
+import cn.bootx.platform.common.jackson.util.JacksonUtil;
import org.dromara.daxpay.channel.alipay.code.AlipayCode;
import org.dromara.daxpay.channel.alipay.result.notice.AlipayOrderChangedResult;
+import org.dromara.daxpay.core.context.CallbackLocal;
import org.dromara.daxpay.core.enums.CallbackStatusEnum;
import org.dromara.daxpay.core.enums.ChannelEnum;
import org.dromara.daxpay.core.enums.TradeTypeEnum;
import org.dromara.daxpay.core.enums.TransferStatusEnum;
-import org.dromara.daxpay.core.context.CallbackLocal;
-import org.dromara.daxpay.service.common.local.PaymentContextLocal;
-import org.dromara.daxpay.service.service.record.callback.TradeCallbackRecordService;
-import org.dromara.daxpay.service.service.trade.transfer.TransferCallbackService;
+import org.dromara.daxpay.service.pay.common.local.PaymentContextLocal;
+import org.dromara.daxpay.service.pay.service.record.callback.TradeCallbackRecordService;
+import org.dromara.daxpay.service.pay.service.trade.transfer.TransferCallbackService;
import cn.hutool.core.bean.BeanUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@@ -51,14 +50,14 @@ public class AlipayTransferNoticeService {
*/
public String callback(Map map) {
CallbackLocal callbackInfo = PaymentContextLocal.get().getCallbackInfo();
- callbackInfo.setRawData(JsonUtil.toJsonStr(map))
+ callbackInfo.setRawData(JacksonUtil.toJson(map))
.setChannel(ChannelEnum.ALIPAY.getCode())
.setCallbackType(TradeTypeEnum.TRANSFER);
// 通过 biz_content 获取值
try {
String bizContent = map.get("biz_content");
- var response = JSONUtil.toBean(bizContent, AlipayOrderChangedResult.class);
+ var response = JacksonUtil.toBean(bizContent, AlipayOrderChangedResult.class);
callbackInfo.setCallbackData(BeanUtil.beanToMap(response));
this.resolveData(response);
return "success";
diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/pay/AliPayService.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/pay/AliPayService.java
index 0756fdfb..fa433dc4 100644
--- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/pay/AliPayService.java
+++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/pay/AliPayService.java
@@ -8,8 +8,8 @@ import org.dromara.daxpay.core.enums.PayMethodEnum;
import org.dromara.daxpay.core.exception.TradeFailException;
import org.dromara.daxpay.core.param.trade.pay.PayParam;
import org.dromara.daxpay.core.util.PayUtil;
-import org.dromara.daxpay.service.bo.trade.PayResultBo;
-import org.dromara.daxpay.service.entity.order.pay.PayOrder;
+import org.dromara.daxpay.service.pay.bo.trade.PayResultBo;
+import org.dromara.daxpay.service.pay.entity.order.pay.PayOrder;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.LocalDateTimeUtil;
import cn.hutool.core.util.StrUtil;
@@ -25,6 +25,7 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpMethod;
import org.springframework.stereotype.Service;
+import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.Objects;
@@ -238,6 +239,8 @@ public class AliPayService {
request.putOtherTextParam(AlipayConstants.APP_AUTH_TOKEN, aliPayConfig.getAppAuthToken());
}
request.setBizModel(model);
+ // 异步回调必须到当前系统中
+ request.setNotifyUrl(aliPayConfigService.getNotifyUrl(aliPayConfig.isIsv()));
try {
AlipayTradeCreateResponse response = aliPayConfigService.execute(request,aliPayConfig);
this.verifyErrorMsg(response);
@@ -315,7 +318,9 @@ public class AliPayService {
Date gmtPayment = response.getGmtPayment();
result.setOutOrderNo(response.getTradeNo())
.setComplete(true)
- .setFinishTime(LocalDateTimeUtil.of(gmtPayment));
+ .setFinishTime(LocalDateTimeUtil.of(gmtPayment))
+ .setRealAmount(new BigDecimal(response.getBuyerPayAmount()))
+ .setBuyerId(response.getBuyerOpenId());
}
// 非支付中响应码, 进行错误处理
if (!Objects.equals(response.getCode(), AlipayCode.ResponseCode.INPROCESS)) {
diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/redirect/AlipayRedirectUrlService.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/redirect/AlipayRedirectUrlService.java
index 413a87d1..e28c0d8b 100644
--- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/redirect/AlipayRedirectUrlService.java
+++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/redirect/AlipayRedirectUrlService.java
@@ -4,12 +4,11 @@ import cn.bootx.platform.core.exception.DataNotExistException;
import cn.bootx.platform.core.exception.ValidationFailedException;
import org.dromara.daxpay.channel.alipay.code.AlipayCode;
import org.dromara.daxpay.channel.alipay.service.payment.config.AlipayConfigService;
-import org.dromara.daxpay.core.context.MchAppLocal;
+import org.dromara.daxpay.core.context.PaymentReqInfoLocal;
import org.dromara.daxpay.core.util.PayUtil;
-import org.dromara.daxpay.service.common.local.PaymentContextLocal;
-import org.dromara.daxpay.service.dao.order.pay.PayOrderManager;
-import org.dromara.daxpay.service.entity.order.pay.PayOrder;
-import org.dromara.daxpay.service.service.config.PlatformConfigService;
+import org.dromara.daxpay.service.pay.common.local.PaymentContextLocal;
+import org.dromara.daxpay.service.pay.dao.order.pay.PayOrderManager;
+import org.dromara.daxpay.service.pay.entity.order.pay.PayOrder;
import cn.hutool.core.util.StrUtil;
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor;
@@ -29,7 +28,6 @@ import java.util.Map;
public class AlipayRedirectUrlService {
private final AlipayConfigService aliPayConfigService;
private final PayOrderManager payOrderManager;
- private final PlatformConfigService platformConfigService;
/**
* 回调地址处理
@@ -49,8 +47,8 @@ public class AlipayRedirectUrlService {
if (StrUtil.isNotBlank(order.getReturnUrl())){
return StrUtil.format("{}?biz_trade_no={}&trade_no={}", order.getReturnUrl(),order.getBizOrderNo(),order.getOrderNo() );
} else {
- MchAppLocal mchAppInfo = PaymentContextLocal.get().getMchAppInfo();
- String serverUrl = mchAppInfo.getGatewayMobileUrl();
+ PaymentReqInfoLocal reqInfo = PaymentContextLocal.get().getReqInfo();
+ String serverUrl = reqInfo.getGatewayH5Url();
return StrUtil.format("{}/paySuccess/{}", serverUrl,order.getOrderNo());
}
diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/refund/AlipayRefundService.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/refund/AlipayRefundService.java
index 5a16f651..e1445215 100644
--- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/refund/AlipayRefundService.java
+++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/refund/AlipayRefundService.java
@@ -6,8 +6,8 @@ import org.dromara.daxpay.core.enums.RefundStatusEnum;
import org.dromara.daxpay.core.exception.OperationFailException;
import org.dromara.daxpay.core.exception.TradeFailException;
import org.dromara.daxpay.core.util.PayUtil;
-import org.dromara.daxpay.service.bo.trade.RefundResultBo;
-import org.dromara.daxpay.service.entity.order.refund.RefundOrder;
+import org.dromara.daxpay.service.pay.bo.trade.RefundResultBo;
+import org.dromara.daxpay.service.pay.entity.order.refund.RefundOrder;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayConstants;
import com.alipay.api.domain.AlipayTradeRefundModel;
diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/sync/AlipayRefundSyncService.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/sync/AlipayRefundSyncService.java
index 99121f88..d93d9d8e 100644
--- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/sync/AlipayRefundSyncService.java
+++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/sync/AlipayRefundSyncService.java
@@ -1,12 +1,12 @@
package org.dromara.daxpay.channel.alipay.service.payment.sync;
-import cn.bootx.platform.core.util.JsonUtil;
+import cn.bootx.platform.common.jackson.util.JacksonUtil;
import org.dromara.daxpay.channel.alipay.code.AlipayCode;
import org.dromara.daxpay.channel.alipay.entity.config.AliPayConfig;
import org.dromara.daxpay.channel.alipay.service.payment.config.AlipayConfigService;
import org.dromara.daxpay.core.enums.RefundStatusEnum;
-import org.dromara.daxpay.service.bo.sync.RefundSyncResultBo;
-import org.dromara.daxpay.service.entity.order.refund.RefundOrder;
+import org.dromara.daxpay.service.pay.bo.sync.RefundSyncResultBo;
+import org.dromara.daxpay.service.pay.entity.order.refund.RefundOrder;
import cn.hutool.core.date.LocalDateTimeUtil;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayConstants;
@@ -54,7 +54,7 @@ public class AlipayRefundSyncService {
}
request.setBizModel(model);
AlipayTradeFastpayRefundQueryResponse response = aliPayConfigService.execute(request,aliPayConfig);
- syncResult.setSyncData(JsonUtil.toJsonStr(response));
+ syncResult.setSyncData(JacksonUtil.toJson(response));
// 失败
if (!response.isSuccess()) {
syncResult.setSyncSuccess(false)
diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/sync/AlipaySyncService.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/sync/AlipaySyncService.java
index e65f0407..34ae3a33 100644
--- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/sync/AlipaySyncService.java
+++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/sync/AlipaySyncService.java
@@ -1,13 +1,13 @@
package org.dromara.daxpay.channel.alipay.service.payment.sync;
-import cn.bootx.platform.core.util.JsonUtil;
+import cn.bootx.platform.common.jackson.util.JacksonUtil;
import org.dromara.daxpay.channel.alipay.code.AlipayCode;
import org.dromara.daxpay.channel.alipay.code.AlipayCode.PayStatus;
import org.dromara.daxpay.channel.alipay.entity.config.AliPayConfig;
import org.dromara.daxpay.channel.alipay.service.payment.config.AlipayConfigService;
import org.dromara.daxpay.core.enums.PayStatusEnum;
-import org.dromara.daxpay.service.bo.sync.PaySyncResultBo;
-import org.dromara.daxpay.service.entity.order.pay.PayOrder;
+import org.dromara.daxpay.service.pay.bo.sync.PaySyncResultBo;
+import org.dromara.daxpay.service.pay.entity.order.pay.PayOrder;
import cn.hutool.core.date.LocalDateTimeUtil;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayConstants;
@@ -18,8 +18,10 @@ import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
+import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.Objects;
+import java.util.Optional;
/**
@@ -56,14 +58,18 @@ public class AlipaySyncService {
request.setBizModel(model);
AlipayTradeQueryResponse response = aliPayConfigService.execute(request,aliPayConfig);
String tradeStatus = response.getTradeStatus();
- syncResult.setSyncData(JsonUtil.toJsonStr(response));
+ syncResult.setSyncData(JacksonUtil.toJson(response));
// 设置网关订单号
syncResult.setOutOrderNo(response.getTradeNo());
// 支付完成 部分退款无法进行区分, 需要借助对账进行处理
if (Objects.equals(tradeStatus, PayStatus.TRADE_SUCCESS) || Objects.equals(tradeStatus, PayStatus.TRADE_FINISHED)) {
// 支付完成时间
LocalDateTime payTime = LocalDateTimeUtil.of(response.getSendPayDate());
- return syncResult.setPayStatus(PayStatusEnum.SUCCESS).setFinishTime(payTime);
+ String userOrOpenId = Optional.ofNullable(response.getBuyerOpenId())
+ .orElse(response.getBuyerUserId());
+ return syncResult.setPayStatus(PayStatusEnum.SUCCESS).setFinishTime(payTime)
+ .setRealAmount(new BigDecimal(response.getBuyerPayAmount()))
+ .setBuyerId(userOrOpenId);
}
// 待支付
if (Objects.equals(tradeStatus, PayStatus.WAIT_BUYER_PAY)) {
diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/sync/AlipayTransferSyncService.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/sync/AlipayTransferSyncService.java
index 1d81934e..58320b85 100644
--- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/sync/AlipayTransferSyncService.java
+++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/sync/AlipayTransferSyncService.java
@@ -1,12 +1,12 @@
package org.dromara.daxpay.channel.alipay.service.payment.sync;
-import cn.bootx.platform.core.util.JsonUtil;
+import cn.bootx.platform.common.jackson.util.JacksonUtil;
import org.dromara.daxpay.channel.alipay.code.AlipayCode.TransferStatus;
import org.dromara.daxpay.channel.alipay.entity.config.AliPayConfig;
import org.dromara.daxpay.channel.alipay.service.payment.config.AlipayConfigService;
import org.dromara.daxpay.core.enums.TransferStatusEnum;
-import org.dromara.daxpay.service.bo.sync.TransferSyncResultBo;
-import org.dromara.daxpay.service.entity.order.transfer.TransferOrder;
+import org.dromara.daxpay.service.pay.bo.sync.TransferSyncResultBo;
+import org.dromara.daxpay.service.pay.entity.order.transfer.TransferOrder;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayConstants;
import com.alipay.api.domain.AlipayFundTransCommonQueryModel;
@@ -51,7 +51,7 @@ public class AlipayTransferSyncService {
try {
var response = aliPayConfigService.execute(request,aliPayConfig);
// 设置网关订单号
- syncResult.setSyncData(JsonUtil.toJsonStr(response));
+ syncResult.setSyncData(JacksonUtil.toJson(response));
// 设置网关订单号
syncResult.setOutTransferNo(response.getPayFundOrderId());
diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/transfer/AlipayTransferService.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/transfer/AlipayTransferService.java
index a4b5649f..42299d4b 100644
--- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/transfer/AlipayTransferService.java
+++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/transfer/AlipayTransferService.java
@@ -8,8 +8,8 @@ import org.dromara.daxpay.core.enums.TransferStatusEnum;
import org.dromara.daxpay.core.exception.OperationFailException;
import org.dromara.daxpay.core.exception.TradeFailException;
import org.dromara.daxpay.core.util.PayUtil;
-import org.dromara.daxpay.service.bo.trade.TransferResultBo;
-import org.dromara.daxpay.service.entity.order.transfer.TransferOrder;
+import org.dromara.daxpay.service.pay.bo.trade.TransferResultBo;
+import org.dromara.daxpay.service.pay.entity.order.transfer.TransferOrder;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.LocalDateTimeUtil;
import com.alipay.api.domain.AlipayFundAccountQueryModel;
diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AliPayStrategy.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AliPayStrategy.java
index 20c20ef0..bcbf2940 100644
--- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AliPayStrategy.java
+++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AliPayStrategy.java
@@ -1,15 +1,14 @@
package org.dromara.daxpay.channel.alipay.strategy.merchant;
+import cn.bootx.platform.common.jackson.util.JacksonUtil;
import cn.bootx.platform.core.exception.ValidationFailedException;
-import cn.bootx.platform.core.util.JsonUtil;
-import cn.hutool.json.JSONUtil;
import org.dromara.daxpay.channel.alipay.entity.config.AliPayConfig;
import org.dromara.daxpay.channel.alipay.param.pay.AlipayParam;
import org.dromara.daxpay.channel.alipay.service.payment.config.AlipayConfigService;
import org.dromara.daxpay.channel.alipay.service.payment.pay.AliPayService;
import org.dromara.daxpay.core.enums.ChannelEnum;
-import org.dromara.daxpay.service.bo.trade.PayResultBo;
-import org.dromara.daxpay.service.strategy.AbsPayStrategy;
+import org.dromara.daxpay.service.pay.bo.trade.PayResultBo;
+import org.dromara.daxpay.service.pay.strategy.AbsPayStrategy;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONException;
import lombok.RequiredArgsConstructor;
@@ -50,7 +49,7 @@ public class AliPayStrategy extends AbsPayStrategy {
// 支付宝参数验证
String channelParam = this.getPayParam().getExtraParam();
if (StrUtil.isNotBlank(channelParam)) {
- this.aliPayParam = JSONUtil.toBean(channelParam, AlipayParam.class);
+ this.aliPayParam = JacksonUtil.toBean(channelParam, AlipayParam.class);
}
else {
this.aliPayParam = new AlipayParam();
diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AliPaySyncTransferStrategy.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AliPaySyncTransferStrategy.java
index 62c891ac..1e16b5af 100644
--- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AliPaySyncTransferStrategy.java
+++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AliPaySyncTransferStrategy.java
@@ -4,8 +4,8 @@ import org.dromara.daxpay.channel.alipay.entity.config.AliPayConfig;
import org.dromara.daxpay.channel.alipay.service.payment.config.AlipayConfigService;
import org.dromara.daxpay.channel.alipay.service.payment.sync.AlipayTransferSyncService;
import org.dromara.daxpay.core.enums.ChannelEnum;
-import org.dromara.daxpay.service.bo.sync.TransferSyncResultBo;
-import org.dromara.daxpay.service.strategy.AbsSyncTransferOrderStrategy;
+import org.dromara.daxpay.service.pay.bo.sync.TransferSyncResultBo;
+import org.dromara.daxpay.service.pay.strategy.AbsSyncTransferOrderStrategy;
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipayAllocationStrategy.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipayAllocationStrategy.java
deleted file mode 100644
index d671e6db..00000000
--- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipayAllocationStrategy.java
+++ /dev/null
@@ -1,62 +0,0 @@
-package org.dromara.daxpay.channel.alipay.strategy.merchant;
-
-import org.dromara.daxpay.channel.alipay.entity.config.AliPayConfig;
-import org.dromara.daxpay.channel.alipay.service.payment.allocation.AlipayAllocationService;
-import org.dromara.daxpay.channel.alipay.service.payment.config.AlipayConfigService;
-import org.dromara.daxpay.core.enums.ChannelEnum;
-import org.dromara.daxpay.service.bo.allocation.AllocStartResultBo;
-import org.dromara.daxpay.service.bo.allocation.AllocSyncResultBo;
-import org.dromara.daxpay.service.strategy.AbsAllocationStrategy;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.stereotype.Component;
-
-/**
- * 支付宝分账
- * @author xxm
- * @since 2024/12/9
- */
-@Slf4j
-@Component
-@RequiredArgsConstructor
-public class AlipayAllocationStrategy extends AbsAllocationStrategy {
-
- private final AlipayAllocationService aliPayAllocationService;
-
- private final AlipayConfigService aliPayConfigService;
-
- /**
- * 分账通道
- */
- @Override
- public String getChannel() {
- return ChannelEnum.ALIPAY.getCode();
- }
-
- /**
- * 开始分账
- */
- @Override
- public AllocStartResultBo start() {
- AliPayConfig aliPayConfig = aliPayConfigService.getAliPayConfig(false);
- return aliPayAllocationService.start(getOrder(), getDetails(), aliPayConfig);
- }
-
- /**
- * 分账完结
- */
- @Override
- public void finish() {
- AliPayConfig aliPayConfig = aliPayConfigService.getAliPayConfig(false);
- aliPayAllocationService.finish(getOrder(), getDetails(), aliPayConfig);
- }
-
- /**
- * 同步状态
- */
- @Override
- public AllocSyncResultBo doSync() {
- AliPayConfig aliPayConfig = aliPayConfigService.getAliPayConfig(false);
- return aliPayAllocationService.sync(getOrder(), getDetails(), aliPayConfig);
- }
-}
diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipayAuthStrategy.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipayAuthStrategy.java
index f34bbc58..17c3ec8d 100644
--- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipayAuthStrategy.java
+++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipayAuthStrategy.java
@@ -8,7 +8,7 @@ import org.dromara.daxpay.core.param.assist.AuthCodeParam;
import org.dromara.daxpay.core.param.assist.GenerateAuthUrlParam;
import org.dromara.daxpay.core.result.assist.AuthResult;
import org.dromara.daxpay.core.result.assist.AuthUrlResult;
-import org.dromara.daxpay.service.strategy.AbsChannelAuthStrategy;
+import org.dromara.daxpay.service.pay.strategy.AbsChannelAuthStrategy;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipayChannelBasicStrategy.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipayChannelBasicStrategy.java
new file mode 100644
index 00000000..550bfec7
--- /dev/null
+++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipayChannelBasicStrategy.java
@@ -0,0 +1,43 @@
+package org.dromara.daxpay.channel.alipay.strategy.merchant;
+
+import cn.bootx.platform.core.rest.dto.KeyValue;
+import org.dromara.daxpay.core.enums.ChannelEnum;
+import org.dromara.daxpay.service.pay.strategy.AbsChannelBasicStrategy;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.stream.Stream;
+
+import static org.dromara.daxpay.core.enums.PayMethodEnum.*;
+
+/**
+ *
+ * @author xxm
+ * @since 2025/6/4
+ */
+@Slf4j
+@Service
+@RequiredArgsConstructor
+public class AlipayChannelBasicStrategy extends AbsChannelBasicStrategy {
+ /**
+ * 获取通道的支付列表
+ */
+ @Override
+ public List payMethodList() {
+ return Stream.of(WAP,WEB,APP,QRCODE,BARCODE,JSAPI )
+ .map(payMethodEnum -> new KeyValue(payMethodEnum.getCode(), payMethodEnum.getName()))
+ .toList();
+ }
+
+ /**
+ * 策略标识, 可以自行进行扩展
+ *
+ * @see ChannelEnum
+ */
+ @Override
+ public String getChannel() {
+ return ChannelEnum.ALIPAY.getCode();
+ }
+}
diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipayCloseStrategy.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipayCloseStrategy.java
index 31c66c3d..7bc2aa31 100644
--- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipayCloseStrategy.java
+++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipayCloseStrategy.java
@@ -5,7 +5,7 @@ import org.dromara.daxpay.channel.alipay.service.payment.close.AlipayCloseServic
import org.dromara.daxpay.channel.alipay.service.payment.config.AlipayConfigService;
import org.dromara.daxpay.core.enums.ChannelEnum;
import org.dromara.daxpay.core.enums.CloseTypeEnum;
-import org.dromara.daxpay.service.strategy.AbsPayCloseStrategy;
+import org.dromara.daxpay.service.pay.strategy.AbsPayCloseStrategy;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipayGatewayPayStrategy.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipayGatewayPayStrategy.java
index 56aed56c..15516d2b 100644
--- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipayGatewayPayStrategy.java
+++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipayGatewayPayStrategy.java
@@ -1,7 +1,7 @@
package org.dromara.daxpay.channel.alipay.strategy.merchant;
import org.dromara.daxpay.core.enums.ChannelEnum;
-import org.dromara.daxpay.service.strategy.AbsGatewayPayStrategy;
+import org.dromara.daxpay.service.pay.strategy.AbsGatewayPayStrategy;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipayRefundStrategy.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipayRefundStrategy.java
index fa13109f..452232ef 100644
--- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipayRefundStrategy.java
+++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipayRefundStrategy.java
@@ -4,8 +4,8 @@ import org.dromara.daxpay.channel.alipay.entity.config.AliPayConfig;
import org.dromara.daxpay.channel.alipay.service.payment.config.AlipayConfigService;
import org.dromara.daxpay.channel.alipay.service.payment.refund.AlipayRefundService;
import org.dromara.daxpay.core.enums.ChannelEnum;
-import org.dromara.daxpay.service.bo.trade.RefundResultBo;
-import org.dromara.daxpay.service.strategy.AbsRefundStrategy;
+import org.dromara.daxpay.service.pay.bo.trade.RefundResultBo;
+import org.dromara.daxpay.service.pay.strategy.AbsRefundStrategy;
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipaySyncOrderStrategy.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipaySyncOrderStrategy.java
index 52b8fb74..efc2ca3c 100644
--- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipaySyncOrderStrategy.java
+++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipaySyncOrderStrategy.java
@@ -4,8 +4,8 @@ import org.dromara.daxpay.channel.alipay.entity.config.AliPayConfig;
import org.dromara.daxpay.channel.alipay.service.payment.config.AlipayConfigService;
import org.dromara.daxpay.channel.alipay.service.payment.sync.AlipaySyncService;
import org.dromara.daxpay.core.enums.ChannelEnum;
-import org.dromara.daxpay.service.bo.sync.PaySyncResultBo;
-import org.dromara.daxpay.service.strategy.AbsSyncPayOrderStrategy;
+import org.dromara.daxpay.service.pay.bo.sync.PaySyncResultBo;
+import org.dromara.daxpay.service.pay.strategy.AbsSyncPayOrderStrategy;
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipaySyncRefundStrategy.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipaySyncRefundStrategy.java
index 2adb88fb..f3839978 100644
--- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipaySyncRefundStrategy.java
+++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipaySyncRefundStrategy.java
@@ -5,9 +5,9 @@ import org.dromara.daxpay.channel.alipay.service.payment.config.AlipayConfigServ
import org.dromara.daxpay.channel.alipay.service.payment.sync.AlipayRefundSyncService;
import org.dromara.daxpay.core.enums.ChannelEnum;
import org.dromara.daxpay.core.exception.OperationFailException;
-import org.dromara.daxpay.service.bo.sync.RefundSyncResultBo;
-import org.dromara.daxpay.service.entity.order.refund.RefundOrder;
-import org.dromara.daxpay.service.strategy.AbsSyncRefundOrderStrategy;
+import org.dromara.daxpay.service.pay.bo.sync.RefundSyncResultBo;
+import org.dromara.daxpay.service.pay.entity.order.refund.RefundOrder;
+import org.dromara.daxpay.service.pay.strategy.AbsSyncRefundOrderStrategy;
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipayTransferStrategy.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipayTransferStrategy.java
index d7a3ecf4..d61c2984 100644
--- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipayTransferStrategy.java
+++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipayTransferStrategy.java
@@ -6,8 +6,8 @@ import org.dromara.daxpay.channel.alipay.service.payment.config.AlipayConfigServ
import org.dromara.daxpay.channel.alipay.service.payment.transfer.AlipayTransferService;
import org.dromara.daxpay.core.enums.ChannelEnum;
import org.dromara.daxpay.core.param.trade.transfer.TransferParam;
-import org.dromara.daxpay.service.bo.trade.TransferResultBo;
-import org.dromara.daxpay.service.strategy.AbsTransferStrategy;
+import org.dromara.daxpay.service.pay.bo.trade.TransferResultBo;
+import org.dromara.daxpay.service.pay.strategy.AbsTransferStrategy;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Scope;
diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/sub/AlipaySubAllocationStrategy.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/sub/AlipaySubAllocationStrategy.java
deleted file mode 100644
index cc9e304f..00000000
--- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/sub/AlipaySubAllocationStrategy.java
+++ /dev/null
@@ -1,62 +0,0 @@
-package org.dromara.daxpay.channel.alipay.strategy.sub;
-
-import org.dromara.daxpay.channel.alipay.entity.config.AliPayConfig;
-import org.dromara.daxpay.channel.alipay.service.payment.allocation.AlipayAllocationService;
-import org.dromara.daxpay.channel.alipay.service.payment.config.AlipayConfigService;
-import org.dromara.daxpay.core.enums.ChannelEnum;
-import org.dromara.daxpay.service.bo.allocation.AllocStartResultBo;
-import org.dromara.daxpay.service.bo.allocation.AllocSyncResultBo;
-import org.dromara.daxpay.service.strategy.AbsAllocationStrategy;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.stereotype.Component;
-
-/**
- * 支付宝分账
- * @author xxm
- * @since 2024/12/9
- */
-@Slf4j
-@Component
-@RequiredArgsConstructor
-public class AlipaySubAllocationStrategy extends AbsAllocationStrategy {
-
- private final AlipayAllocationService aliPayAllocationService;
-
- private final AlipayConfigService aliPayConfigService;
-
- /**
- * 分账通道
- */
- @Override
- public String getChannel() {
- return ChannelEnum.ALIPAY_ISV.getCode();
- }
-
- /**
- * 开始分账
- */
- @Override
- public AllocStartResultBo start() {
- AliPayConfig aliPayConfig = aliPayConfigService.getAliPayConfig(true);
- return aliPayAllocationService.start(getOrder(), getDetails(), aliPayConfig);
- }
-
- /**
- * 分账完结
- */
- @Override
- public void finish() {
- AliPayConfig aliPayConfig = aliPayConfigService.getAliPayConfig(true);
- aliPayAllocationService.finish(getOrder(), getDetails(), aliPayConfig);
- }
-
- /**
- * 同步状态
- */
- @Override
- public AllocSyncResultBo doSync() {
- AliPayConfig aliPayConfig = aliPayConfigService.getAliPayConfig(true);
- return aliPayAllocationService.sync(getOrder(), getDetails(), aliPayConfig);
- }
-}
diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/sub/AlipaySubAuthStrategy.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/sub/AlipaySubAuthStrategy.java
index f002586f..dc27a717 100644
--- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/sub/AlipaySubAuthStrategy.java
+++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/sub/AlipaySubAuthStrategy.java
@@ -8,7 +8,7 @@ import org.dromara.daxpay.core.param.assist.AuthCodeParam;
import org.dromara.daxpay.core.param.assist.GenerateAuthUrlParam;
import org.dromara.daxpay.core.result.assist.AuthResult;
import org.dromara.daxpay.core.result.assist.AuthUrlResult;
-import org.dromara.daxpay.service.strategy.AbsChannelAuthStrategy;
+import org.dromara.daxpay.service.pay.strategy.AbsChannelAuthStrategy;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/sub/AlipaySubChannelBasicStrategy.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/sub/AlipaySubChannelBasicStrategy.java
new file mode 100644
index 00000000..d1932d05
--- /dev/null
+++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/sub/AlipaySubChannelBasicStrategy.java
@@ -0,0 +1,43 @@
+package org.dromara.daxpay.channel.alipay.strategy.sub;
+
+import cn.bootx.platform.core.rest.dto.KeyValue;
+import org.dromara.daxpay.core.enums.ChannelEnum;
+import org.dromara.daxpay.service.pay.strategy.AbsChannelBasicStrategy;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.stream.Stream;
+
+import static org.dromara.daxpay.core.enums.PayMethodEnum.*;
+
+/**
+ *
+ * @author xxm
+ * @since 2025/6/4
+ */
+@Slf4j
+@Service
+@RequiredArgsConstructor
+public class AlipaySubChannelBasicStrategy extends AbsChannelBasicStrategy {
+ /**
+ * 获取通道的支付列表
+ */
+ @Override
+ public List payMethodList() {
+ return Stream.of(WAP,WEB,APP,QRCODE,BARCODE,JSAPI )
+ .map(payMethodEnum -> new KeyValue(payMethodEnum.getCode(), payMethodEnum.getName()))
+ .toList();
+ }
+
+ /**
+ * 策略标识, 可以自行进行扩展
+ *
+ * @see ChannelEnum
+ */
+ @Override
+ public String getChannel() {
+ return ChannelEnum.ALIPAY_ISV.getCode();
+ }
+}
diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/sub/AlipaySubCloseStrategy.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/sub/AlipaySubCloseStrategy.java
index 9555500f..6b7ed452 100644
--- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/sub/AlipaySubCloseStrategy.java
+++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/sub/AlipaySubCloseStrategy.java
@@ -5,7 +5,7 @@ import org.dromara.daxpay.channel.alipay.service.payment.close.AlipayCloseServic
import org.dromara.daxpay.channel.alipay.service.payment.config.AlipayConfigService;
import org.dromara.daxpay.core.enums.ChannelEnum;
import org.dromara.daxpay.core.enums.CloseTypeEnum;
-import org.dromara.daxpay.service.strategy.AbsPayCloseStrategy;
+import org.dromara.daxpay.service.pay.strategy.AbsPayCloseStrategy;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Scope;
diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/sub/AlipaySubGatewayPayStrategy.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/sub/AlipaySubGatewayPayStrategy.java
index 97a106e8..c0be2183 100644
--- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/sub/AlipaySubGatewayPayStrategy.java
+++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/sub/AlipaySubGatewayPayStrategy.java
@@ -1,7 +1,7 @@
package org.dromara.daxpay.channel.alipay.strategy.sub;
import org.dromara.daxpay.core.enums.ChannelEnum;
-import org.dromara.daxpay.service.strategy.AbsGatewayPayStrategy;
+import org.dromara.daxpay.service.pay.strategy.AbsGatewayPayStrategy;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@@ -16,6 +16,8 @@ import org.springframework.stereotype.Component;
@RequiredArgsConstructor
public class AlipaySubGatewayPayStrategy extends AbsGatewayPayStrategy {
+
+
/**
* 策略标识, 可以自行进行扩展
*
diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/sub/AlipaySubPayStrategy.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/sub/AlipaySubPayStrategy.java
index 329f2dff..93ac7bc8 100644
--- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/sub/AlipaySubPayStrategy.java
+++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/sub/AlipaySubPayStrategy.java
@@ -1,15 +1,14 @@
package org.dromara.daxpay.channel.alipay.strategy.sub;
+import cn.bootx.platform.common.jackson.util.JacksonUtil;
import cn.bootx.platform.core.exception.ValidationFailedException;
-import cn.bootx.platform.core.util.JsonUtil;
-import cn.hutool.json.JSONUtil;
import org.dromara.daxpay.channel.alipay.entity.config.AliPayConfig;
import org.dromara.daxpay.channel.alipay.param.pay.AlipayParam;
import org.dromara.daxpay.channel.alipay.service.payment.config.AlipayConfigService;
import org.dromara.daxpay.channel.alipay.service.payment.pay.AliPayService;
import org.dromara.daxpay.core.enums.ChannelEnum;
-import org.dromara.daxpay.service.bo.trade.PayResultBo;
-import org.dromara.daxpay.service.strategy.AbsPayStrategy;
+import org.dromara.daxpay.service.pay.bo.trade.PayResultBo;
+import org.dromara.daxpay.service.pay.strategy.AbsPayStrategy;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONException;
import lombok.RequiredArgsConstructor;
@@ -50,7 +49,7 @@ public class AlipaySubPayStrategy extends AbsPayStrategy {
// 支付宝参数验证
String channelParam = this.getPayParam().getExtraParam();
if (StrUtil.isNotBlank(channelParam)) {
- this.aliPayParam = JSONUtil.toBean(channelParam, AlipayParam.class);
+ this.aliPayParam = JacksonUtil.toBean(channelParam, AlipayParam.class);
}
else {
this.aliPayParam = new AlipayParam();
diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/sub/AlipaySubRefundStrategy.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/sub/AlipaySubRefundStrategy.java
index d1156d30..e237a4e1 100644
--- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/sub/AlipaySubRefundStrategy.java
+++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/sub/AlipaySubRefundStrategy.java
@@ -4,8 +4,8 @@ import org.dromara.daxpay.channel.alipay.entity.config.AliPayConfig;
import org.dromara.daxpay.channel.alipay.service.payment.config.AlipayConfigService;
import org.dromara.daxpay.channel.alipay.service.payment.refund.AlipayRefundService;
import org.dromara.daxpay.core.enums.ChannelEnum;
-import org.dromara.daxpay.service.bo.trade.RefundResultBo;
-import org.dromara.daxpay.service.strategy.AbsRefundStrategy;
+import org.dromara.daxpay.service.pay.bo.trade.RefundResultBo;
+import org.dromara.daxpay.service.pay.strategy.AbsRefundStrategy;
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
@@ -42,5 +42,8 @@ public class AlipaySubRefundStrategy extends AbsRefundStrategy {
public RefundResultBo doRefundHandler() {
AliPayConfig aliPayConfig = aliPayConfigService.getAliPayConfig(true);
return aliRefundService.refund(this.getRefundOrder(), aliPayConfig);
+ // TODO 模拟调试用
+// return new RefundResultBo().setStatus(RefundStatusEnum.SUCCESS)
+// .setFinishTime(LocalDateTime.now());
}
}
diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/sub/AlipaySubSyncOrderStrategy.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/sub/AlipaySubSyncOrderStrategy.java
index cf2a5454..a4700c35 100644
--- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/sub/AlipaySubSyncOrderStrategy.java
+++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/sub/AlipaySubSyncOrderStrategy.java
@@ -4,8 +4,8 @@ import org.dromara.daxpay.channel.alipay.entity.config.AliPayConfig;
import org.dromara.daxpay.channel.alipay.service.payment.config.AlipayConfigService;
import org.dromara.daxpay.channel.alipay.service.payment.sync.AlipaySyncService;
import org.dromara.daxpay.core.enums.ChannelEnum;
-import org.dromara.daxpay.service.bo.sync.PaySyncResultBo;
-import org.dromara.daxpay.service.strategy.AbsSyncPayOrderStrategy;
+import org.dromara.daxpay.service.pay.bo.sync.PaySyncResultBo;
+import org.dromara.daxpay.service.pay.strategy.AbsSyncPayOrderStrategy;
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/sub/AlipaySubSyncRefundStrategy.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/sub/AlipaySubSyncRefundStrategy.java
index 5a8bcb2b..e84c438e 100644
--- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/sub/AlipaySubSyncRefundStrategy.java
+++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/sub/AlipaySubSyncRefundStrategy.java
@@ -5,9 +5,9 @@ import org.dromara.daxpay.channel.alipay.service.payment.config.AlipayConfigServ
import org.dromara.daxpay.channel.alipay.service.payment.sync.AlipayRefundSyncService;
import org.dromara.daxpay.core.enums.ChannelEnum;
import org.dromara.daxpay.core.exception.OperationFailException;
-import org.dromara.daxpay.service.bo.sync.RefundSyncResultBo;
-import org.dromara.daxpay.service.entity.order.refund.RefundOrder;
-import org.dromara.daxpay.service.strategy.AbsSyncRefundOrderStrategy;
+import org.dromara.daxpay.service.pay.bo.sync.RefundSyncResultBo;
+import org.dromara.daxpay.service.pay.entity.order.refund.RefundOrder;
+import org.dromara.daxpay.service.pay.strategy.AbsSyncRefundOrderStrategy;
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
diff --git a/daxpay-open-channel/daxpay-open-channel-union/src/main/java/org/dromara/daxpay/channel/union/controller/UnionPayCallbackController.java b/daxpay-open-channel/daxpay-open-channel-union/src/main/java/org/dromara/daxpay/channel/union/controller/UnionPayCallbackController.java
index d031e68a..0b8409a4 100644
--- a/daxpay-open-channel/daxpay-open-channel-union/src/main/java/org/dromara/daxpay/channel/union/controller/UnionPayCallbackController.java
+++ b/daxpay-open-channel/daxpay-open-channel-union/src/main/java/org/dromara/daxpay/channel/union/controller/UnionPayCallbackController.java
@@ -1,7 +1,7 @@
package org.dromara.daxpay.channel.union.controller;
import cn.bootx.platform.core.annotation.IgnoreAuth;
-import org.dromara.daxpay.service.service.assist.PaymentAssistService;
+import org.dromara.daxpay.service.pay.service.assist.PaymentAssistService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.servlet.http.HttpServletRequest;
diff --git a/daxpay-open-channel/daxpay-open-channel-union/src/main/java/org/dromara/daxpay/channel/union/controller/UnionPayConfigController.java b/daxpay-open-channel/daxpay-open-channel-union/src/main/java/org/dromara/daxpay/channel/union/controller/UnionPayConfigController.java
index 6fccd36e..9529a794 100644
--- a/daxpay-open-channel/daxpay-open-channel-union/src/main/java/org/dromara/daxpay/channel/union/controller/UnionPayConfigController.java
+++ b/daxpay-open-channel/daxpay-open-channel-union/src/main/java/org/dromara/daxpay/channel/union/controller/UnionPayConfigController.java
@@ -1,5 +1,6 @@
package org.dromara.daxpay.channel.union.controller;
+import cn.bootx.platform.core.annotation.ClientCode;
import cn.bootx.platform.core.annotation.OperateLog;
import cn.bootx.platform.core.annotation.RequestGroup;
import cn.bootx.platform.core.annotation.RequestPath;
@@ -12,6 +13,7 @@ import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.constraints.NotNull;
import lombok.RequiredArgsConstructor;
+import org.dromara.daxpay.service.common.code.DaxPayCode;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
@@ -23,6 +25,7 @@ import org.springframework.web.bind.annotation.*;
@Validated
@Tag(name = "云闪付支付配置")
@RestController
+@ClientCode({DaxPayCode.Client.ADMIN, DaxPayCode.Client.MERCHANT})
@RequestGroup(groupCode = "UnionPayConfig", groupName = "云闪付配置", moduleCode = "UnionPay", moduleName = "(DaxPay通道)云闪付")
@RequestMapping("/union/pay/config")
@RequiredArgsConstructor
diff --git a/daxpay-open-channel/daxpay-open-channel-union/src/main/java/org/dromara/daxpay/channel/union/controller/UnionPayRedirectUrlController.java b/daxpay-open-channel/daxpay-open-channel-union/src/main/java/org/dromara/daxpay/channel/union/controller/UnionPayRedirectUrlController.java
index 17ba5512..e10eeca0 100644
--- a/daxpay-open-channel/daxpay-open-channel-union/src/main/java/org/dromara/daxpay/channel/union/controller/UnionPayRedirectUrlController.java
+++ b/daxpay-open-channel/daxpay-open-channel-union/src/main/java/org/dromara/daxpay/channel/union/controller/UnionPayRedirectUrlController.java
@@ -1,11 +1,11 @@
package org.dromara.daxpay.channel.union.controller;
import cn.bootx.platform.core.annotation.IgnoreAuth;
-import org.dromara.daxpay.service.service.assist.PaymentAssistService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor;
+import org.dromara.daxpay.service.pay.service.assist.PaymentAssistService;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
diff --git a/daxpay-open-channel/daxpay-open-channel-union/src/main/java/org/dromara/daxpay/channel/union/entity/config/UnionPayConfig.java b/daxpay-open-channel/daxpay-open-channel-union/src/main/java/org/dromara/daxpay/channel/union/entity/config/UnionPayConfig.java
index 63b2b9ba..d019c7d3 100644
--- a/daxpay-open-channel/daxpay-open-channel-union/src/main/java/org/dromara/daxpay/channel/union/entity/config/UnionPayConfig.java
+++ b/daxpay-open-channel/daxpay-open-channel-union/src/main/java/org/dromara/daxpay/channel/union/entity/config/UnionPayConfig.java
@@ -8,9 +8,9 @@ import org.dromara.daxpay.channel.union.code.UnionPayCode;
import org.dromara.daxpay.channel.union.convert.UnionPayConfigConvert;
import org.dromara.daxpay.channel.union.result.UnionPayConfigResult;
import org.dromara.daxpay.core.enums.ChannelEnum;
-import org.dromara.daxpay.service.entity.config.ChannelConfig;
import lombok.Data;
import lombok.experimental.Accessors;
+import org.dromara.daxpay.service.pay.entity.config.ChannelConfig;
import java.util.Objects;
diff --git a/daxpay-open-channel/daxpay-open-channel-union/src/main/java/org/dromara/daxpay/channel/union/result/UnionPayConfigResult.java b/daxpay-open-channel/daxpay-open-channel-union/src/main/java/org/dromara/daxpay/channel/union/result/UnionPayConfigResult.java
index 07ac2059..95c46c39 100644
--- a/daxpay-open-channel/daxpay-open-channel-union/src/main/java/org/dromara/daxpay/channel/union/result/UnionPayConfigResult.java
+++ b/daxpay-open-channel/daxpay-open-channel-union/src/main/java/org/dromara/daxpay/channel/union/result/UnionPayConfigResult.java
@@ -1,11 +1,11 @@
package org.dromara.daxpay.channel.union.result;
import cn.bootx.platform.common.jackson.sensitive.SensitiveInfo;
-import org.dromara.daxpay.service.common.result.MchResult;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
+import org.dromara.daxpay.service.merchant.result.info.MchResult;
/**
* @author xxm
diff --git a/daxpay-open-channel/daxpay-open-channel-union/src/main/java/org/dromara/daxpay/channel/union/service/config/UnionPayConfigService.java b/daxpay-open-channel/daxpay-open-channel-union/src/main/java/org/dromara/daxpay/channel/union/service/config/UnionPayConfigService.java
index ac7fd33c..7dc6e90d 100644
--- a/daxpay-open-channel/daxpay-open-channel-union/src/main/java/org/dromara/daxpay/channel/union/service/config/UnionPayConfigService.java
+++ b/daxpay-open-channel/daxpay-open-channel-union/src/main/java/org/dromara/daxpay/channel/union/service/config/UnionPayConfigService.java
@@ -7,18 +7,16 @@ import org.dromara.daxpay.channel.union.param.config.UnionPayConfigParam;
import org.dromara.daxpay.core.enums.ChannelEnum;
import org.dromara.daxpay.core.exception.ConfigNotEnableException;
import org.dromara.daxpay.core.exception.DataErrorException;
-import org.dromara.daxpay.service.common.cache.ChannelConfigCacheService;
-import org.dromara.daxpay.core.context.MchAppLocal;
-import org.dromara.daxpay.service.common.local.MchContextLocal;
-import org.dromara.daxpay.service.common.local.PaymentContextLocal;
-import org.dromara.daxpay.service.dao.config.ChannelConfigManager;
-import org.dromara.daxpay.service.entity.config.ChannelConfig;
-import org.dromara.daxpay.service.service.config.PlatformConfigService;
+import org.dromara.daxpay.core.context.PaymentReqInfoLocal;
+import org.dromara.daxpay.service.merchant.cache.ChannelConfigCacheService;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.bean.copier.CopyOptions;
import cn.hutool.core.util.StrUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
+import org.dromara.daxpay.service.merchant.dao.config.ChannelConfigManager;
+import org.dromara.daxpay.service.pay.common.local.PaymentContextLocal;
+import org.dromara.daxpay.service.pay.entity.config.ChannelConfig;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -34,7 +32,6 @@ public class UnionPayConfigService {
private final ChannelConfigManager channelConfigManager;
private final ChannelConfigCacheService channelConfigCacheService;
- private final PlatformConfigService platformConfigService;
/**
* 查询
@@ -91,8 +88,8 @@ public class UnionPayConfigService {
* 获取支付宝支付配置
*/
public UnionPayConfig getUnionPayConfig(){
- MchAppLocal mchAppInfo = PaymentContextLocal.get().getMchAppInfo();
- ChannelConfig channelConfig = channelConfigCacheService.getMchChannelConfig(mchAppInfo.getAppId(), ChannelEnum.ALIPAY.getCode());
+ PaymentReqInfoLocal reqInfo = PaymentContextLocal.get().getReqInfo();
+ ChannelConfig channelConfig = channelConfigCacheService.getMchChannelConfig(reqInfo.getAppId(), ChannelEnum.ALIPAY.getCode());
return UnionPayConfig.convertConfig(channelConfig);
}
@@ -100,16 +97,16 @@ public class UnionPayConfigService {
* 获取支步通知地址
*/
public String getNotifyUrl() {
- var mchAppInfo = PaymentContextLocal.get().getMchAppInfo();
- return StrUtil.format("{}/unipay/callback/{}/union",mchAppInfo.getGatewayServiceUrl(), mchAppInfo.getAppId());
+ var reqInfo = PaymentContextLocal.get().getReqInfo();
+ return StrUtil.format("{}/unipay/callback/{}/union",reqInfo.getGatewayServiceUrl(), reqInfo.getAppId());
}
/**
* 获取同步通知地址
*/
public String getReturnUrl() {
- MchAppLocal mchAppInfo = PaymentContextLocal.get().getMchAppInfo();
- return StrUtil.format("{}/unipay/return/{}/union",mchAppInfo.getGatewayServiceUrl(),mchAppInfo.getAppId());
+ PaymentReqInfoLocal reqInfo = PaymentContextLocal.get().getReqInfo();
+ return StrUtil.format("{}/unipay/return/{}/union",reqInfo.getGatewayServiceUrl(),reqInfo.getAppId());
}
}
diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/controller/allocation/WechatAllocReceiverBindController.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/controller/allocation/WechatAllocReceiverBindController.java
deleted file mode 100644
index 5c7c124f..00000000
--- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/controller/allocation/WechatAllocReceiverBindController.java
+++ /dev/null
@@ -1,98 +0,0 @@
-package org.dromara.daxpay.channel.wechat.controller.allocation;
-
-import cn.bootx.platform.core.annotation.OperateLog;
-import cn.bootx.platform.core.annotation.RequestGroup;
-import cn.bootx.platform.core.annotation.RequestPath;
-import cn.bootx.platform.core.rest.Res;
-import cn.bootx.platform.core.rest.param.PageParam;
-import cn.bootx.platform.core.rest.result.PageResult;
-import cn.bootx.platform.core.rest.result.Result;
-import cn.bootx.platform.core.validation.ValidationGroup;
-import org.dromara.daxpay.channel.wechat.param.allocation.WechatAllocReceiverBindParam;
-import org.dromara.daxpay.channel.wechat.param.allocation.WechatAllocReceiverBindQuery;
-import org.dromara.daxpay.channel.wechat.result.allocation.WechatAllocReceiverBindResult;
-import org.dromara.daxpay.channel.wechat.service.allocation.WechatAllocReceiverBindService;
-import org.dromara.core.trans.anno.TransMethodResult;
-import io.swagger.v3.oas.annotations.Operation;
-import io.swagger.v3.oas.annotations.tags.Tag;
-import jakarta.validation.constraints.NotNull;
-import lombok.RequiredArgsConstructor;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.*;
-
-/**
- * 微信分账接收方绑定
- * @author xxm
- * @since 2025/1/27
- */
-@Validated
-@Tag(name = "微信分账接收方绑定")
-@RestController
-@RequestGroup(groupCode = "WechatAllocReceiver", groupName = "微信分账接收方", moduleCode = "wechatPay")
-@RequestMapping("/wechat/allocation/receiver/bind")
-@RequiredArgsConstructor
-public class WechatAllocReceiverBindController {
-
- private final WechatAllocReceiverBindService receiverBindService;
-
- @TransMethodResult
- @RequestPath("分页")
- @Operation(summary = "分页")
- @GetMapping("/page")
- public Result> page(PageParam pageParam, WechatAllocReceiverBindQuery param){
- return Res.ok(receiverBindService.page(pageParam,param));
- }
-
- @TransMethodResult
- @RequestPath("详情")
- @Operation(summary = "详情")
- @GetMapping("/findById")
- public Result findById(@NotNull(message = "主键不可为空") Long id){
- return Res.ok(receiverBindService.findById(id));
- }
-
- @RequestPath("添加")
- @Operation(summary = "添加")
- @PostMapping("/add")
- @OperateLog(title = "添加微信分账接收方绑定 ", businessType = OperateLog.BusinessType.ADD, saveParam = true)
- public Result add(@RequestBody @Validated(ValidationGroup.add.class) WechatAllocReceiverBindParam param){
- receiverBindService.add(param);
- return Res.ok();
- }
-
- @RequestPath("编辑")
- @Operation(summary = "编辑")
- @PostMapping("/update")
- @OperateLog(title = "编辑支付宝分账接收方绑定", businessType = OperateLog.BusinessType.UPDATE, saveParam = true)
- public Result update(@RequestBody @Validated(ValidationGroup.edit.class) WechatAllocReceiverBindParam param){
- receiverBindService.update(param);
- return Res.ok();
- }
-
- @RequestPath("绑定")
- @Operation(summary = "绑定")
- @PostMapping("/bind")
- @OperateLog(title = "绑定微信分账接收方绑定", businessType = OperateLog.BusinessType.UPDATE, saveParam = true)
- public Result bind(@NotNull(message = "主键不可为空") Long id){
- receiverBindService.bind(id);
- return Res.ok();
- }
-
- @RequestPath("解绑")
- @Operation(summary = "解绑")
- @PostMapping("/unbind")
- @OperateLog(title = "解绑微信分账接收方绑定", businessType = OperateLog.BusinessType.UPDATE, saveParam = true)
- public Result unbind(@NotNull(message = "主键不可为空") Long id){
- receiverBindService.unbind(id);
- return Res.ok();
- }
-
- @RequestPath("删除")
- @Operation(summary = "删除")
- @PostMapping("/remove")
- @OperateLog(title = "删除微信分账接收方绑定", businessType = OperateLog.BusinessType.DELETE, saveParam = true)
- public Result remove(@NotNull(message = "主键不可为空") Long id){
- receiverBindService.remove(id);
- return Res.ok();
- }
-}
diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/controller/allocation/WechatAllocReceiverController.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/controller/allocation/WechatAllocReceiverController.java
deleted file mode 100644
index 382e6629..00000000
--- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/controller/allocation/WechatAllocReceiverController.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package org.dromara.daxpay.channel.wechat.controller.allocation;
-
-import cn.bootx.platform.core.annotation.OperateLog;
-import cn.bootx.platform.core.annotation.RequestGroup;
-import cn.bootx.platform.core.annotation.RequestPath;
-import cn.bootx.platform.core.rest.Res;
-import cn.bootx.platform.core.rest.result.Result;
-import org.dromara.daxpay.channel.wechat.param.allocation.WechatAllocReceiverParam;
-import org.dromara.daxpay.channel.wechat.result.allocation.WechatAllocReceiverResult;
-import org.dromara.daxpay.channel.wechat.service.allocation.WechatAllocReceiverService;
-import io.swagger.v3.oas.annotations.Operation;
-import io.swagger.v3.oas.annotations.tags.Tag;
-import jakarta.validation.constraints.NotNull;
-import lombok.RequiredArgsConstructor;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.*;
-
-/**
- * 微信分账接收方
- * @author xxm
- * @since 2025/1/26
- */
-@Validated
-@Tag(name = "微信分账接收方管理")
-@RestController
-@RequestGroup(groupCode = "WechatAllocReceiver", moduleCode = "wechatPay")
-@RequestMapping("/wechat/allocation/receiver")
-@RequiredArgsConstructor
-public class WechatAllocReceiverController {
- private final WechatAllocReceiverService receiverService;
-
- @RequestPath("分账接收方详情")
- @Operation(summary = "分账接收方详情")
- @GetMapping("/findById")
- public Result findById(@NotNull(message = "主键不可为空") Long id) {
- return Res.ok(receiverService.findById(id));
- }
-
- @RequestPath("添加或更新分账接收方")
- @Operation(summary = "添加或更新分账接收方")
- @PostMapping("/saveOrUpdate")
- @OperateLog(title = "添加或更新微信分账接收方", businessType = OperateLog.BusinessType.UPDATE, saveParam = true)
- public Result saveOrUpdate(@RequestBody @Validated WechatAllocReceiverParam param) {
- receiverService.saveOrUpdate(param);
- return Res.ok();
- }
-
-}
diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/controller/isv/WechatIsvConfigController.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/controller/isv/WechatIsvConfigController.java
new file mode 100644
index 00000000..986e6386
--- /dev/null
+++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/controller/isv/WechatIsvConfigController.java
@@ -0,0 +1,54 @@
+package org.dromara.daxpay.channel.wechat.controller.isv;
+
+import cn.bootx.platform.core.annotation.ClientCode;
+import cn.bootx.platform.core.annotation.OperateLog;
+import cn.bootx.platform.core.annotation.RequestGroup;
+import cn.bootx.platform.core.annotation.RequestPath;
+import cn.bootx.platform.core.rest.Res;
+import cn.bootx.platform.core.rest.result.Result;
+import cn.bootx.platform.core.util.ValidationUtil;
+import org.dromara.daxpay.channel.wechat.param.config.WechatIsvConfigParam;
+import org.dromara.daxpay.channel.wechat.result.config.WechatIsvConfigResult;
+import org.dromara.daxpay.channel.wechat.service.isv.WechatIsvConfigService;
+import org.dromara.daxpay.service.common.code.DaxPayCode;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.validation.constraints.NotNull;
+import lombok.AllArgsConstructor;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * 微信支付配置
+ * @author xxm
+ * @since 2021/3/19
+ */
+@ClientCode({DaxPayCode.Client.ADMIN})
+@Validated
+@Tag(name = "微信服务商配置")
+@RestController
+@RequestMapping("/isv/wechat/config")
+@RequestGroup(groupCode = "WechatIsvConfig", groupName = "微信服务商配置", moduleCode = "wechatPay", moduleName = "(DaxPay通道)微信支付")
+@AllArgsConstructor
+public class WechatIsvConfigController {
+
+ private final WechatIsvConfigService wechatPayConfigService;
+
+ @RequestPath("获取配置")
+ @Operation(summary = "获取配置")
+ @GetMapping("/findById")
+ public Result findById(@NotNull(message = "ID不可为空") Long id) {
+ return Res.ok(wechatPayConfigService.findById(id));
+ }
+
+ @RequestPath("新增或更新")
+ @Operation(summary = "新增或更新")
+ @PostMapping("/saveOrUpdate")
+ @OperateLog(title = "新增或更新微信支付配置", businessType = OperateLog.BusinessType.UPDATE, saveParam = true)
+ public Result saveOrUpdate(@RequestBody @Validated WechatIsvConfigParam param) {
+ ValidationUtil.validateParam(param);
+ wechatPayConfigService.saveOrUpdate(param);
+ return Res.ok();
+ }
+
+}
diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/controller/payment/WechatPayCallbackController.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/controller/payment/WechatPayCallbackController.java
index d0e1d860..abeeb6db 100644
--- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/controller/payment/WechatPayCallbackController.java
+++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/controller/payment/WechatPayCallbackController.java
@@ -1,14 +1,14 @@
package org.dromara.daxpay.channel.wechat.controller.payment;
import cn.bootx.platform.core.annotation.IgnoreAuth;
+import org.dromara.daxpay.channel.wechat.service.payment.callback.WechatPayCallbackService;
+import org.dromara.daxpay.channel.wechat.service.payment.callback.WechatRefundCallbackService;
+import org.dromara.daxpay.channel.wechat.service.payment.callback.WechatTransferCallbackService;
+import org.dromara.daxpay.service.pay.service.assist.PaymentAssistService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor;
-import org.dromara.daxpay.channel.wechat.service.payment.callback.WechatPayCallbackService;
-import org.dromara.daxpay.channel.wechat.service.payment.callback.WechatRefundCallbackService;
-import org.dromara.daxpay.channel.wechat.service.payment.callback.WechatTransferCallbackService;
-import org.dromara.daxpay.service.service.assist.PaymentAssistService;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
@@ -25,7 +25,7 @@ import org.springframework.web.bind.annotation.RestController;
@IgnoreAuth
@Tag(name = "微信回调通知控制器")
@RestController
-@RequestMapping("/unipay/callback/{AppId}/wechat")
+@RequestMapping("/unipay/callback/{mchNo}/{AppId}/wechat")
@RequiredArgsConstructor
public class WechatPayCallbackController {
private final WechatTransferCallbackService transferCallbackService;
@@ -35,44 +35,44 @@ public class WechatPayCallbackController {
@Operation(summary = "微信支付回调(普通商户)")
@PostMapping("/pay")
- public String wechatPayNotify(@PathVariable("AppId") String appId,HttpServletRequest request) {
- paymentAssistService.initMchAndApp(appId);
+ public String wechatPayNotify(@PathVariable("mchNo") String mchNo, @PathVariable("AppId") String appId,HttpServletRequest request) {
+ paymentAssistService.initMchAndApp(mchNo, appId);
return payCallbackService.payHandle(request,false);
}
@Operation(summary = "微信支付回调(特约商户)")
@PostMapping("/isv/pay")
- public String wechatPayIsvNotify(@PathVariable("AppId") String appId,HttpServletRequest request) {
- paymentAssistService.initMchAndApp(appId);
+ public String wechatPayIsvNotify(@PathVariable("mchNo") String mchNo, @PathVariable("AppId") String appId,HttpServletRequest request) {
+ paymentAssistService.initMchAndApp(mchNo, appId);
return payCallbackService.payHandle(request,true);
}
@Operation(summary = "微信退款回调(普通商户)")
@PostMapping("/refund")
- public String wechatRefundNotify(@PathVariable("AppId") String appId,HttpServletRequest request) {
- paymentAssistService.initMchAndApp(appId);
+ public String wechatRefundNotify(@PathVariable("mchNo") String mchNo, @PathVariable("AppId") String appId,HttpServletRequest request) {
+ paymentAssistService.initMchAndApp(mchNo, appId);
return refundCallbackService.refundHandle(request,false);
}
@Operation(summary = "微信退款回调(特约商户)")
@PostMapping("/isv/refund")
- public String wechatIsvRefundNotify(@PathVariable("AppId") String appId,HttpServletRequest request) {
- paymentAssistService.initMchAndApp(appId);
+ public String wechatIsvRefundNotify(@PathVariable("mchNo") String mchNo, @PathVariable("AppId") String appId,HttpServletRequest request) {
+ paymentAssistService.initMchAndApp(mchNo, appId);
return refundCallbackService.refundHandle(request,true);
}
@Operation(summary = "微信转账回调(普通商户)")
@PostMapping("/transfer")
- public String wechatTransferNotify(@PathVariable("AppId") String appId, HttpServletRequest request) {
- paymentAssistService.initMchAndApp(appId);
+ public String wechatTransferNotify(@PathVariable("mchNo") String mchNo, @PathVariable("AppId") String appId, HttpServletRequest request) {
+ paymentAssistService.initMchAndApp(mchNo, appId);
return transferCallbackService.transferHandle(request,false);
}
@Operation(summary = "微信转账回调(特约商户)")
@PostMapping("/isv/transfer")
- public String wechatIsvTransferNotify(@PathVariable("AppId") String appId, HttpServletRequest request) {
- paymentAssistService.initMchAndApp(appId);
+ public String wechatIsvTransferNotify(@PathVariable("mchNo") String mchNo, @PathVariable("AppId") String appId, HttpServletRequest request) {
+ paymentAssistService.initMchAndApp(mchNo, appId);
return transferCallbackService.transferHandle(request,true);
}
}
diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/controller/payment/WechatPayConfigController.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/controller/payment/WechatPayConfigController.java
index 0bcd4617..67ec728d 100644
--- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/controller/payment/WechatPayConfigController.java
+++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/controller/payment/WechatPayConfigController.java
@@ -1,13 +1,18 @@
package org.dromara.daxpay.channel.wechat.controller.payment;
+import cn.bootx.platform.core.annotation.ClientCode;
+import cn.bootx.platform.core.annotation.OperateLog;
import cn.bootx.platform.core.annotation.RequestGroup;
import cn.bootx.platform.core.annotation.RequestPath;
import cn.bootx.platform.core.rest.Res;
import cn.bootx.platform.core.rest.result.Result;
import cn.bootx.platform.core.util.ValidationUtil;
import org.dromara.daxpay.channel.wechat.param.config.WechatPayConfigParam;
+import org.dromara.daxpay.channel.wechat.param.config.WechatPaySubConfigParam;
import org.dromara.daxpay.channel.wechat.result.config.WechatPayConfigResult;
+import org.dromara.daxpay.channel.wechat.result.config.WechatPaySubConfigResult;
import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService;
+import org.dromara.daxpay.service.common.code.DaxPayCode;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.constraints.NotNull;
@@ -20,6 +25,7 @@ import org.springframework.web.bind.annotation.*;
* @author xxm
* @since 2021/3/19
*/
+@ClientCode({DaxPayCode.Client.ADMIN, DaxPayCode.Client.MERCHANT})
@Validated
@Tag(name = "微信支付配置")
@RestController
@@ -37,6 +43,13 @@ public class WechatPayConfigController {
return Res.ok(wechatPayConfigService.findById(id));
}
+ @RequestPath("获取特约商户配置")
+ @Operation(summary = "获取特约商户配置")
+ @GetMapping("/findSubById")
+ public Result findSubById(@NotNull(message = "ID不可为空") Long id) {
+ return Res.ok(wechatPayConfigService.findSubById(id));
+ }
+
@RequestPath("新增或更新商户配置")
@Operation(summary = "新增或更新商户配置")
@PostMapping("/saveOrUpdate")
@@ -46,4 +59,14 @@ public class WechatPayConfigController {
return Res.ok();
}
+ @RequestPath("新增或更新特约商户配置")
+ @Operation(summary = "新增或更新特约商户配置")
+ @PostMapping("/saveOrUpdateSub")
+ @OperateLog(title = "新增或更新微信特约商户支付配置", businessType = OperateLog.BusinessType.UPDATE, saveParam = true)
+ public Result saveOrUpdateSub(@RequestBody @Validated WechatPaySubConfigParam param) {
+ ValidationUtil.validateParam(param);
+ wechatPayConfigService.saveOrUpdateSub(param);
+ return Res.ok();
+ }
+
}
diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/convert/WechatAllocReceiverBindConvert.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/convert/WechatAllocReceiverBindConvert.java
deleted file mode 100644
index ba9feb7c..00000000
--- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/convert/WechatAllocReceiverBindConvert.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package org.dromara.daxpay.channel.wechat.convert;
-
-import org.dromara.daxpay.channel.wechat.entity.allocation.WechatAllocReceiverBind;
-import org.dromara.daxpay.channel.wechat.param.allocation.WechatAllocReceiverBindParam;
-import org.dromara.daxpay.channel.wechat.result.allocation.WechatAllocReceiverBindResult;
-import org.mapstruct.Mapper;
-import org.mapstruct.factory.Mappers;
-
-/**
- *
- * @author xxm
- * @since 2025/1/27
- */
-@Mapper
-public interface WechatAllocReceiverBindConvert {
- WechatAllocReceiverBindConvert CONVERT = Mappers.getMapper(WechatAllocReceiverBindConvert.class);
-
- WechatAllocReceiverBindResult toResult(WechatAllocReceiverBind wxReceiver);
-
- WechatAllocReceiverBind toEntity(WechatAllocReceiverBindParam wxReceiver);
-}
diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/convert/WechatAllocReceiverConvert.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/convert/WechatAllocReceiverConvert.java
deleted file mode 100644
index 84eda4ed..00000000
--- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/convert/WechatAllocReceiverConvert.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package org.dromara.daxpay.channel.wechat.convert;
-
-import org.dromara.daxpay.channel.wechat.entity.allocation.WechatAllocReceiver;
-import org.dromara.daxpay.channel.wechat.param.allocation.WechatAllocReceiverParam;
-import org.dromara.daxpay.channel.wechat.result.allocation.WechatAllocReceiverResult;
-import org.mapstruct.Mapper;
-import org.mapstruct.factory.Mappers;
-
-/**
- *
- * @author xxm
- * @since 2025/1/26
- */
-@Mapper
-public interface WechatAllocReceiverConvert {
- WechatAllocReceiverConvert CONVERT = Mappers.getMapper(WechatAllocReceiverConvert.class);
-
- WechatAllocReceiver copy(WechatAllocReceiver wechatAllocReceiver);
-
- WechatAllocReceiverResult toResult(WechatAllocReceiver wechatAllocReceiver);
-
- WechatAllocReceiver toEntity(WechatAllocReceiverParam param);
-}
diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/convert/WechatIsvConfigConvert.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/convert/WechatIsvConfigConvert.java
new file mode 100644
index 00000000..d64864b7
--- /dev/null
+++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/convert/WechatIsvConfigConvert.java
@@ -0,0 +1,25 @@
+package org.dromara.daxpay.channel.wechat.convert;
+
+import org.dromara.daxpay.channel.wechat.entity.config.WechatIsvConfig;
+import org.dromara.daxpay.channel.wechat.param.config.WechatIsvConfigParam;
+import org.dromara.daxpay.channel.wechat.result.config.WechatIsvConfigResult;
+import org.mapstruct.Mapper;
+import org.mapstruct.factory.Mappers;
+
+/**
+ *
+ * @author xxm
+ * @since 2024/11/1
+ */
+@Mapper
+public interface WechatIsvConfigConvert {
+ WechatIsvConfigConvert CONVERT = Mappers.getMapper(WechatIsvConfigConvert.class);
+
+ WechatIsvConfigResult toResult(WechatIsvConfig wechatIsvConfig);
+
+ WechatIsvConfig toEntity(WechatIsvConfigParam wechatIsvConfigParam);
+
+ WechatIsvConfig copy(WechatIsvConfig wechatIsvConfig);
+
+
+}
diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/convert/WechatPaySubConfigConvert.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/convert/WechatPaySubConfigConvert.java
new file mode 100644
index 00000000..8a565d18
--- /dev/null
+++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/convert/WechatPaySubConfigConvert.java
@@ -0,0 +1,23 @@
+package org.dromara.daxpay.channel.wechat.convert;
+
+import org.dromara.daxpay.channel.wechat.entity.config.WechatPaySubConfig;
+import org.dromara.daxpay.channel.wechat.param.config.WechatPaySubConfigParam;
+import org.dromara.daxpay.channel.wechat.result.config.WechatPaySubConfigResult;
+import org.mapstruct.Mapper;
+import org.mapstruct.factory.Mappers;
+
+/**
+ *
+ * @author xxm
+ * @since 2025/2/11
+ */
+@Mapper
+public interface WechatPaySubConfigConvert {
+ WechatPaySubConfigConvert CONVERT = Mappers.getMapper(WechatPaySubConfigConvert.class);
+
+ WechatPaySubConfig toEntity(WechatPaySubConfigParam in);
+
+ WechatPaySubConfig copy(WechatPaySubConfig in);
+
+ WechatPaySubConfigResult toResult(WechatPaySubConfig in);
+}
diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/dao/allocation/WechatAllocReceiverBindManager.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/dao/allocation/WechatAllocReceiverBindManager.java
deleted file mode 100644
index f898ec48..00000000
--- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/dao/allocation/WechatAllocReceiverBindManager.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package org.dromara.daxpay.channel.wechat.dao.allocation;
-
-import cn.bootx.platform.common.mybatisplus.impl.BaseManager;
-import cn.bootx.platform.common.mybatisplus.query.generator.QueryGenerator;
-import cn.bootx.platform.common.mybatisplus.util.MpUtil;
-import cn.bootx.platform.core.rest.param.PageParam;
-import org.dromara.daxpay.channel.wechat.entity.allocation.WechatAllocReceiverBind;
-import org.dromara.daxpay.channel.wechat.param.allocation.WechatAllocReceiverBindQuery;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.stereotype.Repository;
-
-/**
- *
- * @author xxm
- * @since 2025/1/27
- */
-@Slf4j
-@Repository
-@RequiredArgsConstructor
-public class WechatAllocReceiverBindManager extends BaseManager {
-
- /**
- * 分页
- */
- public Page page(PageParam pageParam, WechatAllocReceiverBindQuery param) {
- var mpPage = MpUtil.getMpPage(pageParam, WechatAllocReceiverBind.class);
- QueryWrapper generator = QueryGenerator.generator(param);
- return page(mpPage, generator);
- }
-}
diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/dao/allocation/WechatAllocReceiverBindMapper.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/dao/allocation/WechatAllocReceiverBindMapper.java
deleted file mode 100644
index 3f0c8d92..00000000
--- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/dao/allocation/WechatAllocReceiverBindMapper.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package org.dromara.daxpay.channel.wechat.dao.allocation;
-
-import org.dromara.daxpay.channel.wechat.entity.allocation.WechatAllocReceiverBind;
-import com.github.yulichang.base.MPJBaseMapper;
-import org.apache.ibatis.annotations.Mapper;
-
-/**
- *
- * @author xxm
- * @since 2025/1/27
- */
-@Mapper
-public interface WechatAllocReceiverBindMapper extends MPJBaseMapper {
-}
diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/entity/allocation/WechatAllocReceiver.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/entity/allocation/WechatAllocReceiver.java
deleted file mode 100644
index d87fc562..00000000
--- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/entity/allocation/WechatAllocReceiver.java
+++ /dev/null
@@ -1,84 +0,0 @@
-package org.dromara.daxpay.channel.wechat.entity.allocation;
-
-import cn.bootx.platform.common.mybatisplus.function.ToResult;
-import cn.bootx.platform.core.util.JsonUtil;
-import cn.hutool.json.JSONUtil;
-import lombok.Data;
-import lombok.experimental.Accessors;
-import org.dromara.daxpay.channel.wechat.convert.WechatAllocReceiverConvert;
-import org.dromara.daxpay.channel.wechat.result.allocation.WechatAllocReceiverResult;
-import org.dromara.daxpay.core.enums.ChannelEnum;
-import org.dromara.daxpay.service.entity.allocation.receiver.AllocReceiver;
-
-/**
- * 微信分账接收方
- * @author xxm
- * @since 2025/1/25
- */
-@Data
-@Accessors(chain = true)
-public class WechatAllocReceiver implements ToResult {
-
- /** 主键 */
- private Long id;
-
- /** 分账接收方编号, 需要保证唯一 */
- private String receiverNo;
-
- /** 接收方名称 */
- private String receiverName;
-
- /** 接收方账号 */
- private String receiverAccount;
-
- /** 接收方类型 */
- private String receiverType;
-
- /** 分账关系类型 */
- private String relationType;
-
- /** 分账关系名称 */
- private String relationName;
-
- /** 商户AppId */
- private String appId;
-
- /**
- * 转换为通用接收方
- */
- public AllocReceiver toReceiver(boolean isv) {
- var receiver = new AllocReceiver();
- receiver.setId(this.getId());
- receiver.setAppId(this.getAppId());
- receiver.setReceiverNo(this.getReceiverNo());
- receiver.setReceiverType(this.getReceiverType());
- receiver.setReceiverName(this.getReceiverName());
- receiver.setReceiverAccount(this.getReceiverAccount());
- receiver.setChannel(isv ? ChannelEnum.WECHAT_ISV.getCode() : ChannelEnum.WECHAT.getCode());
- var copy = WechatAllocReceiverConvert.CONVERT.copy(this);
- // 清空不需要序列化的字段
- copy.setId(null).setReceiverNo(null).setReceiverName(null).setReceiverAccount(null);
- String jsonStr = JsonUtil.toJsonStr(copy);
- receiver.setExt(jsonStr);
- return receiver;
- }
-
- /**
- * 转换为通道接收方
- */
- public static WechatAllocReceiver convertChannel(AllocReceiver receiver) {
- var leshuaAllocReceiver = JSONUtil.toBean(receiver.getExt(), WechatAllocReceiver.class);
- leshuaAllocReceiver.setId(receiver.getId())
- .setReceiverNo(receiver.getReceiverNo())
- .setReceiverName(receiver.getReceiverName())
- .setReceiverType(receiver.getReceiverType())
- .setReceiverAccount(receiver.getReceiverAccount());
- return leshuaAllocReceiver;
- }
-
- @Override
- public WechatAllocReceiverResult toResult() {
- return WechatAllocReceiverConvert.CONVERT.toResult(this);
- }
-
-}
diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/entity/allocation/WechatAllocReceiverBind.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/entity/allocation/WechatAllocReceiverBind.java
deleted file mode 100644
index 0e1e1562..00000000
--- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/entity/allocation/WechatAllocReceiverBind.java
+++ /dev/null
@@ -1,59 +0,0 @@
-package org.dromara.daxpay.channel.wechat.entity.allocation;
-
-import cn.bootx.platform.common.mybatisplus.function.ToResult;
-import com.baomidou.mybatisplus.annotation.FieldStrategy;
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableName;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.experimental.Accessors;
-import org.dromara.daxpay.channel.wechat.convert.WechatAllocReceiverBindConvert;
-import org.dromara.daxpay.channel.wechat.param.allocation.WechatAllocReceiverBindParam;
-import org.dromara.daxpay.channel.wechat.result.allocation.WechatAllocReceiverBindResult;
-import org.dromara.daxpay.service.common.entity.MchAppBaseEntity;
-
-/**
- * 微信分账接收方绑定
- * @author xxm
- * @since 2025/1/27
- */
-@EqualsAndHashCode(callSuper = true)
-@Data
-@Accessors(chain = true)
-@TableName("pay_wechat_alloc_receiver_bind")
-public class WechatAllocReceiverBind extends MchAppBaseEntity implements ToResult {
-
- /** 接收方名称 */
- private String receiverName;
-
- /** 接收方账号 */
- private String receiverAccount;
-
- /** 接收方类型 */
- private String receiverType;
-
- /** 分账关系类型 */
- private String relationType;
-
- /** 分账关系名称 */
- private String relationName;
-
- /** 是否服务商模式 */
- private boolean isv;
-
- /** 是否绑定 */
- private boolean bind;
-
- /** 错误提示 */
- @TableField(updateStrategy = FieldStrategy.ALWAYS)
- private String errorMsg;
-
- public static WechatAllocReceiverBind init(WechatAllocReceiverBindParam param) {
- return WechatAllocReceiverBindConvert.CONVERT.toEntity(param);
- }
-
- @Override
- public WechatAllocReceiverBindResult toResult() {
- return WechatAllocReceiverBindConvert.CONVERT.toResult(this);
- }
-}
diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/entity/config/WechatIsvConfig.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/entity/config/WechatIsvConfig.java
new file mode 100644
index 00000000..3d897b2f
--- /dev/null
+++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/entity/config/WechatIsvConfig.java
@@ -0,0 +1,110 @@
+package org.dromara.daxpay.channel.wechat.entity.config;
+
+import cn.bootx.platform.common.jackson.util.JacksonUtil;
+import cn.bootx.platform.common.mybatisplus.function.ToResult;
+import org.dromara.daxpay.channel.wechat.code.WechatPayCode;
+import org.dromara.daxpay.channel.wechat.convert.WechatIsvConfigConvert;
+import org.dromara.daxpay.channel.wechat.result.config.WechatIsvConfigResult;
+import org.dromara.daxpay.core.enums.ChannelEnum;
+import org.dromara.daxpay.service.isv.entity.config.IsvChannelConfig;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.math.BigDecimal;
+
+/**
+ * 微信服务商配置
+ * @author xxm
+ * @since 2024/11/1
+ */
+@Data
+@Accessors(chain = true)
+public class WechatIsvConfig implements ToResult {
+
+ /** 主键 */
+ private Long id;
+
+ /** 微信商户Id */
+ private String wxMchId;
+
+ /** 微信应用appId */
+ private String wxAppId;
+
+ /** 是否启用 */
+ private Boolean enable;
+
+ /** 支付限额 */
+ private BigDecimal limitAmount;
+
+ /**
+ * 接口版本, 使用v2还是v3接口
+ * @see WechatPayCode#API_V2
+ */
+ private String apiVersion;
+
+ /** 商户平台「API安全」中的 APIv2 密钥 */
+ private String apiKeyV2;
+
+ /** 商户平台「API安全」中的 APIv3 密钥 */
+ private String apiKeyV3;
+
+ /** APPID对应的接口密码,用于获取微信公众号jsapi支付时使用 */
+ private String appSecret;
+
+ /** 支付公钥(pub_key.pem) */
+ private String publicKey;
+
+ /** 支付公钥ID */
+ private String publicKeyId;
+
+ /** apiclient_key. pem证书base64编码 */
+ private String privateKey;
+
+ /** apiclient_cert. pem证书base64编码 */
+ private String privateCert;
+
+ /** 证书序列号 */
+ private String certSerialNo;
+
+ /** API证书中p12证书Base64 */
+ private String p12;
+
+ /** 微信密钥 */
+ private String wxAppSecret;
+
+ /** 微信授权认证地址 */
+ private String wxAuthUrl;
+
+ /**
+ * 转换为通道配置
+ */
+ public IsvChannelConfig toChannelConfig() {
+ var channelConfig = new IsvChannelConfig();
+ channelConfig.setId(this.getId());
+ channelConfig.setEnable(this.getEnable());
+ channelConfig.setChannel(ChannelEnum.WECHAT_ISV.getCode());
+ WechatIsvConfig copy = WechatIsvConfigConvert.CONVERT.copy(this);
+ // 清空不需要序列化的字段
+ copy.setId(null).setEnable(null).setWxMchId(null);
+ String jsonStr = JacksonUtil.toJson(copy);
+ channelConfig.setExt(jsonStr);
+ return channelConfig;
+ }
+
+ /**
+ * 从通道配置转换为微信支付配置
+ */
+ public static WechatIsvConfig convertConfig(IsvChannelConfig channelConfig) {
+ WechatIsvConfig config = JacksonUtil.toBean(channelConfig.getExt(), WechatIsvConfig.class);
+
+ config.setId(channelConfig.getId())
+ .setEnable(channelConfig.isEnable());
+ return config;
+ }
+
+ @Override
+ public WechatIsvConfigResult toResult() {
+ return WechatIsvConfigConvert.CONVERT.toResult(this);
+ }
+}
+
diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/entity/config/WechatPayConfig.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/entity/config/WechatPayConfig.java
index ead3ddad..36ac9e35 100644
--- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/entity/config/WechatPayConfig.java
+++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/entity/config/WechatPayConfig.java
@@ -1,17 +1,16 @@
package org.dromara.daxpay.channel.wechat.entity.config;
+import cn.bootx.platform.common.jackson.util.JacksonUtil;
import cn.bootx.platform.common.mybatisplus.function.ToResult;
-import cn.bootx.platform.core.util.JsonUtil;
-import cn.hutool.core.util.StrUtil;
-import cn.hutool.json.JSONUtil;
-import lombok.Data;
-import lombok.experimental.Accessors;
import org.dromara.daxpay.channel.wechat.code.WechatPayCode;
import org.dromara.daxpay.channel.wechat.convert.WechatPayConfigConvert;
import org.dromara.daxpay.channel.wechat.enums.WechatAuthTypeEnum;
import org.dromara.daxpay.channel.wechat.result.config.WechatPayConfigResult;
import org.dromara.daxpay.core.enums.ChannelEnum;
-import org.dromara.daxpay.service.entity.config.ChannelConfig;
+import org.dromara.daxpay.service.pay.entity.config.ChannelConfig;
+import cn.hutool.core.util.StrUtil;
+import lombok.Data;
+import lombok.experimental.Accessors;
/**
* 微信支付配置
@@ -89,6 +88,9 @@ public class WechatPayConfig implements ToResult {
/** 备注 */
private String remark;
+ /** 商户号 */
+ private String mchNo;
+
/** 商户AppId */
private String appId;
@@ -101,12 +103,13 @@ public class WechatPayConfig implements ToResult {
channelConfig.setOutAppId(this.getWxAppId());
channelConfig.setOutMchNo(this.getWxMchId());
channelConfig.setAppId(this.getAppId());
+ channelConfig.setMchNo(this.getMchNo());
channelConfig.setEnable(this.getEnable());
channelConfig.setChannel(this.isv?ChannelEnum.WECHAT_ISV.getCode():ChannelEnum.WECHAT.getCode());
WechatPayConfig copy = WechatPayConfigConvert.CONVERT.copy(this);
// 清空不需要序列化的字段
- copy.setId(null).setAppId(null).setEnable(null).setWxMchId(null).setWxAppId(null);
- String jsonStr = JsonUtil.toJsonStr(copy);
+ copy.setId(null).setMchNo(null).setAppId(null).setEnable(null).setWxMchId(null).setWxAppId(null);
+ String jsonStr = JacksonUtil.toJson(copy);
channelConfig.setExt(jsonStr);
return channelConfig;
}
@@ -115,12 +118,13 @@ public class WechatPayConfig implements ToResult {
* 从通道配置转换为微信支付配置
*/
public static WechatPayConfig convertConfig(ChannelConfig channelConfig) {
- WechatPayConfig config = JSONUtil.toBean(channelConfig.getExt(), WechatPayConfig.class);
+ WechatPayConfig config = JacksonUtil.toBean(channelConfig.getExt(), WechatPayConfig.class);
config.setId(channelConfig.getId())
.setWxAppId(channelConfig.getOutAppId())
.setWxMchId(channelConfig.getOutMchNo())
.setAppId(channelConfig.getAppId())
+ .setMchNo(channelConfig.getMchNo())
.setEnable(channelConfig.isEnable());
return config;
}
diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/entity/config/WechatPaySubConfig.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/entity/config/WechatPaySubConfig.java
new file mode 100644
index 00000000..3dcfc0a5
--- /dev/null
+++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/entity/config/WechatPaySubConfig.java
@@ -0,0 +1,103 @@
+package org.dromara.daxpay.channel.wechat.entity.config;
+
+import cn.bootx.platform.common.jackson.util.JacksonUtil;
+import cn.bootx.platform.common.mybatisplus.function.ToResult;
+import org.dromara.daxpay.channel.wechat.convert.WechatPaySubConfigConvert;
+import org.dromara.daxpay.channel.wechat.enums.WechatAuthTypeEnum;
+import org.dromara.daxpay.channel.wechat.result.config.WechatPaySubConfigResult;
+import org.dromara.daxpay.core.enums.ChannelEnum;
+import org.dromara.daxpay.service.pay.entity.config.ChannelConfig;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.util.Objects;
+
+/**
+ * 微信特约商户配置类
+ * @author xxm
+ * @since 2024/12/27
+ */
+@Data
+@Accessors(chain = true)
+public class WechatPaySubConfig implements ToResult {
+ /** 主键 */
+ private Long id;
+
+ /** 微信特约商户号/二级商户号 */
+ private String subMchId;
+
+ /** 是否启用 */
+ private Boolean enable;
+
+ /**
+ * 授权类型
+ * @see WechatAuthTypeEnum
+ */
+ private String authType;
+
+ /** 微信特约商户/二级商户AppId */
+ private String subAppId;
+
+ /** 微信特约商户/二级商户密钥 */
+ private String wxAppSecret;
+
+ /** 微信特约商户/二级商户授权认证地址 */
+ private String wxAuthUrl;
+
+ /** 商户号 */
+ private String mchNo;
+
+ /** 商户AppId */
+ private String appId;
+
+
+ /**
+ * 默认使用服务商配置
+ */
+ public String getAuthType() {
+ return Objects.equals(authType, WechatAuthTypeEnum.SUB.getCode())?
+ WechatAuthTypeEnum.SUB.getCode():WechatAuthTypeEnum.SP.getCode();
+ }
+
+
+ /**
+ * 转换为通道配置
+ */
+ public ChannelConfig toChannelConfig() {
+ var channelConfig = new ChannelConfig();
+ channelConfig.setId(this.getId());
+ channelConfig.setOutMchNo(this.getSubMchId());
+ channelConfig.setOutAppId(this.getSubAppId());
+ channelConfig.setAppId(this.getAppId());
+ channelConfig.setMchNo(this.getMchNo());
+ channelConfig.setEnable(this.getEnable());
+ channelConfig.setSub(true);
+ channelConfig.setChannel(ChannelEnum.WECHAT_ISV.getCode());
+ var copy = WechatPaySubConfigConvert.CONVERT.copy(this);
+ // 清空不需要序列化的字段
+ copy.setId(null).setMchNo(null).setAppId(null).setEnable(null).setSubMchId(null);
+ String jsonStr = JacksonUtil.toJson(copy);
+ channelConfig.setExt(jsonStr);
+ channelConfig.setSub(true);
+ return channelConfig;
+ }
+
+ /**
+ * 从通道配置转换为支付配置
+ */
+ public static WechatPaySubConfig convertConfig(ChannelConfig channelConfig) {
+ var config = JacksonUtil.toBean(channelConfig.getExt(), WechatPaySubConfig.class);
+ config.setId(channelConfig.getId())
+ .setAppId(channelConfig.getAppId())
+ .setMchNo(channelConfig.getMchNo())
+ .setSubAppId(channelConfig.getOutAppId())
+ .setSubMchId(channelConfig.getOutMchNo())
+ .setEnable(channelConfig.isEnable());
+ return config;
+ }
+
+ @Override
+ public WechatPaySubConfigResult toResult() {
+ return WechatPaySubConfigConvert.CONVERT.toResult(this);
+ }
+}
diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/enums/WechatAllocReceiverEnum.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/enums/WechatAllocReceiverEnum.java
deleted file mode 100644
index 6ddf1e7b..00000000
--- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/enums/WechatAllocReceiverEnum.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package org.dromara.daxpay.channel.wechat.enums;
-
-import lombok.AllArgsConstructor;
-import lombok.Getter;
-
-/**
- * 微信分账接收者类型
- * @author xxm
- * @since 2024/12/17
- */
-@Getter
-@AllArgsConstructor
-public enum WechatAllocReceiverEnum {
-
- MERCHANT_ID("MERCHANT_ID", "商户号"),
- PERSONAL_OPENID("PERSONAL_OPENID", "openId"),
- ;
-
- private final String code;
- private final String name;
-}
diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/enums/WechatAllocStatusEnum.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/enums/WechatAllocStatusEnum.java
deleted file mode 100644
index 83f86275..00000000
--- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/enums/WechatAllocStatusEnum.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package org.dromara.daxpay.channel.wechat.enums;
-
-import org.dromara.daxpay.core.enums.AllocDetailResultEnum;
-import org.dromara.daxpay.core.exception.ConfigNotExistException;
-import lombok.AllArgsConstructor;
-import lombok.Getter;
-
-import java.util.Arrays;
-import java.util.Objects;
-
-/**
- *
- * @author xxm
- * @since 2024/12/16
- */
-@Getter
-@AllArgsConstructor
-public enum WechatAllocStatusEnum {
-
- //处理中
- PENDING("PENDING", AllocDetailResultEnum.PENDING),
- //分账完成
- SUCCESS("SUCCESS", AllocDetailResultEnum.SUCCESS),
- //分账完成
- CLOSED("CLOSED", AllocDetailResultEnum.FAIL),
- ;
-
- private final String code;
-
- private final AllocDetailResultEnum result;
-
- /**
- * 根据编码获取枚举
- */
- public static WechatAllocStatusEnum findByCode(String code){
- return Arrays.stream(values())
- .filter(o -> Objects.equals(o.getCode(), code))
- .findFirst()
- .orElseThrow(() -> new ConfigNotExistException("该微信分账状态不存在"));
- }
-}
diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/allocation/WechatAllocReceiverBindParam.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/allocation/WechatAllocReceiverBindParam.java
deleted file mode 100644
index 6cb79582..00000000
--- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/allocation/WechatAllocReceiverBindParam.java
+++ /dev/null
@@ -1,66 +0,0 @@
-package org.dromara.daxpay.channel.wechat.param.allocation;
-
-import cn.bootx.platform.core.validation.ValidationGroup;
-import org.dromara.daxpay.core.enums.AllocReceiverTypeEnum;
-import io.swagger.v3.oas.annotations.media.Schema;
-import jakarta.validation.constraints.NotBlank;
-import jakarta.validation.constraints.NotNull;
-import lombok.Data;
-import lombok.experimental.Accessors;
-
-/**
- * 微信分账接收方绑定参数
- * @author xxm
- * @since 2025/1/27
- */
-@Data
-@Accessors(chain = true)
-@Schema(title = "微信分账接收方绑定参数")
-public class WechatAllocReceiverBindParam {
-
- /** 主键 */
- @NotNull(message = "id不能为空", groups = ValidationGroup.edit.class)
- @Schema(description = "主键")
- private Long id;
-
- /**
- * 接收方类型
- * @see AllocReceiverTypeEnum
- */
- @NotBlank(message = "接收方类型不可为空")
- @Schema(description = "接收方类型")
- private String receiverType;
-
- /** 接收方账号 */
- @NotBlank(message = "接收方账号不可为空")
- @Schema(description = "接收方账号")
- private String receiverAccount;
-
-
- /** 接收方名称 */
- @Schema(description = "接收方名称")
- private String receiverName;
-
- /** 分账关系类型 */
- @NotBlank(message = "分账关系类型不可为空")
- @Schema(description = "分账关系类型")
- private String relationType;
-
- /** 分账关系名称 */
- @Schema(description = "分账关系名称")
- private String relationName;
-
- /** 是否服务商模式 */
- @Schema(description = "是否服务商模式")
- private boolean isv;
-
- /** 是否绑定 */
- @Schema(description = "是否绑定")
- private boolean bind;
-
- /** 应用Id */
- @NotBlank(message = "应用Id不可为空")
- @Schema(description = "应用Id")
- private String appId;
-
-}
diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/allocation/WechatAllocReceiverBindQuery.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/allocation/WechatAllocReceiverBindQuery.java
deleted file mode 100644
index 5016a8fc..00000000
--- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/allocation/WechatAllocReceiverBindQuery.java
+++ /dev/null
@@ -1,58 +0,0 @@
-package org.dromara.daxpay.channel.wechat.param.allocation;
-
-import cn.bootx.platform.core.annotation.QueryParam;
-import org.dromara.daxpay.core.enums.AllocReceiverTypeEnum;
-import org.dromara.daxpay.service.common.param.MchQuery;
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.experimental.Accessors;
-
-/**
- * 微信分账接收方绑定查询参数
- * @author xxm
- * @since 2025/2/19
- */
-@QueryParam(type = QueryParam.CompareTypeEnum.LIKE)
-@EqualsAndHashCode(callSuper = true)
-@Data
-@Accessors(chain = true)
-@Schema(title = "微信分账接收方绑定查询参数")
-public class WechatAllocReceiverBindQuery extends MchQuery {
-
- /**
- * 接收方类型
- * @see AllocReceiverTypeEnum
- */
- @QueryParam(type = QueryParam.CompareTypeEnum.EQ)
- @Schema(description = "接收方类型")
- private String receiverType;
-
- /** 接收方账号 */
- @Schema(description = "接收方账号")
- private String receiverAccount;
-
- /** 接收方名称 */
- @Schema(description = "接收方名称")
- private String receiverName;
-
- /** 分账关系类型 */
- @QueryParam(type = QueryParam.CompareTypeEnum.EQ)
- @Schema(description = "分账关系类型")
- private String relationType;
-
- /** 分账关系名称 */
- @Schema(description = "分账关系名称")
- private String relationName;
-
- /** 是否服务商模式 */
- @QueryParam(type = QueryParam.CompareTypeEnum.EQ)
- @Schema(description = "是否服务商模式")
- private Boolean isv;
-
- /** 是否绑定 */
- @QueryParam(type = QueryParam.CompareTypeEnum.EQ)
- @Schema(description = "是否绑定")
- private Boolean bind;
-
-}
diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/allocation/WechatAllocReceiverParam.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/allocation/WechatAllocReceiverParam.java
deleted file mode 100644
index ace6e5b4..00000000
--- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/allocation/WechatAllocReceiverParam.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package org.dromara.daxpay.channel.wechat.param.allocation;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import jakarta.validation.constraints.NotNull;
-import lombok.Data;
-import lombok.experimental.Accessors;
-
-/**
- * 微信分账接收方
- * @author xxm
- * @since 2025/1/26
- */
-@Data
-@Accessors(chain = true)
-@Schema(title = "微信分账接收方")
-public class WechatAllocReceiverParam {
-
- /** 主键 */
- @Schema(description = "主键")
- private Long id;
-
- /** 接收方名称 */
- @Schema(description = "接收方名称")
- private String receiverName;
-
- /** 接收方账号 */
- @NotNull(message = "接收方账号不可为空")
- @Schema(description = "接收方账号")
- private String receiverAccount;
-
- /** 接收方类型 */
- @Schema(description = "接收方类型")
- private String receiverType;
-
- /** 分账关系类型 */
- @Schema(description = "分账关系类型")
- private String relationType;
-
- /** 分账关系名称 */
- @Schema(description = "分账关系名称")
- private String relationName;
-
- /** 是否为服务商 */
- @Schema(description = "是否为服务商")
- private boolean isv;
-
- /** 商户AppId */
- @NotNull(message = "商户AppId不可为空")
- @Schema(description = "商户AppId")
- private String appId;
-}
diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/config/WechatIsvConfigParam.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/config/WechatIsvConfigParam.java
new file mode 100644
index 00000000..1efb2d5a
--- /dev/null
+++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/config/WechatIsvConfigParam.java
@@ -0,0 +1,87 @@
+package org.dromara.daxpay.channel.wechat.param.config;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+import lombok.experimental.Accessors;
+import org.dromara.daxpay.channel.wechat.code.WechatPayCode;
+
+/**
+ * 微信服务商配置参数
+ * @author xxm
+ * @since 2024/11/1
+ */
+@Data
+@Accessors(chain = true)
+@Schema(title = "微信服务商配置参数")
+public class WechatIsvConfigParam {
+
+ /** 主键 */
+ @Schema(description = "主键")
+ private Long id;
+
+ /** 微信商户Id */
+ @NotBlank(message = "微信商户Id不可为空")
+ @Schema(description = "微信商户Id")
+ private String wxMchId;
+
+ /** 微信应用appId */
+ @NotBlank(message = "微信应用appId不可为空")
+ @Schema(description = "微信应用appId")
+ private String wxAppId;
+
+ /** 是否启用 */
+ @NotNull(message = "是否启用不可为空")
+ @Schema(description = "是否启用")
+ private Boolean enable;
+
+ /**
+ * 接口版本, 使用v2还是v3接口
+ * @see WechatPayCode#API_V2
+ */
+ @NotBlank(message = "接口版本不可为空")
+ @Schema(description = "接口版本")
+ private String apiVersion;
+
+ /** 商户平台「API安全」中的 APIv2 密钥 */
+ @Schema(description = "APIv2 密钥")
+ private String apiKeyV2;
+
+ /** 商户平台「API安全」中的 APIv3 密钥 */
+ @Schema(description = "APIv3 密钥")
+ private String apiKeyV3;
+
+ /** APPID对应的接口密码,用于获取微信公众号jsapi支付时使用 */
+ @Schema(description = "APPID对应的接口密码,用于获取微信公众号jsapi支付时使用")
+ private String appSecret;
+
+ /** 支付公钥(pub_key.pem) */
+ @Schema(description = "支付公钥(pub_key.pem)")
+ private String publicKey;
+
+ /** 支付公钥ID */
+ @Schema(description = "支付公钥ID")
+ private String publicKeyId;
+
+ /** apiclient_key.pem证书base64编码 */
+ @Schema(description = "私钥证书base64编码")
+ private String privateKey;
+
+ /** apiclient_cert.pem证书base64编码 */
+ @Schema(description = "私钥Key的base64编码")
+ private String privateCert;
+
+ /** 证书序列号 */
+ @Schema(description = "证书序列号")
+ private String certSerialNo;
+
+ /** apiclient_cert.p12证书Base64 */
+ @Schema(description = "API证书中p12证书")
+ private String p12;
+
+ /** 备注 */
+ @Schema(description = "备注")
+ private String remark;
+
+}
diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/config/WechatPayConfigParam.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/config/WechatPayConfigParam.java
index 8a58d717..56acc4b7 100644
--- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/config/WechatPayConfigParam.java
+++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/config/WechatPayConfigParam.java
@@ -104,6 +104,11 @@ public class WechatPayConfigParam {
@Schema(description = "备注")
private String remark;
+ /** 商户号 */
+ @NotBlank(message = "商户号不可为空")
+ @Schema(description = "商户号")
+ private String mchNo;
+
/** 商户AppId */
@Schema(description = "商户AppId")
@NotBlank(message = "商户AppId不可为空")
diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/config/WechatPaySubConfigParam.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/config/WechatPaySubConfigParam.java
new file mode 100644
index 00000000..b372ff3d
--- /dev/null
+++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/config/WechatPaySubConfigParam.java
@@ -0,0 +1,50 @@
+package org.dromara.daxpay.channel.wechat.param.config;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+import lombok.experimental.Accessors;
+import org.dromara.daxpay.channel.wechat.enums.WechatAuthTypeEnum;
+
+/**
+ * 微信支付配置
+ * @author xxm
+ * @since 2024/7/17
+ */
+@Data
+@Accessors(chain = true)
+@Schema(title = "微信支付配置")
+public class WechatPaySubConfigParam {
+
+ /** 主键 */
+ @Schema(description = "主键")
+ private Long id;
+
+ /** 微信子商户号 */
+ @NotBlank(message = "微信子商户号不可为空")
+ @Schema(description = "微信子商户号")
+ private String subMchId;
+
+ /** 微信特约商户/二级商户应用ID */
+ @Schema(description = "特约商户/二级商户应用ID")
+ private String subAppId;
+
+ /**
+ * 授权类型
+ * @see WechatAuthTypeEnum
+ */
+ @Schema(description = "授权类型")
+ private String authType;
+
+ /** 是否启用 */
+ @NotNull(message = "是否启用不可为空")
+ @Schema(description = "是否启用")
+ private Boolean enable;
+
+ /** 商户AppId */
+ @Schema(description = "商户AppId")
+ @NotBlank(message = "商户AppId不可为空")
+ private String appId;
+
+}
diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/transfer/TransferCreateV3Request.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/transfer/TransferCreateV3Request.java
index d1018b42..723fab8b 100644
--- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/transfer/TransferCreateV3Request.java
+++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/transfer/TransferCreateV3Request.java
@@ -2,7 +2,8 @@ package org.dromara.daxpay.channel.wechat.param.transfer;
import com.github.binarywang.wxpay.bean.merchanttransfer.TransferCreateRequest;
import com.google.gson.annotations.SerializedName;
-import lombok.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/result/allocation/WechatAllocReceiverBindResult.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/result/allocation/WechatAllocReceiverBindResult.java
deleted file mode 100644
index 8266f4e8..00000000
--- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/result/allocation/WechatAllocReceiverBindResult.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package org.dromara.daxpay.channel.wechat.result.allocation;
-
-import org.dromara.daxpay.core.enums.AllocReceiverTypeEnum;
-import org.dromara.daxpay.service.common.result.MchResult;
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.experimental.Accessors;
-
-/**
- * 微信分账接收方绑定
- * @author xxm
- * @since 2025/1/27
- */
-@EqualsAndHashCode(callSuper = true)
-@Data
-@Accessors(chain = true)
-@Schema(title = "微信分账接收方绑定")
-public class WechatAllocReceiverBindResult extends MchResult {
-
- /** 接收方账号 */
- @Schema(description = "接收方账号")
- private String receiverAccount;
-
- /**
- * 接收方类型
- * @see AllocReceiverTypeEnum
- */
- @Schema(description = "接收方类型")
- private String receiverType;
-
- /** 接收方名称 */
- @Schema(description = "接收方名称")
- private String receiverName;
-
- /** 分账关系类型 */
- @Schema(description = "分账关系类型")
- private String relationType;
-
- /** 分账关系名称 */
- @Schema(description = "分账关系名称")
- private String relationName;
-
- /** 是否服务商模式 */
- @Schema(description = "是否服务商模式")
- private boolean isv;
-
- /** 是否绑定 */
- @Schema(description = "是否绑定")
- private boolean bind;
-
- /** 错误提示 */
- @Schema(description = "错误提示")
- private String errorMsg;
-
-}
diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/result/allocation/WechatAllocReceiverResult.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/result/allocation/WechatAllocReceiverResult.java
deleted file mode 100644
index 236f2a89..00000000
--- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/result/allocation/WechatAllocReceiverResult.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package org.dromara.daxpay.channel.wechat.result.allocation;
-
-import org.dromara.daxpay.service.common.result.MchResult;
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.experimental.Accessors;
-
-/**
- * 微信分账接收方
- * @author xxm
- * @since 2025/1/26
- */
-@EqualsAndHashCode(callSuper = true)
-@Data
-@Accessors(chain = true)
-@Schema(title = "微信分账接收方")
-public class WechatAllocReceiverResult extends MchResult {
-
- /** 分账接收方编号 */
- @Schema(description = "分账接收方编号")
- private String receiverNo;
-
- /** 接收方名称 */
- @Schema(description = "接收方名称")
- private String receiverName;
-
- /** 接收方账号 */
- @Schema(description = "接收方账号")
- private String receiverAccount;
-
- /** 接收方类型 */
- @Schema(description = "接收方类型")
- private String receiverType;
-
- /** 分账关系类型 */
- @Schema(description = "分账关系类型")
- private String relationType;
-
- /** 分账关系名称 */
- @Schema(description = "分账关系名称")
- private String relationName;
-}
diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/result/assist/WechatMccConstResult.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/result/assist/WechatMccConstResult.java
deleted file mode 100644
index 050c312d..00000000
--- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/result/assist/WechatMccConstResult.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package org.dromara.daxpay.channel.wechat.result.assist;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-import lombok.experimental.Accessors;
-
-/**
- * 微信经营类目
- * @author xxm
- * @since 2025/1/27
- */
-@Data
-@Accessors(chain = true)
-@Schema(title = "微信经营类目")
-public class WechatMccConstResult {
-
- /** 行业ID */
- @Schema(description = "行业ID")
- private String id;
-
- /** 行业名称 */
- @Schema(description = "行业名称")
- private String name;
-
- /** 主体类型 */
- @Schema(description = "主体类型")
- private String parentCode;
-
- /** 结算规则ID */
- @Schema(description = "结算规则ID")
- private String ruleId;
-
-}
diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/result/config/WechatIsvConfigResult.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/result/config/WechatIsvConfigResult.java
new file mode 100644
index 00000000..9e248af7
--- /dev/null
+++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/result/config/WechatIsvConfigResult.java
@@ -0,0 +1,98 @@
+package org.dromara.daxpay.channel.wechat.result.config;
+
+import cn.bootx.platform.common.jackson.sensitive.SensitiveInfo;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.experimental.Accessors;
+import org.dromara.daxpay.channel.wechat.code.WechatPayCode;
+
+import java.math.BigDecimal;
+
+/**
+ * 微信服务商配置
+ * @author xxm
+ * @since 2024/11/1
+ */
+@Data
+@Accessors(chain = true)
+@Schema(title = "微信服务商配置")
+public class WechatIsvConfigResult {
+
+ /** 主键 */
+ @Schema(description = "主键")
+ private Long id;
+
+ /** 微信商户Id */
+ @Schema(description = "微信商户Id")
+ private String wxMchId;
+
+ /** 微信应用appId */
+ @Schema(description = "微信应用appId")
+ private String wxAppId;
+
+ /** 是否启用 */
+ @Schema(description = "是否启用")
+ private Boolean enable;
+
+ /** 支付限额 */
+ @Schema(description = "支付限额")
+ private BigDecimal limitAmount;
+
+ /**
+ * 接口版本, 使用v2还是v3接口
+ * @see WechatPayCode#API_V2
+ */
+ @Schema(description = "接口版本")
+ private String apiVersion;
+
+ /** 商户平台「API安全」中的 APIv2 密钥 */
+ @Schema(description = "APIv2 密钥")
+ @SensitiveInfo
+ private String apiKeyV2;
+
+ /** 商户平台「API安全」中的 APIv3 密钥 */
+ @Schema(description = "APIv3 密钥")
+ @SensitiveInfo
+ private String apiKeyV3;
+
+ /** APPID对应的接口密码,用于获取微信公众号jsapi支付时使用 */
+ @Schema(description = "APPID对应的接口密码,用于获取微信公众号jsapi支付时使用")
+ @SensitiveInfo
+ private String appSecret;
+
+ /** 支付公钥(pub_key.pem) */
+ @Schema(description = "支付公钥(pub_key.pem)")
+ @SensitiveInfo
+ private String publicKey;
+
+ /** 支付公钥ID */
+ @Schema(description = "支付公钥ID")
+ private String publicKeyId;
+
+ /** apiclient_key.pem证书base64编码 */
+ @SensitiveInfo
+ @Schema(description = "私钥Key的base64编码")
+ private String privateKey;
+
+ /** apiclient_cert.pem证书base64编码 */
+ @SensitiveInfo
+ @Schema(description = "私钥证书base64编码")
+ private String privateCert;
+
+ /** 证书序列号 */
+ @Schema(description = "证书序列号")
+ private String certSerialNo;
+
+ /** apiclient_cert.p12证书Base64 */
+ @Schema(description = "API证书中p12证书")
+ @SensitiveInfo
+ private String p12;
+
+ /** 备注 */
+ @Schema(description = "备注")
+ private String remark;
+
+ /** 服务商号 */
+ @Schema(description = "服务商号")
+ private String appId;
+}
diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/result/config/WechatPayConfigResult.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/result/config/WechatPayConfigResult.java
index 1d546e6f..3972b89b 100644
--- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/result/config/WechatPayConfigResult.java
+++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/result/config/WechatPayConfigResult.java
@@ -108,6 +108,10 @@ public class WechatPayConfigResult {
@Schema(description = "备注")
private String remark;
+ /** 商户号 */
+ @Schema(description = "商户号")
+ private String mchNo;
+
/** 商户AppId */
@Schema(description = "商户AppId")
private String appId;
diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/result/config/WechatPaySubConfigResult.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/result/config/WechatPaySubConfigResult.java
new file mode 100644
index 00000000..f656c31b
--- /dev/null
+++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/result/config/WechatPaySubConfigResult.java
@@ -0,0 +1,56 @@
+package org.dromara.daxpay.channel.wechat.result.config;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.dromara.daxpay.channel.wechat.enums.WechatAuthTypeEnum;
+import org.dromara.daxpay.service.merchant.result.info.MchResult;
+
+/**
+ * 微信支付配置
+ * @author xxm
+ * @since 2024/7/17
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+@Accessors(chain = true)
+@Schema(title = "微信支付配置")
+public class WechatPaySubConfigResult extends MchResult {
+
+ /** 服务商户号 */
+ @Schema(description = "服务商户号")
+ private String spMchId;
+
+ /** 服务商ID */
+ @Schema(description = "服务商ID")
+ private String spAppId;
+
+ /** 特约商户号/二级商户号 */
+ @Schema(description = "特约商户号/二级商户号")
+ private String subMchId;
+
+ /**
+ * 授权类型
+ * @see WechatAuthTypeEnum
+ */
+ @Schema(description = "授权类型")
+ private String authType;
+
+ /** 特约商户/二级商户应用ID */
+ @Schema(description = "特约商户/二级商户应用ID")
+ private String subAppId;
+
+ /** 微信特约商户/二级商户密钥 */
+ @Schema(description = "微信特约商户/二级商户密钥")
+ private String wxAppSecret;
+
+ /** 微信特约商户/二级商户授权认证地址 */
+ @Schema(description = "微信特约商户/二级商户授权认证地址")
+ private String wxAuthUrl;
+
+ /** 是否启用 */
+ @Schema(description = "是否启用")
+ private Boolean enable;
+
+}
diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WechatAllocReceiverBindService.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WechatAllocReceiverBindService.java
deleted file mode 100644
index fb24a173..00000000
--- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WechatAllocReceiverBindService.java
+++ /dev/null
@@ -1,177 +0,0 @@
-package org.dromara.daxpay.channel.wechat.service.allocation;
-
-import cn.bootx.platform.common.mybatisplus.util.MpUtil;
-import cn.bootx.platform.core.exception.DataNotExistException;
-import cn.bootx.platform.core.rest.param.PageParam;
-import cn.bootx.platform.core.rest.result.PageResult;
-import cn.hutool.core.bean.BeanUtil;
-import cn.hutool.core.bean.copier.CopyOptions;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.dromara.daxpay.channel.wechat.code.WechatPayCode;
-import org.dromara.daxpay.channel.wechat.dao.allocation.WechatAllocReceiverBindManager;
-import org.dromara.daxpay.channel.wechat.entity.allocation.WechatAllocReceiverBind;
-import org.dromara.daxpay.channel.wechat.param.allocation.WechatAllocReceiverBindParam;
-import org.dromara.daxpay.channel.wechat.param.allocation.WechatAllocReceiverBindQuery;
-import org.dromara.daxpay.channel.wechat.result.allocation.WechatAllocReceiverBindResult;
-import org.dromara.daxpay.channel.wechat.service.payment.allocation.receiver.WechatPayAllocReceiverV2Service;
-import org.dromara.daxpay.channel.wechat.service.payment.allocation.receiver.WechatPayAllocReceiverV3Service;
-import org.dromara.daxpay.channel.wechat.service.payment.allocation.receiver.WechatPaySubAllocReceiverV2Service;
-import org.dromara.daxpay.channel.wechat.service.payment.allocation.receiver.WechatPaySubAllocReceiverV3Service;
-import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService;
-import org.dromara.daxpay.core.enums.AllocReceiverTypeEnum;
-import org.dromara.daxpay.core.exception.DataErrorException;
-import org.dromara.daxpay.core.exception.OperationFailException;
-import org.dromara.daxpay.service.service.assist.PaymentAssistService;
-import org.springframework.stereotype.Service;
-
-import java.util.Arrays;
-import java.util.List;
-import java.util.Objects;
-
-/**
- * 微信分账接收方绑定
- * @author xxm
- * @since 2025/1/27
- */
-@Slf4j
-@Service
-@RequiredArgsConstructor
-public class WechatAllocReceiverBindService {
-
- private final WechatPayAllocReceiverV2Service receiverV2Service;
-
- private final WechatPaySubAllocReceiverV2Service receiverSubV2Service;
-
- private final WechatPayAllocReceiverV3Service receiverV3Service;
-
- private final WechatPaySubAllocReceiverV3Service receiverSubV3Service;
-
- private final WechatPayConfigService wechatPayConfigService;
-
- private final WechatAllocReceiverBindManager receiverBindManager;
-
- private final PaymentAssistService paymentAssistService;
-
-
- /**
- * 分页
- */
- public PageResult page(PageParam pageParam, WechatAllocReceiverBindQuery param){
- return MpUtil.toPageResult(receiverBindManager.page(pageParam, param));
- }
-
- /**
- * 查询详情
- */
- public WechatAllocReceiverBindResult findById(Long id) {
- return receiverBindManager.findById(id)
- .map(WechatAllocReceiverBind::toResult)
- .orElseThrow(() -> new RuntimeException("数据不存在"));
- }
-
- /**
- * 添加
- */
- public void add(WechatAllocReceiverBindParam param) {
- if (!validation(param)){
- throw new RuntimeException("接收方类型错误");
- }
- paymentAssistService.initMchAndApp(param.getAppId());
- var receiverBind = WechatAllocReceiverBind.init(param);
- receiverBindManager.save(receiverBind);
- }
-
- /**
- * 编辑
- */
- public void update(WechatAllocReceiverBindParam param){
- var receiverBind = receiverBindManager.findById(param.getId()).orElseThrow(() -> new DataNotExistException("分账接收方不存在"));
- if (receiverBind.isBind()){
- throw new DataErrorException("分账接收方已绑定");
- }
- BeanUtil.copyProperties(param,receiverBind, CopyOptions.create().ignoreNullValue());
- receiverBindManager.updateById(receiverBind);
- }
-
- /**
- * 绑定
- */
- public void bind(Long id) {
- var receiverBind = receiverBindManager.findById(id).orElseThrow(() -> new DataNotExistException("微信分账接收方数据不存在"));
- paymentAssistService.initMchAndApp(receiverBind.getAppId());
- if (receiverBind.isBind()){
- throw new DataErrorException("分账接收方已绑定");
- }
- try {
- if (receiverBind.isIsv()){
- var config = wechatPayConfigService.getAndCheckConfig(true);
- if (Objects.equals(config.getApiVersion(), WechatPayCode.API_V2)){
- receiverSubV2Service.bind(receiverBind, config);
- } else {
- receiverSubV3Service.bind(receiverBind, config);
- }
- } else {
- var config = wechatPayConfigService.getAndCheckConfig(false);
- if (Objects.equals(config.getApiVersion(), WechatPayCode.API_V2)){
- receiverV2Service.bind(receiverBind, config);
- } else {
- receiverV3Service.bind(receiverBind, config);
- }
- }
- receiverBind.setBind(true);
- } catch (OperationFailException e) {
- receiverBind.setErrorMsg(e.getMessage());
- }
- receiverBindManager.updateById(receiverBind);
- }
-
- /**
- * 解绑
- */
- public void unbind(Long id) {
- var receiverBind = receiverBindManager.findById(id).orElseThrow(() -> new DataNotExistException("微信分账接收方数据不存在"));
- paymentAssistService.initMchAndApp(receiverBind.getAppId());
- if (!receiverBind.isBind()){
- throw new DataErrorException("分账接收方已解绑");
- }
-
- try {
- if (receiverBind.isIsv()){
- var config = wechatPayConfigService.getAndCheckConfig(true);
- if (Objects.equals(config.getApiVersion(), WechatPayCode.API_V2)){
- receiverSubV2Service.unbind(receiverBind, config);
- } else {
- receiverSubV3Service.unbind(receiverBind, config);
- }
- } else {
- var config = wechatPayConfigService.getAndCheckConfig(false);
- if (Objects.equals(config.getApiVersion(), WechatPayCode.API_V2)){
- receiverV2Service.unbind(receiverBind, config);
- } else {
- receiverV3Service.unbind(receiverBind, config);
- }
- }
- receiverBind.setBind(false);
- } catch (OperationFailException e) {
- receiverBind.setErrorMsg(e.getMessage());
- }
- receiverBindManager.updateById(receiverBind);
- }
-
- /**
- * 删除
- */
- public void remove(Long id){
- receiverBindManager.deleteById(id);
- }
-
- /**
- * 校验方法
- */
- public boolean validation(WechatAllocReceiverBindParam receiverBind){
- List list = Arrays.asList(AllocReceiverTypeEnum.OPEN_ID.getCode(), AllocReceiverTypeEnum.MERCHANT_NO.getCode());
- String receiverType = receiverBind.getReceiverType();
- return list.contains(receiverType);
- }
-}
diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WechatAllocReceiverService.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WechatAllocReceiverService.java
deleted file mode 100644
index ff56d8ca..00000000
--- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WechatAllocReceiverService.java
+++ /dev/null
@@ -1,88 +0,0 @@
-package org.dromara.daxpay.channel.wechat.service.allocation;
-
-import cn.hutool.core.bean.BeanUtil;
-import cn.hutool.core.bean.copier.CopyOptions;
-import cn.hutool.core.lang.UUID;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.dromara.daxpay.channel.wechat.convert.WechatAllocReceiverConvert;
-import org.dromara.daxpay.channel.wechat.entity.allocation.WechatAllocReceiver;
-import org.dromara.daxpay.channel.wechat.param.allocation.WechatAllocReceiverParam;
-import org.dromara.daxpay.channel.wechat.result.allocation.WechatAllocReceiverResult;
-import org.dromara.daxpay.core.enums.ChannelEnum;
-import org.dromara.daxpay.core.exception.ConfigNotEnableException;
-import org.dromara.daxpay.service.common.local.PaymentContextLocal;
-import org.dromara.daxpay.service.dao.allocation.receiver.AllocReceiverManager;
-import org.dromara.daxpay.service.entity.allocation.receiver.AllocReceiver;
-import org.dromara.daxpay.service.service.assist.PaymentAssistService;
-import org.springframework.stereotype.Service;
-
-import java.util.Objects;
-
-/**
- * 微信分账接收方服务类
- * @author xxm
- * @since 2025/1/26
- */
-@Slf4j
-@Service
-@RequiredArgsConstructor
-public class WechatAllocReceiverService {
-
- private final AllocReceiverManager receiverManager;
-
- private final PaymentAssistService paymentAssistService;
-
- /**
- * 获取分账接收方
- */
- public WechatAllocReceiverResult findById(Long id){
- return receiverManager.findById(id)
- .map(WechatAllocReceiver::convertChannel)
- .map(WechatAllocReceiver::toResult)
- .orElseThrow(() -> new ConfigNotEnableException("微信分账接收方不存在"));
- }
-
- /**
- * 新增或更新
- */
- public void saveOrUpdate(WechatAllocReceiverParam param){
- if (param.getId() == null) {
- add(param);
- } else {
- update(param);
- }
- }
-
- /**
- * 添加
- */
- public void add(WechatAllocReceiverParam param){
- paymentAssistService.initMchAndApp(param.getAppId());
- var mchApp = PaymentContextLocal.get().getMchAppInfo();
- var entity = WechatAllocReceiverConvert.CONVERT.toEntity(param);
- AllocReceiver receiver = entity.toReceiver(param.isIsv());
- String uuid = UUID.fastUUID().toString(true);
- receiver.setReceiverNo(uuid);
- receiverManager.save(receiver);
- }
-
- /**
- * 更新
- */
- public void update(WechatAllocReceiverParam param){
- var allocReceiver = receiverManager.findById(param.getId())
- .orElseThrow(() -> new ConfigNotEnableException("微信分账接收方不存在"));
- // 通道配置 --转换--> 通道配置 ----> 从更新参数赋值 --转换--> 通道配置 ----> 保存更新
- var wechatAllocReceiver = WechatAllocReceiver.convertChannel(allocReceiver);
- BeanUtil.copyProperties(param, wechatAllocReceiver, CopyOptions.create()
- .ignoreNullValue());
- var receiver = wechatAllocReceiver.toReceiver(Objects.equals(allocReceiver.getChannel(), ChannelEnum.WECHAT_ISV.getCode()));
- // 手动清空一下默认的数据版本号
- receiver.setVersion(null);
- BeanUtil.copyProperties(receiver, allocReceiver, CopyOptions.create()
- .ignoreNullValue());
- receiverManager.updateById(allocReceiver);
- }
-}
-
diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/isv/WechatIsvConfigService.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/isv/WechatIsvConfigService.java
new file mode 100644
index 00000000..ca49b107
--- /dev/null
+++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/isv/WechatIsvConfigService.java
@@ -0,0 +1,165 @@
+package org.dromara.daxpay.channel.wechat.service.isv;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.bean.copier.CopyOptions;
+import cn.hutool.core.codec.Base64;
+import cn.hutool.core.util.StrUtil;
+import com.github.binarywang.wxpay.config.WxPayConfig;
+import com.github.binarywang.wxpay.service.Applyment4SubService;
+import com.github.binarywang.wxpay.service.MerchantMediaService;
+import com.github.binarywang.wxpay.service.WxPayService;
+import com.github.binarywang.wxpay.service.impl.Applyment4SubServiceImpl;
+import com.github.binarywang.wxpay.service.impl.MerchantMediaServiceImpl;
+import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.daxpay.channel.wechat.convert.WechatIsvConfigConvert;
+import org.dromara.daxpay.channel.wechat.entity.config.WechatIsvConfig;
+import org.dromara.daxpay.channel.wechat.param.config.WechatIsvConfigParam;
+import org.dromara.daxpay.channel.wechat.result.config.WechatIsvConfigResult;
+import org.dromara.daxpay.core.enums.ChannelEnum;
+import org.dromara.daxpay.core.exception.ChannelNotEnableException;
+import org.dromara.daxpay.core.exception.ConfigNotEnableException;
+import org.dromara.daxpay.core.exception.DataErrorException;
+import org.dromara.daxpay.service.isv.cache.IsvChannelConfigCacheService;
+import org.dromara.daxpay.service.isv.dao.config.IsvChannelConfigManager;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * 微信服务商服务
+ * @author xxm
+ * @since 2024/11/1
+ */
+@Slf4j
+@Service
+@RequiredArgsConstructor
+public class WechatIsvConfigService {
+
+ private final IsvChannelConfigManager channelConfigManager;
+ private final IsvChannelConfigCacheService channelConfigCacheService;
+
+ /**
+ * 查询
+ */
+ public WechatIsvConfigResult findById(Long id) {
+ return channelConfigManager.findById(id)
+ .map(WechatIsvConfig::convertConfig)
+ .map(WechatIsvConfig::toResult)
+ .orElseThrow(() -> new ConfigNotEnableException("微信服务商配置不存在"));
+ }
+
+ /**
+ * 新增或更新
+ */
+ @Transactional(rollbackFor = Exception.class)
+ public void saveOrUpdate(WechatIsvConfigParam param){
+ if (param.getId() == null){
+ this.save(param);
+ } else {
+ this.update(param);
+ }
+ }
+
+ /**
+ * 添加
+ */
+ public void save(WechatIsvConfigParam param) {
+ WechatIsvConfig entity = WechatIsvConfigConvert.CONVERT.toEntity(param);
+ var channelConfig = entity.toChannelConfig();
+ // 判断商户和应用下是否存在该配置
+ if (channelConfigManager.existsByChannel(channelConfig.getChannel())){
+ throw new DataErrorException("该服务商下已存在微信配置, 请勿重新添加");
+ }
+ channelConfigManager.save(channelConfig);
+ }
+
+ /**
+ * 更新
+ */
+ public void update(WechatIsvConfigParam param){
+ var channelConfig = channelConfigManager.findById(param.getId())
+ .orElseThrow(() -> new ConfigNotEnableException("微信支付配置不存在"));
+ // 通道配置 --转换--> 微信支付配置 ----> 从更新参数赋值 --转换--> 通道配置 ----> 保存更新
+ WechatIsvConfig wechatIsvConfig = WechatIsvConfig.convertConfig(channelConfig);
+ BeanUtil.copyProperties(param, wechatIsvConfig, CopyOptions.create().ignoreNullValue());
+ var channelConfigParam = wechatIsvConfig.toChannelConfig();
+ // 手动写入一下原来的数据版本号
+ channelConfigParam.setVersion(channelConfig.getVersion());
+ BeanUtil.copyProperties(channelConfigParam, channelConfig, CopyOptions.create().ignoreNullValue());
+ channelConfigManager.updateById(channelConfig);
+ }
+
+ /**
+ * 获取并检查支付配置
+ */
+ public WechatIsvConfig getAndCheckConfig(){
+ var payConfig = this.getWechatIsvConfig();
+ if (!payConfig.getEnable()){
+ throw new ChannelNotEnableException("微信服务商通道未启用");
+ }
+ return payConfig;
+ }
+
+ /**
+ * 获取微信支付配置
+ */
+ public WechatIsvConfig getWechatIsvConfig(){
+ var channelConfig = channelConfigCacheService.get(ChannelEnum.WECHAT.getCode());
+ return WechatIsvConfig.convertConfig(channelConfig);
+ }
+
+ /**
+ * wxjava 支付开发包
+ */
+ public WxPayConfig wxJavaConfig(WechatIsvConfig wechatIsvConfig){
+ WxPayConfig payConfig = new WxPayConfig();
+ payConfig.setMchId(wechatIsvConfig.getWxMchId());
+ payConfig.setAppId(wechatIsvConfig.getWxAppId());
+ payConfig.setMchKey(wechatIsvConfig.getApiKeyV2());
+ payConfig.setApiV3Key(wechatIsvConfig.getApiKeyV3());
+ // 注意不要使用base64的方式进行配置, 因为wxjava 是直接读取文本并不会进行解码, 会导致证书异常
+ if (StrUtil.isNotBlank(wechatIsvConfig.getPublicKey())){
+ payConfig.setPublicKeyContent(Base64.decode(wechatIsvConfig.getPublicKey()));
+ }
+ payConfig.setPublicKeyId(wechatIsvConfig.getPublicKeyId());
+ if (StrUtil.isNotBlank(wechatIsvConfig.getPrivateCert())){
+ payConfig.setPrivateCertContent(Base64.decode(wechatIsvConfig.getPrivateCert()));
+ }
+ if (StrUtil.isNotBlank(wechatIsvConfig.getPrivateKey())){
+ payConfig.setPrivateKeyContent(Base64.decode(wechatIsvConfig.getPrivateKey()));
+ }
+ payConfig.setCertSerialNo(wechatIsvConfig.getCertSerialNo());
+ if (StrUtil.isNotBlank(wechatIsvConfig.getP12())){
+ payConfig.setKeyContent(Base64.decode(wechatIsvConfig.getP12()));
+ }
+ return payConfig;
+ }
+
+ /**
+ * wxjava 支付开发包
+ */
+ public WxPayService wxJavaPay(WechatIsvConfig wechatIsvConfig){
+ WxPayService wxPayService = new WxPayServiceImpl();
+ wxPayService.setConfig(wxJavaConfig(wechatIsvConfig));
+ return wxPayService;
+ }
+
+
+ /**
+ * 特约商户进件
+ */
+ public Applyment4SubService applyment4SubService(WechatIsvConfig wechatIsvConfig){
+ return new Applyment4SubServiceImpl(wxJavaPay(wechatIsvConfig));
+ }
+
+
+ /**
+ * 微信支付通用媒体接口.
+ */
+ public MerchantMediaService merchantMediaService(WechatIsvConfig wechatIsvConfig){
+ return new MerchantMediaServiceImpl(wxJavaPay(wechatIsvConfig));
+ }
+
+}
+
diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/allocation/WeChatPayAllocationV2Service.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/allocation/WeChatPayAllocationV2Service.java
deleted file mode 100644
index 0b09ef0b..00000000
--- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/allocation/WeChatPayAllocationV2Service.java
+++ /dev/null
@@ -1,170 +0,0 @@
-package org.dromara.daxpay.channel.wechat.service.payment.allocation;
-
-import cn.bootx.platform.common.mybatisplus.function.CollectorsFunction;
-import cn.hutool.json.JSONUtil;
-import com.github.binarywang.wxpay.bean.profitsharing.request.ProfitSharingQueryRequest;
-import com.github.binarywang.wxpay.bean.profitsharing.request.ProfitSharingRequest;
-import com.github.binarywang.wxpay.bean.profitsharing.request.ProfitSharingUnfreezeRequest;
-import com.github.binarywang.wxpay.bean.profitsharing.request.ProfitSharingV3Request;
-import com.github.binarywang.wxpay.bean.profitsharing.result.ProfitSharingQueryResult;
-import com.github.binarywang.wxpay.exception.WxPayException;
-import com.github.binarywang.wxpay.service.ProfitSharingService;
-import com.github.binarywang.wxpay.service.WxPayService;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig;
-import org.dromara.daxpay.channel.wechat.enums.WechatAllocReceiverEnum;
-import org.dromara.daxpay.channel.wechat.enums.WechatAllocStatusEnum;
-import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService;
-import org.dromara.daxpay.channel.wechat.util.WechatPayUtil;
-import org.dromara.daxpay.core.enums.AllocDetailResultEnum;
-import org.dromara.daxpay.core.enums.AllocReceiverTypeEnum;
-import org.dromara.daxpay.core.enums.AllocationStatusEnum;
-import org.dromara.daxpay.core.exception.ConfigErrorException;
-import org.dromara.daxpay.core.exception.OperationFailException;
-import org.dromara.daxpay.core.util.PayUtil;
-import org.dromara.daxpay.service.bo.allocation.AllocStartResultBo;
-import org.dromara.daxpay.service.bo.allocation.AllocSyncResultBo;
-import org.dromara.daxpay.service.entity.allocation.order.AllocDetail;
-import org.dromara.daxpay.service.entity.allocation.order.AllocOrder;
-import org.springframework.stereotype.Service;
-
-import java.time.LocalDateTime;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Objects;
-import java.util.Optional;
-import java.util.function.Function;
-import java.util.stream.Collectors;
-
-import static org.dromara.daxpay.core.enums.AllocReceiverTypeEnum.MERCHANT_NO;
-import static org.dromara.daxpay.core.enums.AllocReceiverTypeEnum.OPEN_ID;
-
-
-/**
- * 微信分账V2版本接口
- * @author xxm
- * @since 2024/12/9
- */
-@Slf4j
-@Service
-@RequiredArgsConstructor
-public class WeChatPayAllocationV2Service {
-
- private final WechatPayConfigService wechatPayConfigService;
-
- /**
- * 分账
- */
- public AllocStartResultBo start(AllocOrder allocOrder, List details, WechatPayConfig config) {
- WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(config);
- ProfitSharingService sharingService = wxPayService.getProfitSharingService();
-
- ProfitSharingRequest request = new ProfitSharingRequest();
- request.setAppid(config.getWxAppId());
- request.setOutOrderNo(allocOrder.getAllocNo());
- request.setTransactionId(allocOrder.getOutOrderNo());
-
- // 分账接收方信息
- var receivers = details.stream()
- .map(o -> {
- AllocReceiverTypeEnum receiverTypeEnum = AllocReceiverTypeEnum.findByCode(o.getReceiverType());
- String receiverType = this.getReceiverType(receiverTypeEnum);
- var receiver = new ProfitSharingV3Request.Receiver();
- receiver.setType(receiverType);
- receiver.setAmount(PayUtil.convertCentAmount(o.getAmount()));
- receiver.setAccount(o.getReceiverAccount());
- receiver.setName(o.getReceiverName());
- receiver.setDescription("订单分账");
- return receiver;
- })
- .toList();
-
- request.setReceivers(JSONUtil.toJsonStr(receivers));
- try {
- var result = sharingService.multiProfitSharing(request);
- return new AllocStartResultBo().setOutAllocNo(result.getTransactionId());
- } catch (WxPayException e) {
- throw new OperationFailException("微信分账V2失败: "+e.getMessage());
- }
- }
-
- /**
- * 完结
- */
- public void finish(AllocOrder allocOrder, WechatPayConfig config) {
- WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(config);
- ProfitSharingService sharingService = wxPayService.getProfitSharingService();
- var request = new ProfitSharingUnfreezeRequest();
- request.setOutOrderNo(String.valueOf(allocOrder.getId()));
- request.setTransactionId(allocOrder.getOutOrderNo());
- request.setDescription("分账完结");
- try {
- sharingService.profitSharingFinish(request);
- } catch (WxPayException e) {
- throw new OperationFailException("微信分账完结V2失败: "+e.getMessage());
- }
- }
-
- /**
- * 同步
- */
- public AllocSyncResultBo sync(AllocOrder allocOrder, List details, WechatPayConfig config) {
- WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(config);
- ProfitSharingService sharingService = wxPayService.getProfitSharingService();
- ProfitSharingQueryRequest request = new ProfitSharingQueryRequest();
- // 根据订单状态判断 使用ID还是分账号
- request.setTransactionId(allocOrder.getOutOrderNo());
- if (Objects.equals(AllocationStatusEnum.PROCESSING.getCode(), allocOrder.getStatus())){
- request.setOutOrderNo(allocOrder.getAllocNo());
- } else {
- request.setOutOrderNo(String.valueOf(allocOrder.getId()));
- }
-
- ProfitSharingQueryResult result;
- try {
- result = sharingService.profitSharingQuery(request);
- } catch (WxPayException e) {
- throw new OperationFailException("微信分账订单查询V2失败: "+e.getMessage());
- }
- var detailMap = details.stream()
- .collect(Collectors.toMap(AllocDetail::getReceiverAccount, Function.identity(), CollectorsFunction::retainLatest));
- var royaltyDetailList = Optional.ofNullable( result.getReceivers()).orElse(new ArrayList<>(0));
- for (var receiver : royaltyDetailList) {
- var detail = detailMap.get(receiver.getAccount());
- if (Objects.nonNull(detail)) {
- detail.setResult(this.getDetailResultEnum(receiver.getResult()).getCode());
- detail.setErrorMsg(receiver.getFailReason());
- detail.setOutDetailId(receiver.getDetailId());
- // 如果是完成, 更新时间
- if (AllocDetailResultEnum.SUCCESS.getCode().equals(detail.getResult())){
- LocalDateTime finishTime = WechatPayUtil.parseV2(receiver.getFinishTime());
- detail.setFinishTime(finishTime)
- .setErrorMsg(null)
- .setErrorCode(null);
- }
- }
- }
- return new AllocSyncResultBo().setSyncInfo(JSONUtil.toJsonStr(result));
- }
-
- /**
- * 获取分账接收方类型编码
- */
- private String getReceiverType(AllocReceiverTypeEnum receiverTypeEnum){
- if (receiverTypeEnum == OPEN_ID){
- return WechatAllocReceiverEnum.PERSONAL_OPENID.getCode();
- }
- if (receiverTypeEnum == MERCHANT_NO){
- return WechatAllocReceiverEnum.MERCHANT_ID.getCode();
- }
- throw new ConfigErrorException("分账接收方类型错误");
- }
-
- /**
- * 转换支付宝分账类型到系统中统一的状态
- */
- private AllocDetailResultEnum getDetailResultEnum (String result){
- return WechatAllocStatusEnum.findByCode(result).getResult();
- }
-}
diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/allocation/WeChatPayAllocationV3Service.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/allocation/WeChatPayAllocationV3Service.java
deleted file mode 100644
index 5187035b..00000000
--- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/allocation/WeChatPayAllocationV3Service.java
+++ /dev/null
@@ -1,170 +0,0 @@
-package org.dromara.daxpay.channel.wechat.service.payment.allocation;
-
-import cn.bootx.platform.common.mybatisplus.function.CollectorsFunction;
-import cn.hutool.json.JSONUtil;
-import com.github.binarywang.wxpay.bean.profitsharing.request.ProfitSharingUnfreezeV3Request;
-import com.github.binarywang.wxpay.bean.profitsharing.request.ProfitSharingV3Request;
-import com.github.binarywang.wxpay.bean.profitsharing.result.ProfitSharingV3Result;
-import com.github.binarywang.wxpay.exception.WxPayException;
-import com.github.binarywang.wxpay.service.ProfitSharingService;
-import com.github.binarywang.wxpay.service.WxPayService;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig;
-import org.dromara.daxpay.channel.wechat.enums.WechatAllocReceiverEnum;
-import org.dromara.daxpay.channel.wechat.enums.WechatAllocStatusEnum;
-import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService;
-import org.dromara.daxpay.channel.wechat.util.WechatPayUtil;
-import org.dromara.daxpay.core.enums.AllocDetailResultEnum;
-import org.dromara.daxpay.core.enums.AllocReceiverTypeEnum;
-import org.dromara.daxpay.core.exception.ConfigErrorException;
-import org.dromara.daxpay.core.exception.OperationFailException;
-import org.dromara.daxpay.core.util.PayUtil;
-import org.dromara.daxpay.service.bo.allocation.AllocStartResultBo;
-import org.dromara.daxpay.service.bo.allocation.AllocSyncResultBo;
-import org.dromara.daxpay.service.entity.allocation.order.AllocDetail;
-import org.dromara.daxpay.service.entity.allocation.order.AllocOrder;
-import org.springframework.stereotype.Service;
-
-import java.time.LocalDateTime;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Objects;
-import java.util.Optional;
-import java.util.function.Function;
-import java.util.stream.Collectors;
-
-import static org.dromara.daxpay.core.enums.AllocReceiverTypeEnum.MERCHANT_NO;
-import static org.dromara.daxpay.core.enums.AllocReceiverTypeEnum.OPEN_ID;
-import static org.dromara.daxpay.core.enums.AllocationStatusEnum.*;
-
-
-/**
- * 微信分账V3版本接口
- * @author xxm
- * @since 2024/12/9
- */
-@Slf4j
-@Service
-@RequiredArgsConstructor
-public class WeChatPayAllocationV3Service {
- private final WechatPayConfigService wechatPayConfigService;
-
- /**
- * 发起分账 使用分账号作为请求号
- */
- public AllocStartResultBo start(AllocOrder allocOrder, List orderDetails, WechatPayConfig config){
- WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(config);
- ProfitSharingService sharingService = wxPayService.getProfitSharingService();
-
- ProfitSharingV3Request request = new ProfitSharingV3Request();
- request.setAppid(config.getWxAppId());
- request.setOutOrderNo(allocOrder.getAllocNo());
- request.setTransactionId(allocOrder.getOutOrderNo());
- request.setUnfreezeUnsplit(false);
-
- // 分账接收方信息
- var receivers = orderDetails.stream()
- .map(o -> {
- AllocReceiverTypeEnum receiverTypeEnum = AllocReceiverTypeEnum.findByCode(o.getReceiverType());
- String receiverType = this.getReceiverType(receiverTypeEnum);
- var receiver = new ProfitSharingV3Request.Receiver();
- receiver.setType(receiverType);
- receiver.setAmount(PayUtil.convertCentAmount(o.getAmount()));
- receiver.setAccount(o.getReceiverAccount());
- receiver.setName(o.getReceiverName());
- receiver.setDescription("订单分账");
- receiver.setRelationType("PARTNER");
- return receiver;
- })
- .toList();
-
- request.setReceivers(receivers);
- try {
- ProfitSharingV3Result result = sharingService.profitSharingV3(request);
- return new AllocStartResultBo().setOutAllocNo(result.getTransactionId());
- } catch (WxPayException e) {
- throw new OperationFailException("微信分账V3失败: "+e.getMessage());
- }
- }
-
- /**
- * 分账完结 使用ID作为请求号
- */
- public void finish(AllocOrder allocOrder, WechatPayConfig config){
- WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(config);
- ProfitSharingService sharingService = wxPayService.getProfitSharingService();
- var request = new ProfitSharingUnfreezeV3Request();
- request.setOutOrderNo(String.valueOf(allocOrder.getId()));
- request.setTransactionId(allocOrder.getOutOrderNo());
- request.setDescription("分账完结");
- try {
- sharingService.profitSharingUnfreeze(request);
- } catch (WxPayException e) {
- throw new OperationFailException("微信分账完结V3失败: "+e.getMessage());
- }
- }
-
- /**
- * 同步
- */
- public AllocSyncResultBo sync(AllocOrder allocOrder, List details, WechatPayConfig config){
- WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(config);
- ProfitSharingService sharingService = wxPayService.getProfitSharingService();
- // 根据订单状态判断 使用ID还是分账号
- String outOrderNo;
- if (List.of(PROCESSING.getCode(), ALLOC_FAILED.getCode(), ALLOC_END.getCode()).contains(allocOrder.getStatus())){
- outOrderNo = allocOrder.getAllocNo();
- } else {
- outOrderNo = String.valueOf(allocOrder.getId());
- }
-
- ProfitSharingV3Result result;
- try {
- result = sharingService.profitSharingQueryV3(outOrderNo,allocOrder.getOutOrderNo());
- } catch (WxPayException e) {
- throw new OperationFailException("微信分账订单查询V3失败: "+e.getMessage());
- }
- var detailMap = details.stream()
- .collect(Collectors.toMap(AllocDetail::getReceiverAccount, Function.identity(), CollectorsFunction::retainLatest));
- var royaltyDetailList = Optional.ofNullable(result.getReceivers()).orElse(new ArrayList<>(0));
- for (var receiver : royaltyDetailList) {
- var detail = detailMap.get(receiver.getAccount());
- if (Objects.nonNull(detail)) {
- detail.setResult(this.getDetailResultEnum(receiver.getResult()).getCode());
- detail.setErrorMsg(receiver.getFailReason());
- detail.setOutDetailId(receiver.getDetailId());
- // 如果是完成, 更新时间
- if (AllocDetailResultEnum.SUCCESS.getCode().equals(detail.getResult())){
- LocalDateTime finishTime = WechatPayUtil.parseV3(receiver.getFinishTime());
- detail.setFinishTime(finishTime)
- .setErrorMsg(null)
- .setErrorCode(null);
- }
- }
- }
- return new AllocSyncResultBo().setSyncInfo(JSONUtil.toJsonStr(result));
- }
-
- /**
- * 获取分账接收方类型编码
- */
- private String getReceiverType(AllocReceiverTypeEnum receiverTypeEnum){
- if (receiverTypeEnum == OPEN_ID){
- return WechatAllocReceiverEnum.PERSONAL_OPENID.getCode();
- }
- if (receiverTypeEnum == MERCHANT_NO){
- return WechatAllocReceiverEnum.MERCHANT_ID.getCode();
- }
- throw new ConfigErrorException("分账接收方类型错误");
- }
-
- /**
- * 转换支付宝分账类型到系统中统一的状态
- */
- private AllocDetailResultEnum getDetailResultEnum (String result){
- return WechatAllocStatusEnum.findByCode(result).getResult();
- }
-
-
-}
diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/allocation/WeChatPaySubAllocationV2Service.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/allocation/WeChatPaySubAllocationV2Service.java
deleted file mode 100644
index 191d9a15..00000000
--- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/allocation/WeChatPaySubAllocationV2Service.java
+++ /dev/null
@@ -1,170 +0,0 @@
-package org.dromara.daxpay.channel.wechat.service.payment.allocation;
-
-import cn.bootx.platform.common.mybatisplus.function.CollectorsFunction;
-import cn.hutool.json.JSONUtil;
-import com.github.binarywang.wxpay.bean.profitsharing.request.ProfitSharingQueryRequest;
-import com.github.binarywang.wxpay.bean.profitsharing.request.ProfitSharingRequest;
-import com.github.binarywang.wxpay.bean.profitsharing.request.ProfitSharingUnfreezeRequest;
-import com.github.binarywang.wxpay.bean.profitsharing.request.ProfitSharingV3Request;
-import com.github.binarywang.wxpay.bean.profitsharing.result.ProfitSharingQueryResult;
-import com.github.binarywang.wxpay.exception.WxPayException;
-import com.github.binarywang.wxpay.service.ProfitSharingService;
-import com.github.binarywang.wxpay.service.WxPayService;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig;
-import org.dromara.daxpay.channel.wechat.enums.WechatAllocReceiverEnum;
-import org.dromara.daxpay.channel.wechat.enums.WechatAllocStatusEnum;
-import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService;
-import org.dromara.daxpay.channel.wechat.util.WechatPayUtil;
-import org.dromara.daxpay.core.enums.AllocDetailResultEnum;
-import org.dromara.daxpay.core.enums.AllocReceiverTypeEnum;
-import org.dromara.daxpay.core.enums.AllocationStatusEnum;
-import org.dromara.daxpay.core.exception.ConfigErrorException;
-import org.dromara.daxpay.core.exception.OperationFailException;
-import org.dromara.daxpay.core.util.PayUtil;
-import org.dromara.daxpay.service.bo.allocation.AllocStartResultBo;
-import org.dromara.daxpay.service.bo.allocation.AllocSyncResultBo;
-import org.dromara.daxpay.service.entity.allocation.order.AllocDetail;
-import org.dromara.daxpay.service.entity.allocation.order.AllocOrder;
-import org.springframework.stereotype.Service;
-
-import java.time.LocalDateTime;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Objects;
-import java.util.Optional;
-import java.util.function.Function;
-import java.util.stream.Collectors;
-
-import static org.dromara.daxpay.core.enums.AllocReceiverTypeEnum.MERCHANT_NO;
-import static org.dromara.daxpay.core.enums.AllocReceiverTypeEnum.OPEN_ID;
-
-
-/**
- * 微信服务商分账V2版本接口
- * @author xxm
- * @since 2024/12/9
- */
-@Slf4j
-@Service
-@RequiredArgsConstructor
-public class WeChatPaySubAllocationV2Service {
-
- private final WechatPayConfigService wechatPayConfigService;
-
- /**
- * 分账
- */
- public AllocStartResultBo start(AllocOrder allocOrder, List details, WechatPayConfig config) {
- WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(config);
- ProfitSharingService sharingService = wxPayService.getProfitSharingService();
-
- ProfitSharingRequest request = new ProfitSharingRequest();
- request.setAppid(config.getWxAppId());
- request.setOutOrderNo(allocOrder.getAllocNo());
- request.setTransactionId(allocOrder.getOutOrderNo());
-
- // 分账接收方信息
- var receivers = details.stream()
- .map(o -> {
- AllocReceiverTypeEnum receiverTypeEnum = AllocReceiverTypeEnum.findByCode(o.getReceiverType());
- String receiverType = this.getReceiverType(receiverTypeEnum);
- var receiver = new ProfitSharingV3Request.Receiver();
- receiver.setType(receiverType);
- receiver.setAmount(PayUtil.convertCentAmount(o.getAmount()));
- receiver.setAccount(o.getReceiverAccount());
- receiver.setName(o.getReceiverName());
- receiver.setDescription("订单分账");
- return receiver;
- })
- .toList();
-
- request.setReceivers(JSONUtil.toJsonStr(receivers));
- try {
- var result = sharingService.multiProfitSharing(request);
- return new AllocStartResultBo().setOutAllocNo(result.getTransactionId());
- } catch (WxPayException e) {
- throw new OperationFailException("微信分账V2失败: "+e.getMessage());
- }
- }
-
- /**
- * 完结
- */
- public void finish(AllocOrder allocOrder, WechatPayConfig config) {
- WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(config);
- ProfitSharingService sharingService = wxPayService.getProfitSharingService();
- var request = new ProfitSharingUnfreezeRequest();
- request.setOutOrderNo(String.valueOf(allocOrder.getId()));
- request.setTransactionId(allocOrder.getOutOrderNo());
- request.setDescription("分账完结");
- try {
- sharingService.profitSharingFinish(request);
- } catch (WxPayException e) {
- throw new OperationFailException("微信分账完结V2失败: "+e.getMessage());
- }
- }
-
- /**
- * 同步
- */
- public AllocSyncResultBo sync(AllocOrder allocOrder, List details, WechatPayConfig config) {
- WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(config);
- ProfitSharingService sharingService = wxPayService.getProfitSharingService();
- ProfitSharingQueryRequest request = new ProfitSharingQueryRequest();
- // 根据订单状态判断 使用ID还是分账号
- request.setTransactionId(allocOrder.getOutOrderNo());
- if (Objects.equals(AllocationStatusEnum.PROCESSING.getCode(), allocOrder.getStatus())){
- request.setOutOrderNo(allocOrder.getAllocNo());
- } else {
- request.setOutOrderNo(String.valueOf(allocOrder.getId()));
- }
-
- ProfitSharingQueryResult result;
- try {
- result = sharingService.profitSharingQuery(request);
- } catch (WxPayException e) {
- throw new OperationFailException("微信分账订单查询V2失败: "+e.getMessage());
- }
- var detailMap = details.stream()
- .collect(Collectors.toMap(AllocDetail::getReceiverAccount, Function.identity(), CollectorsFunction::retainLatest));
- var royaltyDetailList = Optional.ofNullable( result.getReceivers()).orElse(new ArrayList<>(0));
- for (var receiver : royaltyDetailList) {
- var detail = detailMap.get(receiver.getAccount());
- if (Objects.nonNull(detail)) {
- detail.setResult(this.getDetailResultEnum(receiver.getResult()).getCode());
- detail.setErrorMsg(receiver.getFailReason());
- detail.setOutDetailId(receiver.getDetailId());
- // 如果是完成, 更新时间
- if (AllocDetailResultEnum.SUCCESS.getCode().equals(detail.getResult())){
- LocalDateTime finishTime = WechatPayUtil.parseV2(receiver.getFinishTime());
- detail.setFinishTime(finishTime)
- .setErrorMsg(null)
- .setErrorCode(null);
- }
- }
- }
- return new AllocSyncResultBo().setSyncInfo(JSONUtil.toJsonStr(result));
- }
-
- /**
- * 获取分账接收方类型编码
- */
- private String getReceiverType(AllocReceiverTypeEnum receiverTypeEnum){
- if (receiverTypeEnum == OPEN_ID){
- return WechatAllocReceiverEnum.PERSONAL_OPENID.getCode();
- }
- if (receiverTypeEnum == MERCHANT_NO){
- return WechatAllocReceiverEnum.MERCHANT_ID.getCode();
- }
- throw new ConfigErrorException("分账接收方类型错误");
- }
-
- /**
- * 转换支付宝分账类型到系统中统一的状态
- */
- private AllocDetailResultEnum getDetailResultEnum (String result){
- return WechatAllocStatusEnum.findByCode(result).getResult();
- }
-}
diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/allocation/WeChatPaySubAllocationV3Service.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/allocation/WeChatPaySubAllocationV3Service.java
deleted file mode 100644
index 5c1dc916..00000000
--- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/allocation/WeChatPaySubAllocationV3Service.java
+++ /dev/null
@@ -1,170 +0,0 @@
-package org.dromara.daxpay.channel.wechat.service.payment.allocation;
-
-import cn.bootx.platform.common.mybatisplus.function.CollectorsFunction;
-import cn.hutool.json.JSONUtil;
-import com.github.binarywang.wxpay.bean.profitsharing.request.ProfitSharingUnfreezeV3Request;
-import com.github.binarywang.wxpay.bean.profitsharing.request.ProfitSharingV3Request;
-import com.github.binarywang.wxpay.bean.profitsharing.result.ProfitSharingV3Result;
-import com.github.binarywang.wxpay.exception.WxPayException;
-import com.github.binarywang.wxpay.service.ProfitSharingService;
-import com.github.binarywang.wxpay.service.WxPayService;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig;
-import org.dromara.daxpay.channel.wechat.enums.WechatAllocReceiverEnum;
-import org.dromara.daxpay.channel.wechat.enums.WechatAllocStatusEnum;
-import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService;
-import org.dromara.daxpay.channel.wechat.util.WechatPayUtil;
-import org.dromara.daxpay.core.enums.AllocDetailResultEnum;
-import org.dromara.daxpay.core.enums.AllocReceiverTypeEnum;
-import org.dromara.daxpay.core.exception.ConfigErrorException;
-import org.dromara.daxpay.core.exception.OperationFailException;
-import org.dromara.daxpay.core.util.PayUtil;
-import org.dromara.daxpay.service.bo.allocation.AllocStartResultBo;
-import org.dromara.daxpay.service.bo.allocation.AllocSyncResultBo;
-import org.dromara.daxpay.service.entity.allocation.order.AllocDetail;
-import org.dromara.daxpay.service.entity.allocation.order.AllocOrder;
-import org.springframework.stereotype.Service;
-
-import java.time.LocalDateTime;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Objects;
-import java.util.Optional;
-import java.util.function.Function;
-import java.util.stream.Collectors;
-
-import static org.dromara.daxpay.core.enums.AllocReceiverTypeEnum.MERCHANT_NO;
-import static org.dromara.daxpay.core.enums.AllocReceiverTypeEnum.OPEN_ID;
-import static org.dromara.daxpay.core.enums.AllocationStatusEnum.*;
-
-
-/**
- * 微信服务商分账V3版本接口
- * @author xxm
- * @since 2024/12/9
- */
-@Slf4j
-@Service
-@RequiredArgsConstructor
-public class WeChatPaySubAllocationV3Service {
- private final WechatPayConfigService wechatPayConfigService;
-
- /**
- * 发起分账 使用分账号作为请求号
- */
- public AllocStartResultBo start(AllocOrder allocOrder, List orderDetails, WechatPayConfig config){
- WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(config);
- ProfitSharingService sharingService = wxPayService.getProfitSharingService();
-
- ProfitSharingV3Request request = new ProfitSharingV3Request();
- request.setAppid(config.getWxAppId());
- request.setOutOrderNo(allocOrder.getAllocNo());
- request.setTransactionId(allocOrder.getOutOrderNo());
- request.setUnfreezeUnsplit(false);
-
- // 分账接收方信息
- var receivers = orderDetails.stream()
- .map(o -> {
- AllocReceiverTypeEnum receiverTypeEnum = AllocReceiverTypeEnum.findByCode(o.getReceiverType());
- String receiverType = this.getReceiverType(receiverTypeEnum);
- var receiver = new ProfitSharingV3Request.Receiver();
- receiver.setType(receiverType);
- receiver.setAmount(PayUtil.convertCentAmount(o.getAmount()));
- receiver.setAccount(o.getReceiverAccount());
- receiver.setName(o.getReceiverName());
- receiver.setDescription("订单分账");
- receiver.setRelationType("PARTNER");
- return receiver;
- })
- .toList();
-
- request.setReceivers(receivers);
- try {
- ProfitSharingV3Result result = sharingService.profitSharingV3(request);
- return new AllocStartResultBo().setOutAllocNo(result.getTransactionId());
- } catch (WxPayException e) {
- throw new OperationFailException("微信分账V3失败: "+e.getMessage());
- }
- }
-
- /**
- * 分账完结 使用ID作为请求号
- */
- public void finish(AllocOrder allocOrder, WechatPayConfig config){
- WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(config);
- ProfitSharingService sharingService = wxPayService.getProfitSharingService();
- var request = new ProfitSharingUnfreezeV3Request();
- request.setOutOrderNo(String.valueOf(allocOrder.getId()));
- request.setTransactionId(allocOrder.getOutOrderNo());
- request.setDescription("分账完结");
- try {
- sharingService.profitSharingUnfreeze(request);
- } catch (WxPayException e) {
- throw new OperationFailException("微信分账完结V3失败: "+e.getMessage());
- }
- }
-
- /**
- * 同步
- */
- public AllocSyncResultBo sync(AllocOrder allocOrder, List details, WechatPayConfig config){
- WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(config);
- ProfitSharingService sharingService = wxPayService.getProfitSharingService();
- // 根据订单状态判断 使用ID还是分账号
- String outOrderNo;
- if (List.of(PROCESSING.getCode(), ALLOC_FAILED.getCode(), ALLOC_END.getCode()).contains(allocOrder.getStatus())){
- outOrderNo = allocOrder.getAllocNo();
- } else {
- outOrderNo = String.valueOf(allocOrder.getId());
- }
-
- ProfitSharingV3Result result;
- try {
- result = sharingService.profitSharingQueryV3(outOrderNo,allocOrder.getOutOrderNo(),config.getSubMchId());
- } catch (WxPayException e) {
- throw new OperationFailException("微信分账订单查询V3失败: "+e.getMessage());
- }
- var detailMap = details.stream()
- .collect(Collectors.toMap(AllocDetail::getReceiverAccount, Function.identity(), CollectorsFunction::retainLatest));
- var royaltyDetailList = Optional.ofNullable(result.getReceivers()).orElse(new ArrayList<>(0));
- for (var receiver : royaltyDetailList) {
- var detail = detailMap.get(receiver.getAccount());
- if (Objects.nonNull(detail)) {
- detail.setResult(this.getDetailResultEnum(receiver.getResult()).getCode());
- detail.setErrorMsg(receiver.getFailReason());
- detail.setOutDetailId(receiver.getDetailId());
- // 如果是完成, 更新时间
- if (AllocDetailResultEnum.SUCCESS.getCode().equals(detail.getResult())){
- LocalDateTime finishTime = WechatPayUtil.parseV3(receiver.getFinishTime());
- detail.setFinishTime(finishTime)
- .setErrorMsg(null)
- .setErrorCode(null);
- }
- }
- }
- return new AllocSyncResultBo().setSyncInfo(JSONUtil.toJsonStr(result));
- }
-
- /**
- * 获取分账接收方类型编码
- */
- private String getReceiverType(AllocReceiverTypeEnum receiverTypeEnum){
- if (receiverTypeEnum == OPEN_ID){
- return WechatAllocReceiverEnum.PERSONAL_OPENID.getCode();
- }
- if (receiverTypeEnum == MERCHANT_NO){
- return WechatAllocReceiverEnum.MERCHANT_ID.getCode();
- }
- throw new ConfigErrorException("分账接收方类型错误");
- }
-
- /**
- * 转换支付宝分账类型到系统中统一的状态
- */
- private AllocDetailResultEnum getDetailResultEnum (String result){
- return WechatAllocStatusEnum.findByCode(result).getResult();
- }
-
-
-}
diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/allocation/receiver/WechatPayAllocReceiverV2Service.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/allocation/receiver/WechatPayAllocReceiverV2Service.java
deleted file mode 100644
index 33ca0c35..00000000
--- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/allocation/receiver/WechatPayAllocReceiverV2Service.java
+++ /dev/null
@@ -1,102 +0,0 @@
-package org.dromara.daxpay.channel.wechat.service.payment.allocation.receiver;
-
-import org.dromara.daxpay.channel.wechat.entity.allocation.WechatAllocReceiverBind;
-import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig;
-import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService;
-import org.dromara.daxpay.core.enums.AllocReceiverTypeEnum;
-import org.dromara.daxpay.core.exception.ConfigErrorException;
-import org.dromara.daxpay.core.exception.OperationFailException;
-import com.github.binarywang.wxpay.bean.profitsharing.Receiver;
-import com.github.binarywang.wxpay.bean.profitsharing.request.ProfitSharingReceiverRequest;
-import com.github.binarywang.wxpay.exception.WxPayException;
-import com.github.binarywang.wxpay.service.ProfitSharingService;
-import com.github.binarywang.wxpay.service.WxPayService;
-import com.google.gson.Gson;
-import com.google.gson.GsonBuilder;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.stereotype.Service;
-
-import java.util.Locale;
-import java.util.Objects;
-
-import static org.dromara.daxpay.core.enums.AllocReceiverTypeEnum.MERCHANT_NO;
-import static org.dromara.daxpay.core.enums.AllocReceiverTypeEnum.OPEN_ID;
-
-/**
- * 微信分账接收方服务
- * @author xxm
- * @since 2024/4/1
- */
-@Slf4j
-@Service
-@RequiredArgsConstructor
-public class WechatPayAllocReceiverV2Service {
-
- private final WechatPayConfigService wechatPayConfigService;
-
- private static final Gson GSON = new GsonBuilder().create();
-
- /**
- * 绑定
- */
- public void bind(WechatAllocReceiverBind wxReceiver, WechatPayConfig config){
- WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(config);
- ProfitSharingService sharingService = wxPayService.getProfitSharingService();
- var receiverTypeEnum = AllocReceiverTypeEnum.findByCode(wxReceiver.getReceiverType());
- String receiverType = this.getReceiverType(receiverTypeEnum);
- ProfitSharingReceiverRequest request = new ProfitSharingReceiverRequest();
- Receiver receiver = new Receiver(receiverType,wxReceiver.getReceiverAccount(),wxReceiver.getReceiverName(),wxReceiver.getRelationType(),wxReceiver.getRelationName());
- request.setReceiver(GSON.toJson(receiver));
-
- try {
- sharingService.addReceiver(request);
- } catch (WxPayException e) {
- throw new OperationFailException("微信添加分账方V2失败: "+e.getMessage());
- }
- }
-
- /**
- * 解除绑定
- */
- public void unbind(WechatAllocReceiverBind allocReceiver, WechatPayConfig config){
-
- WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(config);
- ProfitSharingService sharingService = wxPayService.getProfitSharingService();
-
- ProfitSharingReceiverRequest request = new ProfitSharingReceiverRequest();
- var receiverTypeEnum = AllocReceiverTypeEnum.findByCode(allocReceiver.getReceiverType());
- String receiverType = this.getReceiverType(receiverTypeEnum);
- Receiver receiver = new Receiver(receiverType,allocReceiver.getReceiverAccount());
- request.setReceiver(GSON.toJson(receiver));
- try {
- sharingService.removeReceiver(request);
- } catch (WxPayException e) {
- throw new OperationFailException("微信删除分账方V2失败: "+e.getMessage());
- }
- }
-
-
- /**
- * 获取分账接收方类型编码
- */
- private String getReceiverType(AllocReceiverTypeEnum receiverTypeEnum){
- if (receiverTypeEnum == OPEN_ID){
- return "PERSONAL_OPENID";
- }
- if (receiverTypeEnum == MERCHANT_NO){
- return "MERCHANT_ID";
- }
- throw new ConfigErrorException("分账接收方类型错误");
- }
-
- /**
- * 获取分账关系类型编码
- */
- private String getRelationType(String relationType){
- if (Objects.isNull(relationType)){
- return null;
- }
- return relationType.toUpperCase(Locale.ROOT);
- }
-}
diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/allocation/receiver/WechatPayAllocReceiverV3Service.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/allocation/receiver/WechatPayAllocReceiverV3Service.java
deleted file mode 100644
index 2a32f4c7..00000000
--- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/allocation/receiver/WechatPayAllocReceiverV3Service.java
+++ /dev/null
@@ -1,103 +0,0 @@
-package org.dromara.daxpay.channel.wechat.service.payment.allocation.receiver;
-
-import org.dromara.daxpay.channel.wechat.entity.allocation.WechatAllocReceiverBind;
-import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig;
-import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService;
-import org.dromara.daxpay.core.enums.AllocReceiverTypeEnum;
-import org.dromara.daxpay.core.exception.ConfigErrorException;
-import org.dromara.daxpay.core.exception.OperationFailException;
-import com.github.binarywang.wxpay.bean.profitsharing.request.ProfitSharingReceiverV3Request;
-import com.github.binarywang.wxpay.exception.WxPayException;
-import com.github.binarywang.wxpay.service.ProfitSharingService;
-import com.github.binarywang.wxpay.service.WxPayService;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.stereotype.Service;
-
-import java.util.Locale;
-import java.util.Objects;
-
-import static org.dromara.daxpay.core.enums.AllocReceiverTypeEnum.MERCHANT_NO;
-import static org.dromara.daxpay.core.enums.AllocReceiverTypeEnum.OPEN_ID;
-
-/**
- * 微信分账接收方服务
- * @author xxm
- * @since 2024/4/1
- */
-@Slf4j
-@Service
-@RequiredArgsConstructor
-public class WechatPayAllocReceiverV3Service {
- private final WechatPayConfigService wechatPayConfigService;
-
- /**
- * 绑定
- */
- public void bind(WechatAllocReceiverBind wxReceiver, WechatPayConfig config){
-
- WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(config);
- ProfitSharingService sharingService = wxPayService.getProfitSharingService();
-
- ProfitSharingReceiverV3Request request = new ProfitSharingReceiverV3Request();
- request.setAppid(config.getWxAppId());
- var receiverTypeEnum = AllocReceiverTypeEnum.findByCode(wxReceiver.getReceiverType());
- String receiverType = this.getReceiverType(receiverTypeEnum);
- request.setType(receiverType);
- request.setAccount(wxReceiver.getReceiverAccount());
- request.setName(wxReceiver.getReceiverName());
- request.setRelationType(getRelationType(wxReceiver.getRelationType()));
- request.setCustomRelation(wxReceiver.getRelationName());
- try {
- sharingService.addReceiverV3(request);
- } catch (WxPayException e) {
- throw new OperationFailException("微信添加分账方V3失败: "+e.getMessage());
- }
- }
-
- /**
- * 解除绑定
- */
- public void unbind(WechatAllocReceiverBind wxReceiver, WechatPayConfig config){
-
- WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(config);
- ProfitSharingService sharingService = wxPayService.getProfitSharingService();
-
- ProfitSharingReceiverV3Request request = new ProfitSharingReceiverV3Request();
- request.setAppid(config.getAppId());
- var receiverTypeEnum = AllocReceiverTypeEnum.findByCode(wxReceiver.getReceiverType());
- String receiverType = this.getReceiverType(receiverTypeEnum);
- request.setType(receiverType);
- request.setAccount(wxReceiver.getReceiverAccount());
- request.setName(wxReceiver.getReceiverName());
- request.setRelationType(getRelationType(wxReceiver.getRelationType()));
- request.setCustomRelation(wxReceiver.getRelationName());
- try {
- sharingService.removeReceiverV3(request);
- } catch (WxPayException e) {
- throw new OperationFailException("微信添加分账方V3失败: "+e.getMessage());
- }
- }
-
- /**
- * 获取分账接收方类型编码
- */
- private String getReceiverType(AllocReceiverTypeEnum receiverTypeEnum){
- if (receiverTypeEnum == OPEN_ID){
- return "PERSONAL_OPENID";
- }
- if (receiverTypeEnum == MERCHANT_NO){
- return "MERCHANT_ID";
- }
- throw new ConfigErrorException("分账接收方类型错误");
- }
- /**
- * 获取分账关系类型编码
- */
- private String getRelationType(String relationType){
- if (Objects.isNull(relationType)){
- return null;
- }
- return relationType.toUpperCase(Locale.ROOT);
- }
-}
diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/allocation/receiver/WechatPaySubAllocReceiverV2Service.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/allocation/receiver/WechatPaySubAllocReceiverV2Service.java
deleted file mode 100644
index c4c1d531..00000000
--- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/allocation/receiver/WechatPaySubAllocReceiverV2Service.java
+++ /dev/null
@@ -1,101 +0,0 @@
-package org.dromara.daxpay.channel.wechat.service.payment.allocation.receiver;
-
-import org.dromara.daxpay.channel.wechat.entity.allocation.WechatAllocReceiverBind;
-import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig;
-import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService;
-import org.dromara.daxpay.core.enums.AllocReceiverTypeEnum;
-import org.dromara.daxpay.core.exception.ConfigErrorException;
-import org.dromara.daxpay.core.exception.OperationFailException;
-import com.github.binarywang.wxpay.bean.profitsharing.Receiver;
-import com.github.binarywang.wxpay.bean.profitsharing.request.ProfitSharingReceiverRequest;
-import com.github.binarywang.wxpay.exception.WxPayException;
-import com.github.binarywang.wxpay.service.ProfitSharingService;
-import com.github.binarywang.wxpay.service.WxPayService;
-import com.google.gson.Gson;
-import com.google.gson.GsonBuilder;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.stereotype.Service;
-
-import java.util.Locale;
-import java.util.Objects;
-
-import static org.dromara.daxpay.core.enums.AllocReceiverTypeEnum.MERCHANT_NO;
-import static org.dromara.daxpay.core.enums.AllocReceiverTypeEnum.OPEN_ID;
-
-/**
- * 微信分账接收方服务
- * @author xxm
- * @since 2024/4/1
- */
-@Slf4j
-@Service
-@RequiredArgsConstructor
-public class WechatPaySubAllocReceiverV2Service {
-
- private final WechatPayConfigService wechatPayConfigService;
-
- private static final Gson GSON = new GsonBuilder().create();
-
- /**
- * 绑定
- */
- public void bind(WechatAllocReceiverBind wxReceiver, WechatPayConfig config){
- WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(config);
- ProfitSharingService sharingService = wxPayService.getProfitSharingService();
- var receiverTypeEnum = AllocReceiverTypeEnum.findByCode(wxReceiver.getReceiverType());
- var receiverType = this.getReceiverType(receiverTypeEnum);
- ProfitSharingReceiverRequest request = new ProfitSharingReceiverRequest();
- Receiver receiver = new Receiver(receiverType,wxReceiver.getReceiverAccount(),wxReceiver.getReceiverName(),wxReceiver.getRelationType(),wxReceiver.getRelationName());
- request.setReceiver(GSON.toJson(receiver));
-
- try {
- sharingService.addReceiver(request);
- } catch (WxPayException e) {
- throw new OperationFailException("微信添加分账方V2失败: "+e.getMessage());
- }
- }
-
- /**
- * 解除绑定
- */
- public void unbind(WechatAllocReceiverBind wxReceiver, WechatPayConfig config){
-
- WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(config);
- ProfitSharingService sharingService = wxPayService.getProfitSharingService();
- var receiverTypeEnum = AllocReceiverTypeEnum.findByCode(wxReceiver.getReceiverType());
- String receiverType = this.getReceiverType(receiverTypeEnum);
- ProfitSharingReceiverRequest request = new ProfitSharingReceiverRequest();
- Receiver receiver = new Receiver(receiverType,wxReceiver.getReceiverAccount());
- request.setReceiver(GSON.toJson(receiver));
- try {
- sharingService.removeReceiver(request);
- } catch (WxPayException e) {
- throw new OperationFailException("微信删除分账方V2失败: "+e.getMessage());
- }
- }
-
-
- /**
- * 获取分账接收方类型编码
- */
- private String getReceiverType(AllocReceiverTypeEnum receiverTypeEnum){
- if (receiverTypeEnum == OPEN_ID){
- return "PERSONAL_OPENID";
- }
- if (receiverTypeEnum == MERCHANT_NO){
- return "MERCHANT_ID";
- }
- throw new ConfigErrorException("分账接收方类型错误");
- }
-
- /**
- * 获取分账关系类型编码
- */
- private String getRelationType(String relationType){
- if (Objects.isNull(relationType)){
- return null;
- }
- return relationType.toUpperCase(Locale.ROOT);
- }
-}
diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/allocation/receiver/WechatPaySubAllocReceiverV3Service.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/allocation/receiver/WechatPaySubAllocReceiverV3Service.java
deleted file mode 100644
index 6f7a3262..00000000
--- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/allocation/receiver/WechatPaySubAllocReceiverV3Service.java
+++ /dev/null
@@ -1,103 +0,0 @@
-package org.dromara.daxpay.channel.wechat.service.payment.allocation.receiver;
-
-import org.dromara.daxpay.channel.wechat.entity.allocation.WechatAllocReceiverBind;
-import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig;
-import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService;
-import org.dromara.daxpay.core.enums.AllocReceiverTypeEnum;
-import org.dromara.daxpay.core.exception.ConfigErrorException;
-import org.dromara.daxpay.core.exception.OperationFailException;
-import com.github.binarywang.wxpay.bean.profitsharing.request.ProfitSharingReceiverV3Request;
-import com.github.binarywang.wxpay.exception.WxPayException;
-import com.github.binarywang.wxpay.service.ProfitSharingService;
-import com.github.binarywang.wxpay.service.WxPayService;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.stereotype.Service;
-
-import java.util.Locale;
-import java.util.Objects;
-
-import static org.dromara.daxpay.core.enums.AllocReceiverTypeEnum.MERCHANT_NO;
-import static org.dromara.daxpay.core.enums.AllocReceiverTypeEnum.OPEN_ID;
-
-/**
- * 微信分账接收方服务
- * @author xxm
- * @since 2024/4/1
- */
-@Slf4j
-@Service
-@RequiredArgsConstructor
-public class WechatPaySubAllocReceiverV3Service {
- private final WechatPayConfigService wechatPayConfigService;
-
- /**
- * 绑定
- */
- public void bind(WechatAllocReceiverBind wxReceiver, WechatPayConfig config){
-
- WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(config);
- ProfitSharingService sharingService = wxPayService.getProfitSharingService();
-
- ProfitSharingReceiverV3Request request = new ProfitSharingReceiverV3Request();
- request.setAppid(config.getWxAppId());
- var receiverTypeEnum = AllocReceiverTypeEnum.findByCode(wxReceiver.getReceiverType());
- String receiverType = this.getReceiverType(receiverTypeEnum);
- request.setType(receiverType);
- request.setAccount(wxReceiver.getReceiverAccount());
- request.setName(wxReceiver.getReceiverName());
- request.setRelationType(wxReceiver.getRelationType());
- request.setCustomRelation(wxReceiver.getRelationName());
- try {
- sharingService.addReceiverV3(request);
- } catch (WxPayException e) {
- throw new OperationFailException("微信添加分账方V3失败: "+e.getMessage());
- }
- }
-
- /**
- * 解除绑定
- */
- public void unbind(WechatAllocReceiverBind wxReceiver, WechatPayConfig config){
-
- WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(config);
- ProfitSharingService sharingService = wxPayService.getProfitSharingService();
-
- ProfitSharingReceiverV3Request request = new ProfitSharingReceiverV3Request();
- request.setAppid(config.getAppId());
- var receiverTypeEnum = AllocReceiverTypeEnum.findByCode(wxReceiver.getReceiverType());
- String receiverType = this.getReceiverType(receiverTypeEnum);
- request.setType(receiverType);
- request.setAccount(wxReceiver.getReceiverAccount());
- request.setName(wxReceiver.getReceiverName());
- request.setRelationType(wxReceiver.getRelationType());
- request.setCustomRelation(wxReceiver.getRelationName());
- try {
- sharingService.removeReceiverV3(request);
- } catch (WxPayException e) {
- throw new OperationFailException("微信添加分账方V3失败: "+e.getMessage());
- }
- }
-
- /**
- * 获取分账接收方类型编码
- */
- private String getReceiverType(AllocReceiverTypeEnum receiverTypeEnum){
- if (receiverTypeEnum == OPEN_ID){
- return "PERSONAL_OPENID";
- }
- if (receiverTypeEnum == MERCHANT_NO){
- return "MERCHANT_ID";
- }
- throw new ConfigErrorException("分账接收方类型错误");
- }
- /**
- * 获取分账关系类型编码
- */
- private String getRelationType(String relationType){
- if (Objects.isNull(relationType)){
- return null;
- }
- return relationType.toUpperCase(Locale.ROOT);
- }
-}
diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/callback/WechatPayCallbackService.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/callback/WechatPayCallbackService.java
index 72aadc4b..732ccc79 100644
--- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/callback/WechatPayCallbackService.java
+++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/callback/WechatPayCallbackService.java
@@ -1,18 +1,5 @@
package org.dromara.daxpay.channel.wechat.service.payment.callback;
-import cn.hutool.core.bean.BeanUtil;
-import cn.hutool.core.util.StrUtil;
-import cn.hutool.extra.servlet.JakartaServletUtil;
-import com.github.binarywang.wxpay.bean.notify.SignatureHeader;
-import com.github.binarywang.wxpay.bean.notify.WxPayNotifyResponse;
-import com.github.binarywang.wxpay.bean.notify.WxPayNotifyV3Result;
-import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyResult;
-import com.github.binarywang.wxpay.constant.WxPayConstants.WxpayTradeStatus;
-import com.github.binarywang.wxpay.exception.WxPayException;
-import com.github.binarywang.wxpay.service.WxPayService;
-import jakarta.servlet.http.HttpServletRequest;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
import org.dromara.daxpay.channel.wechat.code.WechatPayCode;
import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig;
import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService;
@@ -23,15 +10,26 @@ import org.dromara.daxpay.core.enums.ChannelEnum;
import org.dromara.daxpay.core.enums.PayStatusEnum;
import org.dromara.daxpay.core.enums.TradeTypeEnum;
import org.dromara.daxpay.core.util.PayUtil;
-import org.dromara.daxpay.service.common.local.PaymentContextLocal;
-import org.dromara.daxpay.service.service.record.callback.TradeCallbackRecordService;
-import org.dromara.daxpay.service.service.trade.pay.PayCallbackService;
+import org.dromara.daxpay.service.pay.common.local.PaymentContextLocal;
+import org.dromara.daxpay.service.pay.service.record.callback.TradeCallbackRecordService;
+import org.dromara.daxpay.service.pay.service.trade.pay.PayCallbackService;
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.extra.servlet.JakartaServletUtil;
+import com.github.binarywang.wxpay.bean.notify.*;
+import com.github.binarywang.wxpay.constant.WxPayConstants.WxpayTradeStatus;
+import com.github.binarywang.wxpay.exception.WxPayException;
+import com.github.binarywang.wxpay.service.WxPayService;
+import jakarta.servlet.http.HttpServletRequest;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
import java.util.Objects;
+import java.util.Optional;
/**
* 微信支付回调处理服务
@@ -82,9 +80,9 @@ public class WechatPayCallbackService {
callbackInfo.setRawData(xml);
try {
// 转换请求
- WxPayOrderNotifyResult wxPayOrderNotifyResult = wxPayService.parseOrderNotifyResult(xml);
+ var v2Result = wxPayService.parseOrderNotifyResult(xml);
// 解析数据
- this.resolveV2Data(wxPayOrderNotifyResult);
+ this.resolveV2Data(v2Result);
return true;
} catch (WxPayException e) {
log.error("微信支付回调V2处理失败", e);
@@ -103,9 +101,14 @@ public class WechatPayCallbackService {
callbackInfo.setRawData(body);
try {
// 转换请求
- WxPayNotifyV3Result wxPayNotifyV3Result = wxPayService.parseOrderNotifyV3Result(body, signatureHeader);
- // 解析数据
- this.resolvePayData(wxPayNotifyV3Result,isv);
+ if (isv){
+ var v3Result = wxPayService.parsePartnerOrderNotifyV3Result(body, signatureHeader);
+ this.resolvePayData(v3Result);
+ } else {
+ var v3Result = wxPayService.parseOrderNotifyV3Result(body, signatureHeader);
+ // 解析数据
+ this.resolvePayData(v3Result);
+ }
} catch (Exception e) {
callbackInfo.setCallbackStatus(CallbackStatusEnum.FAIL);
log.error("微信支付回调V3处理失败", e);
@@ -132,16 +135,20 @@ public class WechatPayCallbackService {
callbackInfo.setTradeStatus(payStatus.getCode());
// 支付金额
callbackInfo.setAmount(PayUtil.conversionAmount(result.getTotalFee()));
+ // 支付用户OpenId
+ String openId = Optional.ofNullable(result.getSubOpenid()).orElse(result.getOpenid());
+ callbackInfo.setBuyerId(openId);
String timeEnd = result.getTimeEnd();
if (StrUtil.isNotBlank(timeEnd)) {
LocalDateTime time = WechatPayUtil.parseV2(timeEnd);
callbackInfo.setFinishTime(time);
}
}
+
/**
- * 解析数据 v3
+ * 解析数据 v3 普通商户
*/
- private void resolvePayData(WxPayNotifyV3Result v3Result, boolean isv){
+ private void resolvePayData(WxPayNotifyV3Result v3Result){
CallbackLocal callbackInfo = PaymentContextLocal.get().getCallbackInfo();
var result = v3Result.getResult();
// 回调数据
@@ -153,6 +160,53 @@ public class WechatPayCallbackService {
callbackInfo.setTradeNo(result.getOutTradeNo());
// 支付状态 - 成功
if (List.of(WxpayTradeStatus.SUCCESS,WxpayTradeStatus.REFUND).contains(result.getTradeState())){
+ // 支付用户OpenId
+ callbackInfo.setBuyerId(result.getPayer().getOpenid());
+ callbackInfo.setTradeStatus(PayStatusEnum.SUCCESS.getCode());
+ }
+ // 支付状态 - 支付中
+ if (Objects.equals(result.getTradeState(), WxpayTradeStatus.NOTPAY)){
+ callbackInfo.setTradeStatus(PayStatusEnum.PROGRESS.getCode());
+ }
+ // 支付状态 - 失败
+ if (Objects.equals(WxpayTradeStatus.PAY_ERROR, result.getTradeState())){
+ callbackInfo.setTradeStatus(PayStatusEnum.FAIL.getCode());
+ }
+ // 撤销
+ if (Objects.equals(result.getTradeState(), WxpayTradeStatus.REVOKED)){
+ callbackInfo.setTradeStatus(PayStatusEnum.CANCEL.getCode());
+ }
+ // 关闭
+ if (Objects.equals(result.getTradeState(), WxpayTradeStatus.CLOSED)){
+ callbackInfo.setTradeStatus(PayStatusEnum.CLOSE.getCode());
+ }
+
+ // 支付金额
+ callbackInfo.setAmount(PayUtil.conversionAmount(result.getAmount().getTotal()));
+ String timeEnd = result.getSuccessTime();
+ if (StrUtil.isNotBlank(timeEnd)) {
+ callbackInfo.setFinishTime(WechatPayUtil.parseV3(timeEnd));
+ }
+ }
+
+ /**
+ * 解析数据 v3 服务商
+ */
+ private void resolvePayData(WxPayPartnerNotifyV3Result v3Result){
+ CallbackLocal callbackInfo = PaymentContextLocal.get().getCallbackInfo();
+ var result = v3Result.getResult();
+ // 回调数据
+ Map map = BeanUtil.beanToMap(result);
+ callbackInfo.setCallbackData(map);
+ // 网关支付号
+ callbackInfo.setOutTradeNo(result.getTransactionId());
+ // 支付号
+ callbackInfo.setTradeNo(result.getOutTradeNo());
+ // 支付状态 - 成功
+ if (List.of(WxpayTradeStatus.SUCCESS,WxpayTradeStatus.REFUND).contains(result.getTradeState())){
+ // 支付用户OpenId
+ String openId = Optional.ofNullable(result.getPayer().getSubOpenid()).orElse(result.getPayer().getSpOpenid());
+ callbackInfo.setBuyerId(openId);
callbackInfo.setTradeStatus(PayStatusEnum.SUCCESS.getCode());
}
// 支付状态 - 支付中
diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/callback/WechatRefundCallbackService.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/callback/WechatRefundCallbackService.java
index 0044f048..7245d595 100644
--- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/callback/WechatRefundCallbackService.java
+++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/callback/WechatRefundCallbackService.java
@@ -1,5 +1,18 @@
package org.dromara.daxpay.channel.wechat.service.payment.callback;
+import org.dromara.daxpay.channel.wechat.code.WechatPayCode;
+import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig;
+import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService;
+import org.dromara.daxpay.channel.wechat.util.WechatPayUtil;
+import org.dromara.daxpay.core.context.CallbackLocal;
+import org.dromara.daxpay.core.enums.CallbackStatusEnum;
+import org.dromara.daxpay.core.enums.ChannelEnum;
+import org.dromara.daxpay.core.enums.RefundStatusEnum;
+import org.dromara.daxpay.core.enums.TradeTypeEnum;
+import org.dromara.daxpay.core.util.PayUtil;
+import org.dromara.daxpay.service.pay.common.local.PaymentContextLocal;
+import org.dromara.daxpay.service.pay.service.record.callback.TradeCallbackRecordService;
+import org.dromara.daxpay.service.pay.service.trade.refund.RefundCallbackService;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.LocalDateTimeUtil;
@@ -15,19 +28,6 @@ import com.github.binarywang.wxpay.service.WxPayService;
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
-import org.dromara.daxpay.channel.wechat.code.WechatPayCode;
-import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig;
-import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService;
-import org.dromara.daxpay.channel.wechat.util.WechatPayUtil;
-import org.dromara.daxpay.core.context.CallbackLocal;
-import org.dromara.daxpay.core.enums.CallbackStatusEnum;
-import org.dromara.daxpay.core.enums.ChannelEnum;
-import org.dromara.daxpay.core.enums.RefundStatusEnum;
-import org.dromara.daxpay.core.enums.TradeTypeEnum;
-import org.dromara.daxpay.core.util.PayUtil;
-import org.dromara.daxpay.service.common.local.PaymentContextLocal;
-import org.dromara.daxpay.service.service.record.callback.TradeCallbackRecordService;
-import org.dromara.daxpay.service.service.trade.refund.RefundCallbackService;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/callback/WechatTransferCallbackService.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/callback/WechatTransferCallbackService.java
index d28521a5..4225bc43 100644
--- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/callback/WechatTransferCallbackService.java
+++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/callback/WechatTransferCallbackService.java
@@ -1,14 +1,5 @@
package org.dromara.daxpay.channel.wechat.service.payment.callback;
-import cn.hutool.core.bean.BeanUtil;
-import cn.hutool.extra.servlet.JakartaServletUtil;
-import com.github.binarywang.wxpay.bean.notify.SignatureHeader;
-import com.github.binarywang.wxpay.bean.notify.WxPayNotifyResponse;
-import com.github.binarywang.wxpay.exception.WxPayException;
-import com.github.binarywang.wxpay.service.WxPayService;
-import jakarta.servlet.http.HttpServletRequest;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
import org.dromara.daxpay.channel.wechat.code.WechatPayCode;
import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig;
import org.dromara.daxpay.channel.wechat.result.transfer.WxPayTransferBatchesNotifyV3Result;
@@ -18,9 +9,18 @@ import org.dromara.daxpay.core.enums.CallbackStatusEnum;
import org.dromara.daxpay.core.enums.ChannelEnum;
import org.dromara.daxpay.core.enums.TradeTypeEnum;
import org.dromara.daxpay.core.enums.TransferStatusEnum;
-import org.dromara.daxpay.service.common.local.PaymentContextLocal;
-import org.dromara.daxpay.service.service.record.callback.TradeCallbackRecordService;
-import org.dromara.daxpay.service.service.trade.transfer.TransferCallbackService;
+import org.dromara.daxpay.service.pay.common.local.PaymentContextLocal;
+import org.dromara.daxpay.service.pay.service.record.callback.TradeCallbackRecordService;
+import org.dromara.daxpay.service.pay.service.trade.transfer.TransferCallbackService;
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.extra.servlet.JakartaServletUtil;
+import com.github.binarywang.wxpay.bean.notify.SignatureHeader;
+import com.github.binarywang.wxpay.bean.notify.WxPayNotifyResponse;
+import com.github.binarywang.wxpay.exception.WxPayException;
+import com.github.binarywang.wxpay.service.WxPayService;
+import jakarta.servlet.http.HttpServletRequest;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.util.List;
diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/close/WechatPayCloseV2Service.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/close/WechatPayCloseV2Service.java
index 2a80532c..dbb21665 100644
--- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/close/WechatPayCloseV2Service.java
+++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/close/WechatPayCloseV2Service.java
@@ -1,14 +1,14 @@
package org.dromara.daxpay.channel.wechat.service.payment.close;
+import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig;
+import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService;
+import org.dromara.daxpay.core.exception.TradeFailException;
+import org.dromara.daxpay.service.pay.entity.order.pay.PayOrder;
import com.github.binarywang.wxpay.bean.request.WxPayOrderReverseRequest;
import com.github.binarywang.wxpay.exception.WxPayException;
import com.github.binarywang.wxpay.service.WxPayService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
-import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig;
-import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService;
-import org.dromara.daxpay.core.exception.TradeFailException;
-import org.dromara.daxpay.service.entity.order.pay.PayOrder;
import org.springframework.stereotype.Service;
/**
diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/close/WechatPayCloseV3Service.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/close/WechatPayCloseV3Service.java
index 94020704..1ad05779 100644
--- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/close/WechatPayCloseV3Service.java
+++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/close/WechatPayCloseV3Service.java
@@ -1,14 +1,14 @@
package org.dromara.daxpay.channel.wechat.service.payment.close;
+import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig;
+import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService;
+import org.dromara.daxpay.core.exception.TradeFailException;
+import org.dromara.daxpay.service.pay.entity.order.pay.PayOrder;
import com.github.binarywang.wxpay.bean.request.WxPayOrderReverseV3Request;
import com.github.binarywang.wxpay.exception.WxPayException;
import com.github.binarywang.wxpay.service.WxPayService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
-import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig;
-import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService;
-import org.dromara.daxpay.core.exception.TradeFailException;
-import org.dromara.daxpay.service.entity.order.pay.PayOrder;
import org.springframework.stereotype.Service;
/**
@@ -41,7 +41,7 @@ public class WechatPayCloseV3Service {
public void cancel(PayOrder payOrder, WechatPayConfig config){
WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(config);
try {
- com.github.binarywang.wxpay.bean.request.WxPayOrderReverseV3Request request = new WxPayOrderReverseV3Request();
+ WxPayOrderReverseV3Request request = new WxPayOrderReverseV3Request();
request.setOutTradeNo(payOrder.getOutOrderNo());
wxPayService.reverseOrderV3(request);
} catch (WxPayException e) {
diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/close/WechatPaySubCloseV2Service.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/close/WechatPaySubCloseV2Service.java
index 2bb3eb6c..3f7dfe16 100644
--- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/close/WechatPaySubCloseV2Service.java
+++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/close/WechatPaySubCloseV2Service.java
@@ -1,14 +1,14 @@
package org.dromara.daxpay.channel.wechat.service.payment.close;
+import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig;
+import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService;
+import org.dromara.daxpay.core.exception.TradeFailException;
+import org.dromara.daxpay.service.pay.entity.order.pay.PayOrder;
import com.github.binarywang.wxpay.bean.request.WxPayOrderReverseRequest;
import com.github.binarywang.wxpay.exception.WxPayException;
import com.github.binarywang.wxpay.service.WxPayService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
-import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig;
-import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService;
-import org.dromara.daxpay.core.exception.TradeFailException;
-import org.dromara.daxpay.service.entity.order.pay.PayOrder;
import org.springframework.stereotype.Service;
/**
diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/close/WechatPaySubCloseV3Service.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/close/WechatPaySubCloseV3Service.java
index ca3cf10c..90a391c9 100644
--- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/close/WechatPaySubCloseV3Service.java
+++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/close/WechatPaySubCloseV3Service.java
@@ -1,5 +1,10 @@
package org.dromara.daxpay.channel.wechat.service.payment.close;
+import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig;
+import org.dromara.daxpay.channel.wechat.param.clode.WxPayPartnerOrderReverseV3Request;
+import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService;
+import org.dromara.daxpay.core.exception.TradeFailException;
+import org.dromara.daxpay.service.pay.entity.order.pay.PayOrder;
import com.github.binarywang.wxpay.config.WxPayConfig;
import com.github.binarywang.wxpay.exception.WxPayException;
import com.github.binarywang.wxpay.service.WxPayService;
@@ -7,11 +12,6 @@ import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
-import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig;
-import org.dromara.daxpay.channel.wechat.param.clode.WxPayPartnerOrderReverseV3Request;
-import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService;
-import org.dromara.daxpay.core.exception.TradeFailException;
-import org.dromara.daxpay.service.entity.order.pay.PayOrder;
import org.springframework.stereotype.Service;
/**
@@ -32,7 +32,7 @@ public class WechatPaySubCloseV3Service {
public void close(PayOrder payOrder, WechatPayConfig weChatPayConfig) {
WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(weChatPayConfig);
try {
- wxPayService.closeOrderV3(payOrder.getOrderNo());
+ wxPayService.closePartnerOrderV3(payOrder.getOrderNo());
} catch (WxPayException e) {
log.error("微信关闭支付V3失败", e);
throw new TradeFailException("微信退款V3失败: "+e.getMessage());
@@ -54,7 +54,7 @@ public class WechatPaySubCloseV3Service {
request.setSubAppid(wxPayConfig.getSubAppId());
// 拼接参数请求路径并发送
- String url = String.format("%s/v3/pay/transactions/out-trade-no/%s/reverse",
+ String url = String.format("%s/v3/pay/partner/transactions/out-trade-no/%s/reverse",
wxPayService.getPayBaseUrl(), payOrder.getOrderNo());
wxPayService.postV3(url, GSON.toJson(request));
} catch (WxPayException e) {
diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/config/WechatPayConfigService.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/config/WechatPayConfigService.java
index 3aa56d8a..a06f6651 100644
--- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/config/WechatPayConfigService.java
+++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/config/WechatPayConfigService.java
@@ -1,5 +1,27 @@
package org.dromara.daxpay.channel.wechat.service.payment.config;
+import org.dromara.daxpay.channel.wechat.convert.WechatPayConfigConvert;
+import org.dromara.daxpay.channel.wechat.convert.WechatPaySubConfigConvert;
+import org.dromara.daxpay.channel.wechat.entity.config.WechatIsvConfig;
+import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig;
+import org.dromara.daxpay.channel.wechat.entity.config.WechatPaySubConfig;
+import org.dromara.daxpay.channel.wechat.enums.WechatAuthTypeEnum;
+import org.dromara.daxpay.channel.wechat.param.config.WechatPayConfigParam;
+import org.dromara.daxpay.channel.wechat.param.config.WechatPaySubConfigParam;
+import org.dromara.daxpay.channel.wechat.result.config.WechatPayConfigResult;
+import org.dromara.daxpay.channel.wechat.result.config.WechatPaySubConfigResult;
+import org.dromara.daxpay.core.context.PaymentReqInfoLocal;
+import org.dromara.daxpay.core.enums.ChannelEnum;
+import org.dromara.daxpay.core.exception.ChannelNotEnableException;
+import org.dromara.daxpay.core.exception.ConfigNotEnableException;
+import org.dromara.daxpay.core.exception.DataErrorException;
+import org.dromara.daxpay.service.isv.cache.IsvChannelConfigCacheService;
+import org.dromara.daxpay.service.merchant.cache.ChannelConfigCacheService;
+import org.dromara.daxpay.service.merchant.dao.config.ChannelConfigManager;
+import org.dromara.daxpay.service.merchant.local.MchContextLocal;
+import org.dromara.daxpay.service.pay.common.local.PaymentContextLocal;
+import org.dromara.daxpay.service.pay.entity.config.ChannelConfig;
+import org.dromara.daxpay.service.pay.service.assist.PaymentAssistService;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.bean.copier.CopyOptions;
import cn.hutool.core.codec.Base64;
@@ -9,23 +31,6 @@ import com.github.binarywang.wxpay.service.WxPayService;
import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
-import org.dromara.daxpay.channel.wechat.convert.WechatPayConfigConvert;
-import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig;
-import org.dromara.daxpay.channel.wechat.param.config.WechatPayConfigParam;
-import org.dromara.daxpay.channel.wechat.result.config.WechatPayConfigResult;
-import org.dromara.daxpay.core.context.MchAppLocal;
-import org.dromara.daxpay.core.enums.ChannelEnum;
-import org.dromara.daxpay.core.enums.MerchantTypeEnum;
-import org.dromara.daxpay.core.exception.ChannelNotEnableException;
-import org.dromara.daxpay.core.exception.ConfigNotEnableException;
-import org.dromara.daxpay.core.exception.DataErrorException;
-import org.dromara.daxpay.service.common.cache.ChannelConfigCacheService;
-import org.dromara.daxpay.service.common.local.MchContextLocal;
-import org.dromara.daxpay.service.common.local.PaymentContextLocal;
-import org.dromara.daxpay.service.dao.config.ChannelConfigManager;
-import org.dromara.daxpay.service.entity.config.ChannelConfig;
-import org.dromara.daxpay.service.service.assist.PaymentAssistService;
-import org.dromara.daxpay.service.service.config.PlatformConfigService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -42,8 +47,8 @@ import java.util.Objects;
public class WechatPayConfigService {
private final ChannelConfigManager channelConfigManager;
private final ChannelConfigCacheService channelConfigCacheService;
- private final PlatformConfigService platformConfigService;
private final PaymentAssistService paymentAssistService;
+ private final IsvChannelConfigCacheService isvChannelConfigCacheService;
/**
* 查询
@@ -55,6 +60,17 @@ public class WechatPayConfigService {
.orElseThrow(() -> new ConfigNotEnableException("微信支付配置不存在"));
}
+
+ /**
+ * 查询特约商户信息
+ */
+ public WechatPaySubConfigResult findSubById(Long id) {
+ return channelConfigManager.findById(id)
+ .map(WechatPaySubConfig::convertConfig)
+ .map(WechatPaySubConfig::toResult)
+ .orElseThrow(() -> new ConfigNotEnableException("微信支付特约商户配置不存在"));
+ }
+
/**
* 新增或更新
*/
@@ -72,13 +88,11 @@ public class WechatPayConfigService {
*/
public void save(WechatPayConfigParam param) {
paymentAssistService.initMchAndApp(param.getAppId());
- var mchApp = PaymentContextLocal.get().getMchAppInfo();
- // 判断商户配置类型
- if (Objects.equals(mchApp.getMchType(), MerchantTypeEnum.PARTNER.getCode())){
- throw new ChannelNotEnableException("请使用特约商户配置保存");
- }
+ var mchApp = PaymentContextLocal.get().getReqInfo();
WechatPayConfig entity = WechatPayConfigConvert.CONVERT.toEntity(param);
ChannelConfig channelConfig = entity.toChannelConfig();
+ // 如果运营端使用, 商户号写入上下文中
+ MchContextLocal.setMchNo(channelConfig.getMchNo());
// 判断商户和应用下是否存在该配置
if (channelConfigManager.existsByAppIdAndChannel(channelConfig.getAppId(), channelConfig.getChannel())){
throw new DataErrorException("该应用下已存在微信配置, 请勿重新添加");
@@ -91,48 +105,90 @@ public class WechatPayConfigService {
*/
public void update(WechatPayConfigParam param){
paymentAssistService.initMchAndApp(param.getAppId());
- var mchApp = PaymentContextLocal.get().getMchAppInfo();
- // 判断商户配置类型
- if (Objects.equals(mchApp.getMchType(), MerchantTypeEnum.PARTNER.getCode())){
- throw new ChannelNotEnableException("请使用特约商户配置更新");
- }
+ var mchApp = PaymentContextLocal.get().getReqInfo();
ChannelConfig channelConfig = channelConfigManager.findById(param.getId())
.orElseThrow(() -> new ConfigNotEnableException("微信支付配置不存在"));
// 通道配置 --转换--> 微信支付配置 ----> 从更新参数赋值 --转换--> 通道配置 ----> 保存更新
- WechatPayConfig alipayConfig = WechatPayConfig.convertConfig(channelConfig);
- BeanUtil.copyProperties(param, alipayConfig, CopyOptions.create().ignoreNullValue());
- ChannelConfig channelConfigParam = alipayConfig.toChannelConfig();
- // 手动清空一下默认的数据版本号
- channelConfigParam.setVersion(null);
+ WechatPayConfig wechatConfig = WechatPayConfig.convertConfig(channelConfig);
+ BeanUtil.copyProperties(param, wechatConfig, CopyOptions.create().ignoreNullValue());
+ ChannelConfig channelConfigParam = wechatConfig.toChannelConfig();
+ // 手动写入一下原来的数据版本号
+ channelConfigParam.setVersion(channelConfig.getVersion());
BeanUtil.copyProperties(channelConfigParam, channelConfig, CopyOptions.create().ignoreNullValue());
channelConfigManager.updateById(channelConfig);
}
+
+ /**
+ * 新增或更新特约商户配置
+ */
+ @Transactional(rollbackFor = Exception.class)
+ public void saveOrUpdateSub(WechatPaySubConfigParam param){
+ if (param.getId() == null){
+ this.saveSub(param);
+ } else {
+ this.updateSub(param);
+ }
+ }
+
+ /**
+ * 创建特约商户
+ */
+ private void saveSub(WechatPaySubConfigParam param) {
+ paymentAssistService.initMchAndApp(param.getAppId());
+ // 转换类型
+ var entity = WechatPaySubConfigConvert.CONVERT.toEntity(param);
+ ChannelConfig channelConfig = entity.toChannelConfig();
+ // 判断商户和应用下是否存在该配置
+ if (channelConfigManager.existsByAppIdAndChannel(param.getAppId(), channelConfig.getChannel())){
+ throw new DataErrorException("该应用下已存在微信配置, 请勿重新添加");
+ }
+ channelConfigManager.save(channelConfig);
+ }
+
+ /**
+ * 更新特约商户
+ */
+ private void updateSub(WechatPaySubConfigParam param) {
+ paymentAssistService.initMchAndApp(param.getAppId());
+ ChannelConfig channelConfig = channelConfigManager.findById(param.getId())
+ .orElseThrow(() -> new ConfigNotEnableException("微信支付配置不存在"));
+ // 通道配置 --转换--> 支付配置 ----> 从更新参数赋值 --转换--> 通道配置 ----> 保存更新
+ var subConfig = WechatPaySubConfig.convertConfig(channelConfig);
+ BeanUtil.copyProperties(param, subConfig, CopyOptions.create().ignoreNullValue());
+ ChannelConfig channelConfigParam = subConfig.toChannelConfig();
+ // 手动写入一下原来的数据版本号
+ channelConfigParam.setVersion(channelConfig.getVersion());
+ BeanUtil.copyProperties(channelConfigParam, channelConfig, CopyOptions.create().ignoreNullValue());
+ channelConfigManager.updateById(channelConfig);
+ }
+
+
/**
* 获取支付异步通知地址
*/
public String getPayNotifyUrl(boolean isv) {
- String url = isv ? "{}/unipay/callback/{}/wechat/isv/pay":"{}/unipay/callback/{}/wechat/pay";
- MchAppLocal mchAppInfo = PaymentContextLocal.get().getMchAppInfo();
- return StrUtil.format(url,mchAppInfo.getGatewayServiceUrl(),mchAppInfo.getAppId());
+ String url = isv ? "{}/unipay/callback/{}/{}/wechat/isv/pay":"{}/unipay/callback/{}/{}/wechat/pay";
+ PaymentReqInfoLocal reqInfo = PaymentContextLocal.get().getReqInfo();
+ return StrUtil.format(url,reqInfo.getGatewayServiceUrl(), reqInfo.getMchNo(),reqInfo.getAppId());
}
/**
* 获取退款异步通知地址
*/
public String getRefundNotifyUrl(boolean isv) {
- String url = isv ? "{}/unipay/callback/{}/wechat/isv/refund":"{}/unipay/callback/{}/wechat/refund";
- MchAppLocal mchAppInfo = PaymentContextLocal.get().getMchAppInfo();
- return StrUtil.format(url,mchAppInfo.getGatewayServiceUrl(),mchAppInfo.getAppId());
+ String url = isv ? "{}/unipay/callback/{}/{}/wechat/isv/refund":"{}/unipay/callback/{}/{}/wechat/refund";
+ PaymentReqInfoLocal reqInfo = PaymentContextLocal.get().getReqInfo();
+ return StrUtil.format(url,reqInfo.getGatewayServiceUrl(), reqInfo.getMchNo(),reqInfo.getAppId());
}
/**
* 转账回调地址
*/
public String getTransferNotifyUrl(boolean isv) {
- String url = isv ? "{}/unipay/callback/{}/wechat/isv/transfer":"{}/unipay/callback/{}/wechat/transfer";
- MchAppLocal mchAppInfo = PaymentContextLocal.get().getMchAppInfo();
- return StrUtil.format(url,mchAppInfo.getGatewayServiceUrl(),mchAppInfo.getAppId());
+ String url = isv ? "{}/unipay/callback/{}/{}/wechat/isv/transfer":"{}/unipay/callback/{}/{}/wechat/transfer";
+ PaymentReqInfoLocal reqInfo = PaymentContextLocal.get().getReqInfo();
+ return StrUtil.format(url,reqInfo.getGatewayServiceUrl(), reqInfo.getMchNo(),reqInfo.getAppId());
}
/**
@@ -150,9 +206,33 @@ public class WechatPayConfigService {
* 获取微信支付配置
*/
public WechatPayConfig getWechatPayConfig(boolean isv){
- MchAppLocal mchAppInfo = PaymentContextLocal.get().getMchAppInfo();
- ChannelConfig channelConfig = channelConfigCacheService.getMchChannelConfig(mchAppInfo.getAppId(), isv?ChannelEnum.WECHAT_ISV.getCode():ChannelEnum.WECHAT.getCode());
- return WechatPayConfig.convertConfig(channelConfig);
+ PaymentReqInfoLocal reqInfo = PaymentContextLocal.get().getReqInfo();
+ ChannelConfig channelConfig = channelConfigCacheService.getMchChannelConfig(reqInfo.getAppId(), isv ? ChannelEnum.WECHAT_ISV.getCode() : ChannelEnum.WECHAT.getCode());
+ // 判断是特约商户还是正常商户
+ if (isv) {
+ // 特约商户
+ var wechatPaySubConfig = WechatPaySubConfig.convertConfig(channelConfig);
+ // 获取微信服务商配置
+ var isvChannelConfig = isvChannelConfigCacheService.get(ChannelEnum.WECHAT_ISV.getCode());
+ var wechatIsvConfig = WechatIsvConfig.convertConfig(isvChannelConfig);
+ // 合并微信服务商配置和微信特约商户配置, 生成普通商户配置
+ WechatPayConfig wechatPayConfig = new WechatPayConfig();
+ BeanUtil.copyProperties(wechatIsvConfig, wechatPayConfig,CopyOptions.create().ignoreNullValue());
+ wechatPayConfig.setSubAppId(wechatPaySubConfig.getSubAppId())
+ .setSubMchId(wechatPaySubConfig.getSubMchId())
+ .setIsv(true);
+ // 使用二级商户微信认证配置
+ if (Objects.equals(wechatPayConfig.getAuthType(), WechatAuthTypeEnum.SUB.getCode())){
+ wechatPayConfig.setAuthUrl(wechatPaySubConfig.getWxAuthUrl())
+ .setAppSecret(wechatPaySubConfig.getWxAppSecret());
+ }
+
+ // 同时启用才可以使用
+ wechatPayConfig.setEnable(wechatPaySubConfig.getEnable()&&wechatIsvConfig.getEnable());
+ return wechatPayConfig;
+ } else {
+ return WechatPayConfig.convertConfig(channelConfig);
+ }
}
/**
@@ -166,7 +246,6 @@ public class WechatPayConfigService {
payConfig.setSubAppId(wechatPayConfig.getSubAppId());
payConfig.setMchKey(wechatPayConfig.getApiKeyV2());
payConfig.setApiV3Key(wechatPayConfig.getApiKeyV3());
-// payConfig.setApiVersion(wechatPayConfig.getApiVersion());
// 注意不要使用base64的方式进行配置, 因为wxjava 是直接读取文本并不会进行解码, 会导致证书异常
if (StrUtil.isNotBlank(wechatPayConfig.getPublicKey())){
payConfig.setPublicKeyContent(Base64.decode(wechatPayConfig.getPublicKey()));
diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/pay/isv/WechatPaySubV2Service.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/pay/isv/WechatPaySubV2Service.java
index 2c5b124c..7516b143 100644
--- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/pay/isv/WechatPaySubV2Service.java
+++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/pay/isv/WechatPaySubV2Service.java
@@ -1,7 +1,22 @@
package org.dromara.daxpay.channel.wechat.service.payment.pay.isv;
+import cn.bootx.platform.common.jackson.util.JacksonUtil;
import cn.bootx.platform.common.spring.exception.RetryableException;
-import cn.bootx.platform.core.util.JsonUtil;
+import org.dromara.daxpay.channel.wechat.code.WechatPayCode;
+import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig;
+import org.dromara.daxpay.channel.wechat.param.pay.WechatPayParam;
+import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService;
+import org.dromara.daxpay.channel.wechat.util.WechatPayUtil;
+import org.dromara.daxpay.core.enums.PayMethodEnum;
+import org.dromara.daxpay.core.enums.PayStatusEnum;
+import org.dromara.daxpay.core.exception.MethodNotExistException;
+import org.dromara.daxpay.core.exception.TradeFailException;
+import org.dromara.daxpay.core.param.trade.pay.PayParam;
+import org.dromara.daxpay.core.result.trade.pay.PaySyncResult;
+import org.dromara.daxpay.core.util.PayUtil;
+import org.dromara.daxpay.service.pay.bo.trade.PayResultBo;
+import org.dromara.daxpay.service.pay.entity.order.pay.PayOrder;
+import org.dromara.daxpay.service.pay.service.trade.pay.PaySyncService;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.LocalDateTimeUtil;
import cn.hutool.extra.spring.SpringUtil;
@@ -18,21 +33,6 @@ import com.github.binarywang.wxpay.service.WxPayService;
import lombok.RequiredArgsConstructor;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
-import org.dromara.daxpay.channel.wechat.code.WechatPayCode;
-import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig;
-import org.dromara.daxpay.channel.wechat.param.pay.WechatPayParam;
-import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService;
-import org.dromara.daxpay.channel.wechat.util.WechatPayUtil;
-import org.dromara.daxpay.core.enums.PayMethodEnum;
-import org.dromara.daxpay.core.enums.PayStatusEnum;
-import org.dromara.daxpay.core.exception.MethodNotExistException;
-import org.dromara.daxpay.core.exception.TradeFailException;
-import org.dromara.daxpay.core.param.trade.pay.PayParam;
-import org.dromara.daxpay.core.result.trade.pay.PaySyncResult;
-import org.dromara.daxpay.core.util.PayUtil;
-import org.dromara.daxpay.service.bo.trade.PayResultBo;
-import org.dromara.daxpay.service.entity.order.pay.PayOrder;
-import org.dromara.daxpay.service.service.trade.pay.PaySyncService;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
@@ -113,7 +113,7 @@ public class WechatPaySubV2Service {
try {
var result = wxPayService.createOrder(WxPayConstants.TradeType.Specific.APP, request);
Map map = this.buildAppResult(result);
- return JsonUtil.toJsonStr(map);
+ return JacksonUtil.toJson(map);
} catch (WxPayException e) {
log.error("微信V2App支付失败", e);
throw new TradeFailException("微信V2App程序支付失败: "+e.getMessage());
@@ -134,7 +134,7 @@ public class WechatPaySubV2Service {
try {
var result = wxPayService.createOrder(WxPayConstants.TradeType.Specific.JSAPI, request);
Map map = this.buildJsapiResult(result);
- return JsonUtil.toJsonStr(map);
+ return JacksonUtil.toJson(map);
} catch (WxPayException e) {
log.error("微信V2Jaspi支付失败", e);
throw new TradeFailException("微信V2Jaspi支付失败: "+e.getMessage());
diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/pay/isv/WechatPaySubV3Service.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/pay/isv/WechatPaySubV3Service.java
index 4be41459..e403adf8 100644
--- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/pay/isv/WechatPaySubV3Service.java
+++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/pay/isv/WechatPaySubV3Service.java
@@ -1,20 +1,7 @@
package org.dromara.daxpay.channel.wechat.service.payment.pay.isv;
+import cn.bootx.platform.common.jackson.util.JacksonUtil;
import cn.bootx.platform.common.spring.exception.RetryableException;
-import cn.bootx.platform.core.util.JsonUtil;
-import cn.hutool.extra.spring.SpringUtil;
-import com.github.binarywang.wxpay.bean.request.WxPayPartnerUnifiedOrderV3Request;
-import com.github.binarywang.wxpay.bean.result.WxPayUnifiedOrderV3Result;
-import com.github.binarywang.wxpay.bean.result.enums.TradeTypeEnum;
-import com.github.binarywang.wxpay.config.WxPayConfig;
-import com.github.binarywang.wxpay.constant.WxPayConstants;
-import com.github.binarywang.wxpay.constant.WxPayErrorCode;
-import com.github.binarywang.wxpay.exception.WxPayException;
-import com.github.binarywang.wxpay.service.WxPayService;
-import com.google.gson.Gson;
-import com.google.gson.GsonBuilder;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
import org.dromara.daxpay.channel.wechat.code.WechatPayCode;
import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig;
import org.dromara.daxpay.channel.wechat.param.pay.WechatPayParam;
@@ -29,9 +16,22 @@ import org.dromara.daxpay.core.exception.TradeFailException;
import org.dromara.daxpay.core.param.trade.pay.PayParam;
import org.dromara.daxpay.core.result.trade.pay.PaySyncResult;
import org.dromara.daxpay.core.util.PayUtil;
-import org.dromara.daxpay.service.bo.trade.PayResultBo;
-import org.dromara.daxpay.service.entity.order.pay.PayOrder;
-import org.dromara.daxpay.service.service.trade.pay.PaySyncService;
+import org.dromara.daxpay.service.pay.bo.trade.PayResultBo;
+import org.dromara.daxpay.service.pay.entity.order.pay.PayOrder;
+import org.dromara.daxpay.service.pay.service.trade.pay.PaySyncService;
+import cn.hutool.extra.spring.SpringUtil;
+import com.github.binarywang.wxpay.bean.request.WxPayPartnerUnifiedOrderV3Request;
+import com.github.binarywang.wxpay.bean.result.WxPayUnifiedOrderV3Result;
+import com.github.binarywang.wxpay.bean.result.enums.TradeTypeEnum;
+import com.github.binarywang.wxpay.config.WxPayConfig;
+import com.github.binarywang.wxpay.constant.WxPayConstants;
+import com.github.binarywang.wxpay.constant.WxPayErrorCode;
+import com.github.binarywang.wxpay.exception.WxPayException;
+import com.github.binarywang.wxpay.service.WxPayService;
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
import org.springframework.retry.annotation.Backoff;
import org.springframework.retry.annotation.Retryable;
import org.springframework.scheduling.annotation.Async;
@@ -120,7 +120,7 @@ public class WechatPaySubV3Service {
try {
WxPayUnifiedOrderV3Result.AppResult result = wxPayService.createPartnerOrderV3(TradeTypeEnum.APP, request);
Map map = this.buildAppResult(result);
- return JsonUtil.toJsonStr(map);
+ return JacksonUtil.toJson(map);
} catch (WxPayException e) {
log.error("微信V3程序支付失败", e);
throw new TradeFailException("微信V3程序支付失败: "+e.getMessage());
@@ -143,7 +143,7 @@ public class WechatPaySubV3Service {
try {
WxPayUnifiedOrderV3Result.JsapiResult result = wxPayService.createPartnerOrderV3(TradeTypeEnum.JSAPI, request);
Map map = this.buildJsapiResult(result);
- return JsonUtil.toJsonStr(map);
+ return JacksonUtil.toJson(map);
} catch (WxPayException e) {
log.error("微信V3JsApi支付失败", e);
throw new TradeFailException("微信V3JsApi支付失败: "+e.getMessage());
diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/pay/merchant/WechatPayV2Service.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/pay/merchant/WechatPayV2Service.java
index 558c6cac..18af3aea 100644
--- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/pay/merchant/WechatPayV2Service.java
+++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/pay/merchant/WechatPayV2Service.java
@@ -1,7 +1,22 @@
package org.dromara.daxpay.channel.wechat.service.payment.pay.merchant;
+import cn.bootx.platform.common.jackson.util.JacksonUtil;
import cn.bootx.platform.common.spring.exception.RetryableException;
-import cn.bootx.platform.core.util.JsonUtil;
+import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig;
+import org.dromara.daxpay.channel.wechat.param.pay.WechatPayParam;
+import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService;
+import org.dromara.daxpay.channel.wechat.util.WechatPayUtil;
+import org.dromara.daxpay.core.enums.PayMethodEnum;
+import org.dromara.daxpay.core.enums.PayStatusEnum;
+import org.dromara.daxpay.core.exception.MethodNotExistException;
+import org.dromara.daxpay.core.exception.TradeFailException;
+import org.dromara.daxpay.core.param.trade.pay.PayParam;
+import org.dromara.daxpay.core.result.trade.pay.PaySyncResult;
+import org.dromara.daxpay.core.util.PayUtil;
+import org.dromara.daxpay.service.pay.bo.trade.PayResultBo;
+import org.dromara.daxpay.service.pay.entity.order.pay.PayOrder;
+import org.dromara.daxpay.service.pay.service.assist.PaymentAssistService;
+import org.dromara.daxpay.service.pay.service.trade.pay.PaySyncService;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.LocalDateTimeUtil;
import cn.hutool.extra.spring.SpringUtil;
@@ -18,20 +33,6 @@ import com.github.binarywang.wxpay.service.WxPayService;
import lombok.RequiredArgsConstructor;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
-import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig;
-import org.dromara.daxpay.channel.wechat.param.pay.WechatPayParam;
-import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService;
-import org.dromara.daxpay.channel.wechat.util.WechatPayUtil;
-import org.dromara.daxpay.core.enums.PayMethodEnum;
-import org.dromara.daxpay.core.enums.PayStatusEnum;
-import org.dromara.daxpay.core.exception.MethodNotExistException;
-import org.dromara.daxpay.core.exception.TradeFailException;
-import org.dromara.daxpay.core.param.trade.pay.PayParam;
-import org.dromara.daxpay.core.result.trade.pay.PaySyncResult;
-import org.dromara.daxpay.core.util.PayUtil;
-import org.dromara.daxpay.service.bo.trade.PayResultBo;
-import org.dromara.daxpay.service.entity.order.pay.PayOrder;
-import org.dromara.daxpay.service.service.trade.pay.PaySyncService;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
@@ -51,6 +52,7 @@ import java.util.Objects;
public class WechatPayV2Service {
private final WechatPayConfigService wechatPayConfigService;
private final PaySyncService paySyncService;
+ private final PaymentAssistService paymentAssistService;
/**
* 调起支付
@@ -112,7 +114,7 @@ public class WechatPayV2Service {
try {
var result = wxPayService.createOrder(WxPayConstants.TradeType.Specific.APP, request);
Map map = this.buildAppResult(result);
- return JsonUtil.toJsonStr(map);
+ return JacksonUtil.toJson(map);
} catch (WxPayException e) {
log.error("微信V2App支付失败", e);
throw new TradeFailException("微信V2App程序支付失败: "+e.getMessage());
@@ -130,7 +132,7 @@ public class WechatPayV2Service {
try {
var result = wxPayService.createOrder(WxPayConstants.TradeType.Specific.JSAPI, request);
Map map = this.buildJsapiResult(result);
- return JsonUtil.toJsonStr(map);
+ return JacksonUtil.toJson(map);
} catch (WxPayException e) {
log.error("微信V2Jaspi支付失败", e);
throw new TradeFailException("微信V2Jaspi支付失败: "+e.getMessage());
@@ -246,6 +248,7 @@ public class WechatPayV2Service {
*/
@Async
public void rotationSync(PayOrder payOrder) {
+ paymentAssistService.initMchAndApp(payOrder.getMchNo(), payOrder.getAppId());
PaySyncResult paySyncResult = paySyncService.syncPayOrder(payOrder);
// 不为支付中状态后, 调用系统同步更新状态, 支付状态则继续重试
if (Objects.equals(PayStatusEnum.PROGRESS.getCode(), paySyncResult.getOrderStatus())) {
diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/pay/merchant/WechatPayV3Service.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/pay/merchant/WechatPayV3Service.java
index d4ba0f7c..a7747f50 100644
--- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/pay/merchant/WechatPayV3Service.java
+++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/pay/merchant/WechatPayV3Service.java
@@ -1,18 +1,7 @@
package org.dromara.daxpay.channel.wechat.service.payment.pay.merchant;
+import cn.bootx.platform.common.jackson.util.JacksonUtil;
import cn.bootx.platform.common.spring.exception.RetryableException;
-import cn.bootx.platform.core.util.JsonUtil;
-import cn.hutool.extra.spring.SpringUtil;
-import com.github.binarywang.wxpay.bean.request.WxPayCodepayRequest;
-import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderV3Request;
-import com.github.binarywang.wxpay.bean.result.WxPayUnifiedOrderV3Result;
-import com.github.binarywang.wxpay.bean.result.enums.TradeTypeEnum;
-import com.github.binarywang.wxpay.constant.WxPayConstants;
-import com.github.binarywang.wxpay.constant.WxPayErrorCode;
-import com.github.binarywang.wxpay.exception.WxPayException;
-import com.github.binarywang.wxpay.service.WxPayService;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig;
import org.dromara.daxpay.channel.wechat.param.pay.WechatPayParam;
import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService;
@@ -24,9 +13,21 @@ import org.dromara.daxpay.core.exception.TradeFailException;
import org.dromara.daxpay.core.param.trade.pay.PayParam;
import org.dromara.daxpay.core.result.trade.pay.PaySyncResult;
import org.dromara.daxpay.core.util.PayUtil;
-import org.dromara.daxpay.service.bo.trade.PayResultBo;
-import org.dromara.daxpay.service.entity.order.pay.PayOrder;
-import org.dromara.daxpay.service.service.trade.pay.PaySyncService;
+import org.dromara.daxpay.service.pay.bo.trade.PayResultBo;
+import org.dromara.daxpay.service.pay.entity.order.pay.PayOrder;
+import org.dromara.daxpay.service.pay.service.assist.PaymentAssistService;
+import org.dromara.daxpay.service.pay.service.trade.pay.PaySyncService;
+import cn.hutool.extra.spring.SpringUtil;
+import com.github.binarywang.wxpay.bean.request.WxPayCodepayRequest;
+import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderV3Request;
+import com.github.binarywang.wxpay.bean.result.WxPayUnifiedOrderV3Result;
+import com.github.binarywang.wxpay.bean.result.enums.TradeTypeEnum;
+import com.github.binarywang.wxpay.constant.WxPayConstants;
+import com.github.binarywang.wxpay.constant.WxPayErrorCode;
+import com.github.binarywang.wxpay.exception.WxPayException;
+import com.github.binarywang.wxpay.service.WxPayService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
import org.springframework.retry.annotation.Backoff;
import org.springframework.retry.annotation.Retryable;
import org.springframework.scheduling.annotation.Async;
@@ -48,6 +49,7 @@ public class WechatPayV3Service {
private final WechatPayConfigService wechatPayConfigService;
private final PaySyncService paySyncService;
+ private final PaymentAssistService paymentAssistService;
/**
* 调起支付
@@ -114,7 +116,7 @@ public class WechatPayV3Service {
try {
WxPayUnifiedOrderV3Result.AppResult result = wxPayService.createOrderV3(TradeTypeEnum.APP, request);
Map map = this.buildAppResult(result);
- return JsonUtil.toJsonStr(map);
+ return JacksonUtil.toJson(map);
} catch (WxPayException e) {
log.error("微信V3程序支付失败", e);
throw new TradeFailException("微信V3程序支付失败: "+e.getMessage());
@@ -133,7 +135,7 @@ public class WechatPayV3Service {
try {
WxPayUnifiedOrderV3Result.JsapiResult result = wxPayService.createOrderV3(TradeTypeEnum.JSAPI, request);
Map map = this.buildJsapiResult(result);
- return JsonUtil.toJsonStr(map);
+ return JacksonUtil.toJson(map);
} catch (WxPayException e) {
log.error("微信V3JsApi支付失败", e);
throw new TradeFailException("微信V3JsApi支付失败: "+e.getMessage());
@@ -192,23 +194,23 @@ public class WechatPayV3Service {
*/
private void barCodePay(PayOrder payOrder, String authCode, WechatPayConfig config, PayResultBo payResult) {
WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(config);
- com.github.binarywang.wxpay.bean.request.WxPayCodepayRequest request = new com.github.binarywang.wxpay.bean.request.WxPayCodepayRequest();
+ WxPayCodepayRequest request = new WxPayCodepayRequest();
request.setDescription(payOrder.getTitle());
request.setOutTradeNo(payOrder.getOrderNo());
// 金额
- var amount = new com.github.binarywang.wxpay.bean.request.WxPayCodepayRequest.Amount();
+ var amount = new WxPayCodepayRequest.Amount();
amount.setTotal(PayUtil.convertCentAmount(payOrder.getAmount()));
request.setAmount(amount);
// 场景信息
- var sceneInfo = new com.github.binarywang.wxpay.bean.request.WxPayCodepayRequest.SceneInfo();
- var storeInfo = new com.github.binarywang.wxpay.bean.request.WxPayCodepayRequest.StoreInfo();
+ var sceneInfo = new WxPayCodepayRequest.SceneInfo();
+ var storeInfo = new WxPayCodepayRequest.StoreInfo();
storeInfo.setOutId("1");
sceneInfo.setStoreInfo(storeInfo);
request.setSceneInfo(sceneInfo);
// 付款码参数
- var payer = new com.github.binarywang.wxpay.bean.request.WxPayCodepayRequest.Payer();
+ var payer = new WxPayCodepayRequest.Payer();
payer.setAuthCode(authCode);
request.setPayer(payer);
@@ -268,6 +270,7 @@ public class WechatPayV3Service {
@Async
@Retryable(retryFor = RetryableException.class, maxAttempts = 10, backoff = @Backoff(value = 5000L))
public void rotationSync(PayOrder payOrder) {
+ paymentAssistService.initMchAndApp(payOrder.getMchNo(), payOrder.getAppId());
PaySyncResult paySyncResult = paySyncService.syncPayOrder(payOrder);
// 不为支付中状态后, 调用系统同步更新状态, 支付状态则继续重试
if (Objects.equals(PayStatusEnum.PROGRESS.getCode(), paySyncResult.getOrderStatus())) {
diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/refund/WechatRefundV2Service.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/refund/WechatRefundV2Service.java
index ca80a854..cd9e7c94 100644
--- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/refund/WechatRefundV2Service.java
+++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/refund/WechatRefundV2Service.java
@@ -5,8 +5,8 @@ import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigS
import org.dromara.daxpay.core.enums.RefundStatusEnum;
import org.dromara.daxpay.core.exception.TradeFailException;
import org.dromara.daxpay.core.util.PayUtil;
-import org.dromara.daxpay.service.bo.trade.RefundResultBo;
-import org.dromara.daxpay.service.entity.order.refund.RefundOrder;
+import org.dromara.daxpay.service.pay.bo.trade.RefundResultBo;
+import org.dromara.daxpay.service.pay.entity.order.refund.RefundOrder;
import com.github.binarywang.wxpay.bean.request.WxPayRefundRequest;
import com.github.binarywang.wxpay.bean.result.WxPayRefundResult;
import com.github.binarywang.wxpay.exception.WxPayException;
diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/refund/WechatRefundV3Service.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/refund/WechatRefundV3Service.java
index 572de204..e49c2b43 100644
--- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/refund/WechatRefundV3Service.java
+++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/refund/WechatRefundV3Service.java
@@ -6,8 +6,8 @@ import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigS
import org.dromara.daxpay.channel.wechat.util.WechatPayUtil;
import org.dromara.daxpay.core.exception.TradeFailException;
import org.dromara.daxpay.core.util.PayUtil;
-import org.dromara.daxpay.service.bo.trade.RefundResultBo;
-import org.dromara.daxpay.service.entity.order.refund.RefundOrder;
+import org.dromara.daxpay.service.pay.bo.trade.RefundResultBo;
+import org.dromara.daxpay.service.pay.entity.order.refund.RefundOrder;
import cn.hutool.core.util.StrUtil;
import com.github.binarywang.wxpay.bean.request.WxPayRefundV3Request;
import com.github.binarywang.wxpay.bean.result.WxPayRefundV3Result;
diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/refund/WechatSubRefundV2Service.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/refund/WechatSubRefundV2Service.java
index 94b5f629..943ed7a9 100644
--- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/refund/WechatSubRefundV2Service.java
+++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/refund/WechatSubRefundV2Service.java
@@ -5,8 +5,8 @@ import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigS
import org.dromara.daxpay.core.enums.RefundStatusEnum;
import org.dromara.daxpay.core.exception.TradeFailException;
import org.dromara.daxpay.core.util.PayUtil;
-import org.dromara.daxpay.service.bo.trade.RefundResultBo;
-import org.dromara.daxpay.service.entity.order.refund.RefundOrder;
+import org.dromara.daxpay.service.pay.bo.trade.RefundResultBo;
+import org.dromara.daxpay.service.pay.entity.order.refund.RefundOrder;
import com.github.binarywang.wxpay.bean.request.WxPayRefundRequest;
import com.github.binarywang.wxpay.bean.result.WxPayRefundResult;
import com.github.binarywang.wxpay.exception.WxPayException;
diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/refund/WechatSubRefundV3Service.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/refund/WechatSubRefundV3Service.java
index 9d8fc1f4..7cf6cb1c 100644
--- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/refund/WechatSubRefundV3Service.java
+++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/refund/WechatSubRefundV3Service.java
@@ -1,14 +1,14 @@
package org.dromara.daxpay.channel.wechat.service.payment.refund;
-import cn.hutool.core.util.StrUtil;
import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig;
import org.dromara.daxpay.channel.wechat.enums.WechatRefundStatusEnum;
import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService;
import org.dromara.daxpay.channel.wechat.util.WechatPayUtil;
import org.dromara.daxpay.core.exception.TradeFailException;
import org.dromara.daxpay.core.util.PayUtil;
-import org.dromara.daxpay.service.bo.trade.RefundResultBo;
-import org.dromara.daxpay.service.entity.order.refund.RefundOrder;
+import org.dromara.daxpay.service.pay.bo.trade.RefundResultBo;
+import org.dromara.daxpay.service.pay.entity.order.refund.RefundOrder;
+import cn.hutool.core.util.StrUtil;
import com.github.binarywang.wxpay.bean.request.WxPayPartnerRefundV3Request;
import com.github.binarywang.wxpay.bean.request.WxPayRefundV3Request;
import com.github.binarywang.wxpay.bean.result.WxPayRefundV3Result;
diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/sync/pay/WechatPaySyncV2Service.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/sync/pay/WechatPaySyncV2Service.java
index 94edd411..4d0501af 100644
--- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/sync/pay/WechatPaySyncV2Service.java
+++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/sync/pay/WechatPaySyncV2Service.java
@@ -1,18 +1,18 @@
package org.dromara.daxpay.channel.wechat.service.payment.sync.pay;
-import cn.bootx.platform.core.util.JsonUtil;
-import com.github.binarywang.wxpay.constant.WxPayConstants.WxpayTradeStatus;
-import com.github.binarywang.wxpay.exception.WxPayException;
-import com.github.binarywang.wxpay.service.WxPayService;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
+import cn.bootx.platform.common.jackson.util.JacksonUtil;
import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig;
import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService;
import org.dromara.daxpay.channel.wechat.util.WechatPayUtil;
import org.dromara.daxpay.core.enums.PayStatusEnum;
import org.dromara.daxpay.core.util.PayUtil;
-import org.dromara.daxpay.service.bo.sync.PaySyncResultBo;
-import org.dromara.daxpay.service.entity.order.pay.PayOrder;
+import org.dromara.daxpay.service.pay.bo.sync.PaySyncResultBo;
+import org.dromara.daxpay.service.pay.entity.order.pay.PayOrder;
+import com.github.binarywang.wxpay.constant.WxPayConstants.WxpayTradeStatus;
+import com.github.binarywang.wxpay.exception.WxPayException;
+import com.github.binarywang.wxpay.service.WxPayService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.util.List;
@@ -39,13 +39,14 @@ public class WechatPaySyncV2Service {
WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(wechatPayConfig);
try {
var result = wxPayService.queryOrder(null, order.getOrderNo());
- syncResult.setSyncData(JsonUtil.toJsonStr(result))
- .setOutOrderNo(result.getTransactionId())
- .setAmount(PayUtil.conversionAmount(result.getTotalFee()));
+ syncResult.setSyncData(JacksonUtil.toJson(result))
+ .setOutOrderNo(result.getTransactionId());
// 支付状态 - 成功 SUCCESS:支付成功 REFUND:转入退款
if (List.of(WxpayTradeStatus.SUCCESS, WxpayTradeStatus.REFUND).contains(result.getTradeState())){
syncResult.setPayStatus(PayStatusEnum.SUCCESS)
- .setFinishTime(WechatPayUtil.parseV2(result.getTimeEnd()));
+ .setFinishTime(WechatPayUtil.parseV2(result.getTimeEnd()))
+ .setAmount(PayUtil.conversionAmount(result.getTotalFee()))
+ .setBuyerId(result.getOpenid());
}
// 支付状态 - 支付中 NOTPAY:未支付,等待扣款 USERPAYING:用户支付中(付款码支付)
if (List.of(WxpayTradeStatus.NOTPAY, WxpayTradeStatus.USER_PAYING).contains(result.getTradeState())){
diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/sync/pay/WechatPaySyncV3Service.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/sync/pay/WechatPaySyncV3Service.java
index 4cf0e0d7..c94847c0 100644
--- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/sync/pay/WechatPaySyncV3Service.java
+++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/sync/pay/WechatPaySyncV3Service.java
@@ -1,19 +1,19 @@
package org.dromara.daxpay.channel.wechat.service.payment.sync.pay;
-import cn.bootx.platform.core.util.JsonUtil;
+import cn.bootx.platform.common.jackson.util.JacksonUtil;
+import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig;
+import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService;
+import org.dromara.daxpay.channel.wechat.util.WechatPayUtil;
+import org.dromara.daxpay.core.enums.PayStatusEnum;
+import org.dromara.daxpay.core.util.PayUtil;
+import org.dromara.daxpay.service.pay.bo.sync.PaySyncResultBo;
+import org.dromara.daxpay.service.pay.entity.order.pay.PayOrder;
import com.github.binarywang.wxpay.bean.result.WxPayOrderQueryV3Result;
import com.github.binarywang.wxpay.constant.WxPayConstants.WxpayTradeStatus;
import com.github.binarywang.wxpay.exception.WxPayException;
import com.github.binarywang.wxpay.service.WxPayService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
-import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig;
-import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService;
-import org.dromara.daxpay.channel.wechat.util.WechatPayUtil;
-import org.dromara.daxpay.core.enums.PayStatusEnum;
-import org.dromara.daxpay.core.util.PayUtil;
-import org.dromara.daxpay.service.bo.sync.PaySyncResultBo;
-import org.dromara.daxpay.service.entity.order.pay.PayOrder;
import org.springframework.stereotype.Service;
import java.util.List;
@@ -45,13 +45,14 @@ public class WechatPaySyncV3Service {
.map(WxPayOrderQueryV3Result.Amount::getTotal)
.map(PayUtil::conversionAmount)
.orElse(null);
- syncResult.setSyncData(JsonUtil.toJsonStr(result))
+ syncResult.setSyncData(JacksonUtil.toJson(result))
.setOutOrderNo(result.getTransactionId())
.setAmount(amount);
// 支付状态 - 成功 SUCCESS:支付成功 REFUND:转入退款
if (List.of(WxpayTradeStatus.SUCCESS, WxpayTradeStatus.REFUND).contains(result.getTradeState())){
syncResult.setPayStatus(PayStatusEnum.SUCCESS)
- .setFinishTime(WechatPayUtil.parseV3(result.getSuccessTime()));
+ .setFinishTime(WechatPayUtil.parseV3(result.getSuccessTime()))
+ .setBuyerId(result.getPayer().getOpenid());
}
// 支付状态 - 支付中 NOTPAY:未支付,等待扣款 USERPAYING:用户支付中(付款码支付)
if (List.of(WxpayTradeStatus.NOTPAY, WxpayTradeStatus.USER_PAYING).contains(result.getTradeState())){
diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/sync/pay/WechatSubPaySyncV2Service.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/sync/pay/WechatSubPaySyncV2Service.java
index 9556083c..eab0559c 100644
--- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/sync/pay/WechatSubPaySyncV2Service.java
+++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/sync/pay/WechatSubPaySyncV2Service.java
@@ -1,23 +1,24 @@
package org.dromara.daxpay.channel.wechat.service.payment.sync.pay;
-import cn.bootx.platform.core.util.JsonUtil;
+import cn.bootx.platform.common.jackson.util.JacksonUtil;
+import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig;
+import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService;
+import org.dromara.daxpay.channel.wechat.util.WechatPayUtil;
+import org.dromara.daxpay.core.enums.PayStatusEnum;
+import org.dromara.daxpay.core.util.PayUtil;
+import org.dromara.daxpay.service.pay.bo.sync.PaySyncResultBo;
+import org.dromara.daxpay.service.pay.entity.order.pay.PayOrder;
import com.github.binarywang.wxpay.bean.request.WxPayOrderQueryRequest;
import com.github.binarywang.wxpay.constant.WxPayConstants.WxpayTradeStatus;
import com.github.binarywang.wxpay.exception.WxPayException;
import com.github.binarywang.wxpay.service.WxPayService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
-import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig;
-import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService;
-import org.dromara.daxpay.channel.wechat.util.WechatPayUtil;
-import org.dromara.daxpay.core.enums.PayStatusEnum;
-import org.dromara.daxpay.core.util.PayUtil;
-import org.dromara.daxpay.service.bo.sync.PaySyncResultBo;
-import org.dromara.daxpay.service.entity.order.pay.PayOrder;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Objects;
+import java.util.Optional;
/**
@@ -44,13 +45,15 @@ public class WechatSubPaySyncV2Service {
request.setSubMchId(wechatPayConfig.getSubMchId())
.setSubAppId(wechatPayConfig.getSubAppId());
var result = wxPayService.queryOrder(request);
- syncResult.setSyncData(JsonUtil.toJsonStr(result))
- .setOutOrderNo(result.getTransactionId())
- .setAmount(PayUtil.conversionAmount(result.getTotalFee()));
+ syncResult.setSyncData(JacksonUtil.toJson(result))
+ .setOutOrderNo(result.getTransactionId());
// 支付状态 - 成功 SUCCESS:支付成功 REFUND:转入退款
if (List.of(WxpayTradeStatus.SUCCESS, WxpayTradeStatus.REFUND).contains(result.getTradeState())){
syncResult.setPayStatus(PayStatusEnum.SUCCESS)
- .setFinishTime(WechatPayUtil.parseV2(result.getTimeEnd()));
+ .setFinishTime(WechatPayUtil.parseV2(result.getTimeEnd()))
+ .setAmount(PayUtil.conversionAmount(result.getTotalFee()))
+ .setBuyerId(Optional.ofNullable(result.getSubOpenid())
+ .orElse(result.getOpenid()));
}
// 支付状态 - 支付中 NOTPAY:未支付,等待扣款 USERPAYING:用户支付中(付款码支付)
if (List.of(WxpayTradeStatus.NOTPAY, WxpayTradeStatus.USER_PAYING).contains(result.getTradeState())){
diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/sync/pay/WechatSubPaySyncV3Service.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/sync/pay/WechatSubPaySyncV3Service.java
index f5609cdf..7185f189 100644
--- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/sync/pay/WechatSubPaySyncV3Service.java
+++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/sync/pay/WechatSubPaySyncV3Service.java
@@ -1,19 +1,19 @@
package org.dromara.daxpay.channel.wechat.service.payment.sync.pay;
-import cn.bootx.platform.core.util.JsonUtil;
+import cn.bootx.platform.common.jackson.util.JacksonUtil;
+import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig;
+import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService;
+import org.dromara.daxpay.channel.wechat.util.WechatPayUtil;
+import org.dromara.daxpay.core.enums.PayStatusEnum;
+import org.dromara.daxpay.core.util.PayUtil;
+import org.dromara.daxpay.service.pay.bo.sync.PaySyncResultBo;
+import org.dromara.daxpay.service.pay.entity.order.pay.PayOrder;
import com.github.binarywang.wxpay.bean.result.WxPayPartnerOrderQueryV3Result;
import com.github.binarywang.wxpay.constant.WxPayConstants.WxpayTradeStatus;
import com.github.binarywang.wxpay.exception.WxPayException;
import com.github.binarywang.wxpay.service.WxPayService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
-import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig;
-import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService;
-import org.dromara.daxpay.channel.wechat.util.WechatPayUtil;
-import org.dromara.daxpay.core.enums.PayStatusEnum;
-import org.dromara.daxpay.core.util.PayUtil;
-import org.dromara.daxpay.service.bo.sync.PaySyncResultBo;
-import org.dromara.daxpay.service.entity.order.pay.PayOrder;
import org.springframework.stereotype.Service;
import java.util.List;
@@ -45,13 +45,15 @@ public class WechatSubPaySyncV3Service {
.map(WxPayPartnerOrderQueryV3Result.Amount::getTotal)
.map(PayUtil::conversionAmount)
.orElse(null);
- syncResult.setSyncData(JsonUtil.toJsonStr(result))
+ syncResult.setSyncData(JacksonUtil.toJson(result))
.setOutOrderNo(result.getTransactionId())
.setAmount(amount);
// 支付状态 - 成功 SUCCESS:支付成功 REFUND:转入退款
if (List.of(WxpayTradeStatus.SUCCESS, WxpayTradeStatus.REFUND).contains(result.getTradeState())){
syncResult.setPayStatus(PayStatusEnum.SUCCESS)
- .setFinishTime(WechatPayUtil.parseV3(result.getSuccessTime()));
+ .setFinishTime(WechatPayUtil.parseV3(result.getSuccessTime()))
+ .setBuyerId(Optional.ofNullable(result.getPayer().getSubOpenid())
+ .orElse(result.getPayer().getSpOpenid()));
}
// 支付状态 - 支付中 NOTPAY:未支付,等待扣款 USERPAYING:用户支付中(付款码支付)
if (List.of(WxpayTradeStatus.NOTPAY, WxpayTradeStatus.USER_PAYING).contains(result.getTradeState())){
diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/sync/refund/WechatRefundSyncV2Service.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/sync/refund/WechatRefundSyncV2Service.java
index 3864303e..49e5eee2 100644
--- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/sync/refund/WechatRefundSyncV2Service.java
+++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/sync/refund/WechatRefundSyncV2Service.java
@@ -1,5 +1,11 @@
package org.dromara.daxpay.channel.wechat.service.payment.sync.refund;
+import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig;
+import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService;
+import org.dromara.daxpay.core.enums.RefundStatusEnum;
+import org.dromara.daxpay.core.util.PayUtil;
+import org.dromara.daxpay.service.pay.bo.sync.RefundSyncResultBo;
+import org.dromara.daxpay.service.pay.entity.order.refund.RefundOrder;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.LocalDateTimeUtil;
@@ -9,12 +15,6 @@ import com.github.binarywang.wxpay.exception.WxPayException;
import com.github.binarywang.wxpay.service.WxPayService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
-import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig;
-import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService;
-import org.dromara.daxpay.core.enums.RefundStatusEnum;
-import org.dromara.daxpay.core.util.PayUtil;
-import org.dromara.daxpay.service.bo.sync.RefundSyncResultBo;
-import org.dromara.daxpay.service.entity.order.refund.RefundOrder;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
@@ -44,6 +44,7 @@ public class WechatRefundSyncV2Service {
var result = wxPayService.refundQuery(request);
// 网关退款号
syncResult.setOutRefundNo(result.getTransactionId())
+
.setAmount(PayUtil.conversionAmount(result.getRefundFee()));
// 交易不存在
if (CollUtil.isEmpty(result.getRefundRecords())){
@@ -65,7 +66,7 @@ public class WechatRefundSyncV2Service {
syncResult.setRefundStatus(RefundStatusEnum.CLOSE);
}
} catch (WxPayException e) {
- log.error("微信退款订单查询V2失败", e);
+ log.error("微信退款订单查询V3失败", e);
syncResult.setSyncErrorMsg(e.getCustomErrorMsg())
.setSyncSuccess(false)
.setRefundStatus(RefundStatusEnum.FAIL);
diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/sync/refund/WechatRefundSyncV3Service.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/sync/refund/WechatRefundSyncV3Service.java
index e68893ba..1d3b94f2 100644
--- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/sync/refund/WechatRefundSyncV3Service.java
+++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/sync/refund/WechatRefundSyncV3Service.java
@@ -1,17 +1,17 @@
package org.dromara.daxpay.channel.wechat.service.payment.sync.refund;
-import com.github.binarywang.wxpay.constant.WxPayConstants.RefundStatus;
-import com.github.binarywang.wxpay.exception.WxPayException;
-import com.github.binarywang.wxpay.service.WxPayService;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig;
import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService;
import org.dromara.daxpay.channel.wechat.util.WechatPayUtil;
import org.dromara.daxpay.core.enums.RefundStatusEnum;
import org.dromara.daxpay.core.util.PayUtil;
-import org.dromara.daxpay.service.bo.sync.RefundSyncResultBo;
-import org.dromara.daxpay.service.entity.order.refund.RefundOrder;
+import org.dromara.daxpay.service.pay.bo.sync.RefundSyncResultBo;
+import org.dromara.daxpay.service.pay.entity.order.refund.RefundOrder;
+import com.github.binarywang.wxpay.constant.WxPayConstants.RefundStatus;
+import com.github.binarywang.wxpay.exception.WxPayException;
+import com.github.binarywang.wxpay.service.WxPayService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.util.Objects;
diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/sync/refund/WechatSubRefundSyncV2Service.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/sync/refund/WechatSubRefundSyncV2Service.java
index 6bef34bc..e012435c 100644
--- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/sync/refund/WechatSubRefundSyncV2Service.java
+++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/sync/refund/WechatSubRefundSyncV2Service.java
@@ -1,5 +1,11 @@
package org.dromara.daxpay.channel.wechat.service.payment.sync.refund;
+import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig;
+import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService;
+import org.dromara.daxpay.core.enums.RefundStatusEnum;
+import org.dromara.daxpay.core.util.PayUtil;
+import org.dromara.daxpay.service.pay.bo.sync.RefundSyncResultBo;
+import org.dromara.daxpay.service.pay.entity.order.refund.RefundOrder;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.LocalDateTimeUtil;
@@ -9,12 +15,6 @@ import com.github.binarywang.wxpay.exception.WxPayException;
import com.github.binarywang.wxpay.service.WxPayService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
-import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig;
-import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService;
-import org.dromara.daxpay.core.enums.RefundStatusEnum;
-import org.dromara.daxpay.core.util.PayUtil;
-import org.dromara.daxpay.service.bo.sync.RefundSyncResultBo;
-import org.dromara.daxpay.service.entity.order.refund.RefundOrder;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/sync/refund/WechatSubRefundSyncV3Service.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/sync/refund/WechatSubRefundSyncV3Service.java
index be28ce7f..2762fc19 100644
--- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/sync/refund/WechatSubRefundSyncV3Service.java
+++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/sync/refund/WechatSubRefundSyncV3Service.java
@@ -1,18 +1,18 @@
package org.dromara.daxpay.channel.wechat.service.payment.sync.refund;
+import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig;
+import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService;
+import org.dromara.daxpay.channel.wechat.util.WechatPayUtil;
+import org.dromara.daxpay.core.enums.RefundStatusEnum;
+import org.dromara.daxpay.core.util.PayUtil;
+import org.dromara.daxpay.service.pay.bo.sync.RefundSyncResultBo;
+import org.dromara.daxpay.service.pay.entity.order.refund.RefundOrder;
import com.github.binarywang.wxpay.bean.request.WxPayRefundQueryV3Request;
import com.github.binarywang.wxpay.constant.WxPayConstants.RefundStatus;
import com.github.binarywang.wxpay.exception.WxPayException;
import com.github.binarywang.wxpay.service.WxPayService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
-import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig;
-import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService;
-import org.dromara.daxpay.channel.wechat.util.WechatPayUtil;
-import org.dromara.daxpay.core.enums.RefundStatusEnum;
-import org.dromara.daxpay.core.util.PayUtil;
-import org.dromara.daxpay.service.bo.sync.RefundSyncResultBo;
-import org.dromara.daxpay.service.entity.order.refund.RefundOrder;
import org.springframework.stereotype.Service;
import java.util.Objects;
diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/sync/transfer/WechatTransferSyncV3Service.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/sync/transfer/WechatTransferSyncV3Service.java
index 83a976b2..ed3cf21b 100644
--- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/sync/transfer/WechatTransferSyncV3Service.java
+++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/sync/transfer/WechatTransferSyncV3Service.java
@@ -1,17 +1,17 @@
package org.dromara.daxpay.channel.wechat.service.payment.sync.transfer;
+import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig;
+import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService;
+import org.dromara.daxpay.core.enums.TransferStatusEnum;
+import org.dromara.daxpay.core.util.PayUtil;
+import org.dromara.daxpay.service.pay.bo.sync.TransferSyncResultBo;
+import org.dromara.daxpay.service.pay.entity.order.transfer.TransferOrder;
import com.github.binarywang.wxpay.bean.merchanttransfer.MerchantDetailsQueryRequest;
import com.github.binarywang.wxpay.exception.WxPayException;
import com.github.binarywang.wxpay.service.MerchantTransferService;
import com.github.binarywang.wxpay.service.WxPayService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
-import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig;
-import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService;
-import org.dromara.daxpay.core.enums.TransferStatusEnum;
-import org.dromara.daxpay.core.util.PayUtil;
-import org.dromara.daxpay.service.bo.sync.TransferSyncResultBo;
-import org.dromara.daxpay.service.entity.order.transfer.TransferOrder;
import org.springframework.stereotype.Service;
import java.util.List;
diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/transfer/WechatTransferV3Service.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/transfer/WechatTransferV3Service.java
index 7faa2cbf..14ec83f4 100644
--- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/transfer/WechatTransferV3Service.java
+++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/transfer/WechatTransferV3Service.java
@@ -1,5 +1,12 @@
package org.dromara.daxpay.channel.wechat.service.payment.transfer;
+import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig;
+import org.dromara.daxpay.channel.wechat.param.transfer.TransferCreateV3Request;
+import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService;
+import org.dromara.daxpay.core.exception.TradeFailException;
+import org.dromara.daxpay.core.util.PayUtil;
+import org.dromara.daxpay.service.pay.bo.trade.TransferResultBo;
+import org.dromara.daxpay.service.pay.entity.order.transfer.TransferOrder;
import cn.hutool.core.util.StrUtil;
import com.github.binarywang.wxpay.bean.merchanttransfer.TransferCreateRequest;
import com.github.binarywang.wxpay.bean.merchanttransfer.TransferCreateResult;
@@ -8,13 +15,6 @@ import com.github.binarywang.wxpay.service.MerchantTransferService;
import com.github.binarywang.wxpay.service.WxPayService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
-import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig;
-import org.dromara.daxpay.channel.wechat.param.transfer.TransferCreateV3Request;
-import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService;
-import org.dromara.daxpay.core.exception.TradeFailException;
-import org.dromara.daxpay.core.util.PayUtil;
-import org.dromara.daxpay.service.bo.trade.TransferResultBo;
-import org.dromara.daxpay.service.entity.order.transfer.TransferOrder;
import org.springframework.stereotype.Service;
import java.util.Collections;
diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatAllocationStrategy.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatAllocationStrategy.java
deleted file mode 100644
index cd984e12..00000000
--- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatAllocationStrategy.java
+++ /dev/null
@@ -1,85 +0,0 @@
-package org.dromara.daxpay.channel.wechat.strategy.merchant;
-
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.dromara.daxpay.channel.wechat.code.WechatPayCode;
-import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig;
-import org.dromara.daxpay.channel.wechat.service.payment.allocation.WeChatPayAllocationV2Service;
-import org.dromara.daxpay.channel.wechat.service.payment.allocation.WeChatPayAllocationV3Service;
-import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService;
-import org.dromara.daxpay.core.enums.ChannelEnum;
-import org.dromara.daxpay.service.bo.allocation.AllocStartResultBo;
-import org.dromara.daxpay.service.bo.allocation.AllocSyncResultBo;
-import org.dromara.daxpay.service.strategy.AbsAllocationStrategy;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.Objects;
-
-import static org.springframework.beans.factory.config.BeanDefinition.SCOPE_PROTOTYPE;
-
-/**
- * 微信分账策略
- * @author xxm
- * @since 2024/12/9
- */
-@Slf4j
-@Scope(SCOPE_PROTOTYPE)
-@Component
-@RequiredArgsConstructor
-public class WechatAllocationStrategy extends AbsAllocationStrategy {
- private final WeChatPayAllocationV3Service weChatPayAllocationV3Service;
- private final WeChatPayAllocationV2Service weChatPayAllocationV2Service;
- private final WechatPayConfigService wechatPayConfigService;
-
- private WechatPayConfig config;
-
- /**
- * 分账通道
- */
- @Override
- public String getChannel() {
- return ChannelEnum.WECHAT.getCode();
- }
-
- @Override
- public void doBeforeHandler(){
- this.config = wechatPayConfigService.getAndCheckConfig(false);
- }
-
- /**
- * 开始分账
- */
- @Override
- public AllocStartResultBo start() {
- if (Objects.equals(config.getApiVersion(), WechatPayCode.API_V3)){
- return weChatPayAllocationV3Service.start(getOrder(), getDetails(), this.config);
- } else {
- return weChatPayAllocationV2Service.start(getOrder(), getDetails(), this.config);
- }
- }
-
- /**
- * 完结
- */
- @Override
- public void finish() {
- if (Objects.equals(config.getApiVersion(), WechatPayCode.API_V3)){
- weChatPayAllocationV3Service.finish(getOrder(), this.config);
- } else {
- weChatPayAllocationV2Service.finish(getOrder(), this.config);
- }
- }
-
- /**
- * 同步状态
- */
- @Override
- public AllocSyncResultBo doSync() {
- if (Objects.equals(config.getApiVersion(), WechatPayCode.API_V3)){
- return weChatPayAllocationV3Service.sync(getOrder(), this.getDetails(), this.config);
- } else {
- return weChatPayAllocationV2Service.sync(getOrder(), this.getDetails(), this.config);
- }
- }
-}
diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatAuthStrategy.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatAuthStrategy.java
index 10bc0b47..983df030 100644
--- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatAuthStrategy.java
+++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatAuthStrategy.java
@@ -1,7 +1,5 @@
package org.dromara.daxpay.channel.wechat.strategy.merchant;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig;
import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService;
import org.dromara.daxpay.core.enums.ChannelEnum;
@@ -9,8 +7,10 @@ import org.dromara.daxpay.core.param.assist.AuthCodeParam;
import org.dromara.daxpay.core.param.assist.GenerateAuthUrlParam;
import org.dromara.daxpay.core.result.assist.AuthResult;
import org.dromara.daxpay.core.result.assist.AuthUrlResult;
-import org.dromara.daxpay.service.service.assist.WechatOpenAuthService;
-import org.dromara.daxpay.service.strategy.AbsChannelAuthStrategy;
+import org.dromara.daxpay.service.pay.service.assist.WechatOpenAuthService;
+import org.dromara.daxpay.service.pay.strategy.AbsChannelAuthStrategy;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
/**
diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatChannelBasicStrategy.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatChannelBasicStrategy.java
new file mode 100644
index 00000000..ee61c392
--- /dev/null
+++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatChannelBasicStrategy.java
@@ -0,0 +1,43 @@
+package org.dromara.daxpay.channel.wechat.strategy.merchant;
+
+import cn.bootx.platform.core.rest.dto.KeyValue;
+import org.dromara.daxpay.core.enums.ChannelEnum;
+import org.dromara.daxpay.service.pay.strategy.AbsChannelBasicStrategy;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.stream.Stream;
+
+import static org.dromara.daxpay.core.enums.PayMethodEnum.*;
+
+/**
+ * 微信商户基础数据策略
+ * @author xxm
+ * @since 2025/6/4
+ */
+@Slf4j
+@Service
+@RequiredArgsConstructor
+public class WechatChannelBasicStrategy extends AbsChannelBasicStrategy {
+ /**
+ * 获取通道的支付列表
+ */
+ @Override
+ public List payMethodList() {
+ return Stream.of(WAP,APP,QRCODE,BARCODE,JSAPI )
+ .map(payMethodEnum -> new KeyValue(payMethodEnum.getCode(), payMethodEnum.getName()))
+ .toList();
+ }
+
+ /**
+ * 策略标识, 可以自行进行扩展
+ *
+ * @see ChannelEnum
+ */
+ @Override
+ public String getChannel() {
+ return ChannelEnum.WECHAT.getCode();
+ }
+}
diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatCloseStrategy.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatCloseStrategy.java
index fbf380fe..48dfc8c6 100644
--- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatCloseStrategy.java
+++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatCloseStrategy.java
@@ -1,8 +1,6 @@
package org.dromara.daxpay.channel.wechat.strategy.merchant;
import cn.bootx.platform.core.exception.ValidationFailedException;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
import org.dromara.daxpay.channel.wechat.code.WechatPayCode;
import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig;
import org.dromara.daxpay.channel.wechat.service.payment.close.WechatPayCloseV2Service;
@@ -11,8 +9,10 @@ import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigS
import org.dromara.daxpay.core.enums.ChannelEnum;
import org.dromara.daxpay.core.enums.CloseTypeEnum;
import org.dromara.daxpay.core.enums.PayMethodEnum;
-import org.dromara.daxpay.service.entity.order.pay.PayOrder;
-import org.dromara.daxpay.service.strategy.AbsPayCloseStrategy;
+import org.dromara.daxpay.service.pay.entity.order.pay.PayOrder;
+import org.dromara.daxpay.service.pay.strategy.AbsPayCloseStrategy;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;
diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatGatewayPayStrategy.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatGatewayPayStrategy.java
index fc4d66ff..7e200678 100644
--- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatGatewayPayStrategy.java
+++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatGatewayPayStrategy.java
@@ -1,9 +1,9 @@
package org.dromara.daxpay.channel.wechat.strategy.merchant;
+import org.dromara.daxpay.core.enums.ChannelEnum;
+import org.dromara.daxpay.service.pay.strategy.AbsGatewayPayStrategy;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
-import org.dromara.daxpay.core.enums.ChannelEnum;
-import org.dromara.daxpay.service.strategy.AbsGatewayPayStrategy;
import org.springframework.stereotype.Component;
/**
diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatPayStrategy.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatPayStrategy.java
index dddd577d..11520ec3 100644
--- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatPayStrategy.java
+++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatPayStrategy.java
@@ -1,8 +1,6 @@
package org.dromara.daxpay.channel.wechat.strategy.merchant;
import cn.bootx.platform.common.jackson.util.JacksonUtil;
-import cn.hutool.core.util.StrUtil;
-import lombok.RequiredArgsConstructor;
import org.dromara.daxpay.channel.wechat.code.WechatPayCode;
import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig;
import org.dromara.daxpay.channel.wechat.param.pay.WechatPayParam;
@@ -11,8 +9,10 @@ import org.dromara.daxpay.channel.wechat.service.payment.pay.merchant.WechatPayS
import org.dromara.daxpay.channel.wechat.service.payment.pay.merchant.WechatPayV2Service;
import org.dromara.daxpay.channel.wechat.service.payment.pay.merchant.WechatPayV3Service;
import org.dromara.daxpay.core.enums.ChannelEnum;
-import org.dromara.daxpay.service.bo.trade.PayResultBo;
-import org.dromara.daxpay.service.strategy.AbsPayStrategy;
+import org.dromara.daxpay.service.pay.bo.trade.PayResultBo;
+import org.dromara.daxpay.service.pay.strategy.AbsPayStrategy;
+import cn.hutool.core.util.StrUtil;
+import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatRefundStrategy.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatRefundStrategy.java
index 4a3965cb..c6cb8939 100644
--- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatRefundStrategy.java
+++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatRefundStrategy.java
@@ -1,14 +1,14 @@
package org.dromara.daxpay.channel.wechat.strategy.merchant;
-import lombok.RequiredArgsConstructor;
import org.dromara.daxpay.channel.wechat.code.WechatPayCode;
import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig;
import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService;
import org.dromara.daxpay.channel.wechat.service.payment.refund.WechatRefundV2Service;
import org.dromara.daxpay.channel.wechat.service.payment.refund.WechatRefundV3Service;
import org.dromara.daxpay.core.enums.ChannelEnum;
-import org.dromara.daxpay.service.bo.trade.RefundResultBo;
-import org.dromara.daxpay.service.strategy.AbsRefundStrategy;
+import org.dromara.daxpay.service.pay.bo.trade.RefundResultBo;
+import org.dromara.daxpay.service.pay.strategy.AbsRefundStrategy;
+import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatSyncPayStrategy.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatSyncPayStrategy.java
index bc45f081..e0384046 100644
--- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatSyncPayStrategy.java
+++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatSyncPayStrategy.java
@@ -1,14 +1,14 @@
package org.dromara.daxpay.channel.wechat.strategy.merchant;
-import lombok.RequiredArgsConstructor;
import org.dromara.daxpay.channel.wechat.code.WechatPayCode;
import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig;
import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService;
import org.dromara.daxpay.channel.wechat.service.payment.sync.pay.WechatPaySyncV2Service;
import org.dromara.daxpay.channel.wechat.service.payment.sync.pay.WechatPaySyncV3Service;
import org.dromara.daxpay.core.enums.ChannelEnum;
-import org.dromara.daxpay.service.bo.sync.PaySyncResultBo;
-import org.dromara.daxpay.service.strategy.AbsSyncPayOrderStrategy;
+import org.dromara.daxpay.service.pay.bo.sync.PaySyncResultBo;
+import org.dromara.daxpay.service.pay.strategy.AbsSyncPayOrderStrategy;
+import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatSyncRefundStrategy.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatSyncRefundStrategy.java
index 49397cb7..6d90b807 100644
--- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatSyncRefundStrategy.java
+++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatSyncRefundStrategy.java
@@ -1,13 +1,13 @@
package org.dromara.daxpay.channel.wechat.strategy.merchant;
-import lombok.RequiredArgsConstructor;
import org.dromara.daxpay.channel.wechat.code.WechatPayCode;
import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService;
import org.dromara.daxpay.channel.wechat.service.payment.sync.refund.WechatRefundSyncV2Service;
import org.dromara.daxpay.channel.wechat.service.payment.sync.refund.WechatRefundSyncV3Service;
import org.dromara.daxpay.core.enums.ChannelEnum;
-import org.dromara.daxpay.service.bo.sync.RefundSyncResultBo;
-import org.dromara.daxpay.service.strategy.AbsSyncRefundOrderStrategy;
+import org.dromara.daxpay.service.pay.bo.sync.RefundSyncResultBo;
+import org.dromara.daxpay.service.pay.strategy.AbsSyncRefundOrderStrategy;
+import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatSyncTransferStrategy.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatSyncTransferStrategy.java
index 33343905..695a518b 100644
--- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatSyncTransferStrategy.java
+++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatSyncTransferStrategy.java
@@ -1,11 +1,11 @@
package org.dromara.daxpay.channel.wechat.strategy.merchant;
-import lombok.RequiredArgsConstructor;
import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService;
import org.dromara.daxpay.channel.wechat.service.payment.sync.transfer.WechatTransferSyncV3Service;
import org.dromara.daxpay.core.enums.ChannelEnum;
-import org.dromara.daxpay.service.bo.sync.TransferSyncResultBo;
-import org.dromara.daxpay.service.strategy.AbsSyncTransferOrderStrategy;
+import org.dromara.daxpay.service.pay.bo.sync.TransferSyncResultBo;
+import org.dromara.daxpay.service.pay.strategy.AbsSyncTransferOrderStrategy;
+import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatTransferStrategy.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatTransferStrategy.java
index cc336708..9e70d35e 100644
--- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatTransferStrategy.java
+++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatTransferStrategy.java
@@ -2,17 +2,17 @@ package org.dromara.daxpay.channel.wechat.strategy.merchant;
import cn.bootx.platform.core.exception.ValidationFailedException;
import cn.bootx.platform.core.util.BigDecimalUtil;
-import cn.hutool.core.util.StrUtil;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig;
import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService;
import org.dromara.daxpay.channel.wechat.service.payment.transfer.WechatTransferV3Service;
import org.dromara.daxpay.core.enums.ChannelEnum;
import org.dromara.daxpay.core.enums.TransferPayeeTypeEnum;
import org.dromara.daxpay.core.param.trade.transfer.TransferParam;
-import org.dromara.daxpay.service.bo.trade.TransferResultBo;
-import org.dromara.daxpay.service.strategy.AbsTransferStrategy;
+import org.dromara.daxpay.service.pay.bo.trade.TransferResultBo;
+import org.dromara.daxpay.service.pay.strategy.AbsTransferStrategy;
+import cn.hutool.core.util.StrUtil;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;
diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/sub/WechatSubAllocationStrategy.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/sub/WechatSubAllocationStrategy.java
deleted file mode 100644
index 4f8c8ecf..00000000
--- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/sub/WechatSubAllocationStrategy.java
+++ /dev/null
@@ -1,86 +0,0 @@
-package org.dromara.daxpay.channel.wechat.strategy.sub;
-
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.dromara.daxpay.channel.wechat.code.WechatPayCode;
-import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig;
-import org.dromara.daxpay.channel.wechat.service.payment.allocation.WeChatPaySubAllocationV2Service;
-import org.dromara.daxpay.channel.wechat.service.payment.allocation.WeChatPaySubAllocationV3Service;
-import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService;
-import org.dromara.daxpay.core.enums.ChannelEnum;
-import org.dromara.daxpay.service.bo.allocation.AllocStartResultBo;
-import org.dromara.daxpay.service.bo.allocation.AllocSyncResultBo;
-import org.dromara.daxpay.service.strategy.AbsAllocationStrategy;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.Objects;
-
-import static org.springframework.beans.factory.config.BeanDefinition.SCOPE_PROTOTYPE;
-
-/**
- * 微信分账策略
- * @author xxm
- * @since 2024/12/9
- */
-@Slf4j
-@Scope(SCOPE_PROTOTYPE)
-@Component
-@RequiredArgsConstructor
-public class WechatSubAllocationStrategy extends AbsAllocationStrategy {
- private final WeChatPaySubAllocationV3Service weChatPayAllocationV3Service;
- private final WeChatPaySubAllocationV2Service weChatPayAllocationV2Service;
- private final WechatPayConfigService wechatPayConfigService;
-
- private WechatPayConfig config;
-
- /**
- * 分账通道
- */
- @Override
- public String getChannel() {
- return ChannelEnum.WECHAT_ISV.getCode();
- }
-
- @Override
- public void doBeforeHandler(){
- this.config = wechatPayConfigService.getAndCheckConfig(true);
- }
-
- /**
- * 开始分账
- */
- @Override
- public AllocStartResultBo start() {
- if (Objects.equals(config.getApiVersion(), WechatPayCode.API_V3)){
- return weChatPayAllocationV3Service.start(getOrder(), getDetails(), this.config);
- } else {
- return weChatPayAllocationV2Service.start(getOrder(), getDetails(), this.config);
- }
- }
-
- /**
- * 完结
- */
- @Override
- public void finish() {
- if (Objects.equals(config.getApiVersion(), WechatPayCode.API_V3)){
- weChatPayAllocationV3Service.finish(getOrder(), this.config);
- } else {
- weChatPayAllocationV2Service.finish(getOrder(), this.config);
- }
- }
-
- /**
- * 同步状态
- */
- @Override
- public AllocSyncResultBo doSync() {
- if (Objects.equals(config.getApiVersion(), WechatPayCode.API_V3)){
- return weChatPayAllocationV3Service.sync(getOrder(), this.getDetails(), this.config);
- } else {
- return weChatPayAllocationV2Service.sync(getOrder(), this.getDetails(), this.config);
- }
- }
-
-}
diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/sub/WechatSubAuthStrategy.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/sub/WechatSubAuthStrategy.java
index ecf0d7fe..b39a9d4b 100644
--- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/sub/WechatSubAuthStrategy.java
+++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/sub/WechatSubAuthStrategy.java
@@ -1,15 +1,15 @@
package org.dromara.daxpay.channel.wechat.strategy.sub;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService;
import org.dromara.daxpay.core.enums.ChannelEnum;
import org.dromara.daxpay.core.param.assist.AuthCodeParam;
import org.dromara.daxpay.core.param.assist.GenerateAuthUrlParam;
import org.dromara.daxpay.core.result.assist.AuthResult;
import org.dromara.daxpay.core.result.assist.AuthUrlResult;
-import org.dromara.daxpay.service.service.assist.WechatOpenAuthService;
-import org.dromara.daxpay.service.strategy.AbsChannelAuthStrategy;
+import org.dromara.daxpay.service.pay.service.assist.WechatOpenAuthService;
+import org.dromara.daxpay.service.pay.strategy.AbsChannelAuthStrategy;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
/**
diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/sub/WechatSubChannelBasicStrategy.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/sub/WechatSubChannelBasicStrategy.java
new file mode 100644
index 00000000..bdbafe17
--- /dev/null
+++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/sub/WechatSubChannelBasicStrategy.java
@@ -0,0 +1,43 @@
+package org.dromara.daxpay.channel.wechat.strategy.sub;
+
+import cn.bootx.platform.core.rest.dto.KeyValue;
+import org.dromara.daxpay.core.enums.ChannelEnum;
+import org.dromara.daxpay.service.pay.strategy.AbsChannelBasicStrategy;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.stream.Stream;
+
+import static org.dromara.daxpay.core.enums.PayMethodEnum.*;
+
+/**
+ *
+ * @author xxm
+ * @since 2025/6/4
+ */
+@Slf4j
+@Service
+@RequiredArgsConstructor
+public class WechatSubChannelBasicStrategy extends AbsChannelBasicStrategy {
+ /**
+ * 获取通道的支付列表
+ */
+ @Override
+ public List payMethodList() {
+ return Stream.of(WAP,APP,QRCODE,BARCODE,JSAPI )
+ .map(payMethodEnum -> new KeyValue(payMethodEnum.getCode(), payMethodEnum.getName()))
+ .toList();
+ }
+
+ /**
+ * 策略标识, 可以自行进行扩展
+ *
+ * @see ChannelEnum
+ */
+ @Override
+ public String getChannel() {
+ return ChannelEnum.WECHAT_ISV.getCode();
+ }
+}
diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/sub/WechatSubCloseStrategy.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/sub/WechatSubCloseStrategy.java
index fd531f9d..bc56bf8f 100644
--- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/sub/WechatSubCloseStrategy.java
+++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/sub/WechatSubCloseStrategy.java
@@ -1,8 +1,6 @@
package org.dromara.daxpay.channel.wechat.strategy.sub;
import cn.bootx.platform.core.exception.ValidationFailedException;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
import org.dromara.daxpay.channel.wechat.code.WechatPayCode;
import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig;
import org.dromara.daxpay.channel.wechat.service.payment.close.WechatPaySubCloseV2Service;
@@ -11,8 +9,10 @@ import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigS
import org.dromara.daxpay.core.enums.ChannelEnum;
import org.dromara.daxpay.core.enums.CloseTypeEnum;
import org.dromara.daxpay.core.enums.PayMethodEnum;
-import org.dromara.daxpay.service.entity.order.pay.PayOrder;
-import org.dromara.daxpay.service.strategy.AbsPayCloseStrategy;
+import org.dromara.daxpay.service.pay.entity.order.pay.PayOrder;
+import org.dromara.daxpay.service.pay.strategy.AbsPayCloseStrategy;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;
diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/sub/WechatSubGatewayPayStrategy.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/sub/WechatSubGatewayPayStrategy.java
index 717c5d54..ba09ac48 100644
--- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/sub/WechatSubGatewayPayStrategy.java
+++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/sub/WechatSubGatewayPayStrategy.java
@@ -1,14 +1,14 @@
package org.dromara.daxpay.channel.wechat.strategy.sub;
-import cn.hutool.json.JSONUtil;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
+import cn.bootx.platform.common.jackson.util.JacksonUtil;
import org.dromara.daxpay.channel.wechat.param.pay.WechatPayParam;
import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService;
import org.dromara.daxpay.core.enums.ChannelEnum;
import org.dromara.daxpay.core.param.gateway.GatewayCashierPayParam;
import org.dromara.daxpay.core.param.trade.pay.PayParam;
-import org.dromara.daxpay.service.strategy.AbsGatewayPayStrategy;
+import org.dromara.daxpay.service.pay.strategy.AbsGatewayPayStrategy;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
/**
@@ -30,7 +30,7 @@ public class WechatSubGatewayPayStrategy extends AbsGatewayPayStrategy {
var wechatPayConfig = wechatPayConfigService.getAndCheckConfig(true);
var wechatPayParam = new WechatPayParam();
wechatPayParam.setOpenIdType(wechatPayConfig.getAuthType());
- payParam.setExtraParam(JSONUtil.toJsonStr(wechatPayParam));
+ payParam.setExtraParam(JacksonUtil.toJson(wechatPayParam));
}
/**
diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/sub/WechatSubPayStrategy.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/sub/WechatSubPayStrategy.java
index c89dbe2f..2a67a352 100644
--- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/sub/WechatSubPayStrategy.java
+++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/sub/WechatSubPayStrategy.java
@@ -1,8 +1,6 @@
package org.dromara.daxpay.channel.wechat.strategy.sub;
import cn.bootx.platform.common.jackson.util.JacksonUtil;
-import cn.hutool.core.util.StrUtil;
-import lombok.RequiredArgsConstructor;
import org.dromara.daxpay.channel.wechat.code.WechatPayCode;
import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig;
import org.dromara.daxpay.channel.wechat.param.pay.WechatPayParam;
@@ -11,8 +9,10 @@ import org.dromara.daxpay.channel.wechat.service.payment.pay.isv.WechatPaySubSer
import org.dromara.daxpay.channel.wechat.service.payment.pay.isv.WechatPaySubV2Service;
import org.dromara.daxpay.channel.wechat.service.payment.pay.isv.WechatPaySubV3Service;
import org.dromara.daxpay.core.enums.ChannelEnum;
-import org.dromara.daxpay.service.bo.trade.PayResultBo;
-import org.dromara.daxpay.service.strategy.AbsPayStrategy;
+import org.dromara.daxpay.service.pay.bo.trade.PayResultBo;
+import org.dromara.daxpay.service.pay.strategy.AbsPayStrategy;
+import cn.hutool.core.util.StrUtil;
+import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/sub/WechatSubRefundStrategy.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/sub/WechatSubRefundStrategy.java
index 79d5c688..6bca86ef 100644
--- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/sub/WechatSubRefundStrategy.java
+++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/sub/WechatSubRefundStrategy.java
@@ -1,14 +1,14 @@
package org.dromara.daxpay.channel.wechat.strategy.sub;
-import lombok.RequiredArgsConstructor;
import org.dromara.daxpay.channel.wechat.code.WechatPayCode;
import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig;
import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService;
import org.dromara.daxpay.channel.wechat.service.payment.refund.WechatSubRefundV2Service;
import org.dromara.daxpay.channel.wechat.service.payment.refund.WechatSubRefundV3Service;
import org.dromara.daxpay.core.enums.ChannelEnum;
-import org.dromara.daxpay.service.bo.trade.RefundResultBo;
-import org.dromara.daxpay.service.strategy.AbsRefundStrategy;
+import org.dromara.daxpay.service.pay.bo.trade.RefundResultBo;
+import org.dromara.daxpay.service.pay.strategy.AbsRefundStrategy;
+import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/sub/WechatSubSyncPayStrategy.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/sub/WechatSubSyncPayStrategy.java
index a3ef08ec..1f144b52 100644
--- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/sub/WechatSubSyncPayStrategy.java
+++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/sub/WechatSubSyncPayStrategy.java
@@ -1,13 +1,13 @@
package org.dromara.daxpay.channel.wechat.strategy.sub;
-import lombok.RequiredArgsConstructor;
import org.dromara.daxpay.channel.wechat.code.WechatPayCode;
import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService;
import org.dromara.daxpay.channel.wechat.service.payment.sync.pay.WechatSubPaySyncV2Service;
import org.dromara.daxpay.channel.wechat.service.payment.sync.pay.WechatSubPaySyncV3Service;
import org.dromara.daxpay.core.enums.ChannelEnum;
-import org.dromara.daxpay.service.bo.sync.PaySyncResultBo;
-import org.dromara.daxpay.service.strategy.AbsSyncPayOrderStrategy;
+import org.dromara.daxpay.service.pay.bo.sync.PaySyncResultBo;
+import org.dromara.daxpay.service.pay.strategy.AbsSyncPayOrderStrategy;
+import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/sub/WechatSubSyncRefundStrategy.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/sub/WechatSubSyncRefundStrategy.java
index 58d4bdb0..848ca8e9 100644
--- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/sub/WechatSubSyncRefundStrategy.java
+++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/sub/WechatSubSyncRefundStrategy.java
@@ -1,13 +1,13 @@
package org.dromara.daxpay.channel.wechat.strategy.sub;
-import lombok.RequiredArgsConstructor;
-import org.dromara.daxpay.core.enums.ChannelEnum;
import org.dromara.daxpay.channel.wechat.code.WechatPayCode;
import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService;
import org.dromara.daxpay.channel.wechat.service.payment.sync.refund.WechatSubRefundSyncV2Service;
import org.dromara.daxpay.channel.wechat.service.payment.sync.refund.WechatSubRefundSyncV3Service;
-import org.dromara.daxpay.service.bo.sync.RefundSyncResultBo;
-import org.dromara.daxpay.service.strategy.AbsSyncRefundOrderStrategy;
+import org.dromara.daxpay.core.enums.ChannelEnum;
+import org.dromara.daxpay.service.pay.bo.sync.RefundSyncResultBo;
+import org.dromara.daxpay.service.pay.strategy.AbsSyncRefundOrderStrategy;
+import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/util/WechatPayUtil.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/util/WechatPayUtil.java
index 32c729b8..38b696c2 100644
--- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/util/WechatPayUtil.java
+++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/util/WechatPayUtil.java
@@ -12,7 +12,9 @@ import java.io.IOException;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
+import java.util.Locale;
import java.util.Map;
+import java.util.Objects;
/**
* 微信支付工具类
@@ -126,9 +128,10 @@ public class WechatPayUtil {
}
/**
- * v3接口时间序列画
+ * v3接口时间序列化
*/
public LocalDateTime parseV3(String dateStr) {
return LocalDateTimeUtil.parse(dateStr, "yyyy-MM-dd'T'HH:mm:ss+08:00");
}
+
}
diff --git a/daxpay-open-server/src/main/java/org/dromara/daxpay/server/DaxpayStart.java b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/DaxpayUnionStart.java
similarity index 90%
rename from daxpay-open-server/src/main/java/org/dromara/daxpay/server/DaxpayStart.java
rename to daxpay-open-server/src/main/java/org/dromara/daxpay/server/DaxpayUnionStart.java
index 2b98a462..a29a2e60 100644
--- a/daxpay-open-server/src/main/java/org/dromara/daxpay/server/DaxpayStart.java
+++ b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/DaxpayUnionStart.java
@@ -5,22 +5,23 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
+import org.springframework.context.annotation.ComponentScan;
import org.springframework.core.env.Environment;
import java.net.InetAddress;
import java.net.UnknownHostException;
/**
- * 运营端
+ * 融合端
* @author xxm
* @since 2024/4/20
*/
@Slf4j
-@SpringBootApplication
-public class DaxpayStart {
+@SpringBootApplication()
+public class DaxpayUnionStart {
public static void main(String[] args) throws UnknownHostException {
- ConfigurableApplicationContext application = SpringApplication.run(DaxpayStart.class, args);
+ ConfigurableApplicationContext application = SpringApplication.run(DaxpayUnionStart.class, args);
Environment env = application.getEnvironment();
// 环境变量
String appName = env.getProperty("spring.application.name");
diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/aop/PaymentVerifyAspect.java b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/aop/PaymentVerifyAspect.java
similarity index 89%
rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/aop/PaymentVerifyAspect.java
rename to daxpay-open-server/src/main/java/org/dromara/daxpay/server/aop/PaymentVerifyAspect.java
index c013336e..95419ef0 100644
--- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/aop/PaymentVerifyAspect.java
+++ b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/aop/PaymentVerifyAspect.java
@@ -1,4 +1,4 @@
-package org.dromara.daxpay.service.common.aop;
+package org.dromara.daxpay.server.aop;
import cn.bootx.platform.core.code.CommonCode;
import cn.bootx.platform.core.exception.BizException;
@@ -6,8 +6,8 @@ import cn.bootx.platform.core.exception.ValidationFailedException;
import cn.bootx.platform.core.util.ValidationUtil;
import org.dromara.daxpay.core.param.PaymentCommonParam;
import org.dromara.daxpay.core.result.DaxResult;
-import org.dromara.daxpay.service.common.anno.PaymentVerify;
-import org.dromara.daxpay.service.service.assist.PaymentAssistService;
+import org.dromara.daxpay.service.pay.common.anno.PaymentVerify;
+import org.dromara.daxpay.service.pay.service.assist.PaymentAssistService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
@@ -47,7 +47,7 @@ public class PaymentVerifyAspect {
// 参数校验
ValidationUtil.validateParam(paymentParam);
// 商户和应用信息初始化
- paymentAssistService.initMchAndApp(paymentParam.getAppId());
+ paymentAssistService.initMchAndApp(paymentParam.getMchNo(), paymentParam.getAppId());
// 状态判断
paymentAssistService.checkStatus();
// 终端信息初始化
@@ -64,13 +64,13 @@ public class PaymentVerifyAspect {
proceed = pjp.proceed();
} catch (BizException ex) {
DaxResult result = new DaxResult<>(ex.getCode(), ex.getMessage());
- result.setTraceId(MDC.get(CommonCode.TRACE_ID));
- result.setResTime(LocalDateTime.now());
paymentAssistService.sign(result);
return result;
}
- // 对返回值进行签名
+ // 对返回值添加追踪ID/响应时间并进行签名
if (proceed instanceof DaxResult> result){
+ result.setTraceId(MDC.get(CommonCode.TRACE_ID));
+ result.setResTime(LocalDateTime.now());
paymentAssistService.sign(result);
} else {
throw new ValidationFailedException("支付方法返回类型需要为 DaxResult 类型的对象");
diff --git a/daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/admin/device/qrcode/CashierCodeConfigController.java b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/admin/device/qrcode/CashierCodeConfigController.java
new file mode 100644
index 00000000..a7318b41
--- /dev/null
+++ b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/admin/device/qrcode/CashierCodeConfigController.java
@@ -0,0 +1,138 @@
+package org.dromara.daxpay.server.controller.admin.device.qrcode;
+
+import cn.bootx.platform.core.annotation.ClientCode;
+import cn.bootx.platform.core.annotation.RequestGroup;
+import cn.bootx.platform.core.annotation.RequestPath;
+import cn.bootx.platform.core.rest.Res;
+import cn.bootx.platform.core.rest.dto.LabelValue;
+import cn.bootx.platform.core.rest.param.PageParam;
+import cn.bootx.platform.core.rest.result.PageResult;
+import cn.bootx.platform.core.rest.result.Result;
+import org.dromara.daxpay.service.common.code.DaxPayCode;
+import org.dromara.daxpay.service.device.param.qrcode.config.CashierCodeConfigParam;
+import org.dromara.daxpay.service.device.param.qrcode.config.CashierCodeConfigQuery;
+import org.dromara.daxpay.service.device.param.qrcode.config.CashierCodeSceneConfigParam;
+import org.dromara.daxpay.service.device.result.qrcode.config.CashierCodeConfigResult;
+import org.dromara.daxpay.service.device.result.qrcode.config.CashierCodeSceneConfigResult;
+import org.dromara.daxpay.service.device.service.qrcode.CashierCodeConfigService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.RequiredArgsConstructor;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 收银码牌配置
+ * @author xxm
+ * @since 2024/11/20
+ */
+@Validated
+@ClientCode(DaxPayCode.Client.ADMIN)
+@Tag(name = "收银码牌配置")
+@RestController
+@RequestMapping("/admin/cashier/code/config")
+@RequestGroup(groupCode = "CashierCodeConfig", groupName = "收银码牌配置", moduleCode = "device")
+@RequiredArgsConstructor
+public class CashierCodeConfigController {
+ private final CashierCodeConfigService codeConfigService;
+
+ @RequestPath("分页查询")
+ @GetMapping("/page")
+ public Result> page(PageParam pageParam, CashierCodeConfigQuery query) {
+ return Res.ok(codeConfigService.page(pageParam, query));
+ }
+
+ @RequestPath("根据id查询码牌配置")
+ @Operation(summary = "根据id查询码牌配置")
+ @GetMapping("/findById")
+ public Result findById(Long id){
+ return Res.ok(codeConfigService.findById(id));
+ }
+
+ @RequestPath("码牌配置保存")
+ @Operation(summary = "码牌配置保存")
+ @PostMapping("/save")
+ public Result save(@RequestBody CashierCodeConfigParam param) {
+ codeConfigService.save(param);
+ return Res.ok();
+ }
+
+ @RequestPath("码牌配置更新")
+ @Operation(summary = "码牌配置更新")
+ @PostMapping("/update")
+ public Result update(@RequestBody CashierCodeConfigParam param) {
+ codeConfigService.update(param);
+ return Res.ok();
+ }
+
+ @RequestPath("码牌配置删除")
+ @Operation(summary = "码牌配置删除")
+ @PostMapping("/delete")
+ public Result delete(Long id){
+ codeConfigService.delete(id);
+ return Res.ok();
+ }
+
+ @RequestPath("获取码牌支付场景配置列表")
+ @Operation(summary = "获取码牌支付场景配置列表")
+ @GetMapping("/scene/findAll")
+ public Result> findSceneByConfigId(Long configId){
+ return Res.ok(codeConfigService.findSceneByConfigId(configId));
+ }
+
+ @RequestPath("获取码牌支付场景配置详情")
+ @Operation(summary = "获取码牌各支付场景配置详情")
+ @GetMapping("/scene/findById")
+ public Result findSceneById(Long id){
+ return Res.ok(codeConfigService.findItemById(id));
+ }
+
+ @RequestPath("码牌支付场景配置保存")
+ @Operation(summary = "码牌支付场景配置保存")
+ @PostMapping("/scene/save")
+ public Result saveScene(@RequestBody CashierCodeSceneConfigParam param){
+ codeConfigService.saveScene(param);
+ return Res.ok();
+ }
+
+ @RequestPath("码牌支付场景配置更新")
+ @Operation(summary = "码牌支付场景配置更新")
+ @PostMapping("/scene/update")
+ public Result updateScene(@RequestBody CashierCodeSceneConfigParam param){
+ codeConfigService.updateScene(param);
+ return Res.ok();
+ }
+
+ @RequestPath("码牌支付场景配置删除")
+ @Operation(summary = "码牌支付场景配置删除")
+ @PostMapping("/scene/delete")
+ public Result deleteScene(Long id){
+ codeConfigService.deleteScene(id);
+ return Res.ok();
+ }
+
+ @RequestPath("码牌支付场景配置是否存在")
+ @Operation(summary = "码牌支付场景配置是否存在")
+ @GetMapping("/scene/exists")
+ public Result existsByScene(String scene, Long configId){
+ return Res.ok(codeConfigService.existsByScene(scene, configId));
+ }
+
+ @RequestPath("码牌支付场景配置是否存在(不包括自身)")
+ @Operation(summary = "码牌支付场景配置是否存在(不包括自身)")
+ @GetMapping("/scene/existsNotId")
+ public Result existsBySceneNotId(String scene, Long configId, Long id){
+ return Res.ok(codeConfigService.existsByScene(scene, configId, id));
+ }
+
+ @ClientCode({DaxPayCode.Client.ADMIN, DaxPayCode.Client.MERCHANT})
+ @RequestPath("码牌配置下拉")
+ @Operation(summary = "码牌配置下拉")
+ @GetMapping("/dropdown")
+ public Result> dropdown(){
+ return Res.ok(codeConfigService.dropdown());
+ }
+
+}
diff --git a/daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/admin/device/qrcode/CashierCodeTemplateController.java b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/admin/device/qrcode/CashierCodeTemplateController.java
new file mode 100644
index 00000000..df90d0cb
--- /dev/null
+++ b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/admin/device/qrcode/CashierCodeTemplateController.java
@@ -0,0 +1,72 @@
+package org.dromara.daxpay.server.controller.admin.device.qrcode;
+
+import cn.bootx.platform.core.annotation.ClientCode;
+import cn.bootx.platform.core.annotation.RequestGroup;
+import cn.bootx.platform.core.annotation.RequestPath;
+import cn.bootx.platform.core.rest.Res;
+import cn.bootx.platform.core.rest.param.PageParam;
+import cn.bootx.platform.core.rest.result.PageResult;
+import cn.bootx.platform.core.rest.result.Result;
+import org.dromara.daxpay.service.common.code.DaxPayCode;
+import org.dromara.daxpay.service.device.param.qrcode.template.CashierCodeTemplateParam;
+import org.dromara.daxpay.service.device.param.qrcode.template.CashierCodeTemplateQuery;
+import org.dromara.daxpay.service.device.result.qrcode.template.CashierCodeTemplateResult;
+import org.dromara.daxpay.service.device.service.qrcode.CashierCodeTemplateService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.validation.constraints.NotNull;
+import lombok.RequiredArgsConstructor;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@Validated
+@ClientCode(DaxPayCode.Client.ADMIN)
+@Tag(name = "收银码牌模板")
+@RestController
+@RequestMapping("/admin/cashier/code/template")
+@RequestGroup(groupCode = "CashierCodeTemplate", groupName = "收银码牌模板", moduleCode = "device")
+@RequiredArgsConstructor
+public class CashierCodeTemplateController {
+ private final CashierCodeTemplateService cashierCodeTemplateService;
+
+ @RequestPath("分页查询")
+ @Operation(summary = "分页查询")
+ @GetMapping("/page")
+ public Result> page(PageParam pageParam, CashierCodeTemplateQuery query){
+ return Res.ok(cashierCodeTemplateService.page(pageParam, query));
+ }
+
+ @RequestPath("查询详情")
+ @Operation(summary = "查询详情")
+ @GetMapping("/findById")
+ public Result findById(@NotNull(message = "id不能为空") Long id){
+ return Res.ok(cashierCodeTemplateService.findById(id));
+ }
+
+ @RequestPath("生成预览图片")
+ @Operation(summary = "生成预览图片")
+ @PostMapping("/generatePreviewImg")
+ public Result generatePreviewImg(@Validated CashierCodeTemplateParam param){
+ return Res.ok(cashierCodeTemplateService.generatePreviewImg(param));
+ }
+
+ @RequestPath("创建")
+ @Operation(summary = "创建")
+ @PostMapping("/create")
+ public Result create(@Validated CashierCodeTemplateParam param){
+ cashierCodeTemplateService.create(param);
+ return Res.ok();
+ }
+
+ @RequestPath("更新")
+ @Operation(summary = "更新")
+ @PostMapping("/update")
+ public Result update(@Validated CashierCodeTemplateParam param){
+ cashierCodeTemplateService.update(param);
+ return Res.ok();
+ }
+
+}
diff --git a/daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/admin/isv/config/IsvChannelConfigController.java b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/admin/isv/config/IsvChannelConfigController.java
new file mode 100644
index 00000000..38e6469b
--- /dev/null
+++ b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/admin/isv/config/IsvChannelConfigController.java
@@ -0,0 +1,44 @@
+package org.dromara.daxpay.server.controller.admin.isv.config;
+
+import cn.bootx.platform.core.annotation.ClientCode;
+import cn.bootx.platform.core.annotation.RequestGroup;
+import cn.bootx.platform.core.annotation.RequestPath;
+import cn.bootx.platform.core.rest.Res;
+import cn.bootx.platform.core.rest.result.Result;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.RequiredArgsConstructor;
+import org.dromara.daxpay.service.common.code.DaxPayCode;
+import org.dromara.daxpay.service.isv.result.config.IsvChannelConfigResult;
+import org.dromara.daxpay.service.isv.service.config.IsvChannelConfigService;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * 服务商通道配置
+ * @author xxm
+ * @since 2024/10/29
+ */
+@Validated
+@ClientCode({DaxPayCode.Client.ADMIN})
+@Tag(name = "服务商通道配置")
+@RestController
+@RequestGroup(groupCode = "IsvChannelConfig", groupName = "通道配置", moduleCode = "isv")
+@RequestMapping("/isv/channel/config")
+@RequiredArgsConstructor
+public class IsvChannelConfigController {
+ private final IsvChannelConfigService service;
+
+ @RequestPath("查询服务商配置列表")
+ @Operation(summary = "查询服务商配置列表")
+ @GetMapping("/findAll")
+ public Result> findAll(){
+ return Res.ok(service.findAll());
+ }
+
+}
+
diff --git a/daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/admin/isv/gateway/IsvAggregateConfigController.java b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/admin/isv/gateway/IsvAggregateConfigController.java
new file mode 100644
index 00000000..35afd28e
--- /dev/null
+++ b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/admin/isv/gateway/IsvAggregateConfigController.java
@@ -0,0 +1,141 @@
+package org.dromara.daxpay.server.controller.admin.isv.gateway;
+
+import cn.bootx.platform.core.annotation.ClientCode;
+import cn.bootx.platform.core.annotation.RequestGroup;
+import cn.bootx.platform.core.annotation.RequestPath;
+import cn.bootx.platform.core.rest.Res;
+import cn.bootx.platform.core.rest.result.Result;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.validation.constraints.NotBlank;
+import lombok.RequiredArgsConstructor;
+import org.dromara.daxpay.service.common.code.DaxPayCode;
+import org.dromara.daxpay.service.isv.param.gateway.IsvAggregateBarPayConfigParam;
+import org.dromara.daxpay.service.isv.param.gateway.IsvAggregatePayConfigParam;
+import org.dromara.daxpay.service.isv.result.gateway.IsvAggregateBarPayConfigResult;
+import org.dromara.daxpay.service.isv.result.gateway.IsvAggregatePayConfigResult;
+import org.dromara.daxpay.service.isv.service.gateway.IsvAggregateConfigService;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 聚合支付配置
+ * @author xxm
+ * @since 2025/3/24
+ */
+@Validated
+@ClientCode({DaxPayCode.Client.ADMIN})
+@Tag(name = "聚合支付配置(服务商)")
+@RestController
+@RequestMapping("/isv/aggregate/config")
+@RequestGroup(groupCode = "AggregateConfig", groupName = "聚合支付配置(服务商)", moduleCode = "GatewayPay")
+@RequiredArgsConstructor
+public class IsvAggregateConfigController {
+ private final IsvAggregateConfigService aggregateConfigService;
+
+ @RequestPath("支付配置列表")
+ @Operation(summary = "支付配置列表")
+ @GetMapping("/listByPay")
+ public Result> listByPay(){
+ return Res.ok(aggregateConfigService.listByPay());
+ }
+
+ @RequestPath("付款码支付配置列表")
+ @Operation(summary = "付款码支付配置列表")
+ @GetMapping("/listByBar")
+ public Result> listByBar(){
+ return Res.ok(aggregateConfigService.listByBar());
+ }
+
+ @RequestPath("支付配置详情")
+ @Operation(summary = "支付配置详情")
+ @GetMapping("/findPayById")
+ public Result findPayById(Long id){
+ return Res.ok(aggregateConfigService.findPayById(id));
+ }
+
+ @RequestPath("付款码支付配置详情")
+ @Operation(summary = "付款码支付配置详情")
+ @GetMapping("/findBarById")
+ public Result findBarById(Long id){
+ return Res.ok(aggregateConfigService.findBarById(id));
+ }
+
+ @RequestPath("保存支付配置")
+ @Operation(summary = "保存支付配置")
+ @PostMapping("/savePay")
+ public Result savePay(@Validated @RequestBody IsvAggregatePayConfigParam param){
+ aggregateConfigService.savePay(param);
+ return Res.ok();
+ }
+
+ @RequestPath("保存付款码支付配置")
+ @Operation(summary = "保存付款码支付配置")
+ @PostMapping("/saveBar")
+ public Result saveBar(@Validated @RequestBody IsvAggregateBarPayConfigParam param){
+ aggregateConfigService.saveBar(param);
+ return Res.ok();
+ }
+
+ @RequestPath("更新支付配置")
+ @Operation(summary = "更新支付配置")
+ @PostMapping("/updatePay")
+ public Result updatePay(@Validated @RequestBody IsvAggregatePayConfigParam param){
+ aggregateConfigService.updatePay(param);
+ return Res.ok();
+ }
+
+ @RequestPath("更新付款码支付配置")
+ @Operation(summary = "更新付款码支付配置")
+ @PostMapping("/updateBar")
+ public Result updateBar(@Validated @RequestBody IsvAggregateBarPayConfigParam param){
+ aggregateConfigService.updateBar(param);
+ return Res.ok();
+ }
+
+ @RequestPath("删除支付配置")
+ @Operation(summary = "删除支付配置")
+ @PostMapping("/deletePay")
+ public Result deletePay(Long id){
+ aggregateConfigService.deletePay(id);
+ return Res.ok();
+ }
+
+ @RequestPath("删除付款码支付配置")
+ @Operation(summary = "删除付款码支付配置")
+ @PostMapping("/deleteBar")
+ public Result deleteBar(Long id){
+ aggregateConfigService.deleteBar(id);
+ return Res.ok();
+ }
+
+ @RequestPath("支付配置是否存在")
+ @Operation(summary = "支付配置是否存在")
+ @GetMapping("/existsPay")
+ public Result existsPay(String type){
+ return Res.ok(aggregateConfigService.existsPay(type));
+ }
+
+ @RequestPath("支付配置是否存在(不包含自身)")
+ @Operation(summary = "支付配置是否存在(不包含自身)")
+ @GetMapping("/existsPayNotId")
+ public Result existsPayNotId(String type, Long id){
+ return Res.ok(aggregateConfigService.existsPay(type, id));
+ }
+
+ @RequestPath("付款码支付配置是否存在")
+ @Operation(summary = "付款码支付配置是否存在")
+ @GetMapping("/existsBar")
+ public Result existsBar(String type){
+ return Res.ok(aggregateConfigService.existsBar(type));
+ }
+
+ @RequestPath("付款码支付配置是否存在(不包含自身)")
+ @Operation(summary = "付款码支付配置是否存在(不包含自身)")
+ @GetMapping("/existsBarNotId")
+ public Result existsBarNotId(String type, Long id){
+ return Res.ok(aggregateConfigService.existsBar(type, id));
+ }
+}
diff --git a/daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/admin/isv/gateway/IsvCashierConfigController.java b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/admin/isv/gateway/IsvCashierConfigController.java
new file mode 100644
index 00000000..7e637547
--- /dev/null
+++ b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/admin/isv/gateway/IsvCashierConfigController.java
@@ -0,0 +1,124 @@
+package org.dromara.daxpay.server.controller.admin.isv.gateway;
+
+import cn.bootx.platform.core.annotation.ClientCode;
+import cn.bootx.platform.core.annotation.RequestGroup;
+import cn.bootx.platform.core.annotation.RequestPath;
+import cn.bootx.platform.core.rest.Res;
+import cn.bootx.platform.core.rest.result.Result;
+import cn.bootx.platform.core.validation.ValidationGroup;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import lombok.RequiredArgsConstructor;
+import org.dromara.daxpay.service.common.code.DaxPayCode;
+import org.dromara.daxpay.service.isv.param.gateway.IsvCashierGroupConfigParam;
+import org.dromara.daxpay.service.isv.param.gateway.IsvCashierItemConfigParam;
+import org.dromara.daxpay.service.isv.result.gateway.IsvCashierGroupConfigResult;
+import org.dromara.daxpay.service.isv.result.gateway.IsvCashierItemConfigResult;
+import org.dromara.daxpay.service.isv.service.gateway.IsvCashierConfigService;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 收银台支付配置
+ * @author xxm
+ * @since 2025/3/24
+ */
+@Validated
+@ClientCode({DaxPayCode.Client.ADMIN})
+@Tag(name = "收银台支付配置(服务商)")
+@RestController
+@RequestMapping("/isv/cashier/config")
+@RequestGroup(groupCode = "CashierConfig", groupName = "收银台支付配置(服务商)", moduleCode = "GatewayPay")
+@RequiredArgsConstructor
+public class IsvCashierConfigController {
+ private final IsvCashierConfigService cashierConfigService;
+
+ @RequestPath("获取指定类型收银台分组列表")
+ @Operation(summary = "获取指定类型收银台分组列表")
+ @GetMapping("/listByType")
+ public Result> listByType(@NotBlank(message = "收银台类型不可为空") String cashierType) {
+ return Res.ok(cashierConfigService.listByGroup(cashierType));
+ }
+
+ @RequestPath("获取收银台分组配置")
+ @Operation(summary = "获取收银台分组配置")
+ @GetMapping("/findGroupById")
+ public Result findGroupById(@NotNull(message = "分组ID不可为空") Long groupId) {
+ return Res.ok(cashierConfigService.findGroupById(groupId));
+ }
+
+ @RequestPath("获取收银台条目配置列表")
+ @Operation(summary = "获取收银台条目配置列表")
+ @GetMapping("/listByItem")
+ public Result> listByItem(Long groupId) {
+ return Res.ok(cashierConfigService.listByItem(groupId));
+ }
+
+ @RequestPath("获取收银台条目配置")
+ @Operation(summary = "获取收银台条目配置")
+ @GetMapping("/findItemById")
+ public Result findItemById(Long groupId) {
+ return Res.ok(cashierConfigService.findItemById(groupId));
+ }
+
+ @RequestPath("保存收银台分组")
+ @Operation(summary = "保存收银台分组")
+ @PostMapping("/saveGroup")
+ public Result saveGroup(@RequestBody @Validated(ValidationGroup.add.class) IsvCashierGroupConfigParam param) {
+ cashierConfigService.saveGroup(param);
+ return Res.ok();
+ }
+
+ @RequestPath("保存默认收银台分组(H5)")
+ @Operation(summary = "保存默认收银台分组(H5)")
+ @PostMapping("/saveDefaultGroup")
+ public Result saveDefaultGroup() {
+ cashierConfigService.saveDefaultGroup();
+ return Res.ok();
+ }
+
+ @RequestPath("修改收银台分组")
+ @Operation(summary = "修改收银台分组")
+ @PostMapping("/updateGroup")
+ public Result updateGroup(@RequestBody @Validated(ValidationGroup.edit.class) IsvCashierGroupConfigParam param) {
+ cashierConfigService.updateGroup(param);
+ return Res.ok();
+ }
+
+ @RequestPath("删除收银台分组")
+ @Operation(summary = "删除收银台分组")
+ @PostMapping("/deleteGroup")
+ public Result deleteGroup(Long id) {
+ cashierConfigService.deleteGroup(id);
+ return Res.ok();
+ }
+
+ @RequestPath("保存收银台条目配置")
+ @Operation(summary = "保存收银台条目配置")
+ @PostMapping("/saveItem")
+ public Result saveItem(@RequestBody @Validated(ValidationGroup.add.class) IsvCashierItemConfigParam param) {
+ cashierConfigService.saveItem(param);
+ return Res.ok();
+ }
+
+ @RequestPath("修改收银台条目配置")
+ @Operation(summary = "修改收银台条目配置")
+ @PostMapping("/updateItem")
+ public Result updateItem(@RequestBody @Validated(ValidationGroup.edit.class) IsvCashierItemConfigParam param) {
+ cashierConfigService.updateItem(param);
+ return Res.ok();
+ }
+
+ @RequestPath("删除收银台条目配置")
+ @Operation(summary = "删除收银台条目配置")
+ @PostMapping("/deleteItem")
+ public Result deleteItem(Long id) {
+ cashierConfigService.deleteItem(id);
+ return Res.ok();
+ }
+
+}
diff --git a/daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/admin/isv/gateway/IsvGatewayPayConfigController.java b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/admin/isv/gateway/IsvGatewayPayConfigController.java
new file mode 100644
index 00000000..2e655c89
--- /dev/null
+++ b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/admin/isv/gateway/IsvGatewayPayConfigController.java
@@ -0,0 +1,49 @@
+package org.dromara.daxpay.server.controller.admin.isv.gateway;
+
+import cn.bootx.platform.core.annotation.ClientCode;
+import cn.bootx.platform.core.annotation.RequestGroup;
+import cn.bootx.platform.core.annotation.RequestPath;
+import cn.bootx.platform.core.rest.Res;
+import cn.bootx.platform.core.rest.result.Result;
+import cn.bootx.platform.core.validation.ValidationGroup;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.validation.constraints.NotBlank;
+import lombok.RequiredArgsConstructor;
+import org.dromara.daxpay.service.common.code.DaxPayCode;
+import org.dromara.daxpay.service.isv.param.gateway.IsvGatewayPayConfigParam;
+import org.dromara.daxpay.service.isv.result.gateway.IsvGatewayPayConfigResult;
+import org.dromara.daxpay.service.isv.service.gateway.IsvGatewayPayConfigService;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * 网关支付配置
+ * @author xxm
+ * @since 2025/3/24
+ */
+@Validated
+@ClientCode({DaxPayCode.Client.ADMIN})
+@Tag(name = "网关支付配置(服务商)")
+@RestController
+@RequestMapping("/isv/gateway/config")
+@RequestGroup(groupCode = "IsvGatewayPayConfig", groupName = "网关支付配置(服务商)", moduleCode = "GatewayPay")
+@RequiredArgsConstructor
+public class IsvGatewayPayConfigController {
+ private final IsvGatewayPayConfigService gatewayPayConfigService;
+
+ @RequestPath("获取网关支付配置")
+ @Operation(summary = "获取网关支付配置")
+ @GetMapping("/getConfig")
+ public Result getConfig() {
+ return Res.ok(gatewayPayConfigService.getConfig());
+ }
+
+ @RequestPath("更新网关支付配置")
+ @Operation(summary = "更新网关支付配置")
+ @PostMapping("/update")
+ public Result update(@Validated(ValidationGroup.edit.class) @RequestBody IsvGatewayPayConfigParam param) {
+ gatewayPayConfigService.update(param);
+ return Res.ok();
+ }
+}
diff --git a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/common/MchAppController.java b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/admin/merchant/MchAppAdminController.java
similarity index 73%
rename from daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/common/MchAppController.java
rename to daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/admin/merchant/MchAppAdminController.java
index 44cde46c..d4dc4f78 100644
--- a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/common/MchAppController.java
+++ b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/admin/merchant/MchAppAdminController.java
@@ -1,19 +1,20 @@
-package org.dromara.daxpay.controller.common;
+package org.dromara.daxpay.server.controller.admin.merchant;
+import cn.bootx.platform.core.annotation.ClientCode;
import cn.bootx.platform.core.annotation.OperateLog;
import cn.bootx.platform.core.annotation.RequestGroup;
import cn.bootx.platform.core.annotation.RequestPath;
import cn.bootx.platform.core.rest.Res;
-import cn.bootx.platform.core.rest.dto.LabelValue;
import cn.bootx.platform.core.rest.param.PageParam;
import cn.bootx.platform.core.rest.result.PageResult;
import cn.bootx.platform.core.rest.result.Result;
import cn.bootx.platform.core.util.ValidationUtil;
import cn.bootx.platform.core.validation.ValidationGroup;
-import org.dromara.daxpay.service.service.merchant.MchAppService;
-import org.dromara.daxpay.service.param.merchant.MchAppParam;
-import org.dromara.daxpay.service.param.merchant.MchAppQuery;
-import org.dromara.daxpay.service.result.merchant.MchAppResult;
+import org.dromara.daxpay.service.common.code.DaxPayCode;
+import org.dromara.daxpay.service.merchant.param.app.MchAppParam;
+import org.dromara.daxpay.service.merchant.param.app.MchAppQuery;
+import org.dromara.daxpay.service.merchant.result.app.MchAppResult;
+import org.dromara.daxpay.service.merchant.service.app.MchAppService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.constraints.NotNull;
@@ -22,20 +23,19 @@ import org.dromara.core.trans.anno.TransMethodResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
-import java.util.List;
-
/**
* 商户应用配置(管理)
* @author xxm
* @since 2024/6/25
*/
@Validated
+@ClientCode({DaxPayCode.Client.ADMIN})
@Tag(name = "商户应用配置(管理)")
@RestController
-@RequestMapping("/mch/app")
-@RequestGroup(groupCode = "mchAppAdmin", groupName = "商户应用配置(管理)", moduleCode = "PayConfig")
+@RequestMapping("/admin/mch/app")
+@RequestGroup(groupCode = "mchAppAdmin", groupName = "商户应用配置(管理)", moduleCode = "merchant")
@RequiredArgsConstructor
-public class MchAppController {
+public class MchAppAdminController {
private final MchAppService mchAppService;
@RequestPath("新增商户应用")
@@ -82,19 +82,4 @@ public class MchAppController {
mchAppService.delete(id);
return Res.ok();
}
-
-
- @RequestPath("根据商户号查询启用的应用下拉列表")
- @Operation(summary = "根据商户号查询启用的商户应用下拉列表")
- @GetMapping("/dropdown")
- public Result> appDropdown(){
- return Res.ok(mchAppService.dropdown());
- }
-
- @RequestPath("根据商户号查询启应用下拉列表")
- @Operation(summary = "根据商户号查询商户应用下拉列表")
- @GetMapping("/dropdownByEnable")
- public Result> appDropdownByEnable(){
- return Res.ok(mchAppService.dropdownByEnable());
- }
}
diff --git a/daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/admin/merchant/MerchantAdminController.java b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/admin/merchant/MerchantAdminController.java
new file mode 100644
index 00000000..0b74e46d
--- /dev/null
+++ b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/admin/merchant/MerchantAdminController.java
@@ -0,0 +1,84 @@
+package org.dromara.daxpay.server.controller.admin.merchant;
+
+import cn.bootx.platform.core.annotation.ClientCode;
+import cn.bootx.platform.core.annotation.OperateLog;
+import cn.bootx.platform.core.annotation.RequestGroup;
+import cn.bootx.platform.core.annotation.RequestPath;
+import cn.bootx.platform.core.rest.Res;
+import cn.bootx.platform.core.rest.param.PageParam;
+import cn.bootx.platform.core.rest.result.PageResult;
+import cn.bootx.platform.core.rest.result.Result;
+import cn.bootx.platform.core.validation.ValidationGroup;
+import org.dromara.daxpay.server.service.admin.MerchantAdminService;
+import org.dromara.daxpay.service.common.code.DaxPayCode;
+import org.dromara.daxpay.service.merchant.param.info.MerchantCreateParam;
+import org.dromara.daxpay.service.merchant.param.info.MerchantParam;
+import org.dromara.daxpay.service.merchant.param.info.MerchantQuery;
+import org.dromara.daxpay.service.merchant.result.info.MerchantResult;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.validation.constraints.NotNull;
+import lombok.RequiredArgsConstructor;
+import org.dromara.core.trans.anno.TransMethodResult;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * 商户配置(管理)
+ * @author xxm
+ * @since 2024/6/25
+ */
+@Validated
+@ClientCode({DaxPayCode.Client.ADMIN})
+@Tag(name = "商户配置(管理)")
+@RestController
+@RequestMapping("/admin/merchant")
+@RequestGroup(groupCode = "merchantAdmin", groupName = "商户配置(管理)", moduleCode = "merchant", moduleName = "(DaxPay)商户管理")
+@RequiredArgsConstructor
+public class MerchantAdminController {
+ private final MerchantAdminService merchantService;
+
+ @RequestPath("新增商户")
+ @Operation(summary = "新增商户")
+ @PostMapping("/add")
+ @OperateLog(title = "新增商户 ", businessType = OperateLog.BusinessType.ADD, saveParam = true)
+ public Result add(@RequestBody @Validated(ValidationGroup.add.class) MerchantCreateParam param){
+ merchantService.add(param);
+ return Res.ok();
+ }
+
+ @RequestPath("修改商户")
+ @Operation(summary = "修改商户")
+ @PostMapping("/update")
+ @OperateLog(title = "修改商户 ", businessType = OperateLog.BusinessType.UPDATE, saveParam = true)
+ public Result update(@RequestBody @Validated(ValidationGroup.edit.class) MerchantParam param){
+ merchantService.update(param);
+ return Res.ok();
+ }
+
+ @TransMethodResult
+ @RequestPath("商户分页")
+ @Operation(summary = "商户分页")
+ @GetMapping("/page")
+ public Result> page(PageParam pageParam, MerchantQuery param){
+ return Res.ok(merchantService.page(pageParam, param));
+ }
+
+ @TransMethodResult
+ @RequestPath("根据id查询商户")
+ @Operation(summary = "根据id查询商户")
+ @GetMapping("/findById")
+ public Result findById(@NotNull(message = "id不可为空")Long id){
+ return Res.ok(merchantService.findById(id));
+ }
+
+ @RequestPath("删除商户")
+ @Operation(summary = "删除商户")
+ @PostMapping("/delete")
+ @OperateLog(title = "删除商户 ", businessType = OperateLog.BusinessType.DELETE, saveParam = true)
+ public Result delete(@NotNull(message = "id不可为空") Long id){
+ merchantService.delete(id);
+ return Res.ok();
+ }
+
+}
diff --git a/daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/admin/report/IndexTradeReportAdminController.java b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/admin/report/IndexTradeReportAdminController.java
new file mode 100644
index 00000000..ee7c86fb
--- /dev/null
+++ b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/admin/report/IndexTradeReportAdminController.java
@@ -0,0 +1,88 @@
+package org.dromara.daxpay.server.controller.admin.report;
+
+import cn.bootx.platform.core.annotation.ClientCode;
+import cn.bootx.platform.core.annotation.RequestGroup;
+import cn.bootx.platform.core.annotation.RequestPath;
+import cn.bootx.platform.core.rest.Res;
+import cn.bootx.platform.core.rest.result.Result;
+import org.dromara.daxpay.service.common.code.DaxPayCode;
+import org.dromara.daxpay.service.pay.param.report.TradeReportQuery;
+import org.dromara.daxpay.service.pay.result.report.MerchantReportResult;
+import org.dromara.daxpay.service.pay.result.report.TradeReportResult;
+import org.dromara.daxpay.service.pay.result.report.TradeStatisticsReport;
+import org.dromara.daxpay.service.pay.service.report.IndexTradeReportService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.RequiredArgsConstructor;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * 首页交易报表
+ * @author xxm
+ * @since 2024/11/17
+ */
+@Validated
+@Tag(name = "运营平台首页交易报表")
+@RequestGroup(groupCode = "IndexTradeReport", groupName = "运营平台首页交易报表", moduleCode = "report", moduleName = "(DaxPay)统计报表")
+@ClientCode(DaxPayCode.Client.ADMIN)
+@RestController
+@RequestMapping("/admin/report/index")
+@RequiredArgsConstructor
+public class IndexTradeReportAdminController {
+
+ private final IndexTradeReportService tradeReportService;
+
+ @RequestPath("支付交易信息统计")
+ @Operation(summary = "支付交易信息统计")
+ @GetMapping("/pay")
+ public Result pryTradeReport(TradeReportQuery query){
+ return Res.ok(tradeReportService.pryTradeReport(query));
+ }
+
+ @RequestPath("退款交易信息统计")
+ @Operation(summary = "退款交易信息统计")
+ @GetMapping("/refund")
+ public Result refundTradeReport(TradeReportQuery query){
+ return Res.ok(tradeReportService.refundTradeReport(query));
+ }
+
+ @RequestPath("支付交易通道统计")
+ @Operation(summary = "支付交易通道统计")
+ @GetMapping("/payChannel")
+ public Result> payChannelReport(TradeReportQuery query){
+ return Res.ok(tradeReportService.payChannelReport(query));
+ }
+
+ @RequestPath("退款交易通道统计")
+ @Operation(summary = "退款交易通道统计")
+ @GetMapping("/refundChannel")
+ public Result> refundChannelReport(TradeReportQuery query){
+ return Res.ok(tradeReportService.refundChannelReport(query));
+ }
+
+ @RequestPath("支付交易方式统计")
+ @Operation(summary = "支付交易方式统计")
+ @GetMapping("/payMethod")
+ public Result> payMethodReport(TradeReportQuery query){
+ return Res.ok(tradeReportService.payMethodReport(query));
+ }
+
+ @RequestPath("商户和应用数量统计")
+ @Operation(summary = "商户和应用数量统计")
+ @GetMapping("/merchantCount")
+ public Result merchantCount(){
+ return Res.ok(tradeReportService.merchantCount(new TradeReportQuery()));
+ }
+
+ @RequestPath("交易统计报表")
+ @Operation(summary = "交易统计报表")
+ @GetMapping("/tradeStatisticsReport")
+ public Result> tradeStatisticsReport(TradeReportQuery query){
+ return Res.ok(tradeReportService.tradeStatistics(query));
+ }
+}
diff --git a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/gateway/ChannelAuthController.java b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/gateway/ChannelAuthController.java
similarity index 89%
rename from daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/gateway/ChannelAuthController.java
rename to daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/gateway/ChannelAuthController.java
index d2e9e1da..cc628293 100644
--- a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/gateway/ChannelAuthController.java
+++ b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/gateway/ChannelAuthController.java
@@ -1,4 +1,4 @@
-package org.dromara.daxpay.controller.gateway;
+package org.dromara.daxpay.server.controller.gateway;
import cn.bootx.platform.core.annotation.IgnoreAuth;
import cn.bootx.platform.core.rest.Res;
@@ -10,9 +10,9 @@ import org.dromara.daxpay.core.result.DaxResult;
import org.dromara.daxpay.core.result.assist.AuthResult;
import org.dromara.daxpay.core.result.assist.AuthUrlResult;
import org.dromara.daxpay.core.util.DaxRes;
-import org.dromara.daxpay.service.common.anno.PaymentVerify;
-import org.dromara.daxpay.service.service.assist.ChannelAuthService;
-import org.dromara.daxpay.service.service.assist.PaymentAssistService;
+import org.dromara.daxpay.service.pay.common.anno.PaymentVerify;
+import org.dromara.daxpay.service.pay.service.assist.ChannelAuthService;
+import org.dromara.daxpay.service.pay.service.assist.PaymentAssistService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
diff --git a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/gateway/CashierCodeController.java b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/gateway/GatewayCashierController.java
similarity index 71%
rename from daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/gateway/CashierCodeController.java
rename to daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/gateway/GatewayCashierController.java
index 2295019e..69617134 100644
--- a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/gateway/CashierCodeController.java
+++ b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/gateway/GatewayCashierController.java
@@ -1,4 +1,4 @@
-package org.dromara.daxpay.controller.gateway;
+package org.dromara.daxpay.server.controller.gateway;
import cn.bootx.platform.core.annotation.IgnoreAuth;
import cn.bootx.platform.core.rest.Res;
@@ -7,9 +7,9 @@ import cn.bootx.platform.core.util.ValidationUtil;
import org.dromara.daxpay.core.param.gateway.*;
import org.dromara.daxpay.core.result.assist.AuthResult;
import org.dromara.daxpay.core.result.trade.pay.PayResult;
-import org.dromara.daxpay.service.result.gateway.GatewayCashierCodeConfigResult;
-import org.dromara.daxpay.service.service.gateway.CashierPayService;
-import org.dromara.daxpay.service.service.gateway.GatewayPayQueryService;
+import org.dromara.daxpay.service.pay.result.gateway.GatewayCashierCodeConfigResult;
+import org.dromara.daxpay.service.pay.service.gateway.CashierCodePayService;
+import org.dromara.daxpay.service.pay.service.gateway.CashierPayService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
@@ -19,47 +19,48 @@ import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
/**
- * 网关支付码牌服务
+ * 网关收银支付服务(收银台/码牌)
* @author xxm
* @since 2025/4/12
*/
@Validated
@IgnoreAuth
-@Tag(name = "网关支付码牌服务")
+@Tag(name = "网关收银支付服务")
@RestController
@RequestMapping("/unipay/gateway/cashier")
@RequiredArgsConstructor
-public class CashierCodeController {
+public class GatewayCashierController {
private final CashierPayService cashierPayService;
- private final GatewayPayQueryService checkoutQueryService;
+ private final CashierCodePayService cashierCodePayService;
@Operation(summary = "获取收银码牌配置信息")
@GetMapping("/getCodeConfig")
public Result getCashierCodeConfig(
@NotBlank(message = "码牌编码不能为空") @Parameter(description = "码牌编码") String cashierCode,
- @NotBlank(message = "收银台类型不能为空") @Parameter(description = "收银台类型")String cashierType){
- return Res.ok(checkoutQueryService.getCashierCodeConfig(cashierCode, cashierType));
+ @NotBlank(message = "支付场景不能为空") @Parameter(description = "支付场景")String cashierScene){
+ return Res.ok(cashierCodePayService.getCashierCodeConfig(cashierCode, cashierScene));
}
@Operation(summary = "获取收银码牌支付的授权链接, 用于获取OpenId一类的信息")
@PostMapping("/code/generateAuthUrl")
public Result getCashierCodeConfig(@RequestBody @Validated GatewayCashierCodeAuthUrlParam param){
- return Res.ok(cashierPayService.genAuthUrl(param));
- }
-
- @Operation(summary = "获取网关支付授权结果")
- @PostMapping("/code/auth")
- public Result auth(@RequestBody @Validated GatewayCashierCodeAuthParam param){
- ValidationUtil.validateParam(param);
- return Res.ok(cashierPayService.auth(param));
+ return Res.ok(cashierCodePayService.genAuthUrl(param));
}
@Operation(summary = "发起支付(码牌)")
@PostMapping("/code/pay")
public Result aggregateBarPay(@RequestBody @Validated GatewayCashierCodePayParam param){
- return Res.ok(cashierPayService.cashierCodePay(param));
+ return Res.ok(cashierCodePayService.cashierCodePay(param));
}
+ @Operation(summary = "获取网关支付授权结果(码牌)")
+ @PostMapping("/code/auth")
+ public Result auth(@RequestBody @Validated GatewayCashierCodeAuthParam param){
+ ValidationUtil.validateParam(param);
+ return Res.ok(cashierCodePayService.auth(param));
+ }
+
+
@Operation(summary = "发起支付(收银台)")
@PostMapping("/pay")
public Result pay(@RequestBody @Validated GatewayCashierPayParam param){
diff --git a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/gateway/GatewayPayController.java b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/gateway/GatewayPayController.java
similarity index 88%
rename from daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/gateway/GatewayPayController.java
rename to daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/gateway/GatewayPayController.java
index ee567673..1d9c39de 100644
--- a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/gateway/GatewayPayController.java
+++ b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/gateway/GatewayPayController.java
@@ -1,4 +1,4 @@
-package org.dromara.daxpay.controller.gateway;
+package org.dromara.daxpay.server.controller.gateway;
import cn.bootx.platform.core.annotation.IgnoreAuth;
import cn.bootx.platform.core.rest.Res;
@@ -14,13 +14,13 @@ import org.dromara.daxpay.core.result.DaxResult;
import org.dromara.daxpay.core.result.assist.AuthResult;
import org.dromara.daxpay.core.result.trade.pay.PayResult;
import org.dromara.daxpay.core.util.DaxRes;
-import org.dromara.daxpay.service.common.anno.PaymentVerify;
-import org.dromara.daxpay.service.result.gateway.AggregateOrderAndConfigResult;
-import org.dromara.daxpay.service.result.gateway.GatewayOrderAndConfigResult;
-import org.dromara.daxpay.service.result.gateway.GatewayOrderResult;
-import org.dromara.daxpay.service.result.gateway.GatewayPayUrlResult;
-import org.dromara.daxpay.service.service.gateway.GatewayPayQueryService;
-import org.dromara.daxpay.service.service.gateway.GatewayPayService;
+import org.dromara.daxpay.service.pay.common.anno.PaymentVerify;
+import org.dromara.daxpay.service.pay.result.gateway.AggregateOrderAndConfigResult;
+import org.dromara.daxpay.service.pay.result.gateway.GatewayOrderAndConfigResult;
+import org.dromara.daxpay.service.pay.result.gateway.GatewayOrderResult;
+import org.dromara.daxpay.service.pay.result.gateway.GatewayPayUrlResult;
+import org.dromara.daxpay.service.pay.service.gateway.GatewayPayQueryService;
+import org.dromara.daxpay.service.pay.service.gateway.GatewayPayService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
@@ -48,7 +48,6 @@ public class GatewayPayController {
@Operation(summary = "创建一个网关支付链接")
@PostMapping("/prePay")
public DaxResult prePay(@RequestBody GatewayPayParam checkoutParam){
- // 初始化
return DaxRes.ok(gatewayPayService.prePay(checkoutParam));
}
diff --git a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/gateway/TestCallbackController.java b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/gateway/TestCallbackController.java
similarity index 68%
rename from daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/gateway/TestCallbackController.java
rename to daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/gateway/TestCallbackController.java
index 24bea829..6e082ca1 100644
--- a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/gateway/TestCallbackController.java
+++ b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/gateway/TestCallbackController.java
@@ -1,8 +1,9 @@
-package org.dromara.daxpay.controller.gateway;
+package org.dromara.daxpay.server.controller.gateway;
import cn.bootx.platform.core.annotation.IgnoreAuth;
import cn.bootx.platform.core.util.JsonUtil;
import org.dromara.daxpay.core.result.DaxNoticeResult;
+import org.dromara.daxpay.core.result.trade.pay.PayOrderResult;
import org.dromara.daxpay.core.util.PaySignUtil;
import cn.hutool.core.lang.TypeReference;
import cn.hutool.core.thread.ThreadUtil;
@@ -35,8 +36,14 @@ public class TestCallbackController {
@PostMapping("/notify")
public String notify(@RequestBody String data){
log.info("notify:{}",data);
+ // 转换成实体类, 使用sdk中内置的json工具类转换
+ DaxNoticeResult x = JsonUtil.toBean(data, new TypeReference<>() {});
+ // 替换成自己的密钥
+ PaySignUtil.verifyHmacSha256Sign(x,"bc5b5d592cc34434a27fb57fe923dacc5374da52a4174ff5874768a8215e5fd3",x.getSign());
+ // 使用map方式验签
DaxNoticeResult