mirror of
https://gitee.com/dromara/dax-pay.git
synced 2025-09-03 19:16:21 +00:00
feat 云闪付对接
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
@@ -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>
|
||||
|
||||
<!-- 微信工具包 -->
|
||||
|
@@ -64,4 +64,7 @@ public interface UnionPayCode {
|
||||
String ERR_MSG = "err_msg";
|
||||
|
||||
|
||||
/** 对账单下载类型编码 */
|
||||
String RECONCILE_BILL_TYPE = "00";
|
||||
|
||||
}
|
||||
|
@@ -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;
|
||||
}
|
@@ -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");
|
||||
}
|
||||
}
|
||||
|
@@ -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();
|
||||
|
@@ -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);
|
||||
|
||||
}
|
||||
|
@@ -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)
|
||||
|
@@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -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);
|
||||
}
|
||||
}
|
||||
|
@@ -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));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@@ -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);
|
||||
|
||||
}
|
||||
|
||||
|
@@ -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());
|
||||
|
@@ -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);
|
||||
}
|
||||
}
|
||||
|
@@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@@ -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;
|
||||
}
|
||||
}
|
@@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@@ -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);
|
||||
}
|
||||
}
|
@@ -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 {
|
||||
}
|
@@ -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 {
|
||||
}
|
Reference in New Issue
Block a user