Skip to content

Commit

Permalink
feat 云闪付支付对接
Browse files Browse the repository at this point in the history
  • Loading branch information
xxm1995 committed Mar 11, 2024
1 parent c5ab2fe commit 3c2deab
Show file tree
Hide file tree
Showing 28 changed files with 254 additions and 196 deletions.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,7 @@ public class SimplePayOrderTest {
.serviceUrl("https://127.0.0.1:9000")
// 需要跟网关中配置一致
.signSecret("123456")
.signType(SignTypeEnum.HMAC_SHA256)
.build();
DaxPayKit.initConfig(config);
}
Expand Down
6 changes: 3 additions & 3 deletions _doc/Task.md
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@

2.0.3:
- [ ] 云闪付接入
- [ ] 支付
- [ ] 退款
- [ ] 同步
- [x] 支付
- [x] 退款
- [x] 同步
- [ ] 对账
- [ ] 回调
- [ ] 统一关闭接口增加使用撤销关闭订单
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package cn.bootx.platform.daxpay.sdk.payment;

import cn.bootx.platform.daxpay.sdk.code.SignTypeEnum;
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;
Expand All @@ -22,6 +23,7 @@ public void init() {
DaxPayConfig config = DaxPayConfig.builder()
.serviceUrl("https://127.0.0.1:9000")
.signSecret("123456")
.signType(SignTypeEnum.HMAC_SHA256)
.build();
DaxPayKit.initConfig(config);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package cn.bootx.platform.daxpay.sdk.payment;

import cn.bootx.platform.daxpay.sdk.code.SignTypeEnum;
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;
Expand All @@ -22,6 +23,7 @@ public void init() {
DaxPayConfig config = DaxPayConfig.builder()
.serviceUrl("https://127.0.0.1:9000")
.signSecret("123456")
.signType(SignTypeEnum.HMAC_SHA256)
.build();
DaxPayKit.initConfig(config);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import cn.bootx.platform.daxpay.sdk.code.PayChannelEnum;
import cn.bootx.platform.daxpay.sdk.code.PayWayEnum;
import cn.bootx.platform.daxpay.sdk.code.SignTypeEnum;
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;
Expand Down Expand Up @@ -30,6 +31,7 @@ public void init() {
DaxPayConfig config = DaxPayConfig.builder()
.serviceUrl("https://127.0.0.1:9000")
.signSecret("123456")
.signType(SignTypeEnum.HMAC_SHA256)
.build();
DaxPayKit.initConfig(config);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package cn.bootx.platform.daxpay.sdk.payment;

import cn.bootx.platform.daxpay.sdk.code.SignTypeEnum;
import cn.bootx.platform.daxpay.sdk.model.sync.RefundSyncModel;
import cn.bootx.platform.daxpay.sdk.net.DaxPayConfig;
import cn.bootx.platform.daxpay.sdk.net.DaxPayKit;
Expand All @@ -22,6 +23,7 @@ public void init() {
DaxPayConfig config = DaxPayConfig.builder()
.serviceUrl("https://127.0.0.1:9000")
.signSecret("123456")
.signType(SignTypeEnum.HMAC_SHA256)
.build();
DaxPayKit.initConfig(config);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package cn.bootx.platform.daxpay.sdk.payment;

import cn.bootx.platform.daxpay.sdk.code.PayChannelEnum;
import cn.bootx.platform.daxpay.sdk.code.SignTypeEnum;
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;
Expand Down Expand Up @@ -29,6 +30,7 @@ public void init() {
DaxPayConfig config = DaxPayConfig.builder()
.serviceUrl("https://127.0.0.1:9000")
.signSecret("123456")
.signType(SignTypeEnum.HMAC_SHA256)
.build();
DaxPayKit.initConfig(config);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import cn.bootx.platform.daxpay.sdk.code.PayChannelEnum;
import cn.bootx.platform.daxpay.sdk.code.PayWayEnum;
import cn.bootx.platform.daxpay.sdk.code.SignTypeEnum;
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;
Expand All @@ -24,6 +25,7 @@ public void init() {
DaxPayConfig config = DaxPayConfig.builder()
.serviceUrl("https://127.0.0.1:9000")
.signSecret("123456")
.signType(SignTypeEnum.HMAC_SHA256)
.build();
DaxPayKit.initConfig(config);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package cn.bootx.platform.daxpay.sdk.payment;

import cn.bootx.platform.daxpay.sdk.code.SignTypeEnum;
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;
Expand All @@ -26,6 +27,7 @@ public void init() {
DaxPayConfig config = DaxPayConfig.builder()
.serviceUrl("https://127.0.0.1:9000")
.signSecret("123456")
.signType(SignTypeEnum.HMAC_SHA256)
.build();
DaxPayKit.initConfig(config);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package cn.bootx.platform.daxpay.sdk.query;

import cn.bootx.platform.daxpay.sdk.code.SignTypeEnum;
import cn.bootx.platform.daxpay.sdk.model.pay.QueryPayOrderModel;
import cn.bootx.platform.daxpay.sdk.net.DaxPayConfig;
import cn.bootx.platform.daxpay.sdk.net.DaxPayKit;
Expand All @@ -21,6 +22,7 @@ public void init() {
DaxPayConfig config = DaxPayConfig.builder()
.serviceUrl("https://127.0.0.1:9000")
.signSecret("123456")
.signType(SignTypeEnum.HMAC_SHA256)
.build();
DaxPayKit.initConfig(config);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package cn.bootx.platform.daxpay.sdk.query;

import cn.bootx.platform.daxpay.sdk.code.SignTypeEnum;
import cn.bootx.platform.daxpay.sdk.model.refund.QueryRefundOrderModel;
import cn.bootx.platform.daxpay.sdk.net.DaxPayConfig;
import cn.bootx.platform.daxpay.sdk.net.DaxPayKit;
Expand All @@ -21,6 +22,7 @@ public void init() {
DaxPayConfig config = DaxPayConfig.builder()
.serviceUrl("https://127.0.0.1:9000")
.signSecret("123456")
.signType(SignTypeEnum.HMAC_SHA256)
.build();
DaxPayKit.initConfig(config);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,11 @@
@Getter
@AllArgsConstructor
public enum RefundSyncStatusEnum {

SUCCESS("refund_success","退款成功"),
FAIL("refund_fail","退款失败"),
PROGRESS("refund_progress","退款中");
PROGRESS("refund_progress","退款中"),
NOT_FOUND("pay_not_found", "交易不存在");

/** 编码 */
private final String code;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package cn.bootx.platform.daxpay.service.code;

import com.egzosn.pay.union.bean.SDKConstants;

/**
* 云闪付常量
* @author xxm
Expand All @@ -11,57 +13,43 @@ public interface UnionPayCode {
/** 成功状态 */
String SUCCESS = "0";

/** 状态 0表示成功 */
String STATUS = "status";
/** 状态 00表示成功 */
String RESP_CODE = SDKConstants.param_respCode;

/** 业务结果 00表示成功 */
String RESP_SUCCESS = SDKConstants.OK_RESP_CODE;

/** 业务结果 0表示成功,非0表示失败 */
String RESULT_CODE = "result_code";
/** 交易类型 */
String TXN_TYPE = "txnType";

/** 网关订单号 */
String QUERY_ID = "queryId";

/** 第三方订单号 */
/** 第三方订单号(本地订单号) */
String ORDER_ID = "orderId";

/** 退款ID */
String REFUND_ID = "refund_id";

/** 交易类型 支付 */
String TXN_TYPE_PAY = "01";

/** 交易类型 退款 */
String TXN_TYPE_REFUND = "04";

/**
* 订单发送时间
* 格式: yyyyMMddHHmmss
*/
String TXN_TIME = "txnTime";

/** 支付结果 */
String PAY_RESULT = "pay_result";

/** 退款金额 */
String TXN_AMT = "txnAmt";

/** 总金额 */
String TOTAL_FEE = "settleAmt";

/** 交易状态 */
String TRADE_STATE = "trade_state";

/** 支付成功 */
String TRADE_SUCCESS = "SUCCESS";

/** 转入退款 */
String TRADE_REFUND = "REFUND";

/** 未支付 */
String TRADE_NOT_PAY = "NOTPAY";

/** 已关闭 */
String TRADE_CLOSED = "CLOSED";

/** 支付失败(其他原因,如银行返回失败) */
String TRADE_PAY_ERROR = "PAYERROR";

/** 返回信息 */
String MESSAGE = "message";

/** 错误代码描述 */
String ERR_MSG = "err_msg";


/** 对账单下载类型编码 */
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,19 @@
import cn.bootx.platform.common.core.util.LocalDateTimeUtil;
import cn.bootx.platform.daxpay.code.PayChannelEnum;
import cn.bootx.platform.daxpay.code.PayStatusEnum;
import cn.bootx.platform.daxpay.code.RefundStatusEnum;
import cn.bootx.platform.daxpay.service.code.PaymentTypeEnum;
import cn.bootx.platform.daxpay.service.code.UnionPayCode;
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.thread.ThreadUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.egzosn.pay.common.bean.NoticeParams;
import com.ijpay.core.kit.WxPayKit;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
Expand All @@ -22,7 +24,6 @@
import java.time.LocalDateTime;
import java.util.Collections;
import java.util.Map;
import java.util.Objects;

import static cn.bootx.platform.daxpay.service.code.UnionPayCode.*;

Expand All @@ -49,35 +50,30 @@ public boolean verifyNotify() {
String callReq = JSONUtil.toJsonStr(params);
log.info("云闪付发起回调 报文: {}", callReq);

String status = params.get(STATUS);
String returnCode = params.get(RESULT_CODE);

// 处理失败
if (!Objects.equals(SUCCESS, status)||!Objects.equals(SUCCESS, returnCode)){
return false;
}

// 支付回调信息校验
UnionPayConfig config = unionPayConfigService.getConfig();
UnionPayKit unionPayKit = unionPayConfigService.initPayService(config);
if (Objects.isNull(config)) {
log.warn("云闪付支付配置不存在");
return false;
}

NoticeParams noticeParams = new NoticeParams();
noticeParams.setBody(Collections.unmodifiableMap(params));
return unionPayKit.verify(noticeParams);
}

/**
* 判断类型 支付回调/退款回调, 云闪付只有支付回调
* 判断类型 支付回调/退款回调
*
* @see PaymentTypeEnum
*/
@Override
public PaymentTypeEnum getCallbackType() {
return PaymentTypeEnum.PAY;
CallbackLocal callbackInfo = PaymentContextLocal.get().getCallbackInfo();
Map<String, String> params = callbackInfo.getCallbackParam();
String txnType = params.get(TXN_TYPE);
if (UnionPayCode.TXN_TYPE_PAY.equals(txnType)){
return PaymentTypeEnum.PAY;
} else {
return PaymentTypeEnum.REFUND;
}
}

/**
Expand All @@ -93,10 +89,12 @@ public void resolvePayData() {
// 支付订单ID
callbackInfo.setOrderId(Long.valueOf(callbackParam.get(ORDER_ID)));
// 支付结果
PayStatusEnum payStatus = WxPayKit.codeIsOk(callbackParam.get(PAY_RESULT)) ? PayStatusEnum.SUCCESS : PayStatusEnum.FAIL;
String resultCode = callbackParam.get(UnionPayCode.RESP_CODE);
PayStatusEnum payStatus = UnionPayCode.RESP_SUCCESS.equals(resultCode) ? PayStatusEnum.SUCCESS : PayStatusEnum.FAIL;

callbackInfo.setGatewayStatus(payStatus.getCode());
// 支付金额
callbackInfo.setAmount(callbackParam.get(TOTAL_FEE));
callbackInfo.setAmount(callbackParam.get(UnionPayCode.TXN_AMT));
String timeEnd = callbackParam.get(TXN_TIME);
if (StrUtil.isNotBlank(timeEnd)) {
LocalDateTime time = LocalDateTimeUtil.parse(timeEnd, DatePattern.PURE_DATETIME_PATTERN);
Expand All @@ -111,6 +109,31 @@ public void resolvePayData() {
*/
@Override
public void resolveRefundData() {
// 云闪付需要延迟半秒再进行处理, 不然会出现业务未处理完, 但回调已经到达的情况
ThreadUtil.sleep(300);

CallbackLocal callbackInfo = PaymentContextLocal.get().getCallbackInfo();
Map<String, String> callbackParam = callbackInfo.getCallbackParam();
// 网关订单号
callbackInfo.setGatewayOrderNo(callbackParam.get(QUERY_ID));
// 退款订单Id
callbackInfo.setOrderId(Long.valueOf(callbackParam.get(ORDER_ID)));
// 退款金额
callbackInfo.setAmount(callbackParam.get(TXN_AMT));

// 交易状态
String resultCode = callbackParam.get(UnionPayCode.RESP_CODE);
RefundStatusEnum refundStatus = UnionPayCode.RESP_SUCCESS.equals(resultCode) ? RefundStatusEnum.SUCCESS : RefundStatusEnum.FAIL;
callbackInfo.setGatewayStatus(refundStatus.getCode());

// 退款时间
String timeEnd = callbackParam.get(TXN_TIME);
if (StrUtil.isNotBlank(timeEnd)) {
LocalDateTime time = LocalDateTimeUtil.parse(timeEnd, DatePattern.PURE_DATETIME_PATTERN);
callbackInfo.setFinishTime(time);
} else {
callbackInfo.setFinishTime(LocalDateTime.now());
}

}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -93,19 +93,19 @@ public UnionPayKit initPayService(UnionPayConfig config){
unionPayConfigStorage.setInputCharset(CharsetUtil.UTF_8);
// 商户号
unionPayConfigStorage.setMerId(config.getMachId());
//是否为证书签名
unionPayConfigStorage.setCertSign(config.isCertSign());
// 云闪付必须使用证书才可以进行调用
unionPayConfigStorage.setCertSign(true);

//中级证书 流
// 中级证书 流
unionPayConfigStorage.setAcpMiddleCert(new ByteArrayInputStream(Base64.decode(config.getAcpMiddleCert())));
//根证书 流
// 根证书 流
unionPayConfigStorage.setAcpRootCert(new ByteArrayInputStream(Base64.decode(config.getAcpRootCert())));
// 私钥证书 流
unionPayConfigStorage.setKeyPrivateCert(new ByteArrayInputStream(Base64.decode(config.getKeyPrivateCert())));

//私钥证书对应的密码 私钥证书对应的密码
unionPayConfigStorage.setKeyPrivateCertPwd(config.getKeyPrivateCertPwd());
//设置证书对应的存储方式,证书字符串信息
//设置证书对应的存储方式,证书流
unionPayConfigStorage.setCertStoreType(CertStoreType.INPUT_STREAM);

// 回调地址
Expand Down
Loading

0 comments on commit 3c2deab

Please sign in to comment.