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..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
@@ -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,29 +59,54 @@ 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;
+ }
+ 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;
+ }
+
+ 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());
- MchPaySettingEntity mchPaySetting = JSONUtil.toBean(orderEntity.getMchPaySettingJson(), MchPaySettingEntity.class);
- MchPaySettingEntity.WechatPaySetting wechatPaySetting = JSONUtil.toBean(mchPaySetting.getSettingJson(), MchPaySettingEntity.WechatPaySetting.class);
-
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 +118,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 +133,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