feat(pay): 优化支付回调处理逻辑
- 统一回调响应格式,使用 Result 封装返回数据 - 引入枚举类管理订单状态和记录类型 - 替换硬编码字符串为常量和枚举值 - 完善异常处理,使用 BusinessException 统一抛出业务异常 - 优化状态映射逻辑,增强空值判断与默认值处理 - 规范化代码结构,提升可读性和维护性
This commit is contained in:
@@ -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()));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
Reference in New Issue
Block a user