feat(pay): 优化支付回调处理逻辑

- 统一回调响应格式,使用 Result 封装返回数据
- 引入枚举类管理订单状态和记录类型
- 替换硬编码字符串为常量和枚举值
- 完善异常处理,使用 BusinessException 统一抛出业务异常
- 优化状态映射逻辑,增强空值判断与默认值处理
- 规范化代码结构,提升可读性和维护性
This commit is contained in:
2025-12-19 10:00:05 +08:00
parent 8f9244e434
commit d716c00c84
3 changed files with 33 additions and 26 deletions

View File

@@ -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("回调处理失败"));
}
}

View File

@@ -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();
}
/**

View File

@@ -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();