feat 云闪付对接

This commit is contained in:
xxm1995
2024-03-08 18:27:27 +08:00
parent 0d49b9dadd
commit aee7c18ebb
26 changed files with 695 additions and 284 deletions

View File

@@ -4,6 +4,8 @@ import cn.bootx.platform.common.core.annotation.IgnoreAuth;
import cn.bootx.platform.daxpay.service.core.channel.alipay.service.AliPayCallbackService;
import cn.bootx.platform.daxpay.service.core.channel.union.service.UnionPayCallbackService;
import cn.bootx.platform.daxpay.service.core.channel.wechat.service.WeChatPayCallbackService;
import cn.bootx.platform.daxpay.service.sdk.union.api.UnionPayKit;
import com.egzosn.pay.union.api.UnionPayConfigStorage;
import com.ijpay.alipay.AliPayApi;
import com.ijpay.core.kit.HttpKit;
import com.ijpay.core.kit.WxPayKit;
@@ -55,12 +57,14 @@ public class PayCallbackController {
return weChatPayCallbackService.callback(params);
}
@SuppressWarnings({"unchecked", "rawtypes"})
@SneakyThrows
@Operation(summary = "云闪付支付信息回调")
@PostMapping("/union")
public String unionPayNotify(HttpServletRequest request) {
String xmlMsg = HttpKit.readData(request);
Map<String, String> params = WxPayKit.xmlToMap(xmlMsg);
return unionPayCallbackService.callback(params);
UnionPayKit unionPayKit = new UnionPayKit(new UnionPayConfigStorage());
// 实际返回的是 Map<String, String> 格式数据
Map parameter2Map = unionPayKit.getParameter2Map(request.getParameterMap(), request.getInputStream());
return unionPayCallbackService.callback(parameter2Map);
}
}

View File

@@ -100,11 +100,11 @@
<version>${wxjava.version}</version>
</dependency>
<!-- 云闪付 -->
<!-- 云闪付 pay-java-parent -->
<dependency>
<groupId>com.github.javen205</groupId>
<artifactId>IJPay-UnionPay</artifactId>
<version>${IJPay.version}</version>
<groupId>com.egzosn</groupId>
<artifactId>pay-java-union</artifactId>
<version>${egzosn-java.version}</version>
</dependency>
<!-- 微信工具包 -->

View File

@@ -64,4 +64,7 @@ public interface UnionPayCode {
String ERR_MSG = "err_msg";
/** 对账单下载类型编码 */
String RECONCILE_BILL_TYPE = "00";
}

View File

@@ -0,0 +1,20 @@
package cn.bootx.platform.daxpay.service.code;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* 云闪付签名类型
* @author xxm
* @since 2024/3/8
*/
@Getter
@AllArgsConstructor
public enum UnionPaySignTypeEnum {
RSA2("RSA2","RSA2");
private final String code;
private final String name;
}

View File

@@ -31,4 +31,12 @@ public class DaxPaySequenceConfiguration {
public Sequence wechatReconcileSequence(SeqRangeManager seqRangeManager) {
return SequenceUtil.create(1,1,1,"WechatReconcileSequence");
}
/**
* 云闪付对账单序列生成器
*/
@Bean
public Sequence unionPayReconcileSequence(SeqRangeManager seqRangeManager) {
return SequenceUtil.create(1,1,1,"UnionPayReconcileSequence");
}
}

View File

@@ -5,10 +5,8 @@ import cn.bootx.platform.daxpay.code.ReconcileTradeEnum;
import cn.bootx.platform.daxpay.exception.pay.PayFailureException;
import cn.bootx.platform.daxpay.service.code.AliPayCode;
import cn.bootx.platform.daxpay.service.common.local.PaymentContextLocal;
import cn.bootx.platform.daxpay.service.core.channel.alipay.dao.AliPayRecordManager;
import cn.bootx.platform.daxpay.service.core.channel.alipay.dao.AliReconcileBillDetailManager;
import cn.bootx.platform.daxpay.service.core.channel.alipay.dao.AliReconcileBillTotalManager;
import cn.bootx.platform.daxpay.service.core.channel.alipay.entity.AliPayConfig;
import cn.bootx.platform.daxpay.service.core.channel.alipay.entity.AliReconcileBillDetail;
import cn.bootx.platform.daxpay.service.core.channel.alipay.entity.AliReconcileBillTotal;
import cn.bootx.platform.daxpay.service.core.order.reconcile.entity.ReconcileDetail;
@@ -48,14 +46,11 @@ import java.util.stream.Collectors;
@Service
@RequiredArgsConstructor
public class AliPayReconcileService {
private final AliPayConfigService configService;
private final AliReconcileBillDetailManager reconcileBillDetailManager;
private final AliReconcileBillTotalManager reconcileBillTotalManager;
private final AliPayRecordManager recordManager;
/**
* 下载对账单, 并进行解析进行保存
*
@@ -65,8 +60,6 @@ public class AliPayReconcileService {
@SneakyThrows
@Transactional(rollbackFor = Exception.class)
public void downAndSave(String date, Long recordOrderId){
AliPayConfig config = configService.getConfig();
configService.initConfig(config);
try {
AlipayDataDataserviceBillDownloadurlQueryModel model = new AlipayDataDataserviceBillDownloadurlQueryModel();

View File

@@ -2,6 +2,7 @@ package cn.bootx.platform.daxpay.service.core.channel.union.convert;
import cn.bootx.platform.daxpay.service.core.channel.union.entity.UnionPayConfig;
import cn.bootx.platform.daxpay.service.core.channel.union.entity.UnionPayRecord;
import cn.bootx.platform.daxpay.service.core.payment.reconcile.domain.GeneralReconcileRecord;
import cn.bootx.platform.daxpay.service.dto.channel.union.UnionPayConfigDto;
import cn.bootx.platform.daxpay.service.dto.channel.union.UnionPayRecordDto;
import org.mapstruct.Mapper;
@@ -20,4 +21,6 @@ public interface UnionPayConvert {
UnionPayRecordDto convert(UnionPayRecord in);
GeneralReconcileRecord convertReconcileRecord(UnionPayRecord in);
}

View File

@@ -1,8 +1,11 @@
package cn.bootx.platform.daxpay.service.core.channel.union.entity;
import cn.bootx.platform.common.core.annotation.BigField;
import cn.bootx.platform.common.core.annotation.EncryptionField;
import cn.bootx.platform.common.core.function.EntityBaseFunction;
import cn.bootx.platform.common.mybatisplus.base.MpBaseEntity;
import cn.bootx.platform.common.mybatisplus.handler.StringListTypeHandler;
import cn.bootx.platform.daxpay.service.code.UnionPaySignTypeEnum;
import cn.bootx.platform.daxpay.service.core.channel.union.convert.UnionPayConvert;
import cn.bootx.platform.daxpay.service.dto.channel.union.UnionPayConfigDto;
import cn.bootx.table.modify.annotation.DbColumn;
@@ -38,9 +41,61 @@ public class UnionPayConfig extends MpBaseEntity implements EntityBaseFunction<U
@DbColumn(comment = "是否启用")
private Boolean enable;
/** 密钥 */
@DbColumn(comment = "密钥")
private String appKey;
/**
* 商户收款账号
*/
@DbColumn(comment = "商户收款账号")
private String seller;
/**
* 签名类型
* @see UnionPaySignTypeEnum
*/
@DbColumn(comment = "签名类型")
public String signType;
/**
* 是否为证书签名
*/
@DbColumn(comment = "是否为证书签名")
private boolean certSign;
/**
* 应用私钥证书 字符串
*/
@DbColumn(comment = "应用私钥证书")
@BigField
@EncryptionField
@DbMySqlFieldType(MySqlFieldTypeEnum.LONGTEXT)
private String keyPrivateCert;
/**
* 私钥证书对应的密码
*/
@DbColumn(comment = "私钥证书对应的密码")
@EncryptionField
private String keyPrivateCertPwd;
/**
* 中级证书
*/
@DbColumn(comment = "中级证书")
@BigField
@EncryptionField
@DbMySqlFieldType(MySqlFieldTypeEnum.LONGTEXT)
private String acpMiddleCert;
/**
* 根证书
*/
@DbColumn(comment = "根证书")
@BigField
@EncryptionField
@DbMySqlFieldType(MySqlFieldTypeEnum.LONGTEXT)
private String acpRootCert;
/** 是否沙箱环境 */
@DbColumn(comment = "是否沙箱环境")
private boolean sandbox;
/** 支付网关地址 */
@DbColumn(comment = "支付网关地址")
@@ -55,6 +110,15 @@ public class UnionPayConfig extends MpBaseEntity implements EntityBaseFunction<U
@DbColumn(comment = "异步通知路径")
private String notifyUrl;
/**
* 服务器同步通知页面路径, 需要填写本网关服务的地址, 不可以直接填写业务系统的地址
* 1. 需http://或者https://格式的完整路径,
* 2. 不能加?id=123这类自定义参数必须外网可以正常访问
* 3. 消息顺序 银联网关 -> 本网关进行处理 -> 重定向到业务系统中
*/
@DbColumn(comment = "同步通知页面路径")
private String returnUrl;
/** 可用支付方式 */
@DbColumn(comment = "可用支付方式")
@DbMySqlFieldType(MySqlFieldTypeEnum.LONGTEXT)

View File

@@ -8,10 +8,11 @@ import cn.bootx.platform.daxpay.service.common.context.CallbackLocal;
import cn.bootx.platform.daxpay.service.common.local.PaymentContextLocal;
import cn.bootx.platform.daxpay.service.core.channel.union.entity.UnionPayConfig;
import cn.bootx.platform.daxpay.service.func.AbsCallbackStrategy;
import cn.bootx.platform.daxpay.service.sdk.union.api.UnionPayKit;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.ijpay.core.enums.SignType;
import com.egzosn.pay.common.bean.NoticeParams;
import com.ijpay.core.kit.WxPayKit;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@@ -19,6 +20,7 @@ import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.Collections;
import java.util.Map;
import java.util.Objects;
@@ -57,13 +59,15 @@ public class UnionPayCallbackService extends AbsCallbackStrategy {
// 支付回调信息校验
UnionPayConfig config = unionPayConfigService.getConfig();
UnionPayKit unionPayKit = unionPayConfigService.initPayService(config);
if (Objects.isNull(config)) {
log.warn("云闪付支付配置不存在");
return false;
}
// 注意此处签名方式需与统一下单的签名类型一致
return WxPayKit.verifyNotify(params, config.getAppKey(), SignType.MD5);
NoticeParams noticeParams = new NoticeParams();
noticeParams.setBody(Collections.unmodifiableMap(params));
return unionPayKit.verify(noticeParams);
}
/**

View File

@@ -2,14 +2,10 @@ package cn.bootx.platform.daxpay.service.core.channel.union.service;
import cn.bootx.platform.daxpay.exception.pay.PayFailureException;
import cn.bootx.platform.daxpay.service.code.UnionPayCode;
import cn.bootx.platform.daxpay.service.core.channel.union.entity.UnionPayConfig;
import cn.bootx.platform.daxpay.service.core.order.pay.entity.PayOrder;
import cn.bootx.platform.daxpay.service.sdk.union.api.UnionPayKit;
import cn.hutool.core.util.StrUtil;
import com.ijpay.core.enums.SignType;
import com.ijpay.core.kit.WxPayKit;
import com.ijpay.unionpay.enums.ServiceEnum;
import com.ijpay.unionpay.model.CloseOrderModel;
import com.ijpay.wxpay.WxPayApi;
import com.egzosn.pay.common.bean.AssistOrder;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@@ -32,17 +28,14 @@ public class UnionPayCloseService {
/**
* 关闭订单
*/
public void close(PayOrder payOrder, UnionPayConfig unionPayConfig) {
Map<String, String> params = CloseOrderModel.builder()
.service(ServiceEnum.CLOSE.toString())
.mch_id(unionPayConfig.getMachId())
.out_trade_no(String.valueOf(payOrder.getId()))
.nonce_str(WxPayKit.generateStr())
.build()
.createSign(unionPayConfig.getAppKey(), SignType.HMACSHA256);
String xmlResult = WxPayApi.closeOrder(params);
Map<String, String> result = WxPayKit.xmlToMap(xmlResult);
this.verifyErrorMsg(result);
public void close(PayOrder payOrder, UnionPayKit unionPayKit) {
AssistOrder closeOrder = new AssistOrder();
closeOrder.setOutTradeNo(String.valueOf(payOrder.getId()));
Map<String, Object> result = unionPayKit.close(closeOrder);
// this.verifyErrorMsg(result);
}
/**

View File

@@ -9,8 +9,12 @@ import cn.bootx.platform.daxpay.service.core.channel.union.dao.UnionPayConfigMan
import cn.bootx.platform.daxpay.service.core.channel.union.entity.UnionPayConfig;
import cn.bootx.platform.daxpay.service.core.system.config.service.PayChannelConfigService;
import cn.bootx.platform.daxpay.service.param.channel.alipay.AliPayConfigParam;
import cn.bootx.platform.daxpay.service.sdk.union.api.UnionPayKit;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.bean.copier.CopyOptions;
import com.egzosn.pay.common.bean.CertStoreType;
import com.egzosn.pay.common.http.HttpConfigStorage;
import com.egzosn.pay.union.api.UnionPayConfigStorage;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@@ -77,4 +81,45 @@ public class UnionPayConfigService {
return unionPayConfig;
}
/**
* 生成云闪付支付服务
*/
public UnionPayKit initPayService(UnionPayConfig config){
UnionPayConfigStorage unionPayConfigStorage = new UnionPayConfigStorage();
unionPayConfigStorage.setMerId(config.getMachId());
//是否为证书签名
unionPayConfigStorage.setCertSign(config.isCertSign());
//中级证书 证书字符串信息
unionPayConfigStorage.setAcpMiddleCert(config.getAcpMiddleCert());
//根证书路径 证书字符串信息
unionPayConfigStorage.setAcpRootCert(config.getAcpRootCert());
// 私钥证书路径 证书字符串信息
unionPayConfigStorage.setKeyPrivateCert(config.getKeyPrivateCert());
//私钥证书对应的密码 私钥证书对应的密码
unionPayConfigStorage.setKeyPrivateCertPwd(config.getKeyPrivateCertPwd());
//设置证书对应的存储方式,证书字符串信息
unionPayConfigStorage.setCertStoreType(CertStoreType.STR);
// 回调地址
unionPayConfigStorage.setNotifyUrl(config.getNotifyUrl());
// 同步回调可不填
unionPayConfigStorage.setReturnUrl(config.getReturnUrl());
unionPayConfigStorage.setSignType(config.signType);
//是否为测试账号,沙箱环境
unionPayConfigStorage.setTest(config.isSandbox());
// 网络请求配置
HttpConfigStorage httpConfigStorage = new HttpConfigStorage();
httpConfigStorage.setCertStoreType(CertStoreType.STR);
//最大连接数
httpConfigStorage.setMaxTotal(20);
//默认的每个路由的最大连接数
httpConfigStorage.setDefaultMaxPerRoute(10);
// 创建支付服务
return new UnionPayKit(unionPayConfigStorage, httpConfigStorage);
}
}

View File

@@ -1,9 +1,15 @@
package cn.bootx.platform.daxpay.service.core.channel.union.service;
import cn.bootx.platform.daxpay.service.sdk.union.api.UnionPayKit;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.Map;
import static cn.bootx.platform.daxpay.service.code.UnionPayCode.RECONCILE_BILL_TYPE;
/**
* 云闪付对账
* @author xxm
@@ -14,4 +20,11 @@ import org.springframework.stereotype.Service;
@RequiredArgsConstructor
public class UnionPayReconcileService {
/**
* 下载对账单
*/
public void downAndSave(Date date, Long recordOrderId, UnionPayKit unionPayKit){
// 下载对账单
Map<String, Object> stringObjectMap = unionPayKit.downloadBill(date, RECONCILE_BILL_TYPE);
}
}

View File

@@ -1,23 +1,20 @@
package cn.bootx.platform.daxpay.service.core.channel.union.service;
import cn.bootx.platform.daxpay.code.RefundStatusEnum;
import cn.bootx.platform.daxpay.exception.pay.PayFailureException;
import cn.bootx.platform.daxpay.service.code.UnionPayCode;
import cn.bootx.platform.daxpay.service.common.context.RefundLocal;
import cn.bootx.platform.daxpay.service.common.local.PaymentContextLocal;
import cn.bootx.platform.daxpay.service.core.channel.union.entity.UnionPayConfig;
import cn.bootx.platform.daxpay.service.core.order.pay.entity.PayChannelOrder;
import cn.bootx.platform.daxpay.service.core.order.refund.entity.RefundOrder;
import cn.bootx.platform.daxpay.service.sdk.union.api.UnionPayKit;
import cn.bootx.platform.daxpay.service.sdk.union.bean.UnionRefundOrder;
import cn.hutool.core.util.StrUtil;
import com.ijpay.core.enums.SignType;
import com.ijpay.core.kit.WxPayKit;
import com.ijpay.unionpay.UnionPayApi;
import com.ijpay.unionpay.enums.ServiceEnum;
import com.ijpay.unionpay.model.RefundModel;
import com.egzosn.pay.union.bean.UnionRefundResult;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
@@ -34,30 +31,29 @@ import static cn.bootx.platform.daxpay.service.code.UnionPayCode.*;
@RequiredArgsConstructor
public class UnionPayRefundService {
/**
* 退款方法
*/
public void refund(RefundOrder refundOrder, int amount, PayChannelOrder channelOrder, UnionPayConfig unionPayConfig) {
Map<String, String> params = RefundModel.builder()
.service(ServiceEnum.REFUND.toString())
.mch_id(unionPayConfig.getMachId())
.out_trade_no(String.valueOf(refundOrder.getPaymentId()))
.out_refund_no(String.valueOf(refundOrder.getId()))
.total_fee(String.valueOf(channelOrder.getAmount()))
.refund_fee(String.valueOf(amount))
.op_user_id(unionPayConfig.getMachId())
.nonce_str(WxPayKit.generateStr())
.build()
.createSign(unionPayConfig.getAppKey(), SignType.MD5);
public void refund(RefundOrder refundOrder, int amount, PayChannelOrder channelOrder, UnionPayKit unionPayKit) {
String xmlResult = UnionPayApi.execution(unionPayConfig.getServerUrl(), params);
Map<String, String> result = WxPayKit.xmlToMap(xmlResult);
this.verifyErrorMsg(result);
// 云闪付退款是否成功需要查询状态, 所以设置为退款中状态
RefundLocal refundInfo = PaymentContextLocal.get().getRefundInfo();
refundInfo.setStatus(RefundStatusEnum.PROGRESS)
.setGatewayOrderNo(result.get(REFUND_ID));
// 金额转换
BigDecimal refundAmount = BigDecimal.valueOf(amount * 0.01);
BigDecimal orderAmount = BigDecimal.valueOf(channelOrder.getAmount() * 0.01);
UnionRefundOrder unionRefundOrder = new UnionRefundOrder();
unionRefundOrder.setOutTradeNo(String.valueOf(refundOrder.getPaymentId()));
unionRefundOrder.setRefundNo(String.valueOf(refundOrder.getId()));
unionRefundOrder.setRefundAmount(refundAmount);
unionRefundOrder.setTotalAmount(orderAmount);
UnionRefundResult refund = unionPayKit.refund(unionRefundOrder);
// String xmlResult = UnionPayApi.execution(unionPayConfig.getServerUrl(), params);
// Map<String, String> result = WxPayKit.xmlToMap(xmlResult);
// this.verifyErrorMsg(result);
// // 云闪付退款是否成功需要查询状态, 所以设置为退款中状态
// RefundLocal refundInfo = PaymentContextLocal.get().getRefundInfo();
// refundInfo.setStatus(RefundStatusEnum.PROGRESS)
// .setGatewayOrderNo(result.get(REFUND_ID));
}
/**

View File

@@ -10,19 +10,17 @@ import cn.bootx.platform.daxpay.service.common.context.PayLocal;
import cn.bootx.platform.daxpay.service.common.local.PaymentContextLocal;
import cn.bootx.platform.daxpay.service.core.channel.union.entity.UnionPayConfig;
import cn.bootx.platform.daxpay.service.core.order.pay.entity.PayOrder;
import cn.bootx.platform.daxpay.util.PayUtil;
import cn.bootx.platform.daxpay.service.sdk.union.api.UnionPayKit;
import cn.bootx.platform.daxpay.service.sdk.union.bean.UnionPayOrder;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import com.ijpay.core.enums.SignType;
import com.ijpay.core.kit.WxPayKit;
import com.ijpay.unionpay.UnionPayApi;
import com.ijpay.unionpay.enums.ServiceEnum;
import com.ijpay.unionpay.model.MicroPayModel;
import com.ijpay.unionpay.model.UnifiedOrderModel;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.Date;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
@@ -59,180 +57,110 @@ public class UnionPayService {
/**
* 支付接口
*/
public void pay(PayOrder payOrder, PayChannelParam payChannelParam, UnionPayParam unionPayParam, UnionPayConfig unionPayConfig){
public void pay(PayOrder payOrder, PayChannelParam payChannelParam, UnionPayParam unionPayParam, UnionPayKit unionPayKit){
Integer amount = payChannelParam.getAmount();
String totalFee = String.valueOf(amount);
BigDecimal totalFee = BigDecimal.valueOf(amount * 0.01);
PayLocal asyncPayInfo = PaymentContextLocal.get().getPayInfo();;
String payBody = null;
PayWayEnum payWayEnum = PayWayEnum.findByCode(payChannelParam.getWay());
// 微信APP支付
if (payWayEnum == PayWayEnum.APP) {
payBody = this.wxAppPay(totalFee, payOrder, unionPayParam, unionPayConfig);
}
// 微信公众号支付或者小程序支付
else if (payWayEnum == PayWayEnum.JSAPI_WX_PAY) {
payBody = this.wxJsPay(totalFee, payOrder, unionPayParam.getOpenId(), unionPayConfig);
}
// 支付宝JS支付
else if (payWayEnum == PayWayEnum.JSAPI_ALI_PAY) {
payBody = this.aliJsPay(totalFee, payOrder, unionPayParam, unionPayConfig);
}
// 银联JS支付
else if (payWayEnum == PayWayEnum.JSAPI) {
payBody = this.unionJsPay(totalFee, payOrder, unionPayParam, unionPayConfig);
}
// 二维码支付
else if (payWayEnum == PayWayEnum.QRCODE) {
payBody = this.qrCodePay(totalFee, payOrder, unionPayConfig);
if (payWayEnum == PayWayEnum.QRCODE) {
payBody = this.qrCodePay(totalFee, payOrder, unionPayKit);
}
// 付款码支付
else if (payWayEnum == PayWayEnum.BARCODE) {
this.barCodePay(totalFee, payOrder, unionPayParam.getAuthCode(), unionPayConfig);
this.barCodePay(totalFee, payOrder, unionPayParam.getAuthCode(), unionPayKit);
}
// APP支付
else if (payWayEnum == PayWayEnum.APP) {
payBody = this.appPay(totalFee, payOrder, unionPayParam, unionPayKit);
}
asyncPayInfo.setPayBody(payBody);
}
/**
* 支付宝生活号支付
* APP支付
*/
private String aliJsPay(String amount, PayOrder payOrder, UnionPayParam unionPayParam, UnionPayConfig unionPayConfig) {
Map<String, String> params = UnifiedOrderModel.builder()
.service(ServiceEnum.ALI_PAY_JS_PAY.toString())
.mch_id(unionPayConfig.getMachId())
.out_trade_no(WxPayKit.generateStr())
.body(payOrder.getTitle())
.total_fee(amount)
.mch_create_ip("127.0.0.15")
.notify_url(unionPayConfig.getNotifyUrl())
.nonce_str(WxPayKit.generateStr())
.buyer_id(unionPayParam.getBuyerId())
.build()
.createSign(unionPayConfig.getAppKey(), SignType.MD5);
private String appPay(BigDecimal amount, PayOrder payOrder, UnionPayParam unionPayParam, UnionPayKit unionPayKit) {
String xmlResult = UnionPayApi.execution(unionPayConfig.getServerUrl(), params);
Map<String, String> result = WxPayKit.xmlToMap(xmlResult);
this.verifyErrorMsg(result);
return null;
}
Date expiredTime = DateUtil.date(payOrder.getExpiredTime());
/**
* 银联JS支付
*/
private String unionJsPay(String amount, PayOrder payOrder, UnionPayParam unionPayParam, UnionPayConfig unionPayConfig) {
Map<String, String> params = UnifiedOrderModel.builder()
.service(ServiceEnum.UNION_JS_PAY.toString())
.mch_id(unionPayConfig.getMachId())
.out_trade_no(WxPayKit.generateStr())
.body(payOrder.getTitle())
.user_id(unionPayParam.getUserId())
.customer_ip(unionPayParam.getCustomerIp())
.total_fee(amount)
.mch_create_ip("127.0.0.1")
.notify_url(unionPayConfig.getNotifyUrl())
.nonce_str(WxPayKit.generateStr())
.build()
.createSign(unionPayConfig.getAppKey(), SignType.MD5);
System.out.println(params);
UnionPayOrder unionPayOrder = new UnionPayOrder();
unionPayOrder.setOutTradeNo(String.valueOf(payOrder.getId()));
unionPayOrder.setSubject(payOrder.getTitle());
unionPayOrder.setPrice(amount);
unionPayOrder.setExpirationTime(expiredTime);
String xmlResult = UnionPayApi.execution(unionPayConfig.getServerUrl(), params);
Map<String, String> result = WxPayKit.xmlToMap(xmlResult);
this.verifyErrorMsg(result);
return null;
}
/**
* 微信APP支付
*/
private String wxAppPay(String amount, PayOrder payOrder, UnionPayParam unionPayParam, UnionPayConfig unionPayConfig) {
Map<String, String> params = UnifiedOrderModel.builder()
.service(ServiceEnum.WEI_XIN_APP_PAY.toString())
.mch_id(unionPayConfig.getMachId())
.appid(unionPayParam.getAppId())
.sub_appid(unionPayParam.getSubAppId())
.out_trade_no(WxPayKit.generateStr())
.body(payOrder.getTitle())
.attach("聚合支付 SDK")
.total_fee(amount)
.mch_create_ip("127.0.0.1")
.notify_url(unionPayConfig.getNotifyUrl())
.nonce_str(WxPayKit.generateStr())
.build()
.createSign(unionPayConfig.getAppKey(), SignType.MD5);
String xmlResult = UnionPayApi.execution(unionPayConfig.getServerUrl(), params);
Map<String, String> result = WxPayKit.xmlToMap(xmlResult);
this.verifyErrorMsg(result);
return null;
}
/**
* 微信公众号支付或者小程序支付
*/
private String wxJsPay(String amount, PayOrder payOrder, String openId, UnionPayConfig unionPayConfig) {
Map<String, String> params = UnifiedOrderModel.builder()
.service(ServiceEnum.WEI_XIN_JS_PAY.toString())
.mch_id(unionPayConfig.getMachId())
// 原生JS 值为1
.is_raw("1")
.out_trade_no(WxPayKit.generateStr())
.body(payOrder.getTitle())
.sub_openid(openId)
.total_fee(amount)
.mch_create_ip("127.0.0.1")
.notify_url(unionPayConfig.getNotifyUrl())
.nonce_str(WxPayKit.generateStr())
.build()
.createSign(unionPayConfig.getAppKey(), SignType.MD5);
String xmlResult = UnionPayApi.execution(unionPayConfig.getServerUrl(), params);
Map<String, String> result = WxPayKit.xmlToMap(xmlResult);
this.verifyErrorMsg(result);
Map<String, Object> app = unionPayKit.app(unionPayOrder);
return null;
}
/**
* 扫码支付
*/
private String qrCodePay(String amount, PayOrder payOrder, UnionPayConfig config){
Map<String, String> params = UnifiedOrderModel.builder()
.service(ServiceEnum.NATIVE.toString())
.mch_id(config.getMachId())
.out_trade_no(String.valueOf(payOrder.getId()))
.body(payOrder.getTitle())
.total_fee(amount)
.time_expire(PayUtil.getUnionExpiredTime(payOrder.getExpiredTime()))
.mch_create_ip("127.0.0.1")
.notify_url(config.getNotifyUrl())
.nonce_str(WxPayKit.generateStr())
.build()
.createSign(config.getAppKey(), SignType.MD5);
String xmlResult = UnionPayApi.execution(config.getServerUrl(), params);
Map<String, String> result = WxPayKit.xmlToMap(xmlResult);
this.verifyErrorMsg(result);
return result.get("code_url");
private String qrCodePay(BigDecimal amount, PayOrder payOrder, UnionPayKit unionPayKit){
Date expiredTime = DateUtil.date(payOrder.getExpiredTime());
UnionPayOrder unionPayOrder = new UnionPayOrder();
unionPayOrder.setOutTradeNo(String.valueOf(payOrder.getId()));
unionPayOrder.setSubject(payOrder.getTitle());
unionPayOrder.setPrice(amount);
unionPayOrder.setExpirationTime(expiredTime);
return unionPayKit.getQrPay(unionPayOrder);
// Map<String, String> params = UnifiedOrderModel.builder()
// .service(ServiceEnum.NATIVE.toString())
// .mch_id(unionPayKit.getMachId())
// .out_trade_no(String.valueOf(payOrder.getId()))
// .body(payOrder.getTitle())
// .total_fee(amount)
// .time_expire(PayUtil.getUnionExpiredTime(payOrder.getExpiredTime()))
// .mch_create_ip("127.0.0.1")
// .notify_url(unionPayKit.getNotifyUrl())
// .nonce_str(WxPayKit.generateStr())
// .build()
// .createSign(unionPayKit.getAppKey(), SignType.MD5);
// String xmlResult = UnionPayApi.execution(unionPayKit.getServerUrl(), params);
// Map<String, String> result = WxPayKit.xmlToMap(xmlResult);
// this.verifyErrorMsg(result);
// return result.get("code_url");
}
/**
* 付款码支付
*/
private void barCodePay(String amount, PayOrder payOrder, String authCode, UnionPayConfig unionPayConfig) {
Map<String, String> params = MicroPayModel.builder()
.service(ServiceEnum.MICRO_PAY.toString())
.mch_id(unionPayConfig.getMachId())
.out_trade_no(WxPayKit.generateStr())
.body(payOrder.getTitle())
.total_fee(amount)
.op_device_id("daxpay")
.mch_create_ip("127.0.0.1")
.auth_code(authCode)
.nonce_str(WxPayKit.generateStr())
.build()
.createSign(unionPayConfig.getAppKey(), SignType.MD5);
private void barCodePay(BigDecimal amount, PayOrder payOrder, String authCode, UnionPayKit unionPayKit) {
Date expiredTime = DateUtil.date(payOrder.getExpiredTime());
String xmlResult = UnionPayApi.execution(unionPayConfig.getServerUrl(), params);
UnionPayOrder unionPayOrder = new UnionPayOrder();
unionPayOrder.setAuthCode(authCode);
unionPayOrder.setOutTradeNo(String.valueOf(payOrder.getId()));
unionPayOrder.setSubject(payOrder.getTitle());
unionPayOrder.setPrice(amount);
unionPayOrder.setExpirationTime(expiredTime);
Map<String, Object> stringObjectMap = unionPayKit.microPay(unionPayOrder);
// Map<String, String> params = MicroPayModel.builder()
// .service(ServiceEnum.MICRO_PAY.toString())
// .mch_id(unionPayKit.getMachId())
// .out_trade_no(WxPayKit.generateStr())
// .body(payOrder.getTitle())
// .total_fee(amount)
// .op_device_id("daxpay")
// .mch_create_ip("127.0.0.1")
// .auth_code(authCode)
// .nonce_str(WxPayKit.generateStr())
// .build()
// .createSign(unionPayKit.getAppKey(), SignType.MD5);
//
// String xmlResult = UnionPayApi.execution(unionPayKit.getServerUrl(), params);
}

View File

@@ -1,29 +1,21 @@
package cn.bootx.platform.daxpay.service.core.channel.union.service;
import cn.bootx.platform.common.core.util.LocalDateTimeUtil;
import cn.bootx.platform.daxpay.code.PaySyncStatusEnum;
import cn.bootx.platform.daxpay.code.RefundSyncStatusEnum;
import cn.bootx.platform.daxpay.service.code.UnionPayCode;
import cn.bootx.platform.daxpay.service.core.channel.union.entity.UnionPayConfig;
import cn.bootx.platform.daxpay.service.core.order.pay.entity.PayOrder;
import cn.bootx.platform.daxpay.service.core.order.refund.entity.RefundOrder;
import cn.bootx.platform.daxpay.service.core.payment.sync.result.PayGatewaySyncResult;
import cn.bootx.platform.daxpay.service.core.payment.sync.result.RefundGatewaySyncResult;
import cn.hutool.core.date.DatePattern;
import cn.bootx.platform.daxpay.service.sdk.union.api.UnionPayKit;
import cn.bootx.platform.daxpay.service.sdk.union.bean.UnionRefundOrder;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.ijpay.core.enums.SignType;
import com.ijpay.core.kit.WxPayKit;
import com.ijpay.unionpay.UnionPayApi;
import com.ijpay.unionpay.enums.ServiceEnum;
import com.ijpay.unionpay.model.OrderQueryModel;
import com.ijpay.unionpay.model.RefundQueryModel;
import com.ijpay.wxpay.WxPayApi;
import com.egzosn.pay.common.bean.AssistOrder;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.util.Map;
import java.util.Objects;
@@ -42,52 +34,47 @@ public class UnionPaySyncService {
/**
* 支付信息查询
*/
public PayGatewaySyncResult syncPayStatus(PayOrder order, UnionPayConfig unionPayConfig) {
public PayGatewaySyncResult syncPayStatus(PayOrder order, UnionPayKit unionPayKit) {
PayGatewaySyncResult syncResult = new PayGatewaySyncResult().setSyncStatus(PaySyncStatusEnum.FAIL);
Map<String, String> params = OrderQueryModel.builder()
.service(ServiceEnum.QUERY.toString())
.mch_id(unionPayConfig.getMachId())
.out_trade_no(String.valueOf(order.getId()))
.nonce_str(WxPayKit.generateStr())
.build()
.createSign(unionPayConfig.getAppKey(), SignType.MD5);
String xmlResult = UnionPayApi.execution(unionPayConfig.getServerUrl(), params);
Map<String, String> result = WxPayKit.xmlToMap(xmlResult);
AssistOrder query = new AssistOrder();
query.setOutTradeNo(String.valueOf(order.getId()));
Map<String, Object> result = unionPayKit.query(query);
syncResult.setSyncInfo(JSONUtil.toJsonStr(result));
String status = result.get(STATUS);
String returnCode = result.get(RESULT_CODE);
// 判断查询是否成功
if (!(Objects.equals(SUCCESS, status) && Objects.equals(SUCCESS, returnCode))){
log.warn("查询云闪付订单失败:{}", result);
return syncResult;
}
// 设置微信支付网关订单号
syncResult.setGatewayOrderNo(result.get(TRANSACTION_ID));
// 查询到订单的状态
String tradeStatus = result.get(TRADE_STATE);
// 支付完成
if (Objects.equals(tradeStatus, SUCCESS)) {
String timeEnd = result.get(TIME_END);
LocalDateTime time = LocalDateTimeUtil.parse(timeEnd, DatePattern.PURE_DATETIME_PATTERN);
return syncResult.setPayTime(time).setSyncStatus(PaySyncStatusEnum.SUCCESS);
}
// 待支付
if (Objects.equals(tradeStatus, TRADE_NOT_PAY)) {
return syncResult.setSyncStatus(PaySyncStatusEnum.PROGRESS);
}
// 已退款/退款中
if (Objects.equals(tradeStatus, TRADE_REFUND)) {
return syncResult.setSyncStatus(PaySyncStatusEnum.REFUND);
}
// 已关闭
if (Objects.equals(tradeStatus, TRADE_CLOSED)) {
return syncResult.setSyncStatus(PaySyncStatusEnum.CLOSED);
}
// String status = result.get(STATUS);
// String returnCode = result.get(RESULT_CODE);
//
// // 判断查询是否成功
// if (!(Objects.equals(SUCCESS, status) && Objects.equals(SUCCESS, returnCode))){
// log.warn("查询云闪付订单失败:{}", result);
// return syncResult;
// }
//
// // 设置微信支付网关订单号
// syncResult.setGatewayOrderNo(result.get(TRANSACTION_ID));
// // 查询到订单的状态
// String tradeStatus = result.get(TRADE_STATE);
// // 支付完成
// if (Objects.equals(tradeStatus, SUCCESS)) {
// String timeEnd = result.get(TIME_END);
// LocalDateTime time = LocalDateTimeUtil.parse(timeEnd, DatePattern.PURE_DATETIME_PATTERN);
// return syncResult.setPayTime(time).setSyncStatus(PaySyncStatusEnum.SUCCESS);
// }
// // 待支付
// if (Objects.equals(tradeStatus, TRADE_NOT_PAY)) {
// return syncResult.setSyncStatus(PaySyncStatusEnum.PROGRESS);
// }
//
// // 已退款/退款中
// if (Objects.equals(tradeStatus, TRADE_REFUND)) {
// return syncResult.setSyncStatus(PaySyncStatusEnum.REFUND);
// }
// // 已关闭
// if (Objects.equals(tradeStatus, TRADE_CLOSED)) {
// return syncResult.setSyncStatus(PaySyncStatusEnum.CLOSED);
// }
return syncResult;
}
@@ -95,23 +82,21 @@ public class UnionPaySyncService {
/**
* 退款信息查询
*/
public RefundGatewaySyncResult syncRefundStatus(RefundOrder refundOrder, UnionPayConfig unionPayConfig){
public RefundGatewaySyncResult syncRefundStatus(RefundOrder refundOrder, UnionPayKit unionPayKit){
RefundGatewaySyncResult syncResult = new RefundGatewaySyncResult();
Map<String, String> params = RefundQueryModel.builder()
.service(ServiceEnum.REFUND_QUERY.toString())
.mch_id(unionPayConfig.getMachId())
.refund_id(refundOrder.getGatewayOrderNo())
.nonce_str(WxPayKit.generateStr())
.build()
.createSign(unionPayConfig.getAppKey(), SignType.MD5);
UnionRefundOrder query = new UnionRefundOrder();
query.setRefundNo(String.valueOf(refundOrder.getId()));
Map<String, Object> results = unionPayKit.refundquery(query);
try {
String xmlResult = WxPayApi.orderRefundQuery(false, params);
Map<String, String> result = WxPayKit.xmlToMap(xmlResult);
syncResult.setSyncInfo(JSONUtil.toJsonStr(result));
// String xmlResult = WxPayApi.orderRefundQuery(false, params);
// Map<String, String> result = WxPayKit.xmlToMap(xmlResult);
// syncResult.setSyncInfo(JSONUtil.toJsonStr(result));
// 设置微信支付网关订单号
syncResult.setGatewayOrderNo(result.get(UnionPayCode.REFUND_ID));
// syncResult.setGatewayOrderNo(result.get(UnionPayCode.REFUND_ID));
// 状态
// String tradeStatus = result.get(UnionPayCode.REFUND_STATUS);
// // 退款成功
@@ -124,8 +109,8 @@ public class UnionPaySyncService {
// if (Objects.equals(tradeStatus, UnionPayCode.REFUND_PROCESSING)) {
// return syncResult.setSyncStatus(RefundSyncStatusEnum.PROGRESS);
// }
String errorMsg = this.getErrorMsg(result);
return syncResult.setSyncStatus(RefundSyncStatusEnum.FAIL).setErrorMsg(errorMsg);
// String errorMsg = this.getErrorMsg(result);
// return syncResult.setSyncStatus(RefundSyncStatusEnum.FAIL).setErrorMsg(errorMsg);
} catch (Exception e) {
log.error("查询退款订单失败:", e);
syncResult.setSyncStatus(RefundSyncStatusEnum.PROGRESS).setErrorMsg(e.getMessage());

View File

@@ -5,6 +5,7 @@ import cn.bootx.platform.daxpay.service.core.channel.union.entity.UnionPayConfig
import cn.bootx.platform.daxpay.service.core.channel.union.service.UnionPayCloseService;
import cn.bootx.platform.daxpay.service.core.channel.union.service.UnionPayConfigService;
import cn.bootx.platform.daxpay.service.func.AbsPayCloseStrategy;
import cn.bootx.platform.daxpay.service.sdk.union.api.UnionPayKit;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Scope;
@@ -48,6 +49,7 @@ public class UnionPayCloseStrategy extends AbsPayCloseStrategy {
*/
@Override
public void doCloseHandler() {
unionPayCloseService.close(this.getOrder(), this.unionPayConfig);
UnionPayKit unionPayKit = unionPayConfigService.initPayService(this.unionPayConfig);
unionPayCloseService.close(this.getOrder(), unionPayKit);
}
}

View File

@@ -14,6 +14,7 @@ import cn.bootx.platform.daxpay.service.core.channel.union.service.UnionPayServi
import cn.bootx.platform.daxpay.service.core.order.pay.entity.PayChannelOrder;
import cn.bootx.platform.daxpay.service.core.order.pay.service.PayChannelOrderService;
import cn.bootx.platform.daxpay.service.func.AbsPayStrategy;
import cn.bootx.platform.daxpay.service.sdk.union.api.UnionPayKit;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.json.JSONException;
@@ -87,7 +88,8 @@ public class UnionPayStrategy extends AbsPayStrategy {
*/
@Override
public void doPayHandler() {
unionPayService.pay(this.getOrder(), this.getPayChannelParam(), this.unionPayParam, this.unionPayConfig);
UnionPayKit unionPayKit = unionPayConfigService.initPayService(unionPayConfig);
unionPayService.pay(this.getOrder(), this.getPayChannelParam(), this.unionPayParam, unionPayKit);
}
/**

View File

@@ -0,0 +1,102 @@
package cn.bootx.platform.daxpay.service.core.payment.reconcile.strategy;
import cn.bootx.platform.common.core.util.LocalDateTimeUtil;
import cn.bootx.platform.common.sequence.func.Sequence;
import cn.bootx.platform.daxpay.code.PayChannelEnum;
import cn.bootx.platform.daxpay.service.core.channel.union.convert.UnionPayConvert;
import cn.bootx.platform.daxpay.service.core.channel.union.dao.UnionPayRecordManager;
import cn.bootx.platform.daxpay.service.core.channel.union.entity.UnionPayConfig;
import cn.bootx.platform.daxpay.service.core.channel.union.entity.UnionPayRecord;
import cn.bootx.platform.daxpay.service.core.channel.union.service.UnionPayConfigService;
import cn.bootx.platform.daxpay.service.core.channel.union.service.UnionPayReconcileService;
import cn.bootx.platform.daxpay.service.core.payment.reconcile.domain.GeneralReconcileRecord;
import cn.bootx.platform.daxpay.service.func.AbsReconcileStrategy;
import cn.bootx.platform.daxpay.service.sdk.union.api.UnionPayKit;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
import static org.springframework.beans.factory.config.BeanDefinition.SCOPE_PROTOTYPE;
/**
*
* @author xxm
* @since 2024/3/8
*/
@Slf4j
@Service
@Scope(SCOPE_PROTOTYPE)
@RequiredArgsConstructor
public class UnionPayReconcileStrategy extends AbsReconcileStrategy {
private final UnionPayConfigService configService;
private final UnionPayReconcileService reconcileService;
private final UnionPayRecordManager recordManager;
@Qualifier("unionPayReconcileSequence")
private final Sequence sequence;
private UnionPayKit unionPayKit;
/**
* 生成对账序列号
*/
@Override
public String generateSequence(LocalDate date) {
String prefix = getChannel().getReconcilePrefix();
String dateStr = LocalDateTimeUtil.format(date, DatePattern.PURE_DATE_PATTERN);
String key = String.format("%02d", sequence.next());
return prefix + dateStr + key;
}
/**
* 对账前处理, 主要是初始化支付SDK配置
*/
@Override
public void doBeforeHandler() {
UnionPayConfig config = configService.getConfig();
this.unionPayKit = configService.initPayService(config);
}
/**
* 下载对账单到本地进行保存
*/
@Override
public void downAndSave() {
Date date = DateUtil.date(this.getRecordOrder().getDate());
reconcileService.downAndSave(date, this.getRecordOrder().getId(), this.unionPayKit);
}
/**
* 获取通用对账对象, 将流水记录转换为对账对象
*/
@Override
public List<GeneralReconcileRecord> getGeneralReconcileRecord() {
// 查询流水
LocalDateTime localDateTime = LocalDateTimeUtil.date2DateTime(this.getRecordOrder().getDate());
LocalDateTime start = LocalDateTimeUtil.beginOfDay(localDateTime);
LocalDateTime end = LocalDateTimeUtil.endOfDay(localDateTime);
List<UnionPayRecord> records = recordManager.findByDate(start, end);
return records.stream().map(UnionPayConvert.CONVERT::convertReconcileRecord).collect(Collectors.toList());
}
/**
* 策略标识
*/
@Override
public PayChannelEnum getChannel() {
return PayChannelEnum.UNION_PAY;
}
}

View File

@@ -9,6 +9,7 @@ import cn.bootx.platform.daxpay.service.core.channel.union.service.UnionPayRecor
import cn.bootx.platform.daxpay.service.core.channel.union.service.UnionPayRefundService;
import cn.bootx.platform.daxpay.service.core.order.pay.service.PayChannelOrderService;
import cn.bootx.platform.daxpay.service.func.AbsRefundStrategy;
import cn.bootx.platform.daxpay.service.sdk.union.api.UnionPayKit;
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
@@ -61,7 +62,8 @@ public class UnionRefundStrategy extends AbsRefundStrategy {
*/
@Override
public void doRefundHandler() {
unionPayRefundService.refund(this.getRefundOrder(), this.getRefundChannelParam().getAmount(), this.getPayChannelOrder(), this.unionPayConfig);
UnionPayKit unionPayKit = unionPayConfigService.initPayService(unionPayConfig);
unionPayRefundService.refund(this.getRefundOrder(), this.getRefundChannelParam().getAmount(), this.getPayChannelOrder(), unionPayKit);
}
/**

View File

@@ -7,6 +7,7 @@ import cn.bootx.platform.daxpay.service.core.channel.union.service.UnionPayConfi
import cn.bootx.platform.daxpay.service.core.channel.union.service.UnionPaySyncService;
import cn.bootx.platform.daxpay.service.core.payment.sync.result.PayGatewaySyncResult;
import cn.bootx.platform.daxpay.service.func.AbsPaySyncStrategy;
import cn.bootx.platform.daxpay.service.sdk.union.api.UnionPayKit;
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
@@ -35,7 +36,8 @@ public class UnionPaySyncStrategy extends AbsPaySyncStrategy {
@Override
public PayGatewaySyncResult doSyncStatus() {
UnionPayConfig config = unionPayConfigService.getConfig();
return unionPaySyncService.syncPayStatus(this.getOrder(),config);
UnionPayKit unionPayKit = unionPayConfigService.initPayService(config);
return unionPaySyncService.syncPayStatus(this.getOrder(),unionPayKit);
}
/**

View File

@@ -0,0 +1,25 @@
package cn.bootx.platform.daxpay.service.sdk.union.api;
import com.egzosn.pay.common.http.HttpConfigStorage;
import com.egzosn.pay.union.api.UnionPayConfigStorage;
import com.egzosn.pay.union.api.UnionPayService;
/**
* 云闪付支付服务类重命名, 避免与系统中类名冲突
* @author xxm
* @since 2024/3/8
*/
public class UnionPayKit extends UnionPayService {
/**
* 构造函数
*
* @param payConfigStorage 支付配置
*/
public UnionPayKit(UnionPayConfigStorage payConfigStorage) {
super(payConfigStorage);
}
public UnionPayKit(UnionPayConfigStorage payConfigStorage, HttpConfigStorage configStorage) {
super(payConfigStorage, configStorage);
}
}

View File

@@ -0,0 +1,11 @@
package cn.bootx.platform.daxpay.service.sdk.union.bean;
import com.egzosn.pay.common.bean.PayOrder;
/**
* 继承SDK中的类, 防止与系统中的类名称冲突
* @author xxm
* @since 2024/3/8
*/
public class UnionPayOrder extends PayOrder {
}

View File

@@ -0,0 +1,11 @@
package cn.bootx.platform.daxpay.service.sdk.union.bean;
import com.egzosn.pay.common.bean.RefundOrder;
/**
* 继承SDK中的类, 防止与系统中的类名称冲突
* @author xxm
* @since 2024/3/8
*/
public class UnionRefundOrder extends RefundOrder {
}