Files
MTKJPAY/mt-pay/src/main/java/com/mtkj/mtpay/controller/PaymentController.java
qiube 0f2f5c8630 refactor(config): 重构配置管理并优化翻译功能
- 移除 @Component 注解,改用 @EnableConfigurationProperties 在启动类中启用配置
- 将PingPong支付配置从主配置文件移至开发环境配置文件
- 添加PayPal支付配置和百度翻译配置到开发环境
- 将商品和SKU名称翻译逻辑从查询时移至创建时,提高性能
- 移除运行时翻译方法,改为数据库中存储已翻译内容
- 标记PaymentController为过时,系统已切换到PayPal支付
- 优化pom.xml配置,添加classifier属性
2025-12-24 17:39:36 +08:00

181 lines
7.3 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package com.mtkj.mtpay.controller;
import com.mtkj.mtpay.common.Result;
import com.mtkj.mtpay.common.ResultCode;
import com.mtkj.mtpay.dto.request.CheckoutRequestDTO;
import com.mtkj.mtpay.entity.PaymentOrder;
import com.mtkj.mtpay.service.PaymentOrderService;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
/**
* 支付控制器PingPong支付
*
* @deprecated 系统已切换到 PayPal 支付,此控制器保留以备将来需要时使用
* 如需重新启用,请取消注释 @RestController 和 @RequestMapping 注解
*/
@Deprecated
@Slf4j
// @RestController
// @RequestMapping("/api/payment")
@RequiredArgsConstructor
public class PaymentController {
private final PaymentOrderService paymentOrderService;
/**
* 创建支付订单
*/
@PostMapping("/checkout")
public ResponseEntity<Result<Map<String, Object>>> checkout(@Valid @RequestBody CheckoutRequestDTO request) {
log.info("收到创建支付订单请求,商户订单号: {}", request.getMerchantTransactionId());
PaymentOrder order = paymentOrderService.createPaymentOrder(request);
Map<String, Object> data = new HashMap<>();
data.put("merchantTransactionId", order.getMerchantTransactionId());
data.put("token", order.getToken());
data.put("paymentUrl", order.getPaymentUrl());
data.put("status", order.getStatus());
return ResponseEntity.ok(Result.success("订单创建成功", data));
}
/**
* 查询订单状态
*/
@GetMapping("/order/{merchantTransactionId}")
public ResponseEntity<Result<Map<String, Object>>> getOrder(@PathVariable String merchantTransactionId) {
log.info("查询订单状态,商户订单号: {}", merchantTransactionId);
Optional<PaymentOrder> orderOpt = paymentOrderService.findByMerchantTransactionId(merchantTransactionId);
if (orderOpt.isPresent()) {
PaymentOrder order = orderOpt.get();
Map<String, Object> data = new HashMap<>();
data.put("merchantTransactionId", order.getMerchantTransactionId());
data.put("transactionId", order.getTransactionId() != null ? order.getTransactionId() : "");
data.put("status", order.getStatus());
data.put("amount", order.getAmount());
data.put("currency", order.getCurrency());
data.put("createTime", order.getCreateTime());
data.put("token", order.getToken());
data.put("paymentUrl", order.getPaymentUrl());
return ResponseEntity.ok(Result.success(data));
} else {
return ResponseEntity.ok(Result.fail(ResultCode.ORDER_NOT_FOUND));
}
}
/**
* 获取收银台页面HTML
* 返回包含SDK初始化的HTML页面
*/
@GetMapping("/checkout/page")
public ResponseEntity<String> getCheckoutPage(@RequestParam String token) {
log.info("获取收银台页面token: {}", token);
String html = generateCheckoutPage(token);
return ResponseEntity.ok()
.header("Content-Type", "text/html;charset=UTF-8")
.body(html);
}
/**
* 生成收银台页面HTML
*/
private String generateCheckoutPage(String token) {
return """
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>PingPong支付收银台</title>
<style>
#ufo-container {
width: 100%;
min-height: 100vh;
margin: 0 auto;
padding: 20px;
box-sizing: border-box;
}
</style>
</head>
<body>
<div id="ufo-container"></div>
<script src="https://pay-cdn.pingpongx.com/production/static/sdk/1.2.0/ppPay.min.js"></script>
<script>
window.onload = function() {
let client = new ppPay({
lang: 'zh',
root: '#ufo-container',
manul: false,
located: true,
showPrice: true,
bill: true,
mode: 'sandbox',
menu: false,
base: {
width: '100%',
height: '100%',
fontSize: '14px',
backgroundColor: '#fff',
showHeader: true,
showHeaderLabel: true,
headerLabelFont: "支付",
headerColor: '#333333',
headerSize: '16px',
headerBackgroundColor: '#fff',
headerPadding: '20px',
btnSize: '100%',
btnColor: '#fff',
btnFontSize: '14px',
btnPaddingX: '20px',
btnPaddingY: '10px',
btnBackgroundColor: '#1fa0e8',
btnBorderRadius: '4px',
btnMarginTop: '20px'
}
});
let sdkConfig = {
token: '%s'
};
client.createPayment(sdkConfig);
function setPPPayPropWin() {
let winWidth = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
let winHeight = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight;
let ufoContainer = document.getElementById('ufo-container');
if (winWidth >= 500) {
let clientW = Math.floor(winWidth / 3);
clientW = clientW >= 500 ? clientW : 500;
ufoContainer.style.width = clientW + 'px';
} else {
ufoContainer.style.width = winWidth + 'px';
}
}
setPPPayPropWin();
window.addEventListener('resize', setPPPayPropWin);
}
</script>
</body>
</html>
""".formatted(token);
}
}