feat(pay): 优化支付回调处理逻辑
- 统一回调响应格式,使用 Result 封装返回数据 - 引入枚举类管理订单状态和记录类型 - 替换硬编码字符串为常量和枚举值 - 完善异常处理,使用 BusinessException 统一抛出业务异常 - 优化状态映射逻辑,增强空值判断与默认值处理 - 规范化代码结构,提升可读性和维护性
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
package com.mtkj.mtpay.controller;
|
||||
|
||||
import com.mtkj.mtpay.common.Result;
|
||||
import com.mtkj.mtpay.service.CallbackService;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
@@ -24,21 +25,15 @@ public class CallbackController {
|
||||
* PingPong支付回调接口
|
||||
*/
|
||||
@PostMapping("/pingpong")
|
||||
public ResponseEntity<Map<String, String>> pingpongCallback(@RequestBody Map<String, Object> callbackData) {
|
||||
public ResponseEntity<Result<Object>> pingpongCallback(@RequestBody Map<String, Object> callbackData) {
|
||||
log.info("收到PingPong回调通知");
|
||||
|
||||
try {
|
||||
boolean success = callbackService.handleCallback(callbackData);
|
||||
|
||||
if (success) {
|
||||
return ResponseEntity.ok(Map.of("code", "0000", "message", "success"));
|
||||
} else {
|
||||
return ResponseEntity.badRequest().body(Map.of("code", "9999", "message", "处理失败"));
|
||||
}
|
||||
|
||||
} catch (Exception e) {
|
||||
log.error("处理回调失败", e);
|
||||
return ResponseEntity.badRequest().body(Map.of("code", "9999", "message", "处理异常: " + e.getMessage()));
|
||||
boolean success = callbackService.handleCallback(callbackData);
|
||||
|
||||
if (success) {
|
||||
return ResponseEntity.ok(Result.success("回调处理成功"));
|
||||
} else {
|
||||
return ResponseEntity.ok(Result.fail("回调处理失败"));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
package com.mtkj.mtpay.service.impl;
|
||||
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import com.mtkj.mtpay.common.enums.OrderStatus;
|
||||
import com.mtkj.mtpay.common.enums.RecordType;
|
||||
import com.mtkj.mtpay.entity.PaymentOrder;
|
||||
import com.mtkj.mtpay.entity.PaymentRecord;
|
||||
import com.mtkj.mtpay.mapper.PaymentOrderMapper;
|
||||
@@ -79,7 +81,7 @@ public class CallbackServiceImpl implements CallbackService {
|
||||
PaymentRecord record = new PaymentRecord();
|
||||
record.setMerchantTransactionId(merchantTransactionId);
|
||||
record.setTransactionId(transactionId);
|
||||
record.setRecordType("CALLBACK");
|
||||
record.setRecordType(RecordType.CALLBACK.getCode());
|
||||
record.setCode(code);
|
||||
record.setDescription(description);
|
||||
record.setStatus(status);
|
||||
@@ -102,17 +104,24 @@ public class CallbackServiceImpl implements CallbackService {
|
||||
* 将回调状态映射到订单状态
|
||||
*/
|
||||
private String mapCallbackStatusToOrderStatus(String callbackStatus) {
|
||||
return switch (callbackStatus.toUpperCase()) {
|
||||
case "SUCCESS", "SUCCESSFUL" -> "SUCCESS";
|
||||
case "FAILED", "FAILURE" -> "FAILED";
|
||||
case "REVIEW" -> "REVIEW";
|
||||
case "CANCELLED", "CANCEL" -> "CANCELLED";
|
||||
case "PENDING" -> "PENDING";
|
||||
if (callbackStatus == null || callbackStatus.isEmpty()) {
|
||||
return OrderStatus.PENDING.getCode();
|
||||
}
|
||||
|
||||
String upperStatus = callbackStatus.toUpperCase();
|
||||
OrderStatus orderStatus = switch (upperStatus) {
|
||||
case "SUCCESS", "SUCCESSFUL" -> OrderStatus.SUCCESS;
|
||||
case "FAILED", "FAILURE" -> OrderStatus.FAILED;
|
||||
case "REVIEW" -> OrderStatus.REVIEW;
|
||||
case "CANCELLED", "CANCEL" -> OrderStatus.CANCELLED;
|
||||
case "PENDING" -> OrderStatus.PENDING;
|
||||
default -> {
|
||||
log.warn("未知的回调状态: {}", callbackStatus);
|
||||
yield "PENDING";
|
||||
yield OrderStatus.PENDING;
|
||||
}
|
||||
};
|
||||
|
||||
return orderStatus.getCode();
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -1,9 +1,12 @@
|
||||
package com.mtkj.mtpay.service.impl;
|
||||
|
||||
import com.mtkj.mtpay.common.ResultCode;
|
||||
import com.mtkj.mtpay.common.constants.PaymentConstants;
|
||||
import com.mtkj.mtpay.dto.request.CheckoutRequestDTO;
|
||||
import com.mtkj.mtpay.dto.response.CheckoutResponseDTO;
|
||||
import com.mtkj.mtpay.entity.PaymentOrder;
|
||||
import com.mtkj.mtpay.entity.PaymentRecord;
|
||||
import com.mtkj.mtpay.exception.BusinessException;
|
||||
import com.mtkj.mtpay.mapper.PaymentOrderMapper;
|
||||
import com.mtkj.mtpay.mapper.PaymentRecordMapper;
|
||||
import com.mtkj.mtpay.service.PaymentOrderService;
|
||||
@@ -38,7 +41,7 @@ public class PaymentOrderServiceImpl implements PaymentOrderService {
|
||||
request.getMerchantTransactionId()
|
||||
);
|
||||
if (existingOrder.isPresent()) {
|
||||
throw new RuntimeException("商户订单号已存在: " + request.getMerchantTransactionId());
|
||||
throw new BusinessException(ResultCode.ORDER_EXISTS);
|
||||
}
|
||||
|
||||
// 创建订单实体
|
||||
@@ -53,13 +56,13 @@ public class PaymentOrderServiceImpl implements PaymentOrderService {
|
||||
order.setShopperCancelUrl(request.getShopperCancelUrl());
|
||||
order.setNotificationUrl(request.getNotificationUrl());
|
||||
order.setRemark(request.getRemark());
|
||||
order.setStatus("PENDING");
|
||||
order.setStatus(PaymentConstants.DEFAULT_ORDER_STATUS);
|
||||
|
||||
// 调用PingPong API创建支付
|
||||
CheckoutResponseDTO response = pingPongPayService.checkout(request);
|
||||
|
||||
// 更新订单信息
|
||||
if ("001000".equals(response.getCode())) {
|
||||
if (PaymentConstants.PINGPONG_SUCCESS_CODE.equals(response.getCode())) {
|
||||
// transactionId在回调中返回,这里先不设置
|
||||
order.setClientId(response.getClientId());
|
||||
order.setAccId(response.getAccId());
|
||||
@@ -77,7 +80,7 @@ public class PaymentOrderServiceImpl implements PaymentOrderService {
|
||||
PaymentRecord record = new PaymentRecord();
|
||||
record.setMerchantTransactionId(order.getMerchantTransactionId());
|
||||
record.setTransactionId(order.getTransactionId());
|
||||
record.setRecordType("CHECKOUT");
|
||||
record.setRecordType(com.mtkj.mtpay.common.enums.RecordType.CHECKOUT.getCode());
|
||||
record.setCode(response.getCode());
|
||||
record.setDescription(response.getDescription());
|
||||
record.setStatus(order.getStatus());
|
||||
@@ -103,7 +106,7 @@ public class PaymentOrderServiceImpl implements PaymentOrderService {
|
||||
public PaymentOrder updateOrderStatus(String merchantTransactionId, String status, String transactionId) {
|
||||
Optional<PaymentOrder> orderOpt = paymentOrderMapper.findByMerchantTransactionId(merchantTransactionId);
|
||||
if (orderOpt.isEmpty()) {
|
||||
throw new RuntimeException("订单不存在: " + merchantTransactionId);
|
||||
throw new BusinessException(ResultCode.ORDER_NOT_FOUND);
|
||||
}
|
||||
|
||||
PaymentOrder order = orderOpt.get();
|
||||
|
||||
Reference in New Issue
Block a user