params, String body) {
- try {
- log.info("开始处理微信退款回调");
- return wechatPlayClient.parseRefundNotifyV3(headers, body);
- } catch (Exception e) {
- log.error("处理微信退款回调失败", e);
- throw e;
- }
- }
}
\ No newline at end of file
diff --git a/seer-pay/seer-pay-service-app/src/main/java/com/seer/teach/pay/app/client/wechat/WechatNativePayClient.java b/seer-pay/seer-pay-service-app/src/main/java/com/seer/teach/pay/app/client/wechat/WechatNativePayClient.java
new file mode 100644
index 0000000..f39dc0f
--- /dev/null
+++ b/seer-pay/seer-pay-service-app/src/main/java/com/seer/teach/pay/app/client/wechat/WechatNativePayClient.java
@@ -0,0 +1,58 @@
+package com.seer.teach.pay.app.client.wechat;
+
+import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderV3Request;
+import com.github.binarywang.wxpay.bean.result.enums.TradeTypeEnum;
+import com.github.binarywang.wxpay.constant.WxPayConstants;
+import com.github.binarywang.wxpay.exception.WxPayException;
+import com.seer.teach.common.enums.ResultCodeEnum;
+import com.seer.teach.common.enums.pay.PayChannelEnum;
+import com.seer.teach.common.enums.pay.PayStatusEnum;
+import com.seer.teach.common.exception.CommonException;
+import com.seer.teach.pay.app.client.dto.PayOrderReqDTO;
+import com.seer.teach.pay.app.client.dto.PayOrderRespDTO;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+
+@Slf4j
+public class WechatNativePayClient extends AbstractWxPayClient {
+
+ public WechatNativePayClient(String configJson) {
+ super(PayChannelEnum.WECHAT_NATIVE.getCode(), configJson);
+ }
+
+ @Override
+ public void init() {
+ super.doInit(WxPayConstants.TradeType.NATIVE);
+ }
+
+ @Override
+ protected PayOrderRespDTO doPayOrder(PayOrderReqDTO payOrderReqDTO) {
+ WxPayUnifiedOrderV3Request request = buildPayRequestV3(payOrderReqDTO);
+
+ try {
+ String response = client.createOrderV3(TradeTypeEnum.NATIVE, request);
+
+ if(StringUtils.isNotEmpty(response)){
+ PayOrderRespDTO payOrderRespDTO = new PayOrderRespDTO();
+ payOrderRespDTO.setChannelCode(payOrderReqDTO.getChannelCode());
+ payOrderRespDTO.setPayOrderSn(payOrderReqDTO.getPayOrderSn());
+ payOrderRespDTO.setStatus(PayStatusEnum.PENDING.getCode());
+ payOrderRespDTO.setQrCodeUrl(response);
+ return payOrderRespDTO;
+ }
+ throw new CommonException(ResultCodeEnum.WX_PREPAY_ERROR, "微信二维码预支付失败:");
+ } catch (WxPayException e) {
+ throw new CommonException(ResultCodeEnum.WX_PREPAY_ERROR, "微信二维码预支付失败:");
+ }
+ }
+
+ @Override
+ public PayChannelEnum getChannel() {
+ return PayChannelEnum.WECHAT_NATIVE;
+ }
+
+ @Override
+ public boolean isAsyncCallback() {
+ return false;
+ }
+}
\ No newline at end of file
diff --git a/seer-pay/seer-pay-service-app/src/main/java/com/seer/teach/pay/app/client/wechat/core/WechatPlayClient.java b/seer-pay/seer-pay-service-app/src/main/java/com/seer/teach/pay/app/client/wechat/core/WechatPlayClient.java
index a28846c..231f2de 100644
--- a/seer-pay/seer-pay-service-app/src/main/java/com/seer/teach/pay/app/client/wechat/core/WechatPlayClient.java
+++ b/seer-pay/seer-pay-service-app/src/main/java/com/seer/teach/pay/app/client/wechat/core/WechatPlayClient.java
@@ -1,44 +1,69 @@
package com.seer.teach.pay.app.client.wechat.core;
+import cn.hutool.core.date.TemporalAccessorUtil;
import cn.hutool.core.map.MapUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
+import com.seer.teach.common.config.WxConfig;
import com.seer.teach.common.enums.ResultCodeEnum;
import com.seer.teach.common.enums.pay.RefundStatusEnum;
import com.seer.teach.common.exception.CommonException;
-import com.seer.teach.common.config.WxConfig;
import com.seer.teach.common.utils.DateUtils;
+import com.seer.teach.pay.app.client.convert.PayClientConvert;
import com.seer.teach.pay.app.client.dto.PayOrderReqDTO;
import com.seer.teach.pay.app.client.dto.RefundNotificationRespDTO;
-import com.seer.teach.pay.app.client.convert.PayClientConvert;
import com.seer.teach.pay.app.client.wechat.core.resp.WechatPayOrderResp;
import com.seer.teach.pay.app.client.wechat.core.resp.WechatPrepayTransactionResp;
-import com.seer.teach.pay.dto.RefundSubmitRespDTO;
import com.seer.teach.pay.app.client.wechat.core.resp.WechatTransferDetailResp;
import com.seer.teach.pay.app.client.wechat.core.resp.WechatTransferQueryResp;
import com.seer.teach.pay.app.client.wechat.core.resp.WechatTransferResp;
import com.seer.teach.pay.app.util.ConfigDecryptUtil;
-import com.seer.teach.pay.entity.PayOrderEntity;
+import com.seer.teach.pay.dto.RefundSubmitRespDTO;
import com.wechat.pay.java.core.Config;
import com.wechat.pay.java.core.RSAPublicKeyConfig;
import com.wechat.pay.java.core.notification.NotificationConfig;
import com.wechat.pay.java.core.notification.NotificationParser;
import com.wechat.pay.java.core.notification.RequestParam;
import com.wechat.pay.java.service.payments.jsapi.JsapiServiceExtension;
-import com.wechat.pay.java.service.payments.jsapi.model.*;
import com.wechat.pay.java.service.payments.jsapi.model.Amount;
+import com.wechat.pay.java.service.payments.jsapi.model.CloseOrderRequest;
+import com.wechat.pay.java.service.payments.jsapi.model.Payer;
+import com.wechat.pay.java.service.payments.jsapi.model.PrepayRequest;
+import com.wechat.pay.java.service.payments.jsapi.model.PrepayWithRequestPaymentResponse;
import com.wechat.pay.java.service.payments.model.Transaction;
+import com.wechat.pay.java.service.payments.nativepay.NativePayService;
+import com.wechat.pay.java.service.payments.nativepay.model.PrepayResponse;
import com.wechat.pay.java.service.refund.RefundService;
-import com.wechat.pay.java.service.refund.model.*;
+import com.wechat.pay.java.service.refund.model.AmountReq;
+import com.wechat.pay.java.service.refund.model.CreateRequest;
+import com.wechat.pay.java.service.refund.model.QueryByOutRefundNoRequest;
+import com.wechat.pay.java.service.refund.model.Refund;
+import com.wechat.pay.java.service.refund.model.RefundNotification;
import com.wechat.pay.java.service.transferbatch.TransferBatchService;
-import com.wechat.pay.java.service.transferbatch.model.*;
+import com.wechat.pay.java.service.transferbatch.model.GetTransferBatchByOutNoRequest;
+import com.wechat.pay.java.service.transferbatch.model.GetTransferDetailByOutNoRequest;
+import com.wechat.pay.java.service.transferbatch.model.InitiateBatchTransferRequest;
+import com.wechat.pay.java.service.transferbatch.model.InitiateBatchTransferResponse;
+import com.wechat.pay.java.service.transferbatch.model.TransferBatchEntity;
+import com.wechat.pay.java.service.transferbatch.model.TransferBatchGet;
+import com.wechat.pay.java.service.transferbatch.model.TransferDetailCompact;
+import com.wechat.pay.java.service.transferbatch.model.TransferDetailEntity;
+import com.wechat.pay.java.service.transferbatch.model.TransferDetailInput;
import lombok.Getter;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.context.ApplicationContext;
-import java.util.*;
+import java.time.ZoneId;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+
+import static cn.hutool.core.date.DatePattern.UTC_WITH_XXX_OFFSET_PATTERN;
/**
* 微信支付客户端
@@ -64,6 +89,8 @@ public class WechatPlayClient {
private ApplicationContext applicationContext;
+ private NativePayService nativePayService;
+
private String configJson;
private String appId;
@@ -107,8 +134,12 @@ public class WechatPlayClient {
.merchantSerialNumber(merchantSerialNumber)
.apiV3Key(apiV3Key)
.build();
- // 初始化证书服务
+
jsapiServiceExtension = new JsapiServiceExtension.Builder().config(config).build();
+
+
+ nativePayService = new NativePayService.Builder().config(config).build();
+
NotificationConfig notificationConfig = new RSAPublicKeyConfig.Builder()
.merchantId(mchId)
.privateKey(privateKeyPem)
@@ -147,7 +178,7 @@ public class WechatPlayClient {
public WechatPrepayTransactionResp prepayPay(PayOrderReqDTO payOrder, Object extrasRequest) {
String sn = payOrder.getPayOrderSn();
Integer userId = payOrder.getUserId();
- Long totalAmount = payOrder.getTotalAmount();
+ Integer totalAmount = payOrder.getTotalAmount();
log.info("开始处理微信预支付请求,订单号: {}, 用户ID: {}, 支付金额: {}分", sn, userId, totalAmount);
// 构建支付请求
@@ -201,6 +232,35 @@ public class WechatPlayClient {
}
}
+ /**
+ * 预支付,获取二维码地址(使用默认配置)
+ *
+ * NATIVE支付场景,商户调用该接口在微信支付下单,生成用于调起支付的二维码,
+ * 获取二维码地址。
+ * 微信NATIVE下单
+ *
+ * @param payOrder 支付订单信息
+ * @param extrasRequest 额外参数
+ * @return 二维码地址
+ *
+ */
+ public Optional nativePrepayPay(PayOrderReqDTO payOrder, Object extrasRequest){
+ com.wechat.pay.java.service.payments.nativepay.model.PrepayRequest request = new com.wechat.pay.java.service.payments.nativepay.model.PrepayRequest();
+ request.setOutTradeNo(payOrder.getPayOrderSn());
+ request.setDescription(payOrder.getDescription());
+ request.setNotifyUrl(jsPayNotifyUrl);
+ com.wechat.pay.java.service.payments.nativepay.model.Amount amount = new com.wechat.pay.java.service.payments.nativepay.model.Amount();
+ amount.setTotal(payOrder.getTotalAmount().intValue());
+ amount.setCurrency("CNY");
+ request.setAmount(amount);
+ request.setTimeExpire(TemporalAccessorUtil.format(payOrder.getExpireTime().atZone(ZoneId.systemDefault()), UTC_WITH_XXX_OFFSET_PATTERN));
+
+ PrepayResponse prepay = nativePayService.prepay(request);
+ if(Objects.nonNull(prepay)){
+ return Optional.of(prepay.getCodeUrl());
+ }
+ return Optional.empty();
+ }
/**
* 清理PEM内容,确保符合微信SDK要求
diff --git a/seer-pay/seer-pay-service-app/src/main/java/com/seer/teach/pay/app/pay/controller/AppPayOrderController.java b/seer-pay/seer-pay-service-app/src/main/java/com/seer/teach/pay/app/pay/controller/AppPayOrderController.java
index 1999719..577aaca 100644
--- a/seer-pay/seer-pay-service-app/src/main/java/com/seer/teach/pay/app/pay/controller/AppPayOrderController.java
+++ b/seer-pay/seer-pay-service-app/src/main/java/com/seer/teach/pay/app/pay/controller/AppPayOrderController.java
@@ -53,18 +53,16 @@ public class AppPayOrderController {
@SaCheckPermission("app:order:status")
public ResultBean queryPayStatus(
@Parameter(description = "订单号") @PathVariable("orderSn") String orderSn) {
- PayOrderEntity payOrder = appPayOrderService.queryPayStatus(orderSn);
- AppPayOrderStatusResp result = AppPayOrderConvert.INSTANCE.convertOne(payOrder);
- return ResultBean.success(result);
+ AppPayOrderStatusResp payOrder = appPayOrderService.queryPayStatus(orderSn);
+ return ResultBean.success(payOrder);
}
@Operation(summary = "关闭支付订单")
@PostMapping("/close/{orderSn}")
@SaCheckPermission("app:order:close")
- public ResultBean closePayOrder(
+ public ResultBean closePayOrder(
@Parameter(description = "订单号", required = true) @PathVariable("orderSn") String orderSn) {
- Boolean result = appPayOrderService.closePayOrder(orderSn);
- return ResultBean.success(result);
+ return ResultBean.success(appPayOrderService.closePayOrder(orderSn));
}
}
\ No newline at end of file
diff --git a/seer-pay/seer-pay-service-app/src/main/java/com/seer/teach/pay/app/pay/controller/req/OrderPayReq.java b/seer-pay/seer-pay-service-app/src/main/java/com/seer/teach/pay/app/pay/controller/req/OrderPayReq.java
index fc83ee4..9281326 100644
--- a/seer-pay/seer-pay-service-app/src/main/java/com/seer/teach/pay/app/pay/controller/req/OrderPayReq.java
+++ b/seer-pay/seer-pay-service-app/src/main/java/com/seer/teach/pay/app/pay/controller/req/OrderPayReq.java
@@ -8,6 +8,7 @@ import lombok.Setter;
import lombok.ToString;
import jakarta.validation.constraints.NotBlank;
+import org.hibernate.validator.constraints.URL;
@Getter
@Setter
@@ -22,4 +23,8 @@ public class OrderPayReq {
@Schema(description = "商户订单编号")
private String merchantOrderSn;
+
+ @Schema(description = "回跳地址")
+ @URL(message = "回跳地址的格式必须是 URL")
+ private String returnUrl;
}
\ No newline at end of file
diff --git a/seer-pay/seer-pay-service-app/src/main/java/com/seer/teach/pay/app/pay/controller/resp/AppPayOrderResp.java b/seer-pay/seer-pay-service-app/src/main/java/com/seer/teach/pay/app/pay/controller/resp/AppPayOrderResp.java
index df0736e..9fc958e 100644
--- a/seer-pay/seer-pay-service-app/src/main/java/com/seer/teach/pay/app/pay/controller/resp/AppPayOrderResp.java
+++ b/seer-pay/seer-pay-service-app/src/main/java/com/seer/teach/pay/app/pay/controller/resp/AppPayOrderResp.java
@@ -17,4 +17,7 @@ public class AppPayOrderResp {
@Schema(description = "支付订单号")
private String payOrderSn;
+
+ @Schema(description = "二维码地址")
+ private String qrCodeUrl;
}
diff --git a/seer-pay/seer-pay-service-app/src/main/java/com/seer/teach/pay/app/pay/service/IAppPayOrderService.java b/seer-pay/seer-pay-service-app/src/main/java/com/seer/teach/pay/app/pay/service/IAppPayOrderService.java
index 12a91a3..f2d4987 100644
--- a/seer-pay/seer-pay-service-app/src/main/java/com/seer/teach/pay/app/pay/service/IAppPayOrderService.java
+++ b/seer-pay/seer-pay-service-app/src/main/java/com/seer/teach/pay/app/pay/service/IAppPayOrderService.java
@@ -2,6 +2,7 @@ package com.seer.teach.pay.app.pay.service;
import com.seer.teach.pay.app.pay.controller.req.OrderPayReq;
import com.seer.teach.pay.app.pay.controller.resp.AppPayOrderResp;
+import com.seer.teach.pay.app.pay.controller.resp.AppPayOrderStatusResp;
import com.seer.teach.pay.entity.PayOrderEntity;
import java.util.Map;
@@ -30,12 +31,12 @@ public interface IAppPayOrderService {
* @param orderSn 订单号
* @return 支付订单信息
*/
- PayOrderEntity queryPayStatus(String orderSn);
+ AppPayOrderStatusResp queryPayStatus(String orderSn);
/**
* 关闭支付订单
* @param orderSn
* @return
*/
- Boolean closePayOrder(String orderSn);
+ String closePayOrder(String orderSn);
}
\ No newline at end of file
diff --git a/seer-pay/seer-pay-service-app/src/main/java/com/seer/teach/pay/app/pay/service/impl/AppPayOrderServiceImpl.java b/seer-pay/seer-pay-service-app/src/main/java/com/seer/teach/pay/app/pay/service/impl/AppPayOrderServiceImpl.java
index 49adc16..14772c0 100644
--- a/seer-pay/seer-pay-service-app/src/main/java/com/seer/teach/pay/app/pay/service/impl/AppPayOrderServiceImpl.java
+++ b/seer-pay/seer-pay-service-app/src/main/java/com/seer/teach/pay/app/pay/service/impl/AppPayOrderServiceImpl.java
@@ -1,28 +1,34 @@
package com.seer.teach.pay.app.pay.service.impl;
+import com.alibaba.nacos.shaded.com.google.common.collect.Maps;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.seer.teach.common.enums.pay.PayChannelEnum;
-import com.seer.teach.common.enums.pay.PayStatusEnum;
+import com.seer.teach.common.constants.CommonConstant;
import com.seer.teach.common.enums.ResultCodeEnum;
+import com.seer.teach.common.enums.pay.PayChannelEnum;
import com.seer.teach.common.enums.pay.PayOrderSourceEnum;
+import com.seer.teach.common.enums.pay.PayStatusEnum;
import com.seer.teach.common.utils.AssertUtils;
+import com.seer.teach.pay.app.client.PayClient;
+import com.seer.teach.pay.app.client.PayClientFactory;
import com.seer.teach.pay.app.client.convert.PayClientConvert;
import com.seer.teach.pay.app.client.dto.PayOrderReqDTO;
-import com.seer.teach.pay.app.pay.controller.req.OrderPayReq;
import com.seer.teach.pay.app.client.dto.PayOrderRespDTO;
-import com.seer.teach.pay.app.pay.controller.resp.AppPayOrderResp;
-import com.seer.teach.pay.app.pay.convert.AppPayOrderConvert;
-import com.seer.teach.pay.app.pay.service.IAppPayOrderService;
import com.seer.teach.pay.app.notify.service.OrderPayNotifyHandler;
import com.seer.teach.pay.app.notify.service.OrderProcessStrategyFactory;
-import com.seer.teach.pay.app.client.PayClient;
-import com.seer.teach.pay.app.client.factory.PayClientFactory;
+import com.seer.teach.pay.app.pay.controller.req.OrderPayReq;
+import com.seer.teach.pay.app.pay.controller.resp.AppPayOrderResp;
+import com.seer.teach.pay.app.pay.controller.resp.AppPayOrderStatusResp;
+import com.seer.teach.pay.app.pay.convert.AppPayOrderConvert;
+import com.seer.teach.pay.app.pay.service.IAppPayOrderService;
import com.seer.teach.pay.entity.PayChannelEntity;
import com.seer.teach.pay.entity.PayOrderEntity;
import com.seer.teach.pay.service.IPayChannelService;
import com.seer.teach.pay.service.IPayOrderService;
+import com.seer.teach.user.api.UserInfoServiceApi;
+import com.seer.teach.user.api.dto.UserAuthDTO;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.util.Map;
@@ -41,6 +47,12 @@ public class AppPayOrderServiceImpl implements IAppPayOrderService {
private final IPayChannelService payChannelService;
+ private final UserInfoServiceApi userInfoServiceApi;
+
+ @Value("${server.servlet.context-path:}")
+ private String contextPath;
+
+
@Override
public AppPayOrderResp payOrder(OrderPayReq orderPayReq) {
log.info("开始处理支付订单,渠道:{},商户订单号:{}", orderPayReq.getChannelCode(), orderPayReq.getMerchantOrderSn());
@@ -58,30 +70,44 @@ public class AppPayOrderServiceImpl implements IAppPayOrderService {
AssertUtils.isTrue(payOrderEntity.getStatus() == PayStatusEnum.PENDING.getCode() || payOrderEntity.getStatus() == PayStatusEnum.PAY_FAILED.getCode(), ResultCodeEnum.PAY_ORDER_IS_PROCESSED);
// 4.获取对应的支付客户端
- PayClient payCLient = payClientFactory.getPayClient(orderPayReq.getChannelCode());
+ PayClient payClient = payClientFactory.getPayClient(PayChannelEnum.fromCode(channelCode), payChannel.getConfigJson());
- // 5,执行支付订单
- PayOrderReqDTO payOrderReqDTO = PayClientConvert.INSTANCE.convert2PayOrderReqDTO(payOrderEntity,orderPayReq);
- PayOrderRespDTO response = payCLient.payOrder(payOrderReqDTO);
+ // 5,设置支付客户端的参数
+ PayOrderReqDTO payOrderReqDTO = PayClientConvert.INSTANCE.convert2PayOrderReqDTO(payOrderEntity, orderPayReq);
+ if( PayChannelEnum.WECHAT_JSAPI.getCode().equalsIgnoreCase(channelCode)){
+ UserAuthDTO userAuthDTO = userInfoServiceApi.getUserAuthByUserIdAndAppId(payOrderEntity.getUserId(), payChannel.getAppId());
+ if(Objects.nonNull(userAuthDTO)){
+ Map channelExtras = payOrderReqDTO.getChannelExtras() == null ? Maps.newHashMap() : payOrderReqDTO.getChannelExtras();
+ channelExtras.put(CommonConstant.WX_OPEN_ID, userAuthDTO.getOpenId());
+ }
+ }
+ payOrderReqDTO.setNotifyUrl(getNotifyUrl(payChannel));
+ payOrderReqDTO.setReturnUrl(orderPayReq.getReturnUrl());
+ // 6,执行支付
+ PayOrderRespDTO response = payClient.payOrder(payOrderReqDTO);
response.setChannelId(payChannel.getId());
- if (!payCLient.isAsyncCallback()) {
+ if (!payClient.isAsyncCallback()) {
handlePayResult(response);
}
log.info("支付订单处理完成,订单号:{}", orderPayReq.getMerchantOrderSn());
return AppPayOrderConvert.INSTANCE.convertOne(response);
}
+ private String getNotifyUrl(PayChannelEntity payChannel) {
+ return payChannel.getNotifyDomain() + contextPath + "/app/callback/pay/" + payChannel.getChannelCode();
+ }
+
@Override
public boolean payCallback(String channelCode, Map headers, Map params, String body) {
log.info("开始处理统一支付回调,渠道编码:{}", channelCode);
try {
// 根据渠道编码获取对应的支付策略
- PayChannelEnum channel = PayChannelEnum.fromCode(channelCode);
+ PayChannelEntity payChannel = payChannelService.checkChannelByChannelCode(channelCode);
- AssertUtils.notNull(channel, ResultCodeEnum.PAY_CHANNEL_IS_NOT_EXIST);
+ AssertUtils.notNull(payChannel, ResultCodeEnum.PAY_CHANNEL_IS_NOT_EXIST);
- PayClient payClient = payClientFactory.getPayClient(channel);
+ PayClient payClient = payClientFactory.getPayClient(PayChannelEnum.fromCode(channelCode), payChannel.getConfigJson());
// 处理支付回调
PayOrderRespDTO response = payClient.handlePayCallback(headers, params, body);
@@ -128,11 +154,20 @@ public class AppPayOrderServiceImpl implements IAppPayOrderService {
* @return 支付订单
*/
@Override
- public PayOrderEntity queryPayStatus(String orderSn) {
+ public AppPayOrderStatusResp queryPayStatus(String orderSn) {
log.info("查询支付状态,订单号:{}", orderSn);
- // 根据订单号查询支付订单,获取支付渠道编码
- PayClient payCLient = getPayStrategy(orderSn);
- return payCLient.queryPayStatus(orderSn);
+ PayOrderEntity payOrder = payOrderService.getOrderByOrderSn(orderSn);
+ if (Objects.isNull(payOrder)) {
+ return null;
+ }
+ AppPayOrderStatusResp appPayOrderStatusResp = AppPayOrderConvert.INSTANCE.convertOne(payOrder);
+
+ PayClient payCLient = getPayClient(orderSn);
+ PayOrderRespDTO payOrderRespDTO = payCLient.queryPayStatus(orderSn);
+ if (Objects.nonNull(payOrderRespDTO)) {
+ appPayOrderStatusResp.setStatus(payOrderRespDTO.getStatus());
+ }
+ return appPayOrderStatusResp;
}
/**
@@ -142,25 +177,27 @@ public class AppPayOrderServiceImpl implements IAppPayOrderService {
* @return 关闭结果
*/
@Override
- public Boolean closePayOrder(String orderSn) {
+ public String closePayOrder(String orderSn) {
log.info("关闭支付状态,订单号:{}", orderSn);
- PayClient payCLient = getPayStrategy(orderSn);
+ PayClient payCLient = getPayClient(orderSn);
return payCLient.closePayOrder(orderSn);
}
/**
- * 根据订单号获取支付策略
+ * 根据订单号获取支付客户端
* 提取公共方法
*
* @param orderSn 订单号
- * @return 支付策略
+ * @return 支付客户端
*/
- private PayClient getPayStrategy(String orderSn) {
+ private PayClient getPayClient(String orderSn) {
PayOrderEntity payOrder = payOrderService.getOne(new LambdaQueryWrapper()
.eq(PayOrderEntity::getOrderSn, orderSn));
AssertUtils.notNull(payOrder, ResultCodeEnum.ORDER_NOT_FOUND);
String channelCode = payOrder.getChannelCode();
+
+ PayChannelEntity payChannel = payChannelService.checkChannelByChannelCode(channelCode);
log.info("订单号:{},支付渠道:{}", orderSn, channelCode);
- return payClientFactory.getPayClient(channelCode);
+ return payClientFactory.getPayClient(PayChannelEnum.fromCode(channelCode), payChannel.getConfigJson());
}
}
\ No newline at end of file
diff --git a/seer-pay/seer-pay-service-app/src/main/java/com/seer/teach/pay/app/refund/service/impl/AppRefundOrderServiceImpl.java b/seer-pay/seer-pay-service-app/src/main/java/com/seer/teach/pay/app/refund/service/impl/AppRefundOrderServiceImpl.java
index a01489e..be76527 100644
--- a/seer-pay/seer-pay-service-app/src/main/java/com/seer/teach/pay/app/refund/service/impl/AppRefundOrderServiceImpl.java
+++ b/seer-pay/seer-pay-service-app/src/main/java/com/seer/teach/pay/app/refund/service/impl/AppRefundOrderServiceImpl.java
@@ -4,7 +4,6 @@ import com.seer.teach.common.enums.pay.PayChannelEnum;
import com.seer.teach.common.enums.ResultCodeEnum;
import com.seer.teach.common.enums.pay.PayOrderSourceEnum;
import com.seer.teach.common.enums.pay.RefundStatusEnum;
-import com.seer.teach.common.enums.pay.RefundTypeEnum;
import com.seer.teach.common.exception.CommonException;
import com.seer.teach.common.utils.AssertUtils;
import com.seer.teach.common.utils.OrderIdGenerator;
@@ -12,15 +11,17 @@ import com.seer.teach.pay.api.refund.dto.RefundOrderRequestDTO;
import com.seer.teach.pay.app.client.PayClient;
import com.seer.teach.pay.app.client.convert.PayClientConvert;
import com.seer.teach.pay.app.client.dto.RefundNotificationRespDTO;
-import com.seer.teach.pay.app.client.factory.PayClientFactory;
+import com.seer.teach.pay.app.client.PayClientFactory;
import com.seer.teach.pay.app.notify.service.OrderPayNotifyHandler;
import com.seer.teach.pay.app.notify.service.OrderProcessStrategyFactory;
import com.seer.teach.pay.app.client.dto.PayRefundReqDTO;
import com.seer.teach.pay.app.refund.service.IAppRefundOrderService;
import com.seer.teach.pay.app.refund.service.dto.RefundResultDTO;
import com.seer.teach.pay.dto.RefundSubmitRespDTO;
+import com.seer.teach.pay.entity.PayChannelEntity;
import com.seer.teach.pay.entity.PayOrderEntity;
import com.seer.teach.pay.entity.RefundOrderEntity;
+import com.seer.teach.pay.service.IPayChannelService;
import com.seer.teach.pay.service.IPayOrderService;
import com.seer.teach.pay.service.IRefundOrderService;
import lombok.RequiredArgsConstructor;
@@ -43,6 +44,8 @@ public class AppRefundOrderServiceImpl implements IAppRefundOrderService {
private final IPayOrderService payOrderService;
+ private final IPayChannelService payChannelService;
+
private final IRefundOrderService refundOrderService;
private final OrderProcessStrategyFactory orderProcessStrategyFactory;
@@ -94,7 +97,10 @@ public class AppRefundOrderServiceImpl implements IAppRefundOrderService {
PayChannelEnum channel = PayChannelEnum.fromCode(channelCode);
log.info("获取支付渠道结果:{}", channel);
AssertUtils.notNull(channel, ResultCodeEnum.PAY_CHANNEL_NOT_SUPPORTED);
- PayClient payClient = payClientFactory.getPayClient(channel);
+
+ PayChannelEntity payChannel = payChannelService.checkChannelByChannelCode(channelCode);
+
+ PayClient payClient = payClientFactory.getPayClient(channel,payChannel.getConfigJson());
log.info("获取支付客户端完成:{}", payClient != null);
// 执行退款订单
@@ -103,8 +109,8 @@ public class AppRefundOrderServiceImpl implements IAppRefundOrderService {
.outTradeNo(payOrder.getOrderSn())
.outRefundNo(refundSn)
.reason(refundRequest.getRefundReason())
- .payPrice(refundRequest.getTotalAmount())
- .refundPrice(refundRequest.getRefundAmount())
+ .payPrice(refundRequest.getTotalAmount().intValue())
+ .refundPrice(refundRequest.getRefundAmount().intValue())
.userId(refundRequest.getUserId())
.build();
log.info("构建退款请求参数完成,请求参数:{}", payRefundReqDTO);
@@ -140,7 +146,7 @@ public class AppRefundOrderServiceImpl implements IAppRefundOrderService {
log.info("查询退款状态,退款单号:{}", refundSn);
try {
// 根据退款单号查询支付订单,获取支付渠道编码
- PayClient payClient = getPayStrategy(refundSn);
+ PayClient payClient = getPayClient(refundSn);
log.info("获取支付客户端完成,退款单号:{}", refundSn);
RefundSubmitRespDTO result = payClient.doQueryRefundStatus(refundSn);
@@ -157,12 +163,14 @@ public class AppRefundOrderServiceImpl implements IAppRefundOrderService {
public boolean refundCallback(String channelCode, Map headers, Map params, String body) {
log.info("开始处理统一退款回调,渠道编码:{}", channelCode);
try {
- // 根据渠道编码获取对应的支付策略
+ // 根据渠道编码获取对应的支付客户端
PayChannelEnum channel = PayChannelEnum.fromCode(channelCode);
- log.info("获取的支付策略:{}", channel);
+ log.info("获取的支付客户端:{}", channel);
AssertUtils.notNull(channel, ResultCodeEnum.PAY_CHANNEL_NOT_SUPPORTED);
- PayClient payClient = payClientFactory.getPayClient(channel);
+ PayChannelEntity payChannel = payChannelService.checkChannelByChannelCode(channelCode);
+
+ PayClient payClient = payClientFactory.getPayClient(channel,payChannel.getConfigJson());
log.info("获取支付客户端完成,渠道编码:{}", channelCode);
// 处理退款回调
@@ -249,13 +257,13 @@ public class AppRefundOrderServiceImpl implements IAppRefundOrderService {
}
/**
- * 根据退款单号获取支付策略
+ * 根据退款单号获取支付客户端
*
* @param refundSn 退款单号
- * @return 支付策略
+ * @return 支付客户端
*/
- private PayClient getPayStrategy(String refundSn) {
- log.info("开始获取支付策略,退款单号:{}", refundSn);
+ private PayClient getPayClient(String refundSn) {
+ log.info("开始获取支付客户端,退款单号:{}", refundSn);
try {
// 根据退款单号查询退款订单
RefundOrderEntity refundOrder = refundOrderService.getRefundOrderByRefundSn(refundSn);
@@ -268,11 +276,12 @@ public class AppRefundOrderServiceImpl implements IAppRefundOrderService {
PayChannelEnum channel = PayChannelEnum.fromCode(channelCode);
log.info("支付渠道枚举转换结果:{}", channel);
- PayClient result = payClientFactory.getPayClient(channel);
- log.info("获取支付策略完成,退款单号:{},支付策略:{}", refundSn, result != null);
- return result;
+ PayChannelEntity payChannel = payChannelService.checkChannelByChannelCode(channelCode);
+
+ PayClient payClient = payClientFactory.getPayClient(channel,payChannel.getConfigJson());
+ return payClient;
} catch (Exception e) {
- log.error("获取支付策略发生异常,退款单号:{}", refundSn, e);
+ log.error("获取支付客户端发生异常,退款单号:{}", refundSn, e);
throw e;
}
}
diff --git a/seer-pay/seer-pay-service/pom.xml b/seer-pay/seer-pay-service/pom.xml
index ac8ebb9..ebf923a 100644
--- a/seer-pay/seer-pay-service/pom.xml
+++ b/seer-pay/seer-pay-service/pom.xml
@@ -43,6 +43,16 @@
wechatpay-java