From 931948bd4e8681869b10641993a855b3368e5c0d Mon Sep 17 00:00:00 2001 From: dzc <2388224167@qq.com> Date: Mon, 25 May 2026 17:25:03 +0800 Subject: [PATCH 1/2] =?UTF-8?q?feat:=E5=BE=AE=E4=BF=A1=E5=88=86=E4=BB=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pjcloud-thirdparty-api/pom.xml | 6 + .../feign/RemoterThirdAppPlusPayService.java | 23 +++ .../thirdparty/dto/pay/ThirdFzOrderDto.java | 6 + .../entity/pay/ThirdFzOrderEntity.java | 7 + .../entity/pay/ThirdPayOrderEntity.java | 24 +++ .../thirdparty/vo/pay/ThirdFzOrderVo.java | 3 + ...mework.cloud.openfeign.FeignClient.imports | 1 + .../appplus/ThirdAppPlusController.java | 59 ++++++ .../pay/ThirdFzOrderController.java | 8 +- .../thirdparty/job/ThirdAppPlusPayJob.java | 53 +++++ .../mapper/pay/ThirdFzOrderMapper.java | 6 + .../service/ThirdAppPlusService.java | 7 + .../service/ThirdAppPlusWechatFzService.java | 27 +++ .../service/ThirdFzOrderService.java | 7 + .../impl/appplus/ThirdAppPlusServiceImpl.java | 136 +++++++------ .../ThirdAppPlusWechatServiceImpl.java | 40 +++- .../appplus/common/AppPlusOrderLifecycle.java | 4 +- .../fz/ThirdAppPlusWechatFzServiceImpl.java | 191 +++++++++++++++++- .../ThirdAppPlusWechatFzLifecycle.java | 6 +- .../impl/pay/ThirdFzOrderServiceImpl.java | 23 +++ .../resources/mapper/ThirdFzOrderMapper.xml | 51 +++++ .../resources/mapper/ThirdPayOrderMapper.xml | 60 +++--- .../api/entity/mch/MchPaySettingEntity.java | 2 +- .../impl/mch/MchManageServiceImpl.java | 8 + .../impl/mch/MchPaySettingServiceImpl.java | 16 ++ 25 files changed, 667 insertions(+), 107 deletions(-) create mode 100644 pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/api/feign/RemoterThirdAppPlusPayService.java create mode 100644 pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/appplus/ThirdAppPlusController.java create mode 100644 pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/job/ThirdAppPlusPayJob.java diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/pom.xml b/pjcloud-thirdparty/pjcloud-thirdparty-api/pom.xml index e1fa6f100..bcd94ff2f 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-api/pom.xml +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/pom.xml @@ -42,5 +42,11 @@ com.bsd pjcloud-common-excel + + com.bsd + pjcloud-wallet-api + 5.7.0 + compile + diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/api/feign/RemoterThirdAppPlusPayService.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/api/feign/RemoterThirdAppPlusPayService.java new file mode 100644 index 000000000..36a622375 --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/api/feign/RemoterThirdAppPlusPayService.java @@ -0,0 +1,23 @@ +package com.bsd.pjcloud.thirdparty.api.feign; + +import com.bsd.pjcloud.common.core.constant.ServiceNameConstants; +import com.bsd.pjcloud.common.core.util.R; +import com.bsd.pjcloud.common.feign.annotation.NoToken; +import com.bsd.pjcloud.wallet.api.entity.mch.MchManageEntity; +import com.bsd.pjcloud.wallet.api.vo.MchManageVo; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; + + +@FeignClient(contextId = "remoterThirdAppPlusPayService", value = ServiceNameConstants.THIRDPARTY_SERVICE) +public interface RemoterThirdAppPlusPayService { + + /** + * 编辑商户的回调 + */ + @NoToken + @PostMapping("/remoter/change-mch") + R remoterChangeMch(@RequestBody MchManageVo dto); + +} diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/pay/ThirdFzOrderDto.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/pay/ThirdFzOrderDto.java index 30981d62a..e358f37f7 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/pay/ThirdFzOrderDto.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/pay/ThirdFzOrderDto.java @@ -3,7 +3,13 @@ package com.bsd.pjcloud.thirdparty.dto.pay; import com.bsd.pjcloud.thirdparty.entity.pay.ThirdFzOrderEntity; import lombok.Data; +import java.time.LocalDateTime; + @Data public class ThirdFzOrderDto extends ThirdFzOrderEntity { + private LocalDateTime[] fzTimeList; + + private LocalDateTime[] fzRefundTimeList; + } diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/entity/pay/ThirdFzOrderEntity.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/entity/pay/ThirdFzOrderEntity.java index bba6cd358..98f30ab27 100755 --- a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/entity/pay/ThirdFzOrderEntity.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/entity/pay/ThirdFzOrderEntity.java @@ -26,6 +26,13 @@ public class ThirdFzOrderEntity extends Model { @Schema(description = "主键") private Long id; + + /** + * 分账金额 + */ + @Schema(description = "分账金额") + private Integer price; + /** * 支付订单号 */ diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/entity/pay/ThirdPayOrderEntity.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/entity/pay/ThirdPayOrderEntity.java index ac7b199e9..41b318124 100755 --- a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/entity/pay/ThirdPayOrderEntity.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/entity/pay/ThirdPayOrderEntity.java @@ -84,6 +84,12 @@ public class ThirdPayOrderEntity extends Model { @Schema(description = "支付金额(分)") private Integer price; + /** + * 分账分掉的金额(分) + */ + @Schema(description = "分账分掉的金额(分)") + private Integer fzPrice; + /** * 支付状态 */ @@ -156,6 +162,24 @@ public class ThirdPayOrderEntity extends Model { @Schema(description = "订单过期时间") private LocalDateTime expireTime; + /** + * 是否开启分账 + */ + @Schema(description = "是否开启分账") + private String enableFz; + + /** + * 业务回调是否完成 + */ + @Schema(description = "业务回调是否完成") + private String isBizCallback; + + /** + * 是否分账成功 + */ + @Schema(description = "是否分账成功") + private String isFzSuccess; + /** * 创建人 */ diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/pay/ThirdFzOrderVo.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/pay/ThirdFzOrderVo.java index c39f7ab39..91d29a068 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/pay/ThirdFzOrderVo.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/pay/ThirdFzOrderVo.java @@ -3,7 +3,10 @@ package com.bsd.pjcloud.thirdparty.vo.pay; import com.bsd.pjcloud.thirdparty.entity.pay.ThirdFzOrderEntity; import lombok.Data; +import java.time.LocalDateTime; + @Data public class ThirdFzOrderVo extends ThirdFzOrderEntity { + } diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/resources/META-INF/spring/org.springframework.cloud.openfeign.FeignClient.imports b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/resources/META-INF/spring/org.springframework.cloud.openfeign.FeignClient.imports index 37e0bfcf9..3565f6069 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/resources/META-INF/spring/org.springframework.cloud.openfeign.FeignClient.imports +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/resources/META-INF/spring/org.springframework.cloud.openfeign.FeignClient.imports @@ -1,3 +1,4 @@ +com.bsd.pjcloud.thirdparty.api.feign.RemoterThirdAppPlusPayService com.bsd.pjcloud.thirdparty.api.feign.RemoterThirdKsService com.bsd.pjcloud.thirdparty.api.feign.RemoterThirdDoorApiService com.bsd.pjcloud.thirdparty.api.feign.RemoterThirdLbApiService diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/appplus/ThirdAppPlusController.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/appplus/ThirdAppPlusController.java new file mode 100644 index 000000000..b999370f5 --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/appplus/ThirdAppPlusController.java @@ -0,0 +1,59 @@ +package com.bsd.pjcloud.thirdparty.controller.appplus; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.json.JSONUtil; +import com.bsd.pjcloud.common.core.util.R; +import com.bsd.pjcloud.common.security.annotation.Inner; +import com.bsd.pjcloud.thirdparty.constant.miniplatform.AppPlusPlatformPayType; +import com.bsd.pjcloud.thirdparty.dto.appplus.pay.wechat.ThirdMiniWechatRefundDto; +import com.bsd.pjcloud.thirdparty.service.ThirdAppPlusWechatFzService; +import com.bsd.pjcloud.thirdparty.vo.appplus.pay.ThirdMiniAppPayVo; +import com.bsd.pjcloud.wallet.api.dto.WalletManageDto; +import com.bsd.pjcloud.wallet.api.entity.mch.MchPaySettingEntity; +import com.bsd.pjcloud.wallet.api.vo.MchManageVo; +import com.bsd.pjcloud.wallet.api.vo.WalletManageVo; +import com.bsd.pjcloud.wallet.api.vo.mch.MchPaySettingVo; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpHeaders; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/remoter") +@Tag(description = "remoter", name = "小程序支付") +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class ThirdAppPlusController { + + private final ThirdAppPlusWechatFzService appPlusWechatFzService; + + @Operation(summary = "支付退款") + @PostMapping("/change-mch") + @Inner + public R remoterChangeMch(@RequestBody MchManageVo dto) { + if (ObjectUtil.isNotEmpty(dto)) { + List paySettingList = dto.getPaySettingList(); + if (ObjectUtil.isNotEmpty(paySettingList)) { + for (MchPaySettingVo v : paySettingList) { + if (ObjectUtil.equals(v.getPlatformType(), AppPlusPlatformPayType.WECHAT.getType())) { + MchPaySettingEntity.WechatPaySetting jsonSetting = JSONUtil.toBean(v.getSettingJson(), MchPaySettingEntity.WechatPaySetting.class); + if (ObjectUtil.isNotEmpty(jsonSetting)) { + appPlusWechatFzService.addReceiver(jsonSetting.getSubMchid()); + } + } + } + } + } + return R.ok(true); + } + + +} diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/pay/ThirdFzOrderController.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/pay/ThirdFzOrderController.java index 15901b72d..a32149d92 100755 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/pay/ThirdFzOrderController.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/pay/ThirdFzOrderController.java @@ -1,11 +1,14 @@ package com.bsd.pjcloud.thirdparty.controller.pay; + ; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.bsd.pjcloud.common.core.util.R; +import com.bsd.pjcloud.thirdparty.dto.pay.ThirdFzOrderDto; import com.bsd.pjcloud.thirdparty.entity.pay.ThirdFzOrderEntity; import com.bsd.pjcloud.thirdparty.service.ThirdFzOrderService; +import com.bsd.pjcloud.thirdparty.vo.pay.ThirdFzOrderVo; import org.springframework.security.access.prepost.PreAuthorize; import io.swagger.v3.oas.annotations.security.SecurityRequirement; import org.springdoc.core.annotations.ParameterObject; @@ -33,9 +36,8 @@ public class ThirdFzOrderController { @Operation(summary = "分页查询", description = "分页查询") @GetMapping("/page") @PreAuthorize("@pms.hasPermission('third_thirdFzOrder_view')") - public R getThirdFzOrderPage(@ParameterObject Page page, @ParameterObject ThirdFzOrderEntity thirdFzOrder) { - LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); - return R.ok(thirdFzOrderService.page(page, wrapper)); + public R> getThirdFzOrderPage(@ParameterObject Page page, @ParameterObject ThirdFzOrderDto dto) { + return R.ok(thirdFzOrderService.scopePageList(page, dto, null)); } @Operation(summary = "通过id查询", description = "通过id查询") diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/job/ThirdAppPlusPayJob.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/job/ThirdAppPlusPayJob.java new file mode 100644 index 000000000..60d7435f8 --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/job/ThirdAppPlusPayJob.java @@ -0,0 +1,53 @@ +package com.bsd.pjcloud.thirdparty.job; + + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.bsd.pjcloud.common.core.constant.enums.YesNoEnum; +import com.bsd.pjcloud.thirdparty.constant.pay.ThirdPayOrderStatusEnum; +import com.bsd.pjcloud.thirdparty.entity.pay.ThirdPayOrderEntity; +import com.bsd.pjcloud.thirdparty.service.ThirdAppPlusService; +import com.bsd.pjcloud.thirdparty.service.ThirdPayOrderService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.time.LocalDateTime; +import java.util.List; + +@Component +@Slf4j +@RequiredArgsConstructor +public class ThirdAppPlusPayJob { + + private final ThirdPayOrderService thirdPayOrderService; + private final ThirdAppPlusService thirdAppPlusService; + + /** + * 处理,未勾起业务回调的订单 + */ + public void handleUnBizCallbackOrder() { + LocalDateTime now = LocalDateTime.now(); + + // 查询10分钟前未出发业务回调的订单 + List list = thirdPayOrderService.list(new LambdaQueryWrapper() + .eq(ThirdPayOrderEntity::getIsBizCallback, YesNoEnum.NO.getCode()) + .in(ThirdPayOrderEntity::getStatus, List.of( + ThirdPayOrderStatusEnum.PAY_SUCCESS.getType(), + ThirdPayOrderStatusEnum.REFUNDING.getType(), + ThirdPayOrderStatusEnum.REFUND_SUCCESS.getType(), + ThirdPayOrderStatusEnum.REFUND_FAILED.getType() + )) + .between(ThirdPayOrderEntity::getCreateTime, now.minusMinutes(11), now) + ); + if (ObjectUtil.isEmpty(list)) return; + for (ThirdPayOrderEntity item : list) { + thirdAppPlusService.queryPayResult(item); + } + } + + /** + * 处理,长时间未支付的订单(1个小时不支付) + */ + +} diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/mapper/pay/ThirdFzOrderMapper.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/mapper/pay/ThirdFzOrderMapper.java index 29aa028a2..96d47d473 100755 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/mapper/pay/ThirdFzOrderMapper.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/mapper/pay/ThirdFzOrderMapper.java @@ -1,11 +1,17 @@ package com.bsd.pjcloud.thirdparty.mapper.pay; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.bsd.pjcloud.common.data.datascope.DataScope; import com.bsd.pjcloud.common.data.datascope.PjcloudBaseMapper; +import com.bsd.pjcloud.thirdparty.dto.pay.ThirdFzOrderDto; import com.bsd.pjcloud.thirdparty.entity.pay.ThirdFzOrderEntity; +import com.bsd.pjcloud.thirdparty.vo.pay.ThirdFzOrderVo; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; @Mapper public interface ThirdFzOrderMapper extends PjcloudBaseMapper { + Page scopePageList(Page page, @Param("dto") ThirdFzOrderDto dto, DataScope dataScope); } \ No newline at end of file diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdAppPlusService.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdAppPlusService.java index ce580118a..bf6e3ffd2 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdAppPlusService.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdAppPlusService.java @@ -4,6 +4,7 @@ import com.bsd.pjcloud.thirdparty.dto.appplus.ThirdMiniAppGetUniqueDto; import com.bsd.pjcloud.thirdparty.dto.appplus.ThirdMiniAppOAth2LoginDto; import com.bsd.pjcloud.thirdparty.dto.appplus.ThirdMiniAppPayDto; import com.bsd.pjcloud.thirdparty.dto.appplus.pay.wechat.ThirdMiniWechatRefundDto; +import com.bsd.pjcloud.thirdparty.entity.pay.ThirdPayOrderEntity; import com.bsd.pjcloud.thirdparty.vo.appplus.ThirdMinAppOAth2LoginVo; import com.bsd.pjcloud.thirdparty.vo.appplus.pay.ThirdMiniAppPayVo; import com.bsd.pjcloud.thirdparty.vo.pay.ThirdPayOrderVo; @@ -42,6 +43,12 @@ public interface ThirdAppPlusService { */ String miniPayCallback(Map parameterMap, String body, Map headers); + /** + * 手动查询支付结果 + */ + + void queryPayResult(ThirdPayOrderEntity dto); + /** * 小程序退款回调 */ diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdAppPlusWechatFzService.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdAppPlusWechatFzService.java index e3e1f6c90..c0701e678 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdAppPlusWechatFzService.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdAppPlusWechatFzService.java @@ -1,8 +1,10 @@ package com.bsd.pjcloud.thirdparty.service; +import com.bsd.pjcloud.thirdparty.entity.pay.ThirdFzOrderEntity; import com.bsd.pjcloud.thirdparty.entity.pay.ThirdPayOrderEntity; import com.wechat.pay.java.service.profitsharing.model.OrdersEntity; +import com.wechat.pay.java.service.profitsharing.model.ReturnOrdersEntity; public interface ThirdAppPlusWechatFzService { @@ -11,4 +13,29 @@ public interface ThirdAppPlusWechatFzService { */ OrdersEntity create(ThirdPayOrderEntity orderEntity); + /** + * 分账退款 + */ + ReturnOrdersEntity refund(ThirdPayOrderEntity orderEntity); + + + /** + * 查询分账 + */ + OrdersEntity getFzOrder(ThirdFzOrderEntity fzOrder); + + /** + * 查询分账退款 + */ + ReturnOrdersEntity getFzRefundOrder(ThirdFzOrderEntity fzOrder); + + /** + * 添加分账方 + */ + boolean addReceiver(String targetMchId); + + /** + * 删除分账接收方 + */ + boolean deleteReceiver(String targetMchId); } diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdFzOrderService.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdFzOrderService.java index e2555cf5f..82e7c10df 100755 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdFzOrderService.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdFzOrderService.java @@ -1,8 +1,15 @@ package com.bsd.pjcloud.thirdparty.service; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; +import com.bsd.pjcloud.common.data.datascope.DataScope; +import com.bsd.pjcloud.thirdparty.dto.pay.ThirdFzOrderDto; import com.bsd.pjcloud.thirdparty.entity.pay.ThirdFzOrderEntity; +import com.bsd.pjcloud.thirdparty.vo.pay.ThirdFzOrderVo; public interface ThirdFzOrderService extends IService { + Page scopePageList(Page page, ThirdFzOrderDto dto, DataScope dataScope); + + ThirdFzOrderEntity getByPayNo(String payNo); } \ No newline at end of file diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/appplus/ThirdAppPlusServiceImpl.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/appplus/ThirdAppPlusServiceImpl.java index 22154286d..9d275485b 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/appplus/ThirdAppPlusServiceImpl.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/appplus/ThirdAppPlusServiceImpl.java @@ -17,6 +17,7 @@ import com.bsd.pjcloud.app.api.dto.AppAdminSyncDto; import com.bsd.pjcloud.app.api.dto.AppUserInfo; import com.bsd.pjcloud.app.api.feign.RemoteAppUserService; import com.bsd.pjcloud.common.core.constant.enums.MerchantTypeEnum; +import com.bsd.pjcloud.common.core.constant.enums.YesNoEnum; import com.bsd.pjcloud.thirdparty.config.AppPlusPayConfig; import com.bsd.pjcloud.thirdparty.constant.miniplatform.AppPlusPlatformLoginErrorEnum; import com.bsd.pjcloud.thirdparty.constant.miniplatform.AppPlusPlatformPayType; @@ -158,8 +159,6 @@ public class ThirdAppPlusServiceImpl implements ThirdAppPlusService { if (ObjectUtil.isEmpty(detail)) return null; if (ObjectUtil.notEqual(detail.getUserId(), userId)) return null; - boolean isPaySuccessAfter = manualQueyPayResult(detail); - detail = thirdPayOrderService.getByPayNo(payNo); ThirdPayOrderVo vo = BeanUtil.toBean(detail, ThirdPayOrderVo.class); // 查询商户 @@ -172,62 +171,6 @@ public class ThirdAppPlusServiceImpl implements ThirdAppPlusService { return vo; } - public boolean manualQueyPayResult(ThirdPayOrderEntity payOrder) { - ThirdPayOrderEntity update = new ThirdPayOrderEntity(); - update.setId(payOrder.getId()); - - // 判断是否为支付中,如果是则查询支付 - if (ObjectUtil.equals(payOrder.getStatus(), ThirdPayOrderStatusEnum.PAY_UNPAID.getType()) || ObjectUtil.equals(payOrder.getStatus(), ThirdPayOrderStatusEnum.REFUNDING.getType())) { - // 微信 - if (ObjectUtil.equals(payOrder.getPayPlatformType(), AppPlusPlatformTypeEnum.WECHAT.getType())) { - Transaction query = thirdMiniAppWechatService.query(payOrder.getPayNo(), payOrder.getMchPaySettingJson()); - Transaction.TradeStateEnum tradeState = query.getTradeState(); - // 支付成功 - if (ObjectUtil.equals(tradeState, Transaction.TradeStateEnum.SUCCESS)) { - update.setPayTime(LocalDateTime.now()); - update.setPayRes(JSONUtil.toJsonStr(query)); - update.setStatus(ThirdPayOrderStatusEnum.PAY_SUCCESS.getType()); - // thirdPayOrderService.updateById(update); - return true; - } - // 退款成功 - else if (ObjectUtil.equals(tradeState, Transaction.TradeStateEnum.REFUND)) { - update.setRefundTime(LocalDateTime.now()); - update.setRefundRes(JSONUtil.toJsonStr(query)); - update.setStatus(ThirdPayOrderStatusEnum.PAY_SUCCESS.getType()); - // thirdPayOrderService.updateById(update); - return true; - } - } - // 支付宝 - else if (ObjectUtil.equals(payOrder.getPayPlatformType(), AppPlusPlatformTypeEnum.ALI_PAY.getType())) { - AlipayTradeQueryResponse query = thirdMiniAppAliPayService.query(payOrder.getPayNo(), payOrder.getMchPaySettingJson()); - String tradeStatus = query.getTradeStatus(); - // 支付成功 - if (ObjectUtil.equals("TRADE_SUCCESS", tradeStatus)) { - update.setPayTime(LocalDateTime.now()); - update.setPayRes(JSONUtil.toJsonStr(query)); - update.setStatus(ThirdPayOrderStatusEnum.PAY_SUCCESS.getType()); - thirdPayOrderService.updateById(update); - return true; - } - // 退款成功 - else if (ObjectUtil.equals("TRADE_CLOSED", tradeStatus)) { - update.setRefundTime(LocalDateTime.now()); - update.setRefundRes(JSONUtil.toJsonStr(query)); - update.setStatus(ThirdPayOrderStatusEnum.PAY_SUCCESS.getType()); - thirdPayOrderService.updateById(update); - return true; - } - } else { - return true; - } - } else { - return true; - } - return false; - } - /** * 小程序支付 */ @@ -366,6 +309,9 @@ public class ThirdAppPlusServiceImpl implements ThirdAppPlusService { @Override public String miniPayCallback(Map params, String body, Map headers) { AppPlusPlatformTypeEnum platformType = checkMiniPlatformType(params, body, headers); + + ThirdPayOrderEntity updateObj = new ThirdPayOrderEntity(); + // 微信小程序 if (ObjectUtil.equals(platformType, AppPlusPlatformTypeEnum.WECHAT)) { ThirdPayOrderEntity thirdPayOrder = thirdMiniAppWechatService.payCallback(body, headers); @@ -374,6 +320,11 @@ public class ThirdAppPlusServiceImpl implements ThirdAppPlusService { } // 根据订单bizType来处理 boolean isSuccess = disposePaySuccessAfter(thirdPayOrder); + if (isSuccess) { + updateObj.setId(thirdPayOrder.getId()); + updateObj.setIsBizCallback(YesNoEnum.YES.getCode()); + thirdPayOrderService.updateById(updateObj); + } return isSuccess ? "success" : "fail"; } // 支付宝 @@ -384,6 +335,12 @@ public class ThirdAppPlusServiceImpl implements ThirdAppPlusService { } // 根据订单bizType来处理 boolean isSuccess = disposePaySuccessAfter(thirdPayOrder); + // 更新 + if (isSuccess) { + updateObj.setId(thirdPayOrder.getId()); + updateObj.setIsBizCallback(YesNoEnum.YES.getCode()); + thirdPayOrderService.updateById(updateObj); + } return isSuccess ? ThirdALiPayCallbackVo.aliPaySuccess() : ThirdALiPayCallbackVo.aliPayFail(); } // 不支持的支付类型 @@ -392,6 +349,69 @@ public class ThirdAppPlusServiceImpl implements ThirdAppPlusService { } } + @Override + public void queryPayResult(ThirdPayOrderEntity dto) { + ThirdPayOrderEntity updateObj = new ThirdPayOrderEntity(); + boolean isUpdateOrder = false; + // 微信小程序 + if (ObjectUtil.equals(dto.getPayPlatformType(), AppPlusPlatformTypeEnum.WECHAT)) { + Transaction thirdPayOrder = thirdMiniAppWechatService.query(dto.getPayNo(), dto.getMchPaySettingJson()); + if (ObjectUtil.isEmpty(thirdPayOrder) || ObjectUtil.isEmpty(thirdPayOrder.getTradeState())) { + return; + } + Transaction.TradeStateEnum tradeState = thirdPayOrder.getTradeState(); + if (ObjectUtil.equals(tradeState, Transaction.TradeStateEnum.SUCCESS)) { + if (ObjectUtil.equals(dto.getStatus(), ThirdPayOrderStatusEnum.PAY_UNPAID.getType())) { + // 执行支付成功的代码 + updateObj.setStatus(ThirdPayOrderStatusEnum.PAY_SUCCESS.getType()); + updateObj.setPayTime(LocalDateTime.now()); + isUpdateOrder = true; + } + if (ObjectUtil.notEqual(dto.getIsBizCallback(), YesNoEnum.YES.getCode())) { + dto.setStatus(ThirdPayOrderStatusEnum.PAY_SUCCESS.getType()); + boolean isSuccess = disposePaySuccessAfter(dto); + if (isSuccess) { + isUpdateOrder = true; + updateObj.setIsBizCallback(YesNoEnum.YES.getCode()); + thirdPayOrderService.updateById(updateObj); + } + } + } + } + // 支付宝 + else if (ObjectUtil.equals(dto.getPayPlatformType(), AppPlusPlatformTypeEnum.ALI_PAY)) { + AlipayTradeQueryResponse aliRes = thirdMiniAppAliPayService.query(dto.getPayNo(), dto.getMchPaySettingJson()); + if (ObjectUtil.isEmpty(aliRes) || ObjectUtil.isEmpty(aliRes.getTradeStatus())) { + return; + } + String tradeStatus = aliRes.getTradeStatus(); + if (ObjectUtil.equals(tradeStatus, "TRADE_SUCCESS")) { + if (ObjectUtil.equals(dto.getStatus(), ThirdPayOrderStatusEnum.PAY_UNPAID.getType())) { + // 执行支付成功的代码 + updateObj.setStatus(ThirdPayOrderStatusEnum.PAY_SUCCESS.getType()); + updateObj.setPayTime(LocalDateTime.now()); + isUpdateOrder = true; + } + if (ObjectUtil.notEqual(dto.getIsBizCallback(), YesNoEnum.YES.getCode())) { + dto.setStatus(ThirdPayOrderStatusEnum.PAY_SUCCESS.getType()); + boolean isSuccess = disposePaySuccessAfter(dto); + if (isSuccess) { + isUpdateOrder = true; + updateObj.setIsBizCallback(YesNoEnum.YES.getCode()); + thirdPayOrderService.updateById(updateObj); + } + } + } + } + // 不支持的支付类型 + else { + return; + } + if (isUpdateOrder) { + thirdPayOrderService.updateById(updateObj); + } + } + /** * 小程序退款回调 */ diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/appplus/ThirdAppPlusWechatServiceImpl.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/appplus/ThirdAppPlusWechatServiceImpl.java index 3554637fd..991d5f3f3 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/appplus/ThirdAppPlusWechatServiceImpl.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/appplus/ThirdAppPlusWechatServiceImpl.java @@ -9,6 +9,7 @@ import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.RandomUtil; import cn.hutool.core.util.XmlUtil; import cn.hutool.json.JSONUtil; +import com.bsd.pjcloud.common.core.constant.enums.YesNoEnum; import com.bsd.pjcloud.thirdparty.config.AppPlusPayConfig; import com.bsd.pjcloud.thirdparty.constant.miniplatform.AppPlusPlatformTypeEnum; import com.bsd.pjcloud.thirdparty.constant.pay.ThirdPayOrderStatusEnum; @@ -33,6 +34,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.codec.digest.DigestUtils; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import javax.crypto.Cipher; @@ -42,6 +44,9 @@ import java.math.RoundingMode; import java.nio.charset.StandardCharsets; import java.time.LocalDateTime; import java.util.Map; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; /** * 微信小程序(app版本) @@ -65,6 +70,8 @@ public class ThirdAppPlusWechatServiceImpl implements ThirdAppPlusWechatService private final ProfitsharingService profitsharingService; private final ThirdAppPlusWechatFzLifecycle appPlusWechatFzLifecycle; + private static final ExecutorService executorService = Executors.newFixedThreadPool(10); + /** * APP支付 */ @@ -98,7 +105,7 @@ public class ThirdAppPlusWechatServiceImpl implements ThirdAppPlusWechatService request.setSpMchid(wechatConfig.getMerchantId()); request.setSubMchid(dto.getSubMchid()); request.setDescription(description); - // request.setSettleInfo(settleInfo); + request.setSettleInfo(settleInfo); request.setOutTradeNo(dto.getOutTradeNo()); request.setNotifyUrl(wechatConfig.getBaseCallbackUrl() + wechatConfig.getPayCallbackUrl()); @@ -170,12 +177,11 @@ public class ThirdAppPlusWechatServiceImpl implements ThirdAppPlusWechatService req.setSpMchid(wechatConfig.getMerchantId()); req.setSubMchid(wechatPaySetting.getSubMchid()); req.setOutTradeNo(payNo); - Transaction transaction = appServiceExtension.queryOrderByOutTradeNo(req); + return appServiceExtension.queryOrderByOutTradeNo(req); } catch (Exception e) { log.error("|{}|查询订单,异常", TAG, e); return null; } - return null; } /** @@ -188,15 +194,20 @@ public class ThirdAppPlusWechatServiceImpl implements ThirdAppPlusWechatService } /** - * AP申请退款 + * APP申请退款 */ @Override + @Transactional public ThirdPayOrderEntity refund(ThirdPayOrderEntity thirdPayOrder, ThirdMiniWechatRefundDto dto) { AppPlusPayConfig.WechatConfig wechatConfig = appPlusPayConfig.getWechatConfig(); if (ObjectUtil.isEmpty(thirdPayOrder.getMchPaySettingJson())) { throw new RuntimeException("支付配置不存在"); } + + // 订单退款前的回调 + boolean isFzRefund = appPlusWechatFzLifecycle.beforeOrderRefund(thirdPayOrder); + MchPaySettingEntity wechatPaySettingEntity = JSONUtil.toBean(thirdPayOrder.getMchPaySettingJson(), MchPaySettingEntity.class); MchPaySettingEntity.WechatPaySetting wechatPaySetting = JSONUtil.toBean(wechatPaySettingEntity.getSettingJson(), MchPaySettingEntity.WechatPaySetting.class); @@ -207,6 +218,9 @@ public class ThirdAppPlusWechatServiceImpl implements ThirdAppPlusWechatService if (ObjectUtil.isEmpty(refundFee)) { refundFee = thirdPayOrder.getPrice(); } + if (!isFzRefund) { + refundFee = thirdPayOrder.getPrice() - thirdPayOrder.getFzPrice(); + } String refundNo = "refund_" + thirdPayOrder.getPayNo(); CreateRequest createRequest = new CreateRequest(); @@ -230,12 +244,12 @@ public class ThirdAppPlusWechatServiceImpl implements ThirdAppPlusWechatService try { Refund refund = refundService.create(createRequest); updateObj.setRefundRes(JSONUtil.toJsonStr(refund)); - if (ObjectUtil.isNotEmpty(refund)) { + if (ObjectUtil.isEmpty(refund)) { throw new RuntimeException("微信退款申请错误异常"); } } catch (Exception e) { log.error("|{}|AP申请退款,异常", TAG, e); - return null; + throw new RuntimeException(e.getMessage()); } finally { thirdPayOrderService.updateById(updateObj); } @@ -278,12 +292,24 @@ public class ThirdAppPlusWechatServiceImpl implements ThirdAppPlusWechatService updateObj.setThirdPayNo(transaction.getTransactionId()); updateObj.setId(payOrderEntity.getId()); updateObj.setPayCallbackRes(JSONUtil.toJsonStr(transaction)); + updateObj.setEnableFz(YesNoEnum.YES.getCode()); + updateObj.setIsBizCallback(YesNoEnum.NO.getCode()); updateObj.setStatus(paySucess ? ThirdPayOrderStatusEnum.PAY_SUCCESS.getType() : ThirdPayOrderStatusEnum.PAY_FAILED.getType()); thirdPayOrderService.updateById(updateObj); ThirdPayOrderEntity result = thirdPayOrderService.getById(payOrderEntity.getId()); // 订单支付成功 - appPlusWechatFzLifecycle.orderPaySuccess(result); + CompletableFuture.runAsync(() -> { + try { + Thread.sleep(30000); + appPlusWechatFzLifecycle.orderPaySuccess(result); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + log.error("|{}|延迟调用orderPaySuccess被中断", TAG, e); + } catch (Exception e) { + log.error("|{}|延迟调用orderPaySuccess异常", TAG, e); + } + }, executorService); return result; } diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/appplus/common/AppPlusOrderLifecycle.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/appplus/common/AppPlusOrderLifecycle.java index b41bfdd84..61036af42 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/appplus/common/AppPlusOrderLifecycle.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/appplus/common/AppPlusOrderLifecycle.java @@ -35,7 +35,9 @@ public interface AppPlusOrderLifecycle { * 订单退款前 * @param order 支付订单 */ - default void beforeOrderRefund(ThirdPayOrderEntity order) {} + default boolean beforeOrderRefund(ThirdPayOrderEntity order) { + return false; + } /** * 订单退款后 diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/appplus/fz/ThirdAppPlusWechatFzServiceImpl.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/appplus/fz/ThirdAppPlusWechatFzServiceImpl.java index 286b83b84..8686505aa 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/appplus/fz/ThirdAppPlusWechatFzServiceImpl.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/appplus/fz/ThirdAppPlusWechatFzServiceImpl.java @@ -2,17 +2,19 @@ package com.bsd.pjcloud.thirdparty.service.impl.appplus.fz; import cn.hutool.core.util.ObjectUtil; import cn.hutool.json.JSONUtil; +import com.bsd.pjcloud.common.core.constant.enums.YesNoEnum; import com.bsd.pjcloud.thirdparty.config.AppPlusPayConfig; import com.bsd.pjcloud.thirdparty.constant.fz.ThirdFzOrderStatusEnum; import com.bsd.pjcloud.thirdparty.entity.pay.ThirdFzOrderEntity; import com.bsd.pjcloud.thirdparty.entity.pay.ThirdPayOrderEntity; import com.bsd.pjcloud.thirdparty.mapper.pay.ThirdFzOrderMapper; +import com.bsd.pjcloud.thirdparty.mapper.pay.ThirdPayOrderMapper; import com.bsd.pjcloud.thirdparty.service.ThirdAppPlusWechatFzService; +import com.bsd.pjcloud.thirdparty.service.ThirdFzOrderService; +import com.bsd.pjcloud.thirdparty.service.ThirdPayOrderService; import com.bsd.pjcloud.wallet.api.entity.mch.MchPaySettingEntity; import com.wechat.pay.java.service.profitsharing.ProfitsharingService; -import com.wechat.pay.java.service.profitsharing.model.CreateOrderReceiver; -import com.wechat.pay.java.service.profitsharing.model.CreateOrderRequest; -import com.wechat.pay.java.service.profitsharing.model.OrdersEntity; +import com.wechat.pay.java.service.profitsharing.model.*; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -37,7 +39,10 @@ public class ThirdAppPlusWechatFzServiceImpl implements ThirdAppPlusWechatFzServ private final AppPlusPayConfig appPlusPayConfig; private final ProfitsharingService profitsharingService; + private final ThirdFzOrderService fzOrderService; + private final ThirdPayOrderService thirdPayOrderService; + private final ThirdPayOrderMapper thirdPayOrderMapper; private final ThirdFzOrderMapper thirdFzOrderMapper; /** @@ -54,7 +59,18 @@ public class ThirdAppPlusWechatFzServiceImpl implements ThirdAppPlusWechatFzServ log.info("|{}|订单金额太小,无需分账,订单号:{}", TAG, orderEntity.getPayNo()); return null; } + // 目前理论之能分一次账 + ThirdFzOrderEntity fzOrderDetail = fzOrderService.getByPayNo(orderEntity.getPayNo()); + if (ObjectUtil.isNotEmpty(fzOrderDetail)) { + log.info("|{}|订单已分账,订单号:{}", TAG, orderEntity.getPayNo()); + return null; + } + + String outOrderNo = "fz" + orderEntity.getPayNo(); + ThirdFzOrderEntity fzOrderEntity = new ThirdFzOrderEntity(); + fzOrderEntity.setPayNo(orderEntity.getPayNo()); + fzOrderEntity.setFzNo(outOrderNo); fzOrderEntity.setFzTime(LocalDateTime.now()); fzOrderEntity.setStatus(ThirdFzOrderStatusEnum.FZ_UNPAID.getType()); @@ -63,20 +79,31 @@ public class ThirdAppPlusWechatFzServiceImpl implements ThirdAppPlusWechatFzServ AppPlusPayConfig.WechatConfig wechatConfig = appPlusPayConfig.getWechatConfig(); - String outOrderNo = "fz" + orderEntity.getPayNo(); // 最少分账1分 Long amount = BigDecimal.valueOf(orderEntity.getPrice()) - .multiply(BigDecimal.valueOf(mchPaySetting.getFzRatio())) - .setScale(2, RoundingMode.HALF_UP) - .multiply(BigDecimal.valueOf(100)) + .multiply(BigDecimal.valueOf(mchPaySetting.getFzRatio())).divide(BigDecimal.valueOf(100), 2, RoundingMode.DOWN) .longValue(); // 确保至少1分 if (amount < 1L) { amount = 1L; } + + ThirdPayOrderEntity thirdPayOrder = new ThirdPayOrderEntity(); + Integer fzPrice = 0; + if (ObjectUtil.isNotEmpty(orderEntity.getFzPrice())) { + fzPrice = orderEntity.getFzPrice(); + } + fzPrice += BigDecimal.valueOf(amount).intValue(); + + thirdPayOrder.setId(orderEntity.getId()); + thirdPayOrder.setFzPrice(fzPrice); + thirdPayOrder.setIsFzSuccess(YesNoEnum.YES.getCode()); + thirdPayOrderMapper.updateById(thirdPayOrder); + // 请求参数 CreateOrderRequest createDto = new CreateOrderRequest(); - createDto.setSubAppid(wechatPaySetting.getSubMchid()); + createDto.setAppid(wechatConfig.getAppPlatformAppId()); + createDto.setSubMchid(wechatPaySetting.getSubMchid()); createDto.setTransactionId(orderEntity.getThirdPayNo()); createDto.setOutOrderNo(outOrderNo); CreateOrderReceiver zaxReceiver = new CreateOrderReceiver(); @@ -88,6 +115,7 @@ public class ThirdAppPlusWechatFzServiceImpl implements ThirdAppPlusWechatFzServ createDto.setReceivers(List.of(zaxReceiver)); createDto.setUnfreezeUnsplit(true); try { + fzOrderEntity.setPrice(BigDecimal.valueOf(amount).intValue()); fzOrderEntity.setCreateReq(JSONUtil.toJsonStr(createDto)); OrdersEntity orderRes = profitsharingService.createOrder(createDto); fzOrderEntity.setCreateRes(JSONUtil.toJsonStr(orderRes)); @@ -102,6 +130,153 @@ public class ThirdAppPlusWechatFzServiceImpl implements ThirdAppPlusWechatFzServ } } + /** + * 分账退款 + */ + @Override + public ReturnOrdersEntity refund(ThirdPayOrderEntity orderEntity) { + // 查询有没有进行分账 + ThirdFzOrderEntity fzOrderDetail = fzOrderService.getByPayNo(orderEntity.getPayNo()); + if (ObjectUtil.isEmpty(fzOrderDetail)) { + log.info("|{}|分账退款,该订单未进行分账,订单号:{}", TAG, orderEntity.getPayNo()); + return null; + } + + AppPlusPayConfig.WechatConfig wechatConfig = appPlusPayConfig.getWechatConfig(); + + MchPaySettingEntity mchPaySetting = JSONUtil.toBean(orderEntity.getMchPaySettingJson(), MchPaySettingEntity.class); + MchPaySettingEntity.WechatPaySetting wechatPaySetting = JSONUtil.toBean(mchPaySetting.getSettingJson(), MchPaySettingEntity.WechatPaySetting.class); + + String outOrderNo = "refund_" + fzOrderDetail.getFzNo(); + + ThirdFzOrderEntity updateObj = new ThirdFzOrderEntity(); + updateObj.setId(fzOrderDetail.getId()); + updateObj.setFzRefundTime(LocalDateTime.now()); + updateObj.setStatus(ThirdFzOrderStatusEnum.FZ_REFUNDING.getType()); + updateObj.setFzRefundNo(outOrderNo); + + try { + CreateReturnOrderRequest returnDto = new CreateReturnOrderRequest(); + returnDto.setSubMchid(wechatPaySetting.getSubMchid()); + returnDto.setOutOrderNo(fzOrderDetail.getFzNo()); + returnDto.setOutReturnNo(outOrderNo); + returnDto.setReturnMchid(wechatConfig.getMerchantId()); + returnDto.setAmount((long) fzOrderDetail.getPrice()); + returnDto.setDescription("退回" + getDescription(mchPaySetting, returnDto.getAmount())); + + updateObj.setFzRefundReq(JSONUtil.toJsonStr(returnDto)); + ReturnOrdersEntity returnOrderRes = profitsharingService.createReturnOrder(returnDto); + updateObj.setFzRefundRes(JSONUtil.toJsonStr(returnOrderRes)); + if (ObjectUtil.equals(returnOrderRes.getResult(), ReturnOrderStatus.SUCCESS)) { + updateObj.setStatus(ThirdFzOrderStatusEnum.FZ_REFUND_SUCCESS.getType()); + } else if (ObjectUtil.equals(returnOrderRes.getResult(), ReturnOrderStatus.FAILED)) { + updateObj.setStatus(ThirdFzOrderStatusEnum.FZ_REFUND_SUCCESS.getType()); + } + return returnOrderRes; + } catch (Exception e) { + e.printStackTrace(); + updateObj.setFzRefundError(e.getMessage()); + log.error("|{}|分账退款意外的错误,error:|{}|", TAG, e.getMessage()); + return null; + } finally { + thirdFzOrderMapper.updateById(updateObj); + } + } + + /** + * 查询分账 + */ + @Override + public OrdersEntity getFzOrder(ThirdFzOrderEntity fzOrder) { + // 查询支付订单 + ThirdPayOrderEntity thirdPayOrder = thirdPayOrderService.getByPayNo(fzOrder.getPayNo()); + if (ObjectUtil.isEmpty(thirdPayOrder)) { + throw new RuntimeException("支付订单不存在"); + } + + MchPaySettingEntity mchPaySetting = JSONUtil.toBean(thirdPayOrder.getMchPaySettingJson(), MchPaySettingEntity.class); + MchPaySettingEntity.WechatPaySetting wechatPaySetting = JSONUtil.toBean(mchPaySetting.getSettingJson(), MchPaySettingEntity.WechatPaySetting.class); + + QueryOrderRequest queryDto = new QueryOrderRequest(); + queryDto.setOutOrderNo(fzOrder.getFzNo()); + queryDto.setSubMchid(wechatPaySetting.getSubMchid()); + queryDto.setTransactionId(thirdPayOrder.getThirdPayNo()); + + try { + return profitsharingService.queryOrder(queryDto); + } catch (Exception e) { + log.error("|{}|查询分账意外的错误,fzOrder:{},error:|{}|", TAG, JSONUtil.toJsonStr(fzOrder), e.getMessage()); + return null; + } + } + + /** + * 查询分账退款 + */ + @Override + public ReturnOrdersEntity getFzRefundOrder(ThirdFzOrderEntity fzOrder) { + // 查询支付订单 + ThirdPayOrderEntity thirdPayOrder = thirdPayOrderService.getByPayNo(fzOrder.getPayNo()); + if (ObjectUtil.isEmpty(thirdPayOrder)) { + throw new RuntimeException("支付订单不存在"); + } + + MchPaySettingEntity mchPaySetting = JSONUtil.toBean(thirdPayOrder.getMchPaySettingJson(), MchPaySettingEntity.class); + MchPaySettingEntity.WechatPaySetting wechatPaySetting = JSONUtil.toBean(mchPaySetting.getSettingJson(), MchPaySettingEntity.WechatPaySetting.class); + + QueryReturnOrderRequest queryDto = new QueryReturnOrderRequest(); + queryDto.setOutReturnNo(fzOrder.getFzRefundNo()); + queryDto.setSubMchid(wechatPaySetting.getSubMchid()); + queryDto.setOutOrderNo(fzOrder.getFzNo()); + try { + return profitsharingService.queryReturnOrder(queryDto); + } catch (Exception e) { + log.error("|{}|查询分账退款,fzOrder:{},error:|{}|", TAG, JSONUtil.toJsonStr(fzOrder), e.getMessage()); + return null; + } + } + + /** + * 添加分账方 + */ + @Override + public boolean addReceiver(String targetMchId) { + AppPlusPayConfig.WechatConfig wechatConfig = appPlusPayConfig.getWechatConfig(); + try { + AddReceiverRequest createDto = new AddReceiverRequest(); + createDto.setAppid(wechatConfig.getAppPlatformAppId()); + createDto.setSubMchid(targetMchId); + createDto.setType(ReceiverType.MERCHANT_ID); + createDto.setAccount(wechatConfig.getMerchantId()); + createDto.setName("浙江资安信信息科技有限公司"); + createDto.setRelationType(ReceiverRelationType.SERVICE_PROVIDER); + AddReceiverResponse result = profitsharingService.addReceiver(createDto); + return ObjectUtil.isNotEmpty(result); + } catch (Exception e) { + log.error("|{}|添加分账方targetMchId:{};,异常,error:|{}|", TAG, targetMchId, e.getMessage()); + return false; + } + } + + /** + * 删除分账接收方 + */ + @Override + public boolean deleteReceiver(String targetMchId) { + AppPlusPayConfig.WechatConfig wechatConfig = appPlusPayConfig.getWechatConfig(); + try { + DeleteReceiverRequest deleteDto = new DeleteReceiverRequest(); + deleteDto.setAppid(wechatConfig.getAppPlatformAppId()); + deleteDto.setType(ReceiverType.MERCHANT_ID); + deleteDto.setAccount(wechatConfig.getMerchantId()); + DeleteReceiverResponse result = profitsharingService.deleteReceiver(deleteDto); + return ObjectUtil.isNotEmpty(result); + } catch (Exception e) { + log.error("|{}|删除分账接收方targetMchId:{};,异常,error:|{}|", TAG, targetMchId, e.getMessage()); + return false; + } + } + // 分账描述,最多80个字 private String getDescription(MchPaySettingEntity mchPaySetting, Long amount) { return "商户id:" + mchPaySetting.getMchId() + "分账" + mchPaySetting.getFzRatio() + "%即" + fenToYuan(BigDecimal.valueOf(amount)) + "元,到平台"; diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/appplus/fz/lifecycle/ThirdAppPlusWechatFzLifecycle.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/appplus/fz/lifecycle/ThirdAppPlusWechatFzLifecycle.java index 011fdc950..790b812ab 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/appplus/fz/lifecycle/ThirdAppPlusWechatFzLifecycle.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/appplus/fz/lifecycle/ThirdAppPlusWechatFzLifecycle.java @@ -1,5 +1,6 @@ package com.bsd.pjcloud.thirdparty.service.impl.appplus.fz.lifecycle; +import cn.hutool.core.util.ObjectUtil; import com.bsd.pjcloud.thirdparty.entity.pay.ThirdPayOrderEntity; import com.bsd.pjcloud.thirdparty.service.ThirdAppPlusWechatFzService; import com.bsd.pjcloud.thirdparty.service.impl.appplus.common.AppPlusOrderLifecycle; @@ -49,8 +50,9 @@ public class ThirdAppPlusWechatFzLifecycle implements AppPlusOrderLifecycle { * @param order 支付订单 */ @Override - public void beforeOrderRefund(ThirdPayOrderEntity order) { - AppPlusOrderLifecycle.super.beforeOrderRefund(order); + public boolean beforeOrderRefund(ThirdPayOrderEntity order) { + // 分账退款 + return ObjectUtil.isNotEmpty(appPlusWechatFzService.refund(order)); } /** diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/pay/ThirdFzOrderServiceImpl.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/pay/ThirdFzOrderServiceImpl.java index 1dbd29ebe..86b0d6c64 100755 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/pay/ThirdFzOrderServiceImpl.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/pay/ThirdFzOrderServiceImpl.java @@ -1,15 +1,38 @@ package com.bsd.pjcloud.thirdparty.service.impl.pay; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.bsd.pjcloud.common.data.datascope.DataScope; +import com.bsd.pjcloud.thirdparty.dto.pay.ThirdFzOrderDto; import com.bsd.pjcloud.thirdparty.entity.pay.ThirdFzOrderEntity; import com.bsd.pjcloud.thirdparty.mapper.pay.ThirdFzOrderMapper; import com.bsd.pjcloud.thirdparty.service.ThirdFzOrderService; +import com.bsd.pjcloud.thirdparty.vo.pay.ThirdFzOrderVo; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; /** * 第三方支付分账 */ @Service +@Validated +@Slf4j +@RequiredArgsConstructor public class ThirdFzOrderServiceImpl extends ServiceImpl implements ThirdFzOrderService { + @Override + public Page scopePageList(Page page, ThirdFzOrderDto dto, DataScope dataScope) { + return baseMapper.scopePageList(page, dto, dataScope); + } + + @Override + public ThirdFzOrderEntity getByPayNo(String payNo) { + return baseMapper.selectOne(new LambdaQueryWrapper() + .eq(ThirdFzOrderEntity::getPayNo, payNo) + ); + } + } \ No newline at end of file diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/mapper/ThirdFzOrderMapper.xml b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/mapper/ThirdFzOrderMapper.xml index 10aeed229..7014c626d 100755 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/mapper/ThirdFzOrderMapper.xml +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/mapper/ThirdFzOrderMapper.xml @@ -2,6 +2,57 @@ + + select a.id, + a.price, + a.pay_no, + a.fz_no, + a.create_req, + a.create_res, + a.create_error, + a.status, + a.fz_time, + a.fz_refund_no, + a.fz_refund_time, + a.fz_refund_req, + a.fz_refund_res, + a.fz_refund_error, + a.create_time, + a.update_time, + a.create_by, + a.update_by, + a.del_flag, + a.tenant_id + + + a.del_flag = '0' + + and a.pay_no LIKE concat('%',#{dto.payNo},'%') + + + and a.fz_no LIKE concat('%',#{dto.fzNo},'%') + + + and a.fz_refund_no LIKE concat('%',#{dto.fzRefundNo},'%') + + + and a.status = #{dto.status} + + + and a.fz_time between #{dto.fzTimeList[0]} and #{dto.fzTimeList[1]} + + + and a.fz_refund_time between #{dto.fzRefundTimeList[0]} and #{dto.fzRefundTimeList[1]} + + + \ No newline at end of file diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/mapper/ThirdPayOrderMapper.xml b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/mapper/ThirdPayOrderMapper.xml index ad29c9cd7..18b8417b7 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/mapper/ThirdPayOrderMapper.xml +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/mapper/ThirdPayOrderMapper.xml @@ -3,33 +3,39 @@ - select a.id, - a.pay_platform_type, - a.biz_type, - a.biz_id, - a.user_id, - a.user_code, - a.mch_id, - a.mch_pay_setting_json, - a.price, - a.status, - a.pay_no, - a.pay_time, - a.pay_rep, - a.pay_res, - a.pay_callback_res, - a.refund_no, - a.refund_time, - a.refund_rep, - a.refund_res, - a.refund_callback_res, - a.expire_time, - a.create_time, - a.update_time, - a.create_by, - a.update_by, - a.del_flag, - a.tenant_id + select + a.id, + a.third_pay_no, + a.pay_platform_type, + a.biz_type, + a.biz_id, + a.user_id, + a.user_code, + a.mch_id, + a.mch_pay_setting_json, + a.price, + a.fz_price, + a.status, + a.pay_no, + a.pay_time, + a.pay_rep, + a.pay_res, + a.pay_callback_res, + a.refund_no, + a.refund_time, + a.refund_rep, + a.refund_res, + a.refund_callback_res, + a.expire_time, + a.enable_fz, + a.is_biz_callback, + a.is_fz_success, + a.create_time, + a.update_time, + a.create_by, + a.update_by, + a.del_flag, + a.tenant_id diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/mch/MchPaySettingEntity.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/mch/MchPaySettingEntity.java index 149457c53..b6c96de56 100755 --- a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/mch/MchPaySettingEntity.java +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/mch/MchPaySettingEntity.java @@ -60,7 +60,7 @@ public class MchPaySettingEntity extends Model { * 分账比例(最高100%即分给对方商户的%) */ @Schema(description = "分账比例(最高100%即分给对方商户的%)") - private Integer fzRatio; + private Double fzRatio; /** * 创建人 diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/mch/MchManageServiceImpl.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/mch/MchManageServiceImpl.java index 8f0f5f700..61e351c2b 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/mch/MchManageServiceImpl.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/mch/MchManageServiceImpl.java @@ -263,6 +263,14 @@ public class MchManageServiceImpl extends ServiceImpl paySettingList = paySettingService.pageList(paySettingDto, null); + if (ObjectUtil.isNotEmpty(paySettingList)) { + detail.setPaySettingList(paySettingList); + } } return detail; } diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/mch/MchPaySettingServiceImpl.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/mch/MchPaySettingServiceImpl.java index babfe9ac9..115180292 100755 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/mch/MchPaySettingServiceImpl.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/mch/MchPaySettingServiceImpl.java @@ -11,7 +11,9 @@ import com.bsd.pjcloud.common.core.constant.enums.MerchantTypeEnum; import com.bsd.pjcloud.common.core.constant.enums.YesNoEnum; import com.bsd.pjcloud.common.data.datascope.DataScope; import com.bsd.pjcloud.common.security.service.PjcloudUser; +import com.bsd.pjcloud.thirdparty.api.feign.RemoterThirdAppPlusPayService; import com.bsd.pjcloud.wallet.api.dto.mch.MchPaySettingDto; +import com.bsd.pjcloud.wallet.api.entity.mch.MchManageEntity; import com.bsd.pjcloud.wallet.api.entity.mch.MchPaySettingEntity; import com.bsd.pjcloud.wallet.api.vo.MchManageVo; import com.bsd.pjcloud.wallet.api.vo.mch.MchPaySettingVo; @@ -27,6 +29,7 @@ import org.springframework.validation.annotation.Validated; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.CompletableFuture; /** * 商户管理 @@ -42,6 +45,8 @@ public class MchPaySettingServiceImpl extends ServiceImpl scopePageList(Page page, MchPaySettingDto dto, DataScope dataScope) { return baseMapper.scopePageList(page, dto, dataScope); @@ -67,6 +72,16 @@ public class MchPaySettingServiceImpl extends ServiceImpl { + try { + MchManageVo mchManage = mchManageService.join(dto.getMchId()); + if (ObjectUtil.isNotEmpty(mchManage)) { + thirdAppPlusPayService.remoterChangeMch(mchManage); + } + } catch (Exception e) { + log.error("编辑商户的回调异常:{}", e.getMessage()); + } + }); return dto; } @@ -99,4 +114,5 @@ public class MchPaySettingServiceImpl extends ServiceImpl= 1; } + } \ No newline at end of file From 99c9d0a5b1c078aa8b117406db54371b89218510 Mon Sep 17 00:00:00 2001 From: dzc <2388224167@qq.com> Date: Mon, 25 May 2026 17:37:54 +0800 Subject: [PATCH 2/2] =?UTF-8?q?feat:=E4=BC=98=E5=8C=96=E4=B8=80=E4=B8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../appplus/fz/ThirdAppPlusWechatFzServiceImpl.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/appplus/fz/ThirdAppPlusWechatFzServiceImpl.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/appplus/fz/ThirdAppPlusWechatFzServiceImpl.java index 8686505aa..49be27e2a 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/appplus/fz/ThirdAppPlusWechatFzServiceImpl.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/appplus/fz/ThirdAppPlusWechatFzServiceImpl.java @@ -62,7 +62,13 @@ public class ThirdAppPlusWechatFzServiceImpl implements ThirdAppPlusWechatFzServ // 目前理论之能分一次账 ThirdFzOrderEntity fzOrderDetail = fzOrderService.getByPayNo(orderEntity.getPayNo()); if (ObjectUtil.isNotEmpty(fzOrderDetail)) { - log.info("|{}|订单已分账,订单号:{}", TAG, orderEntity.getPayNo()); + log.info("|{}|订单分账,订单号:{}", TAG, orderEntity.getPayNo()); + return null; + } + MchPaySettingEntity mchPaySetting = JSONUtil.toBean(orderEntity.getMchPaySettingJson(), MchPaySettingEntity.class); + MchPaySettingEntity.WechatPaySetting wechatPaySetting = JSONUtil.toBean(mchPaySetting.getSettingJson(), MchPaySettingEntity.WechatPaySetting.class); + if (mchPaySetting.getFzRatio() <= 0) { + log.info("|{}|订单分账错误,分账比例为0,订单号:{}", TAG, orderEntity.getPayNo()); return null; } @@ -74,9 +80,6 @@ public class ThirdAppPlusWechatFzServiceImpl implements ThirdAppPlusWechatFzServ fzOrderEntity.setFzTime(LocalDateTime.now()); fzOrderEntity.setStatus(ThirdFzOrderStatusEnum.FZ_UNPAID.getType()); - MchPaySettingEntity mchPaySetting = JSONUtil.toBean(orderEntity.getMchPaySettingJson(), MchPaySettingEntity.class); - MchPaySettingEntity.WechatPaySetting wechatPaySetting = JSONUtil.toBean(mchPaySetting.getSettingJson(), MchPaySettingEntity.WechatPaySetting.class); - AppPlusPayConfig.WechatConfig wechatConfig = appPlusPayConfig.getWechatConfig(); // 最少分账1分