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; package com.mtkj.mtpay.controller;
import com.mtkj.mtpay.common.Result;
import com.mtkj.mtpay.service.CallbackService; import com.mtkj.mtpay.service.CallbackService;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@@ -24,21 +25,15 @@ public class CallbackController {
* PingPong支付回调接口 * PingPong支付回调接口
*/ */
@PostMapping("/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回调通知"); log.info("收到PingPong回调通知");
try { boolean success = callbackService.handleCallback(callbackData);
boolean success = callbackService.handleCallback(callbackData);
if (success) { if (success) {
return ResponseEntity.ok(Map.of("code", "0000", "message", "success")); return ResponseEntity.ok(Result.success("回调处理成功"));
} else { } else {
return ResponseEntity.badRequest().body(Map.of("code", "9999", "message", "处理失败")); return ResponseEntity.ok(Result.fail("回调处理失败"));
}
} catch (Exception e) {
log.error("处理回调失败", e);
return ResponseEntity.badRequest().body(Map.of("code", "9999", "message", "处理异常: " + e.getMessage()));
} }
} }

View File

@@ -1,6 +1,8 @@
package com.mtkj.mtpay.service.impl; package com.mtkj.mtpay.service.impl;
import com.fasterxml.jackson.databind.ObjectMapper; 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.PaymentOrder;
import com.mtkj.mtpay.entity.PaymentRecord; import com.mtkj.mtpay.entity.PaymentRecord;
import com.mtkj.mtpay.mapper.PaymentOrderMapper; import com.mtkj.mtpay.mapper.PaymentOrderMapper;
@@ -79,7 +81,7 @@ public class CallbackServiceImpl implements CallbackService {
PaymentRecord record = new PaymentRecord(); PaymentRecord record = new PaymentRecord();
record.setMerchantTransactionId(merchantTransactionId); record.setMerchantTransactionId(merchantTransactionId);
record.setTransactionId(transactionId); record.setTransactionId(transactionId);
record.setRecordType("CALLBACK"); record.setRecordType(RecordType.CALLBACK.getCode());
record.setCode(code); record.setCode(code);
record.setDescription(description); record.setDescription(description);
record.setStatus(status); record.setStatus(status);
@@ -102,17 +104,24 @@ public class CallbackServiceImpl implements CallbackService {
* 将回调状态映射到订单状态 * 将回调状态映射到订单状态
*/ */
private String mapCallbackStatusToOrderStatus(String callbackStatus) { private String mapCallbackStatusToOrderStatus(String callbackStatus) {
return switch (callbackStatus.toUpperCase()) { if (callbackStatus == null || callbackStatus.isEmpty()) {
case "SUCCESS", "SUCCESSFUL" -> "SUCCESS"; return OrderStatus.PENDING.getCode();
case "FAILED", "FAILURE" -> "FAILED"; }
case "REVIEW" -> "REVIEW";
case "CANCELLED", "CANCEL" -> "CANCELLED"; String upperStatus = callbackStatus.toUpperCase();
case "PENDING" -> "PENDING"; 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 -> { default -> {
log.warn("未知的回调状态: {}", callbackStatus); log.warn("未知的回调状态: {}", callbackStatus);
yield "PENDING"; yield OrderStatus.PENDING;
} }
}; };
return orderStatus.getCode();
} }
/** /**

View File

@@ -1,9 +1,12 @@
package com.mtkj.mtpay.service.impl; 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.request.CheckoutRequestDTO;
import com.mtkj.mtpay.dto.response.CheckoutResponseDTO; import com.mtkj.mtpay.dto.response.CheckoutResponseDTO;
import com.mtkj.mtpay.entity.PaymentOrder; import com.mtkj.mtpay.entity.PaymentOrder;
import com.mtkj.mtpay.entity.PaymentRecord; import com.mtkj.mtpay.entity.PaymentRecord;
import com.mtkj.mtpay.exception.BusinessException;
import com.mtkj.mtpay.mapper.PaymentOrderMapper; import com.mtkj.mtpay.mapper.PaymentOrderMapper;
import com.mtkj.mtpay.mapper.PaymentRecordMapper; import com.mtkj.mtpay.mapper.PaymentRecordMapper;
import com.mtkj.mtpay.service.PaymentOrderService; import com.mtkj.mtpay.service.PaymentOrderService;
@@ -38,7 +41,7 @@ public class PaymentOrderServiceImpl implements PaymentOrderService {
request.getMerchantTransactionId() request.getMerchantTransactionId()
); );
if (existingOrder.isPresent()) { 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.setShopperCancelUrl(request.getShopperCancelUrl());
order.setNotificationUrl(request.getNotificationUrl()); order.setNotificationUrl(request.getNotificationUrl());
order.setRemark(request.getRemark()); order.setRemark(request.getRemark());
order.setStatus("PENDING"); order.setStatus(PaymentConstants.DEFAULT_ORDER_STATUS);
// 调用PingPong API创建支付 // 调用PingPong API创建支付
CheckoutResponseDTO response = pingPongPayService.checkout(request); CheckoutResponseDTO response = pingPongPayService.checkout(request);
// 更新订单信息 // 更新订单信息
if ("001000".equals(response.getCode())) { if (PaymentConstants.PINGPONG_SUCCESS_CODE.equals(response.getCode())) {
// transactionId在回调中返回这里先不设置 // transactionId在回调中返回这里先不设置
order.setClientId(response.getClientId()); order.setClientId(response.getClientId());
order.setAccId(response.getAccId()); order.setAccId(response.getAccId());
@@ -77,7 +80,7 @@ public class PaymentOrderServiceImpl implements PaymentOrderService {
PaymentRecord record = new PaymentRecord(); PaymentRecord record = new PaymentRecord();
record.setMerchantTransactionId(order.getMerchantTransactionId()); record.setMerchantTransactionId(order.getMerchantTransactionId());
record.setTransactionId(order.getTransactionId()); record.setTransactionId(order.getTransactionId());
record.setRecordType("CHECKOUT"); record.setRecordType(com.mtkj.mtpay.common.enums.RecordType.CHECKOUT.getCode());
record.setCode(response.getCode()); record.setCode(response.getCode());
record.setDescription(response.getDescription()); record.setDescription(response.getDescription());
record.setStatus(order.getStatus()); record.setStatus(order.getStatus());
@@ -103,7 +106,7 @@ public class PaymentOrderServiceImpl implements PaymentOrderService {
public PaymentOrder updateOrderStatus(String merchantTransactionId, String status, String transactionId) { public PaymentOrder updateOrderStatus(String merchantTransactionId, String status, String transactionId) {
Optional<PaymentOrder> orderOpt = paymentOrderMapper.findByMerchantTransactionId(merchantTransactionId); Optional<PaymentOrder> orderOpt = paymentOrderMapper.findByMerchantTransactionId(merchantTransactionId);
if (orderOpt.isEmpty()) { if (orderOpt.isEmpty()) {
throw new RuntimeException("订单不存在: " + merchantTransactionId); throw new BusinessException(ResultCode.ORDER_NOT_FOUND);
} }
PaymentOrder order = orderOpt.get(); PaymentOrder order = orderOpt.get();