feat SDK编写,更新bootx-platform版本依赖

This commit is contained in:
bootx
2024-02-06 00:13:10 +08:00
parent abe3df6c7a
commit 5435f6164f
22 changed files with 403 additions and 21 deletions

View File

@@ -0,0 +1,44 @@
package cn.bootx.platform.daxpay.sdk.code;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.Arrays;
import java.util.Objects;
/**
* 支付同步结果
*
* @author xxm
* @since 2021/4/21
*/
@Getter
@AllArgsConstructor
public enum PaySyncStatusEnum {
FAIL("pay_fail", "支付查询失败"),
SUCCESS("pay_success", "支付成功"),
PROGRESS("pay_progress", "支付中"),
CLOSED("pay_closed", "支付已关闭"),
REFUND("pay_refund", "支付退款"),
NOT_FOUND("pay_not_found", "交易不存在"),
/**
* 未查询到订单(具体类型未知)
* 区别于上面的未查询到订单,有些支付方式如支付宝,发起支付后并不能查询到订单,需要用户进行操作后才能查询到订单,
* 所以查询为了区分,增加一个未知的状态, 用于处理这种特殊情况, 然后根据业务需要,关闭订单或者进行其他操作
*/
NOT_FOUND_UNKNOWN("pay_not_found_unknown","交易不存在(特殊)"),
/** 不属于网关同步过来的状态, 需要手动设置, 处理本地订单到了超时时间, 但是网关和本地都未关闭, 需要触发关闭相关处理 */
TIMEOUT("pay_timeout", "支付超时");
/** 编码 */
private final String code;
/** 名称 */
private final String name;
public static PaySyncStatusEnum getByCode(String code) {
return Arrays.stream(values())
.filter(item -> Objects.equals(item.getCode(), code))
.findFirst()
.orElseThrow(() -> new IllegalArgumentException("该枚举不存在"));
}
}

View File

@@ -1,4 +1,4 @@
package cn.bootx.platform.daxpay.sdk.model;
package cn.bootx.platform.daxpay.sdk.model.pay;
import cn.bootx.platform.daxpay.sdk.net.DaxPayResponseModel;
import lombok.Getter;

View File

@@ -1,4 +1,4 @@
package cn.bootx.platform.daxpay.sdk.model;
package cn.bootx.platform.daxpay.sdk.model.pay;
import cn.bootx.platform.daxpay.sdk.code.PayChannelEnum;
import cn.bootx.platform.daxpay.sdk.code.PayStatusEnum;

View File

@@ -1,12 +1,18 @@
package cn.bootx.platform.daxpay.sdk.model;
package cn.bootx.platform.daxpay.sdk.model.refund;
import cn.bootx.platform.daxpay.sdk.net.DaxPayResponseModel;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
/**
* 支付退款通道明细数据
* @author xxm
* @since 2024/1/17
*/
@Getter
@Setter
@ToString
public class RefundChannelOrderModel extends DaxPayResponseModel {
/** 通道 */

View File

@@ -1,19 +1,25 @@
package cn.bootx.platform.daxpay.sdk.model;
package cn.bootx.platform.daxpay.sdk.model.refund;
import cn.bootx.platform.daxpay.sdk.code.RefundStatusEnum;
import cn.bootx.platform.daxpay.sdk.net.DaxPayResponseModel;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
/**
* 退款响应参数
* @author xxm
* @since 2023/12/18
*/
@Getter
@Setter
@ToString
public class RefundModel extends DaxPayResponseModel {
/** 退款ID */
private Long refundId;
/** 退款订单号, 如果请求时未传, 默认为退款ID */
/** 退款号, 如果请求时未传, 默认为退款ID */
private String refundNo;
/**

View File

@@ -1,7 +1,10 @@
package cn.bootx.platform.daxpay.sdk.model;
package cn.bootx.platform.daxpay.sdk.model.refund;
import cn.bootx.platform.daxpay.sdk.code.RefundStatusEnum;
import cn.bootx.platform.daxpay.sdk.net.DaxPayResponseModel;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import java.math.BigDecimal;
import java.time.LocalDateTime;
@@ -12,6 +15,9 @@ import java.util.List;
* @author xxm
* @since 2024/1/16
*/
@Getter
@Setter
@ToString
public class RefundOrderResult extends DaxPayResponseModel {
/** 支付号 */

View File

@@ -0,0 +1,36 @@
package cn.bootx.platform.daxpay.sdk.model.sync;
import cn.bootx.platform.daxpay.sdk.net.DaxPayResponseModel;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
/**
* 支付单同步结果
* @author xxm
* @since 2023/12/27
*/
@Getter
@Setter
@ToString
public class PaySyncModel extends DaxPayResponseModel {
/**
* 支付网关同步状态
* @see PaySyncStatusEnum
*/
private String gatewayStatus;
/** 是否同步成功 */
private boolean success;
/** 是否进行了修复 */
private boolean repair;
/** 修复号 */
private String repairOrderNo;
/** 失败原因 */
private String errorMsg;
}

View File

@@ -25,9 +25,20 @@ public class DaxPayKit {
DaxPayKit.config = config;
}
/**
* 支付请求执行类, 默认对请求参数进行签名
* @param request 请求参数
* @return DaxPayResult 响应类
* @param <T> 业务对象
*/
public <T extends DaxPayResponseModel> DaxPayResult<T> execute(DaxPayRequest<T> request){
return execute(request, true);
}
/**
* 支付请求执行类
* @param request 请求参数
* @param sign 是否进行签名
* @return DaxPayResult 响应类
* @param <T> 业务对象
*/

View File

@@ -31,7 +31,7 @@ public abstract class DaxPayRequest<T extends DaxPayResponseModel> {
/** 是否不进行同步通知的跳转 */
private boolean notReturn;
/** 同步通知URL */
/** 同步跳转URL, 部分接口不支持该配置,传输了也不会生效 */
private String returnUrl;
/** 是否不启用异步通知 */

View File

@@ -1,6 +1,6 @@
package cn.bootx.platform.daxpay.sdk.param.pay;
import cn.bootx.platform.daxpay.sdk.model.PayCloseModel;
import cn.bootx.platform.daxpay.sdk.model.pay.PayCloseModel;
import cn.bootx.platform.daxpay.sdk.net.DaxPayRequest;
import cn.bootx.platform.daxpay.sdk.response.DaxPayResult;
import cn.hutool.core.lang.TypeReference;
@@ -17,7 +17,7 @@ import lombok.EqualsAndHashCode;
@Data
public class PayCloseParam extends DaxPayRequest<PayCloseModel> {
/** 支付ID */
/** 支付ID */
private Long paymentId;
/** 业务号 */

View File

@@ -1,6 +1,6 @@
package cn.bootx.platform.daxpay.sdk.param.pay;
import cn.bootx.platform.daxpay.sdk.model.PayOrderModel;
import cn.bootx.platform.daxpay.sdk.model.pay.PayOrderModel;
import cn.bootx.platform.daxpay.sdk.net.DaxPayRequest;
import cn.bootx.platform.daxpay.sdk.response.DaxPayResult;
import cn.hutool.core.lang.TypeReference;

View File

@@ -2,7 +2,7 @@ package cn.bootx.platform.daxpay.sdk.param.pay;
import cn.bootx.platform.daxpay.sdk.code.PayChannelEnum;
import cn.bootx.platform.daxpay.sdk.code.PayWayEnum;
import cn.bootx.platform.daxpay.sdk.model.PayOrderModel;
import cn.bootx.platform.daxpay.sdk.model.pay.PayOrderModel;
import cn.bootx.platform.daxpay.sdk.net.DaxPayRequest;
import cn.bootx.platform.daxpay.sdk.param.ChannelParam;
import cn.bootx.platform.daxpay.sdk.param.channel.AliPayParam;

View File

@@ -1,6 +1,6 @@
package cn.bootx.platform.daxpay.sdk.param.refund;
import cn.bootx.platform.daxpay.sdk.model.RefundModel;
import cn.bootx.platform.daxpay.sdk.model.refund.RefundModel;
import cn.bootx.platform.daxpay.sdk.net.DaxPayRequest;
import cn.bootx.platform.daxpay.sdk.response.DaxPayResult;
import cn.hutool.core.lang.TypeReference;
@@ -26,7 +26,7 @@ public class RefundParam extends DaxPayRequest<RefundModel> {
private String businessNo;
/**
* 部分退款需要传输支付通道参数参数
* 是否全部退款, 传false时为部分退款, 通道退款参数不可为空
*/
private boolean refundAll;
@@ -36,6 +36,7 @@ public class RefundParam extends DaxPayRequest<RefundModel> {
private String refundNo;
/**
* 通道退款参数
* 部分退款时必传
*/
private List<RefundChannelParam> refundChannels;

View File

@@ -1,6 +1,6 @@
package cn.bootx.platform.daxpay.sdk.param.refund;
import cn.bootx.platform.daxpay.sdk.model.RefundModel;
import cn.bootx.platform.daxpay.sdk.model.refund.RefundModel;
import cn.bootx.platform.daxpay.sdk.net.DaxPayRequest;
import cn.bootx.platform.daxpay.sdk.response.DaxPayResult;
import cn.hutool.core.lang.TypeReference;

View File

@@ -0,0 +1,41 @@
package cn.bootx.platform.daxpay.sdk.param.sync;
import cn.bootx.platform.daxpay.sdk.model.sync.PaySyncModel;
import cn.bootx.platform.daxpay.sdk.net.DaxPayRequest;
import cn.bootx.platform.daxpay.sdk.response.DaxPayResult;
import cn.hutool.core.lang.TypeReference;
import cn.hutool.json.JSONUtil;
import lombok.Getter;
import lombok.Setter;
/**
*支付同步参数
* @author xxm
* @since 2024/2/5
*/
@Getter
@Setter
public class PaySyncParam extends DaxPayRequest<PaySyncModel> {
/** 支付ID */
private Long paymentId;
/** 业务号 */
private String businessNo;
/**
* 方法请求路径
*/
@Override
public String path() {
return "/unipay/syncPay";
}
/**
* 将请求返回结果反序列化为实体类
*/
@Override
public DaxPayResult<PaySyncModel> toModel(String json) {
return JSONUtil.toBean(json, new TypeReference<DaxPayResult<PaySyncModel>>() {}, false);
}
}

View File

@@ -0,0 +1,36 @@
package cn.bootx.platform.daxpay.sdk;
import cn.bootx.platform.daxpay.sdk.model.pay.PayCloseModel;
import cn.bootx.platform.daxpay.sdk.net.DaxPayConfig;
import cn.bootx.platform.daxpay.sdk.net.DaxPayKit;
import cn.bootx.platform.daxpay.sdk.param.pay.PayCloseParam;
import cn.bootx.platform.daxpay.sdk.response.DaxPayResult;
import org.junit.Before;
import org.junit.Test;
/**
* 支付关闭接口测试类
* @author xxm
* @since 2024/2/5
*/
public class PayCloseOrderTest {
@Before
public void init() {
// 初始化支付配置
DaxPayConfig config = DaxPayConfig.builder()
.serviceUrl("http://127.0.0.1:9000")
.signSecret("123456")
.build();
DaxPayKit.initConfig(config);
}
@Test
public void close(){
PayCloseParam param = new PayCloseParam();
param.setBusinessNo("P0001");
DaxPayResult<PayCloseModel> execute = DaxPayKit.execute(param);
System.out.println(execute);
}
}

View File

@@ -0,0 +1,40 @@
package cn.bootx.platform.daxpay.sdk;
import cn.bootx.platform.daxpay.sdk.model.sync.PaySyncModel;
import cn.bootx.platform.daxpay.sdk.net.DaxPayConfig;
import cn.bootx.platform.daxpay.sdk.net.DaxPayKit;
import cn.bootx.platform.daxpay.sdk.param.sync.PaySyncParam;
import cn.bootx.platform.daxpay.sdk.response.DaxPayResult;
import org.junit.Before;
import org.junit.Test;
/**
* 支付同步接口
* @author xxm
* @since 2024/2/5
*/
public class PayOrderSyncTest {
@Before
public void init() {
// 初始化支付配置
DaxPayConfig config = DaxPayConfig.builder()
.serviceUrl("http://127.0.0.1:9000")
.signSecret("123456")
.build();
DaxPayKit.initConfig(config);
}
@Test
public void testPay() {
PaySyncParam param = new PaySyncParam();
param.setBusinessNo("P0001");
DaxPayResult<PaySyncModel> execute = DaxPayKit.execute(param);
System.out.println(execute);
System.out.println(execute.getData());
}
}

View File

@@ -0,0 +1,66 @@
package cn.bootx.platform.daxpay.sdk;
import cn.bootx.platform.daxpay.sdk.code.PayChannelEnum;
import cn.bootx.platform.daxpay.sdk.code.PayWayEnum;
import cn.bootx.platform.daxpay.sdk.model.pay.PayOrderModel;
import cn.bootx.platform.daxpay.sdk.net.DaxPayConfig;
import cn.bootx.platform.daxpay.sdk.net.DaxPayKit;
import cn.bootx.platform.daxpay.sdk.param.pay.PayChannelParam;
import cn.bootx.platform.daxpay.sdk.param.pay.PayParam;
import cn.bootx.platform.daxpay.sdk.response.DaxPayResult;
import org.junit.Before;
import org.junit.Test;
import java.util.Collections;
import java.util.List;
/**
* 通用支付接口
* @author xxm
* @since 2024/2/5
*/
public class PayOrderTest {
@Before
public void init() {
// 初始化支付配置
DaxPayConfig config = DaxPayConfig.builder()
.serviceUrl("http://127.0.0.1:9000")
.signSecret("123456")
.build();
DaxPayKit.initConfig(config);
}
/**
* 单通道支付
*/
@Test
public void onePay() {
PayParam param = new PayParam();
param.setClientIp("127.0.0.1");
param.setNotNotify(true);
param.setNotReturn(true);
param.setBusinessNo("P0001");
param.setTitle("测试接口支付");
PayChannelParam payChannelParam = new PayChannelParam();
payChannelParam.setChannel(PayChannelEnum.WECHAT.getCode());
payChannelParam.setWay(PayWayEnum.QRCODE.getCode());
payChannelParam.setAmount(1);
List<PayChannelParam> payChannels = Collections.singletonList(payChannelParam);
param.setPayChannels(payChannels);
DaxPayResult<PayOrderModel> execute = DaxPayKit.execute(param);
System.out.println(execute);
System.out.println(execute.getData());
}
/**
* 多通道支付
*/
@Test
public void multiPay() {
}
}

View File

@@ -0,0 +1,76 @@
package cn.bootx.platform.daxpay.sdk;
import cn.bootx.platform.daxpay.sdk.model.refund.RefundModel;
import cn.bootx.platform.daxpay.sdk.net.DaxPayConfig;
import cn.bootx.platform.daxpay.sdk.net.DaxPayKit;
import cn.bootx.platform.daxpay.sdk.param.refund.RefundChannelParam;
import cn.bootx.platform.daxpay.sdk.param.refund.RefundParam;
import cn.bootx.platform.daxpay.sdk.response.DaxPayResult;
import org.junit.Before;
import org.junit.Test;
import java.util.Collections;
import java.util.List;
/**
* 退款接口测试
* 支持部分退款和全部退款, 部分退款的次数不要超过10次, 否则可能会出现不可知的错误
*
* @author xxm
* @since 2024/2/5
*/
public class RefundOrderTest {
@Before
public void init() {
// 初始化支付配置
DaxPayConfig config = DaxPayConfig.builder()
.serviceUrl("http://127.0.0.1:9000")
.signSecret("123456")
.build();
DaxPayKit.initConfig(config);
}
/**
* 全部退款
*/
@Test
public void refundAllOrder(){
RefundParam param = new RefundParam();
param.setClientIp("127.0.0.1");
param.setNotNotify(true);
param.setNotReturn(true);
param.setBusinessNo("P0001");
param.setRefundAll(true);
param.setRefundNo("R0001");
DaxPayResult<RefundModel> execute = DaxPayKit.execute(param);
System.out.println(execute);
System.out.println(execute.getData());
}
/**
* 部分退款(单通道)
*/
@Test
public void refundPartOrder(){
RefundParam param = new RefundParam();
param.setClientIp("127.0.0.1");
param.setBusinessNo("P0001");
param.setRefundAll(false);
param.setRefundNo("R0001");
// 设置具体的退款参数
RefundChannelParam refundChannelParam = new RefundChannelParam();
refundChannelParam.setChannel("ali_pay");
refundChannelParam.setAmount(12);
List<RefundChannelParam> refundChannels = Collections.singletonList(refundChannelParam);
param.setRefundChannels(refundChannels);
DaxPayResult<RefundModel> execute = DaxPayKit.execute(param);
System.out.println(execute);
System.out.println(execute.getData());
}
}

View File

@@ -2,26 +2,35 @@ package cn.bootx.platform.daxpay.sdk;
import cn.bootx.platform.daxpay.sdk.code.PayChannelEnum;
import cn.bootx.platform.daxpay.sdk.code.PayWayEnum;
import cn.bootx.platform.daxpay.sdk.model.PayOrderModel;
import cn.bootx.platform.daxpay.sdk.model.pay.PayOrderModel;
import cn.bootx.platform.daxpay.sdk.net.DaxPayConfig;
import cn.bootx.platform.daxpay.sdk.net.DaxPayKit;
import cn.bootx.platform.daxpay.sdk.param.pay.SimplePayParam;
import cn.bootx.platform.daxpay.sdk.response.DaxPayResult;
import org.junit.Before;
import org.junit.Test;
/**
*
* 简单支付
* @author xxm
* @since 2024/2/2
*/
public class SimplePayOrderTest {
public static void main(String[] args) {
@Before
public void init() {
// 初始化支付配置
DaxPayConfig config = DaxPayConfig.builder()
.serviceUrl("http://127.0.0.1:9000")
.signSecret("123456")
.build();
DaxPayKit.initConfig(config);
}
@Test
public void simplePay() {
// 简单支付参数
SimplePayParam param = new SimplePayParam();
param.setBusinessNo("1");
@@ -33,7 +42,9 @@ public class SimplePayOrderTest {
param.setNotNotify(true);
param.setNotReturn(true);
DaxPayResult<PayOrderModel> execute = DaxPayKit.execute(param, true);
DaxPayResult<PayOrderModel> execute = DaxPayKit.execute(param);
System.out.println(execute);
PayOrderModel data = execute.getData();
System.out.println(data);
}
}

View File

@@ -15,6 +15,7 @@ import cn.bootx.platform.daxpay.service.core.order.refund.service.PayRefundOrder
import cn.bootx.platform.daxpay.service.core.payment.close.service.PayCloseService;
import cn.bootx.platform.daxpay.service.core.payment.pay.service.PayService;
import cn.bootx.platform.daxpay.service.core.payment.refund.service.PayRefundService;
import cn.bootx.platform.daxpay.service.core.payment.sync.service.PayRefundSyncService;
import cn.bootx.platform.daxpay.service.core.payment.sync.service.PaySyncService;
import cn.bootx.platform.daxpay.util.DaxRes;
import io.swagger.v3.oas.annotations.Operation;
@@ -37,6 +38,7 @@ public class UniPayController {
private final PayRefundService payRefundService;
private final PaySyncService paySyncService;
private final PayCloseService payCloseService;
private final PayRefundSyncService payRefundSyncService;
private final PayOrderQueryService PayOrderQueryService;
private final PayRefundOrderQueryService payRefundQueryService;
@@ -94,8 +96,8 @@ public class UniPayController {
@PaymentApi("syncRefund")
@Operation(summary = "退款状态同步")
@PostMapping("/syncRefund")
public DaxResult<Void> syncRefund(@RequestBody RefundSyncParam param){
return DaxRes.ok();
public DaxResult<SyncResult> syncRefund(@RequestBody RefundSyncParam param){
return DaxRes.ok(payRefundSyncService.sync(param));
}
@CountTime

View File

@@ -28,7 +28,7 @@
<java.version>1.8</java.version>
<!-- 二方库版本 -->
<bootx-platform.version>1.3.6</bootx-platform.version>
<bootx-platform.version>1.3.6.1</bootx-platform.version>
<dax.version>2.0.0</dax.version>
<!-- 三方库 -->
<slf4j.version>1.7.30</slf4j.version>