mirror of
https://gitee.com/dromara/dax-pay.git
synced 2025-10-15 14:20:26 +00:00
feat(wechat): 实现微信分账 V2 和 V3 接口, 修复微信支付 v2 接口设置分账不生效问题
This commit is contained in:
@@ -2,10 +2,7 @@ package cn.bootx.platform.core.util;
|
|||||||
|
|
||||||
import cn.hutool.core.date.DatePattern;
|
import cn.hutool.core.date.DatePattern;
|
||||||
import cn.hutool.core.lang.TypeReference;
|
import cn.hutool.core.lang.TypeReference;
|
||||||
import cn.hutool.json.JSON;
|
import cn.hutool.json.*;
|
||||||
import cn.hutool.json.JSONConfig;
|
|
||||||
import cn.hutool.json.JSONObject;
|
|
||||||
import cn.hutool.json.JSONUtil;
|
|
||||||
import lombok.experimental.UtilityClass;
|
import lombok.experimental.UtilityClass;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -143,6 +143,7 @@ public class AliPayAllocationService {
|
|||||||
if (Objects.nonNull(detail)) {
|
if (Objects.nonNull(detail)) {
|
||||||
detail.setResult(this.getDetailResultEnum(receiver.getState()).getCode());
|
detail.setResult(this.getDetailResultEnum(receiver.getState()).getCode());
|
||||||
detail.setErrorMsg(receiver.getErrorDesc());
|
detail.setErrorMsg(receiver.getErrorDesc());
|
||||||
|
detail.setOutDetailId(receiver.getDetailId());
|
||||||
// 如果是完成, 更新时间
|
// 如果是完成, 更新时间
|
||||||
if (AllocDetailResultEnum.SUCCESS.getCode().equals(detail.getResult())){
|
if (AllocDetailResultEnum.SUCCESS.getCode().equals(detail.getResult())){
|
||||||
LocalDateTime finishTime = LocalDateTimeUtil.of(receiver.getExecuteDt());
|
LocalDateTime finishTime = LocalDateTimeUtil.of(receiver.getExecuteDt());
|
||||||
|
@@ -0,0 +1,41 @@
|
|||||||
|
package org.dromara.daxpay.channel.wechat.enums;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Getter;
|
||||||
|
import org.dromara.daxpay.core.enums.AllocDetailResultEnum;
|
||||||
|
import org.dromara.daxpay.core.exception.ConfigNotExistException;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author xxm
|
||||||
|
* @since 2024/12/16
|
||||||
|
*/
|
||||||
|
@Getter
|
||||||
|
@AllArgsConstructor
|
||||||
|
public enum WechatAllocStatusEnum {
|
||||||
|
|
||||||
|
//处理中
|
||||||
|
PENDING("PENDING", AllocDetailResultEnum.PENDING),
|
||||||
|
//分账完成
|
||||||
|
SUCCESS("SUCCESS", AllocDetailResultEnum.SUCCESS),
|
||||||
|
//分账完成
|
||||||
|
CLOSED("CLOSED", AllocDetailResultEnum.FAIL),
|
||||||
|
;
|
||||||
|
|
||||||
|
private final String code;
|
||||||
|
|
||||||
|
private final AllocDetailResultEnum result;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据编码获取枚举
|
||||||
|
*/
|
||||||
|
public static WechatAllocStatusEnum findByCode(String code){
|
||||||
|
return Arrays.stream(values())
|
||||||
|
.filter(o -> Objects.equals(o.getCode(), code))
|
||||||
|
.findFirst()
|
||||||
|
.orElseThrow(() -> new ConfigNotExistException("该微信分账状态不存在"));
|
||||||
|
}
|
||||||
|
}
|
@@ -1,14 +1,41 @@
|
|||||||
package org.dromara.daxpay.channel.wechat.service.allocation;
|
package org.dromara.daxpay.channel.wechat.service.allocation;
|
||||||
|
|
||||||
|
import cn.bootx.platform.common.mybatisplus.function.CollectorsFunction;
|
||||||
|
import cn.hutool.json.JSONUtil;
|
||||||
|
import com.github.binarywang.wxpay.bean.profitsharing.request.ProfitSharingQueryRequest;
|
||||||
|
import com.github.binarywang.wxpay.bean.profitsharing.request.ProfitSharingRequest;
|
||||||
|
import com.github.binarywang.wxpay.bean.profitsharing.request.ProfitSharingUnfreezeRequest;
|
||||||
|
import com.github.binarywang.wxpay.bean.profitsharing.request.ProfitSharingV3Request;
|
||||||
|
import com.github.binarywang.wxpay.bean.profitsharing.result.ProfitSharingQueryResult;
|
||||||
|
import com.github.binarywang.wxpay.exception.WxPayException;
|
||||||
|
import com.github.binarywang.wxpay.service.ProfitSharingService;
|
||||||
|
import com.github.binarywang.wxpay.service.WxPayService;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig;
|
import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig;
|
||||||
|
import org.dromara.daxpay.channel.wechat.enums.WechatAllocStatusEnum;
|
||||||
|
import org.dromara.daxpay.channel.wechat.service.config.WechatPayConfigService;
|
||||||
|
import org.dromara.daxpay.channel.wechat.util.WechatPayUtil;
|
||||||
|
import org.dromara.daxpay.core.enums.AllocDetailResultEnum;
|
||||||
|
import org.dromara.daxpay.core.enums.AllocReceiverTypeEnum;
|
||||||
|
import org.dromara.daxpay.core.enums.AllocationStatusEnum;
|
||||||
|
import org.dromara.daxpay.core.exception.ConfigErrorException;
|
||||||
|
import org.dromara.daxpay.core.exception.OperationFailException;
|
||||||
|
import org.dromara.daxpay.core.util.PayUtil;
|
||||||
import org.dromara.daxpay.service.bo.allocation.AllocStartResultBo;
|
import org.dromara.daxpay.service.bo.allocation.AllocStartResultBo;
|
||||||
|
import org.dromara.daxpay.service.bo.allocation.AllocSyncResultBo;
|
||||||
import org.dromara.daxpay.service.entity.allocation.transaction.AllocDetail;
|
import org.dromara.daxpay.service.entity.allocation.transaction.AllocDetail;
|
||||||
import org.dromara.daxpay.service.entity.allocation.transaction.AllocOrder;
|
import org.dromara.daxpay.service.entity.allocation.transaction.AllocOrder;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import java.time.LocalDateTime;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Objects;
|
||||||
|
import java.util.function.Function;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
import static org.dromara.daxpay.core.enums.AllocReceiverTypeEnum.MERCHANT_NO;
|
||||||
|
import static org.dromara.daxpay.core.enums.AllocReceiverTypeEnum.OPEN_ID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 微信分账V2版本接口
|
* 微信分账V2版本接口
|
||||||
@@ -20,24 +47,120 @@ import java.util.List;
|
|||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
public class WeChatPayAllocationV2Service {
|
public class WeChatPayAllocationV2Service {
|
||||||
|
|
||||||
|
private final WechatPayConfigService wechatPayConfigService;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 分账
|
* 分账
|
||||||
*/
|
*/
|
||||||
public AllocStartResultBo start(AllocOrder order, List<AllocDetail> details, WechatPayConfig config) {
|
public AllocStartResultBo start(AllocOrder allocOrder, List<AllocDetail> details, WechatPayConfig config) {
|
||||||
return null;
|
WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(config);
|
||||||
|
ProfitSharingService sharingService = wxPayService.getProfitSharingService();
|
||||||
|
|
||||||
|
ProfitSharingRequest request = new ProfitSharingRequest();
|
||||||
|
request.setAppid(config.getWxAppId());
|
||||||
|
request.setOutOrderNo(allocOrder.getAllocNo());
|
||||||
|
request.setTransactionId(allocOrder.getOutOrderNo());
|
||||||
|
|
||||||
|
// 分账接收方信息
|
||||||
|
var receivers = details.stream()
|
||||||
|
.map(o -> {
|
||||||
|
AllocReceiverTypeEnum receiverTypeEnum = AllocReceiverTypeEnum.findByCode(o.getReceiverType());
|
||||||
|
String receiverType = this.getReceiverType(receiverTypeEnum);
|
||||||
|
var receiver = new ProfitSharingV3Request.Receiver();
|
||||||
|
receiver.setType(receiverType);
|
||||||
|
receiver.setAmount(PayUtil.convertCentAmount(o.getAmount()));
|
||||||
|
receiver.setAccount(o.getReceiverAccount());
|
||||||
|
receiver.setName(o.getReceiverName());
|
||||||
|
receiver.setDescription("订单分账");
|
||||||
|
return receiver;
|
||||||
|
})
|
||||||
|
.toList();
|
||||||
|
|
||||||
|
request.setReceivers(JSONUtil.toJsonStr(receivers));
|
||||||
|
try {
|
||||||
|
var result = sharingService.multiProfitSharing(request);
|
||||||
|
return new AllocStartResultBo().setOutAllocNo(result.getTransactionId());
|
||||||
|
} catch (WxPayException e) {
|
||||||
|
throw new OperationFailException("微信分账V2失败: "+e.getMessage());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 完结
|
* 完结
|
||||||
*/
|
*/
|
||||||
public void finish(AllocOrder order, List<AllocDetail> details, WechatPayConfig config) {
|
public void finish(AllocOrder allocOrder, WechatPayConfig config) {
|
||||||
|
WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(config);
|
||||||
|
ProfitSharingService sharingService = wxPayService.getProfitSharingService();
|
||||||
|
var request = new ProfitSharingUnfreezeRequest();
|
||||||
|
request.setOutOrderNo(String.valueOf(allocOrder.getId()));
|
||||||
|
request.setTransactionId(allocOrder.getOutOrderNo());
|
||||||
|
request.setDescription("分账完结");
|
||||||
|
try {
|
||||||
|
sharingService.profitSharingFinish(request);
|
||||||
|
} catch (WxPayException e) {
|
||||||
|
throw new OperationFailException("微信分账完结V2失败: "+e.getMessage());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 同步
|
* 同步
|
||||||
*/
|
*/
|
||||||
public void sync(AllocOrder order, List<AllocDetail> details, WechatPayConfig config) {
|
public AllocSyncResultBo sync(AllocOrder allocOrder, List<AllocDetail> details, WechatPayConfig config) {
|
||||||
|
WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(config);
|
||||||
|
ProfitSharingService sharingService = wxPayService.getProfitSharingService();
|
||||||
|
ProfitSharingQueryRequest request = new ProfitSharingQueryRequest();
|
||||||
|
// 根据订单状态判断 使用ID还是分账号
|
||||||
|
request.setTransactionId(allocOrder.getOutOrderNo());
|
||||||
|
if (Objects.equals(AllocationStatusEnum.PROCESSING.getCode(), allocOrder.getStatus())){
|
||||||
|
request.setOutOrderNo(allocOrder.getAllocNo());
|
||||||
|
} else {
|
||||||
|
request.setOutOrderNo(String.valueOf(allocOrder.getId()));
|
||||||
|
}
|
||||||
|
|
||||||
|
ProfitSharingQueryResult result;
|
||||||
|
try {
|
||||||
|
result = sharingService.profitSharingQuery(request);
|
||||||
|
} catch (WxPayException e) {
|
||||||
|
throw new OperationFailException("微信分账订单查询V2失败: "+e.getMessage());
|
||||||
|
}
|
||||||
|
var detailMap = details.stream()
|
||||||
|
.collect(Collectors.toMap(AllocDetail::getReceiverAccount, Function.identity(), CollectorsFunction::retainLatest));
|
||||||
|
var royaltyDetailList = result.getReceivers();
|
||||||
|
for (var receiver : royaltyDetailList) {
|
||||||
|
var detail = detailMap.get(receiver.getAccount());
|
||||||
|
if (Objects.nonNull(detail)) {
|
||||||
|
detail.setResult(this.getDetailResultEnum(receiver.getResult()).getCode());
|
||||||
|
detail.setErrorMsg(receiver.getFailReason());
|
||||||
|
detail.setOutDetailId(receiver.getDetailId());
|
||||||
|
// 如果是完成, 更新时间
|
||||||
|
if (AllocDetailResultEnum.SUCCESS.getCode().equals(detail.getResult())){
|
||||||
|
LocalDateTime finishTime = WechatPayUtil.parseV2(receiver.getFinishTime());
|
||||||
|
detail.setFinishTime(finishTime)
|
||||||
|
.setErrorMsg(null)
|
||||||
|
.setErrorCode(null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return new AllocSyncResultBo().setSyncInfo(JSONUtil.toJsonStr(result));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取分账接收方类型编码
|
||||||
|
*/
|
||||||
|
private String getReceiverType(AllocReceiverTypeEnum receiverTypeEnum){
|
||||||
|
if (receiverTypeEnum == OPEN_ID){
|
||||||
|
return "PERSONAL_OPENID";
|
||||||
|
}
|
||||||
|
if (receiverTypeEnum == MERCHANT_NO){
|
||||||
|
return "MERCHANT_ID";
|
||||||
|
}
|
||||||
|
throw new ConfigErrorException("分账接收方类型错误");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 转换支付宝分账类型到系统中统一的状态
|
||||||
|
*/
|
||||||
|
private AllocDetailResultEnum getDetailResultEnum (String result){
|
||||||
|
return WechatAllocStatusEnum.findByCode(result).getResult();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,6 +1,7 @@
|
|||||||
package org.dromara.daxpay.channel.wechat.service.allocation;
|
package org.dromara.daxpay.channel.wechat.service.allocation;
|
||||||
|
|
||||||
import com.github.binarywang.wxpay.bean.profitsharing.request.ProfitSharingQueryV3Request;
|
import cn.bootx.platform.common.mybatisplus.function.CollectorsFunction;
|
||||||
|
import cn.hutool.json.JSONUtil;
|
||||||
import com.github.binarywang.wxpay.bean.profitsharing.request.ProfitSharingUnfreezeV3Request;
|
import com.github.binarywang.wxpay.bean.profitsharing.request.ProfitSharingUnfreezeV3Request;
|
||||||
import com.github.binarywang.wxpay.bean.profitsharing.request.ProfitSharingV3Request;
|
import com.github.binarywang.wxpay.bean.profitsharing.request.ProfitSharingV3Request;
|
||||||
import com.github.binarywang.wxpay.bean.profitsharing.result.ProfitSharingV3Result;
|
import com.github.binarywang.wxpay.bean.profitsharing.result.ProfitSharingV3Result;
|
||||||
@@ -10,17 +11,26 @@ import com.github.binarywang.wxpay.service.WxPayService;
|
|||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig;
|
import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig;
|
||||||
|
import org.dromara.daxpay.channel.wechat.enums.WechatAllocStatusEnum;
|
||||||
import org.dromara.daxpay.channel.wechat.service.config.WechatPayConfigService;
|
import org.dromara.daxpay.channel.wechat.service.config.WechatPayConfigService;
|
||||||
|
import org.dromara.daxpay.channel.wechat.util.WechatPayUtil;
|
||||||
|
import org.dromara.daxpay.core.enums.AllocDetailResultEnum;
|
||||||
import org.dromara.daxpay.core.enums.AllocReceiverTypeEnum;
|
import org.dromara.daxpay.core.enums.AllocReceiverTypeEnum;
|
||||||
|
import org.dromara.daxpay.core.enums.AllocationStatusEnum;
|
||||||
import org.dromara.daxpay.core.exception.ConfigErrorException;
|
import org.dromara.daxpay.core.exception.ConfigErrorException;
|
||||||
import org.dromara.daxpay.core.exception.OperationFailException;
|
import org.dromara.daxpay.core.exception.OperationFailException;
|
||||||
import org.dromara.daxpay.core.util.PayUtil;
|
import org.dromara.daxpay.core.util.PayUtil;
|
||||||
import org.dromara.daxpay.service.bo.allocation.AllocStartResultBo;
|
import org.dromara.daxpay.service.bo.allocation.AllocStartResultBo;
|
||||||
|
import org.dromara.daxpay.service.bo.allocation.AllocSyncResultBo;
|
||||||
import org.dromara.daxpay.service.entity.allocation.transaction.AllocDetail;
|
import org.dromara.daxpay.service.entity.allocation.transaction.AllocDetail;
|
||||||
import org.dromara.daxpay.service.entity.allocation.transaction.AllocOrder;
|
import org.dromara.daxpay.service.entity.allocation.transaction.AllocOrder;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import java.time.LocalDateTime;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Objects;
|
||||||
|
import java.util.function.Function;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
import static org.dromara.daxpay.core.enums.AllocReceiverTypeEnum.MERCHANT_NO;
|
import static org.dromara.daxpay.core.enums.AllocReceiverTypeEnum.MERCHANT_NO;
|
||||||
import static org.dromara.daxpay.core.enums.AllocReceiverTypeEnum.OPEN_ID;
|
import static org.dromara.daxpay.core.enums.AllocReceiverTypeEnum.OPEN_ID;
|
||||||
@@ -37,10 +47,9 @@ public class WeChatPayAllocationV3Service {
|
|||||||
private final WechatPayConfigService wechatPayConfigService;
|
private final WechatPayConfigService wechatPayConfigService;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 发起分账 使用分账号作为请求号4
|
* 发起分账 使用分账号作为请求号
|
||||||
*/
|
*/
|
||||||
public AllocStartResultBo start(AllocOrder allocOrder, List<AllocDetail> orderDetails, WechatPayConfig config){
|
public AllocStartResultBo start(AllocOrder allocOrder, List<AllocDetail> orderDetails, WechatPayConfig config){
|
||||||
|
|
||||||
WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(config);
|
WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(config);
|
||||||
ProfitSharingService sharingService = wxPayService.getProfitSharingService();
|
ProfitSharingService sharingService = wxPayService.getProfitSharingService();
|
||||||
|
|
||||||
@@ -69,7 +78,7 @@ public class WeChatPayAllocationV3Service {
|
|||||||
request.setReceivers(receivers);
|
request.setReceivers(receivers);
|
||||||
try {
|
try {
|
||||||
ProfitSharingV3Result result = sharingService.profitSharingV3(request);
|
ProfitSharingV3Result result = sharingService.profitSharingV3(request);
|
||||||
return new AllocStartResultBo().setOutAllocNo(result.getOrderId());
|
return new AllocStartResultBo().setOutAllocNo(result.getTransactionId());
|
||||||
} catch (WxPayException e) {
|
} catch (WxPayException e) {
|
||||||
throw new OperationFailException("微信分账V3失败: "+e.getMessage());
|
throw new OperationFailException("微信分账V3失败: "+e.getMessage());
|
||||||
}
|
}
|
||||||
@@ -78,7 +87,7 @@ public class WeChatPayAllocationV3Service {
|
|||||||
/**
|
/**
|
||||||
* 分账完结 使用ID作为请求号
|
* 分账完结 使用ID作为请求号
|
||||||
*/
|
*/
|
||||||
public void finish(AllocOrder allocOrder, List<AllocDetail> details, WechatPayConfig config){
|
public void finish(AllocOrder allocOrder, WechatPayConfig config){
|
||||||
WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(config);
|
WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(config);
|
||||||
ProfitSharingService sharingService = wxPayService.getProfitSharingService();
|
ProfitSharingService sharingService = wxPayService.getProfitSharingService();
|
||||||
var request = new ProfitSharingUnfreezeV3Request();
|
var request = new ProfitSharingUnfreezeV3Request();
|
||||||
@@ -86,28 +95,51 @@ public class WeChatPayAllocationV3Service {
|
|||||||
request.setTransactionId(allocOrder.getOutOrderNo());
|
request.setTransactionId(allocOrder.getOutOrderNo());
|
||||||
request.setDescription("分账完结");
|
request.setDescription("分账完结");
|
||||||
try {
|
try {
|
||||||
var result = sharingService.profitSharingUnfreeze(request);
|
sharingService.profitSharingUnfreeze(request);
|
||||||
} catch (WxPayException e) {
|
} catch (WxPayException e) {
|
||||||
throw new OperationFailException("微信分账V3失败: "+e.getMessage());
|
throw new OperationFailException("微信分账完结V3失败: "+e.getMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 同步
|
* 同步
|
||||||
*/
|
*/
|
||||||
public void sync(AllocOrder allocOrder, List<AllocDetail> details, WechatPayConfig config){
|
public AllocSyncResultBo sync(AllocOrder allocOrder, List<AllocDetail> details, WechatPayConfig config){
|
||||||
WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(config);
|
WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(config);
|
||||||
ProfitSharingService sharingService = wxPayService.getProfitSharingService();
|
ProfitSharingService sharingService = wxPayService.getProfitSharingService();
|
||||||
ProfitSharingQueryV3Request request = new ProfitSharingQueryV3Request();
|
// 根据订单状态判断 使用ID还是分账号
|
||||||
request.setOutOrderNo(allocOrder.getAllocNo());
|
String outOrderNo;
|
||||||
// 根据订单状态判断
|
if (Objects.equals(AllocationStatusEnum.PROCESSING.getCode(), allocOrder.getStatus())){
|
||||||
|
outOrderNo = allocOrder.getAllocNo();
|
||||||
|
} else {
|
||||||
|
outOrderNo = String.valueOf(allocOrder.getId());
|
||||||
|
}
|
||||||
|
|
||||||
request.setTransactionId(allocOrder.getOutOrderNo());
|
ProfitSharingV3Result result;
|
||||||
try {
|
try {
|
||||||
var result = sharingService.profitSharingQueryV3(request);
|
result = sharingService.profitSharingQueryV3(outOrderNo,allocOrder.getOutOrderNo());
|
||||||
} catch (WxPayException e) {
|
} catch (WxPayException e) {
|
||||||
throw new OperationFailException("微信分账订单查询V3失败: "+e.getMessage());
|
throw new OperationFailException("微信分账订单查询V3失败: "+e.getMessage());
|
||||||
}
|
}
|
||||||
|
var detailMap = details.stream()
|
||||||
|
.collect(Collectors.toMap(AllocDetail::getReceiverAccount, Function.identity(), CollectorsFunction::retainLatest));
|
||||||
|
var royaltyDetailList = result.getReceivers();
|
||||||
|
for (var receiver : royaltyDetailList) {
|
||||||
|
var detail = detailMap.get(receiver.getAccount());
|
||||||
|
if (Objects.nonNull(detail)) {
|
||||||
|
detail.setResult(this.getDetailResultEnum(receiver.getResult()).getCode());
|
||||||
|
detail.setErrorMsg(receiver.getFailReason());
|
||||||
|
detail.setOutDetailId(receiver.getDetailId());
|
||||||
|
// 如果是完成, 更新时间
|
||||||
|
if (AllocDetailResultEnum.SUCCESS.getCode().equals(detail.getResult())){
|
||||||
|
LocalDateTime finishTime = WechatPayUtil.parseV3(receiver.getFinishTime());
|
||||||
|
detail.setFinishTime(finishTime)
|
||||||
|
.setErrorMsg(null)
|
||||||
|
.setErrorCode(null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return new AllocSyncResultBo().setSyncInfo(JSONUtil.toJsonStr(result));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -123,4 +155,12 @@ public class WeChatPayAllocationV3Service {
|
|||||||
throw new ConfigErrorException("分账接收方类型错误");
|
throw new ConfigErrorException("分账接收方类型错误");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 转换支付宝分账类型到系统中统一的状态
|
||||||
|
*/
|
||||||
|
private AllocDetailResultEnum getDetailResultEnum (String result){
|
||||||
|
return WechatAllocStatusEnum.findByCode(result).getResult();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -165,7 +165,7 @@ public class WechatPayV2Service {
|
|||||||
request.setSpbillCreateIp(payOrder.getClientIp());
|
request.setSpbillCreateIp(payOrder.getClientIp());
|
||||||
request.setDetail(payOrder.getDescription());
|
request.setDetail(payOrder.getDescription());
|
||||||
request.setBody(payOrder.getTitle());
|
request.setBody(payOrder.getTitle());
|
||||||
request.setProfitSharing(payOrder.getAutoAllocation()?"Y":"N");
|
request.setProfitSharing(payOrder.getAllocation()?"Y":"N");
|
||||||
try {
|
try {
|
||||||
WxPayMicropayResult result = wxPayService.micropay(request);
|
WxPayMicropayResult result = wxPayService.micropay(request);
|
||||||
// 支付成功处理, 如果不成功会走异常流
|
// 支付成功处理, 如果不成功会走异常流
|
||||||
@@ -232,6 +232,7 @@ public class WechatPayV2Service {
|
|||||||
request.setTotalFee(PayUtil.convertCentAmount(payOrder.getAmount()));
|
request.setTotalFee(PayUtil.convertCentAmount(payOrder.getAmount()));
|
||||||
request.setNotifyUrl(wechatPayConfigService.getPayNotifyUrl());
|
request.setNotifyUrl(wechatPayConfigService.getPayNotifyUrl());
|
||||||
request.setSpbillCreateIp(payOrder.getClientIp());
|
request.setSpbillCreateIp(payOrder.getClientIp());
|
||||||
|
request.setProfitSharing(payOrder.getAllocation()?"Y":"N");
|
||||||
return request;
|
return request;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -65,9 +65,9 @@ public class WechatAllocationStrategy extends AbsAllocationStrategy {
|
|||||||
@Override
|
@Override
|
||||||
public void finish() {
|
public void finish() {
|
||||||
if (Objects.equals(config.getApiVersion(), WechatPayCode.API_V3)){
|
if (Objects.equals(config.getApiVersion(), WechatPayCode.API_V3)){
|
||||||
weChatPayAllocationV3Service.finish(getOrder(), this.getDetails(), this.config);
|
weChatPayAllocationV3Service.finish(getOrder(), this.config);
|
||||||
} else {
|
} else {
|
||||||
weChatPayAllocationV2Service.finish(getOrder(), this.getDetails(), this.config);
|
weChatPayAllocationV2Service.finish(getOrder(), this.config);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -77,13 +77,10 @@ public class WechatAllocationStrategy extends AbsAllocationStrategy {
|
|||||||
@Override
|
@Override
|
||||||
public AllocSyncResultBo doSync() {
|
public AllocSyncResultBo doSync() {
|
||||||
if (Objects.equals(config.getApiVersion(), WechatPayCode.API_V3)){
|
if (Objects.equals(config.getApiVersion(), WechatPayCode.API_V3)){
|
||||||
weChatPayAllocationV3Service.finish(getOrder(), this.getDetails(), this.config);
|
return weChatPayAllocationV3Service.sync(getOrder(), this.getDetails(), this.config);
|
||||||
|
|
||||||
weChatPayAllocationV3Service.sync(getOrder(), this.getDetails(), this.config);
|
|
||||||
} else {
|
} else {
|
||||||
weChatPayAllocationV2Service.sync(getOrder(), this.getDetails(), this.config);
|
return weChatPayAllocationV2Service.sync(getOrder(), this.getDetails(), this.config);
|
||||||
}
|
}
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -119,14 +119,14 @@ public class WechatPayUtil {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* v3接口时间序列画
|
* v2接口时间序列化
|
||||||
*/
|
*/
|
||||||
public LocalDateTime parseV2(String date) {
|
public LocalDateTime parseV2(String date) {
|
||||||
return LocalDateTimeUtil.parse(date, DatePattern.PURE_DATETIME_PATTERN);
|
return LocalDateTimeUtil.parse(date, DatePattern.PURE_DATETIME_PATTERN);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* v3接口时间序列画
|
* v3接口时间序列化
|
||||||
*/
|
*/
|
||||||
public LocalDateTime parseV3(String dateStr) {
|
public LocalDateTime parseV3(String dateStr) {
|
||||||
return LocalDateTimeUtil.parse(dateStr, "yyyy-MM-dd'T'HH:mm:ss+08:00");
|
return LocalDateTimeUtil.parse(dateStr, "yyyy-MM-dd'T'HH:mm:ss+08:00");
|
||||||
|
@@ -28,6 +28,9 @@ public class AllocDetail extends MchAppBaseEntity implements ToResult<AllocDetai
|
|||||||
/** 分账订单ID */
|
/** 分账订单ID */
|
||||||
private Long allocationId;
|
private Long allocationId;
|
||||||
|
|
||||||
|
/** 外部明细ID */
|
||||||
|
private String outDetailId;
|
||||||
|
|
||||||
/** 接收者ID */
|
/** 接收者ID */
|
||||||
private Long receiverId;
|
private Long receiverId;
|
||||||
|
|
||||||
|
@@ -32,6 +32,10 @@ public class AllocDetailVo extends MchAppResult implements TransPojo {
|
|||||||
@Schema(description = "分账订单ID")
|
@Schema(description = "分账订单ID")
|
||||||
private Long allocationId;
|
private Long allocationId;
|
||||||
|
|
||||||
|
/** 外部明细ID */
|
||||||
|
@Schema(description = "外部明细ID")
|
||||||
|
private String outDetailId;
|
||||||
|
|
||||||
@Schema(description = "分账接收方编号")
|
@Schema(description = "分账接收方编号")
|
||||||
private String receiverNo;
|
private String receiverNo;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user