diff --git a/demo/ALIPAY_SETUP_GUIDE.md b/demo/ALIPAY_SETUP_GUIDE.md index 40ee502..6ddfb99 100644 --- a/demo/ALIPAY_SETUP_GUIDE.md +++ b/demo/ALIPAY_SETUP_GUIDE.md @@ -211,3 +211,4 @@ ngrok http 8080 - IJPay文档:https://github.com/Javen205/IJPay + diff --git a/demo/EMAIL_VERIFICATION_LOGIN_GUIDE.md b/demo/EMAIL_VERIFICATION_LOGIN_GUIDE.md index 670a2c6..c5b6485 100644 --- a/demo/EMAIL_VERIFICATION_LOGIN_GUIDE.md +++ b/demo/EMAIL_VERIFICATION_LOGIN_GUIDE.md @@ -272,3 +272,4 @@ if (result.success) { 安全和用户体验都得到了提升! + diff --git a/demo/IMAGE_TO_VIDEO_API_README.md b/demo/IMAGE_TO_VIDEO_API_README.md index 1f52ca2..b76c629 100644 --- a/demo/IMAGE_TO_VIDEO_API_README.md +++ b/demo/IMAGE_TO_VIDEO_API_README.md @@ -292,3 +292,4 @@ grep "img2vid_abc123def456" logs/application.log + diff --git a/demo/POINTS_FREEZE_SYSTEM_README.md b/demo/POINTS_FREEZE_SYSTEM_README.md index b5aaae0..518383f 100644 --- a/demo/POINTS_FREEZE_SYSTEM_README.md +++ b/demo/POINTS_FREEZE_SYSTEM_README.md @@ -293,3 +293,4 @@ public TaskQueue addTextToVideoTask(String username, String taskId) { + diff --git a/demo/PasswordChecker.java b/demo/PasswordChecker.java index 0dc0129..8510ed2 100644 --- a/demo/PasswordChecker.java +++ b/demo/PasswordChecker.java @@ -36,5 +36,6 @@ public class PasswordChecker { + diff --git a/demo/TENCENT_SES_STARTUP_CHECKLIST.md b/demo/TENCENT_SES_STARTUP_CHECKLIST.md index 3b0d453..2b9b992 100644 --- a/demo/TENCENT_SES_STARTUP_CHECKLIST.md +++ b/demo/TENCENT_SES_STARTUP_CHECKLIST.md @@ -284,3 +284,4 @@ ResourceNotFound.TemplateNotFound - 创建邮件模板并配置template-id + diff --git a/demo/TEXT_TO_VIDEO_API_README.md b/demo/TEXT_TO_VIDEO_API_README.md index 0275ac2..5d1a85c 100644 --- a/demo/TEXT_TO_VIDEO_API_README.md +++ b/demo/TEXT_TO_VIDEO_API_README.md @@ -302,3 +302,4 @@ const startPolling = (taskId) => { + diff --git a/demo/USER_WORKS_SYSTEM_README.md b/demo/USER_WORKS_SYSTEM_README.md index ecbbd35..c8c2a88 100644 --- a/demo/USER_WORKS_SYSTEM_README.md +++ b/demo/USER_WORKS_SYSTEM_README.md @@ -172,3 +172,4 @@ const updateWork = async (workId, updateData) => { + diff --git a/demo/env.example b/demo/env.example index a8d5d12..61e4b37 100644 --- a/demo/env.example +++ b/demo/env.example @@ -17,11 +17,6 @@ ALIPAY_PUBLIC_KEY=alipay_public_key ALIPAY_NOTIFY_URL=https://yourdomain.com/api/payments/alipay/notify ALIPAY_RETURN_URL=https://yourdomain.com/api/payments/alipay/return -# PayPal配置 -PAYPAL_CLIENT_ID=your_paypal_client_id -PAYPAL_CLIENT_SECRET=your_paypal_client_secret -PAYPAL_RETURN_URL=https://yourdomain.com/api/payments/paypal/return -PAYPAL_CANCEL_URL=https://yourdomain.com/api/payments/paypal/cancel # 日志配置 LOG_FILE_PATH=./logs/application.log diff --git a/demo/frontend/README.md b/demo/frontend/README.md index e8f8bb0..3be8588 100644 --- a/demo/frontend/README.md +++ b/demo/frontend/README.md @@ -436,5 +436,6 @@ MIT License + diff --git a/demo/frontend/src/App-backup.vue b/demo/frontend/src/App-backup.vue index 482c7a8..a83e595 100644 --- a/demo/frontend/src/App-backup.vue +++ b/demo/frontend/src/App-backup.vue @@ -34,3 +34,4 @@ console.log('App.vue 加载成功') + diff --git a/demo/frontend/src/api/payments.js b/demo/frontend/src/api/payments.js index d8a9ca9..cac60a0 100644 --- a/demo/frontend/src/api/payments.js +++ b/demo/frontend/src/api/payments.js @@ -47,14 +47,6 @@ export const handleAlipayCallback = (params) => { return api.post('/payments/alipay/callback', params) } -// PayPal支付API -export const createPayPalPayment = (paymentData) => { - return api.post(`/payments/paypal/create`, paymentData) -} - -export const handlePayPalCallback = (params) => { - return api.post('/payment/paypal/callback', params) -} // 支付统计API export const getPaymentStats = () => { diff --git a/demo/frontend/src/api/userWorks.js b/demo/frontend/src/api/userWorks.js index 2854888..3536222 100644 --- a/demo/frontend/src/api/userWorks.js +++ b/demo/frontend/src/api/userWorks.js @@ -60,3 +60,4 @@ export const getWorkStats = () => { + diff --git a/demo/frontend/src/components/Footer.vue b/demo/frontend/src/components/Footer.vue index d2ea55b..3a10c6f 100644 --- a/demo/frontend/src/components/Footer.vue +++ b/demo/frontend/src/components/Footer.vue @@ -95,5 +95,6 @@ + diff --git a/demo/frontend/src/components/PaymentModal.vue b/demo/frontend/src/components/PaymentModal.vue index e6d50ba..2b0422d 100644 --- a/demo/frontend/src/components/PaymentModal.vue +++ b/demo/frontend/src/components/PaymentModal.vue @@ -23,17 +23,6 @@ Alipay扫码支付 - -
-
- -
- PayPal支付 -
@@ -127,8 +116,8 @@ const handlePay = async () => { const paymentData = { orderId: props.orderId, amount: props.amount.toString(), - method: selectedMethod.value.toUpperCase(), - description: `${props.title} - ${selectedMethod.value === 'alipay' ? '支付宝' : 'PayPal'}支付` + method: 'ALIPAY', + description: `${props.title} - 支付宝支付` } console.log('=== 开始支付流程 ===') @@ -139,52 +128,46 @@ const handlePay = async () => { const createResponse = await createPayment(paymentData) console.log('创建支付订单响应:', createResponse) - if (createResponse.data && createResponse.data.success) { + if (createResponse.data && createResponse.data.success) { const paymentId = createResponse.data.data.id console.log('2. 支付订单创建成功,ID:', paymentId) - if (selectedMethod.value === 'alipay') { - ElMessage.info('正在生成支付宝二维码...') + ElMessage.info('正在生成支付宝二维码...') + + console.log('3. 创建支付宝支付...') + // 创建支付宝支付 + const alipayResponse = await createAlipayPayment({ paymentId }) + console.log('支付宝支付响应:', alipayResponse) + console.log('支付宝支付响应数据:', alipayResponse.data) + console.log('支付宝支付响应数据详情:', JSON.stringify(alipayResponse.data, null, 2)) + + if (alipayResponse.data && alipayResponse.data.success) { + // 显示二维码 + const qrCode = alipayResponse.data.data.qrCode + console.log('4. 支付宝二维码:', qrCode) - console.log('3. 创建支付宝支付...') - // 创建支付宝支付 - const alipayResponse = await createAlipayPayment({ paymentId }) - console.log('支付宝支付响应:', alipayResponse) - console.log('支付宝支付响应数据:', alipayResponse.data) - console.log('支付宝支付响应数据详情:', JSON.stringify(alipayResponse.data, null, 2)) - - if (alipayResponse.data && alipayResponse.data.success) { - // 显示二维码 - const qrCode = alipayResponse.data.data.qrCode - console.log('4. 支付宝二维码:', qrCode) - - // 更新二维码显示 - const qrCodeElement = document.querySelector('#qr-code-img') - if (qrCodeElement) { - qrCodeElement.src = `https://api.qrserver.com/v1/create-qr-code/?size=200x200&data=${encodeURIComponent(qrCode)}` - qrCodeElement.style.display = 'block' - console.log('5. 二维码图片已设置') - } - - // 隐藏模拟二维码 - const qrPlaceholder = document.querySelector('.qr-placeholder') - if (qrPlaceholder) { - qrPlaceholder.style.display = 'none' - console.log('6. 模拟二维码已隐藏') - } - - ElMessage.success('二维码已生成,请使用支付宝扫码支付') - console.log('=== 支付流程完成 ===') - - } else { - console.error('支付宝响应失败:', alipayResponse) - ElMessage.error(alipayResponse.data?.message || '生成二维码失败') - emit('pay-error', new Error(alipayResponse.data?.message || '生成二维码失败')) + // 更新二维码显示 + const qrCodeElement = document.querySelector('#qr-code-img') + if (qrCodeElement) { + qrCodeElement.src = `https://api.qrserver.com/v1/create-qr-code/?size=200x200&data=${encodeURIComponent(qrCode)}` + qrCodeElement.style.display = 'block' + console.log('5. 二维码图片已设置') } + + // 隐藏模拟二维码 + const qrPlaceholder = document.querySelector('.qr-placeholder') + if (qrPlaceholder) { + qrPlaceholder.style.display = 'none' + console.log('6. 模拟二维码已隐藏') + } + + ElMessage.success('二维码已生成,请使用支付宝扫码支付') + console.log('=== 支付流程完成 ===') + } else { - // PayPal支付处理 - ElMessage.info('PayPal支付功能开发中...') - emit('pay-error', new Error('PayPal支付功能暂未开放')) + console.error('支付宝响应失败:', alipayResponse) + ElMessage.error(alipayResponse.data?.message || '生成二维码失败') + emit('pay-error', new Error(alipayResponse.data?.message || '生成二维码失败')) } } else { diff --git a/demo/frontend/src/views/PaymentCreate.vue b/demo/frontend/src/views/PaymentCreate.vue index 50ee3f5..11e4ea2 100644 --- a/demo/frontend/src/views/PaymentCreate.vue +++ b/demo/frontend/src/views/PaymentCreate.vue @@ -49,18 +49,6 @@ 支付宝 - - - PayPal - - - - 微信支付 - - - - 银联支付 - @@ -103,30 +91,6 @@

支持支付宝扫码支付和网页支付

- - -
- -
PayPal
-

支持PayPal账户支付和信用卡支付

-
-
- - -
- -
微信支付
-

支持微信扫码支付和H5支付

-
-
- - -
- -
银联支付
-

支持银联卡支付和网银支付

-
-
diff --git a/demo/src/main/java/com/example/demo/config/PaymentConfig.java b/demo/src/main/java/com/example/demo/config/PaymentConfig.java index 2d45960..a0e0857 100644 --- a/demo/src/main/java/com/example/demo/config/PaymentConfig.java +++ b/demo/src/main/java/com/example/demo/config/PaymentConfig.java @@ -19,12 +19,6 @@ public class PaymentConfig { return new AliPayConfig(); } - @Bean - @ConfigurationProperties(prefix = "paypal") - public PayPalConfig payPalConfig() { - return new PayPalConfig(); - } - /** * 支付宝配置 */ @@ -64,34 +58,4 @@ public class PaymentConfig { public void setAliPayRootCertPath(String aliPayRootCertPath) { this.aliPayRootCertPath = aliPayRootCertPath; } } - /** - * PayPal支付配置 - */ - public static class PayPalConfig { - private String clientId; - private String clientSecret; - private String mode; - private String returnUrl; - private String cancelUrl; - private String domain; - - // Getters and Setters - public String getClientId() { return clientId; } - public void setClientId(String clientId) { this.clientId = clientId; } - - public String getClientSecret() { return clientSecret; } - public void setClientSecret(String clientSecret) { this.clientSecret = clientSecret; } - - public String getMode() { return mode; } - public void setMode(String mode) { this.mode = mode; } - - public String getReturnUrl() { return returnUrl; } - public void setReturnUrl(String returnUrl) { this.returnUrl = returnUrl; } - - public String getCancelUrl() { return cancelUrl; } - public void setCancelUrl(String cancelUrl) { this.cancelUrl = cancelUrl; } - - public String getDomain() { return domain; } - public void setDomain(String domain) { this.domain = domain; } - } } diff --git a/demo/src/main/java/com/example/demo/controller/OrderController.java b/demo/src/main/java/com/example/demo/controller/OrderController.java index 6d54e52..9b12465 100644 --- a/demo/src/main/java/com/example/demo/controller/OrderController.java +++ b/demo/src/main/java/com/example/demo/controller/OrderController.java @@ -1,9 +1,9 @@ package com.example.demo.controller; -import com.example.demo.model.*; -import com.example.demo.service.OrderService; -import com.example.demo.service.PaymentService; -import jakarta.validation.Valid; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Optional; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -15,11 +15,24 @@ import org.springframework.security.core.Authentication; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.validation.BindingResult; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; -import java.math.BigDecimal; -import java.util.ArrayList; -import java.util.Optional; +import com.example.demo.model.Order; +import com.example.demo.model.OrderItem; +import com.example.demo.model.OrderStatus; +import com.example.demo.model.OrderType; +import com.example.demo.model.Payment; +import com.example.demo.model.PaymentMethod; +import com.example.demo.model.User; +import com.example.demo.service.OrderService; +import com.example.demo.service.PaymentService; + +import jakarta.validation.Valid; @Controller @RequestMapping("/orders") @@ -362,8 +375,6 @@ public class OrderController { // 根据支付方式跳转到相应的支付页面 if (paymentMethod == PaymentMethod.ALIPAY) { return "redirect:/payment/alipay/create?paymentId=" + savedPayment.getId(); - } else if (paymentMethod == PaymentMethod.PAYPAL) { - return "redirect:/payment/paypal/create?paymentId=" + savedPayment.getId(); } else { model.addAttribute("error", "不支持的支付方式"); return "redirect:/orders/" + id; diff --git a/demo/src/main/java/com/example/demo/controller/PayPalController.java b/demo/src/main/java/com/example/demo/controller/PayPalController.java deleted file mode 100644 index 07a882d..0000000 --- a/demo/src/main/java/com/example/demo/controller/PayPalController.java +++ /dev/null @@ -1,162 +0,0 @@ -package com.example.demo.controller; - -import java.util.HashMap; -import java.util.Map; - -import javax.servlet.http.HttpServletRequest; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; - -/** - * PayPal支付控制器 - * 基于IJPay实现 - */ -@RestController -@RequestMapping("/api/payments/paypal") -public class PayPalController { - - private static final Logger logger = LoggerFactory.getLogger(PayPalController.class); - - - - /** - * 创建支付订单 - */ - @PostMapping("/create-order") - public ResponseEntity> createOrder(@RequestParam String outTradeNo, - @RequestParam String totalAmount, - @RequestParam String subject, - @RequestParam String body) { - Map response = new HashMap<>(); - try { - // TODO: 实现PayPal订单创建逻辑 - // 这里需要根据实际的PayPal API进行实现 - response.put("success", true); - response.put("message", "PayPal订单创建功能待实现"); - response.put("outTradeNo", outTradeNo); - response.put("totalAmount", totalAmount); - response.put("subject", subject); - logger.info("PayPal订单创建请求: outTradeNo={}, totalAmount={}", outTradeNo, totalAmount); - } catch (Exception e) { - logger.error("PayPal订单创建失败", e); - response.put("success", false); - response.put("message", "订单创建失败: " + e.getMessage()); - } - return ResponseEntity.ok(response); - } - - /** - * 捕获支付 - */ - @PostMapping("/capture") - public ResponseEntity> captureOrder(@RequestParam String orderId) { - Map response = new HashMap<>(); - try { - // TODO: 实现PayPal支付捕获逻辑 - response.put("success", true); - response.put("message", "PayPal支付捕获功能待实现"); - response.put("orderId", orderId); - logger.info("PayPal支付捕获请求: orderId={}", orderId); - } catch (Exception e) { - logger.error("PayPal支付捕获失败", e); - response.put("success", false); - response.put("message", "支付捕获失败: " + e.getMessage()); - } - return ResponseEntity.ok(response); - } - - /** - * 查询订单 - */ - @GetMapping("/query") - public ResponseEntity> queryOrder(@RequestParam String orderId) { - Map response = new HashMap<>(); - try { - // TODO: 实现PayPal订单查询逻辑 - response.put("success", true); - response.put("message", "PayPal订单查询功能待实现"); - response.put("orderId", orderId); - logger.info("PayPal订单查询请求: orderId={}", orderId); - } catch (Exception e) { - logger.error("PayPal订单查询失败", e); - response.put("success", false); - response.put("message", "订单查询失败: " + e.getMessage()); - } - return ResponseEntity.ok(response); - } - - /** - * 退款 - */ - @PostMapping("/refund") - public ResponseEntity> refund(@RequestParam String captureId, - @RequestParam String refundAmount, - @RequestParam String refundReason) { - Map response = new HashMap<>(); - try { - // TODO: 实现PayPal退款逻辑 - response.put("success", true); - response.put("message", "PayPal退款功能待实现"); - response.put("captureId", captureId); - response.put("refundAmount", refundAmount); - logger.info("PayPal退款请求: captureId={}, amount={}", captureId, refundAmount); - } catch (Exception e) { - logger.error("PayPal退款失败", e); - response.put("success", false); - response.put("message", "退款失败: " + e.getMessage()); - } - return ResponseEntity.ok(response); - } - - /** - * 支付成功回调 - */ - @GetMapping("/return") - public ResponseEntity> returnUrl(HttpServletRequest request) { - Map response = new HashMap<>(); - try { - String token = request.getParameter("token"); - String payerId = request.getParameter("PayerID"); - - logger.info("PayPal支付成功回调: token={}, payerId={}", token, payerId); - - response.put("success", true); - response.put("message", "PayPal支付回调功能待实现"); - response.put("token", token); - response.put("payerId", payerId); - } catch (Exception e) { - logger.error("PayPal支付回调处理失败", e); - response.put("success", false); - response.put("message", "支付处理失败: " + e.getMessage()); - } - return ResponseEntity.ok(response); - } - - /** - * 支付取消回调 - */ - @GetMapping("/cancel") - public ResponseEntity> cancelUrl(HttpServletRequest request) { - Map response = new HashMap<>(); - try { - String token = request.getParameter("token"); - logger.info("PayPal支付取消: token={}", token); - - response.put("success", false); - response.put("message", "PayPal支付取消功能待实现"); - response.put("token", token); - } catch (Exception e) { - logger.error("PayPal支付取消处理失败", e); - response.put("success", false); - response.put("message", "支付取消处理失败: " + e.getMessage()); - } - return ResponseEntity.ok(response); - } -} diff --git a/demo/src/main/java/com/example/demo/controller/PaymentApiController.java b/demo/src/main/java/com/example/demo/controller/PaymentApiController.java index c6ded82..480f58f 100644 --- a/demo/src/main/java/com/example/demo/controller/PaymentApiController.java +++ b/demo/src/main/java/com/example/demo/controller/PaymentApiController.java @@ -22,7 +22,6 @@ import org.springframework.web.bind.annotation.RestController; import com.example.demo.model.Payment; import com.example.demo.model.PaymentStatus; import com.example.demo.service.AlipayService; -import com.example.demo.service.PayPalService; import com.example.demo.service.PaymentService; @RestController @@ -36,9 +35,6 @@ public class PaymentApiController { @Autowired private AlipayService alipayService; - - @Autowired - private PayPalService payPalService; /** @@ -418,50 +414,6 @@ public class PaymentApiController { } } - /** - * 创建PayPal支付 - */ - @PostMapping("/paypal/create") - public ResponseEntity> createPayPalPayment( - @RequestBody Map paymentData, - Authentication authentication) { - try { - String username; - if (authentication != null && authentication.isAuthenticated()) { - username = authentication.getName(); - } else { - return ResponseEntity.badRequest() - .body(createErrorResponse("请先登录后再创建支付")); - } - - Long paymentId = Long.valueOf(paymentData.get("paymentId").toString()); - Payment payment = paymentService.findById(paymentId) - .orElseThrow(() -> new RuntimeException("支付记录不存在")); - - // 检查权限 - if (!payment.getUser().getUsername().equals(username)) { - return ResponseEntity.status(403) - .body(createErrorResponse("无权限操作此支付记录")); - } - - // 调用PayPal接口创建支付 - String paymentUrl = payPalService.createPayment(payment); - - Map response = new HashMap<>(); - response.put("success", true); - response.put("message", "PayPal支付创建成功"); - response.put("data", Map.of("paymentUrl", paymentUrl)); - - return ResponseEntity.ok(response); - } catch (Exception e) { - logger.error("创建PayPal支付失败", e); - return ResponseEntity.badRequest() - .body(createErrorResponse("创建PayPal支付失败: " + e.getMessage())); - } - } - - - private Map createErrorResponse(String message) { Map response = new HashMap<>(); response.put("success", false); diff --git a/demo/src/main/java/com/example/demo/controller/PaymentController.java b/demo/src/main/java/com/example/demo/controller/PaymentController.java index 1398472..6d3081e 100644 --- a/demo/src/main/java/com/example/demo/controller/PaymentController.java +++ b/demo/src/main/java/com/example/demo/controller/PaymentController.java @@ -15,14 +15,12 @@ import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import com.example.demo.model.Payment; import com.example.demo.model.PaymentMethod; import com.example.demo.model.User; import com.example.demo.service.AlipayService; -import com.example.demo.service.PayPalService; import com.example.demo.service.PaymentService; import jakarta.servlet.http.HttpServletRequest; @@ -40,9 +38,6 @@ public class PaymentController { @Autowired private AlipayService alipayService; - @Autowired - private PayPalService payPalService; - /** * 显示支付页面 */ @@ -78,7 +73,6 @@ public class PaymentController { } // 根据支付方式创建支付 - String redirectUrl; if (payment.getPaymentMethod() == PaymentMethod.ALIPAY) { Map paymentResult = alipayService.createPayment(payment); if (paymentResult.containsKey("qrCode")) { @@ -86,9 +80,6 @@ public class PaymentController { return "redirect:/payment/qr?qrCode=" + paymentResult.get("qrCode"); } return "redirect:/payment/error"; - } else if (payment.getPaymentMethod() == PaymentMethod.PAYPAL) { - redirectUrl = payPalService.createPayment(payment); - return "redirect:" + redirectUrl; } else { model.addAttribute("error", "不支持的支付方式"); model.addAttribute("paymentMethods", PaymentMethod.values()); @@ -158,65 +149,6 @@ public class PaymentController { } } - /** - * PayPal支付返回 - */ - @GetMapping("/paypal/return") - public String paypalReturn(@RequestParam("paymentId") String paymentId, - @RequestParam("PayerID") String payerId, - Model model) { - try { - boolean success = payPalService.executePayment(paymentId, payerId); - - if (success) { - Payment payment = paymentService.findByExternalTransactionId(paymentId) - .orElseThrow(() -> new RuntimeException("支付记录不存在")); - model.addAttribute("payment", payment); - model.addAttribute("success", true); - return "payment/result"; - } else { - model.addAttribute("error", "支付执行失败"); - return "payment/result"; - } - - } catch (Exception e) { - logger.error("处理PayPal支付返回失败:", e); - model.addAttribute("error", "支付处理失败:" + e.getMessage()); - return "payment/result"; - } - } - - /** - * PayPal支付取消 - */ - @GetMapping("/paypal/cancel") - public String paypalCancel(Model model) { - model.addAttribute("error", "支付已取消"); - return "payment/result"; - } - - /** - * PayPal Webhook通知 - */ - @PostMapping("/paypal/webhook") - @ResponseBody - public String paypalWebhook(HttpServletRequest request) { - try { - Map params = request.getParameterMap().entrySet().stream() - .collect(java.util.stream.Collectors.toMap( - Map.Entry::getKey, - entry -> entry.getValue()[0] - )); - - boolean success = payPalService.handleWebhook(params); - return success ? "success" : "fail"; - - } catch (Exception e) { - logger.error("处理PayPal Webhook失败:", e); - return "fail"; - } - } - /** * 支付记录列表 */ diff --git a/demo/src/main/java/com/example/demo/dto/MailMessage.java b/demo/src/main/java/com/example/demo/dto/MailMessage.java index fc810dc..100ae22 100644 --- a/demo/src/main/java/com/example/demo/dto/MailMessage.java +++ b/demo/src/main/java/com/example/demo/dto/MailMessage.java @@ -67,3 +67,4 @@ public class MailMessage { } + diff --git a/demo/src/main/java/com/example/demo/model/PaymentMethod.java b/demo/src/main/java/com/example/demo/model/PaymentMethod.java index ab1ce5e..8755b3b 100644 --- a/demo/src/main/java/com/example/demo/model/PaymentMethod.java +++ b/demo/src/main/java/com/example/demo/model/PaymentMethod.java @@ -1,8 +1,7 @@ package com.example.demo.model; public enum PaymentMethod { - ALIPAY("支付宝"), - PAYPAL("PayPal"); + ALIPAY("支付宝"); private final String displayName; diff --git a/demo/src/main/java/com/example/demo/model/PointsFreezeRecord.java b/demo/src/main/java/com/example/demo/model/PointsFreezeRecord.java index 8f55b15..04600e9 100644 --- a/demo/src/main/java/com/example/demo/model/PointsFreezeRecord.java +++ b/demo/src/main/java/com/example/demo/model/PointsFreezeRecord.java @@ -201,3 +201,4 @@ public class PointsFreezeRecord { + diff --git a/demo/src/main/java/com/example/demo/model/TaskQueue.java b/demo/src/main/java/com/example/demo/model/TaskQueue.java index 7df4534..de91209 100644 --- a/demo/src/main/java/com/example/demo/model/TaskQueue.java +++ b/demo/src/main/java/com/example/demo/model/TaskQueue.java @@ -269,3 +269,4 @@ public class TaskQueue { + diff --git a/demo/src/main/java/com/example/demo/model/TaskStatus.java b/demo/src/main/java/com/example/demo/model/TaskStatus.java index 788306e..e3214d8 100644 --- a/demo/src/main/java/com/example/demo/model/TaskStatus.java +++ b/demo/src/main/java/com/example/demo/model/TaskStatus.java @@ -261,3 +261,4 @@ public class TaskStatus { + diff --git a/demo/src/main/java/com/example/demo/repository/TaskStatusRepository.java b/demo/src/main/java/com/example/demo/repository/TaskStatusRepository.java index 1dc99b5..1c1c948 100644 --- a/demo/src/main/java/com/example/demo/repository/TaskStatusRepository.java +++ b/demo/src/main/java/com/example/demo/repository/TaskStatusRepository.java @@ -69,3 +69,4 @@ public interface TaskStatusRepository extends JpaRepository { + diff --git a/demo/src/main/java/com/example/demo/security/PlainTextPasswordEncoder.java b/demo/src/main/java/com/example/demo/security/PlainTextPasswordEncoder.java index 6519727..86e1b4a 100644 --- a/demo/src/main/java/com/example/demo/security/PlainTextPasswordEncoder.java +++ b/demo/src/main/java/com/example/demo/security/PlainTextPasswordEncoder.java @@ -38,5 +38,6 @@ public class PlainTextPasswordEncoder implements PasswordEncoder { + diff --git a/demo/src/main/java/com/example/demo/service/PayPalService.java b/demo/src/main/java/com/example/demo/service/PayPalService.java deleted file mode 100644 index 8558720..0000000 --- a/demo/src/main/java/com/example/demo/service/PayPalService.java +++ /dev/null @@ -1,202 +0,0 @@ -package com.example.demo.service; - -import com.example.demo.model.Payment; -import com.example.demo.model.PaymentMethod; -import com.example.demo.model.PaymentStatus; -import com.example.demo.repository.PaymentRepository; -import com.paypal.api.payments.*; -import com.paypal.base.rest.APIContext; -import com.paypal.base.rest.PayPalRESTException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Service; - -import java.time.LocalDateTime; -import java.util.*; - -@Service -public class PayPalService { - - private static final Logger logger = LoggerFactory.getLogger(PayPalService.class); - - private final PaymentRepository paymentRepository; - - @Value("${paypal.client-id}") - private String clientId; - - @Value("${paypal.client-secret}") - private String clientSecret; - - @Value("${paypal.mode}") - private String mode; - - @Value("${paypal.return-url}") - private String returnUrl; - - @Value("${paypal.cancel-url}") - private String cancelUrl; - - public PayPalService(PaymentRepository paymentRepository) { - this.paymentRepository = paymentRepository; - } - - /** - * 创建PayPal支付订单 - */ - public String createPayment(Payment payment) { - try { - // 设置支付状态 - payment.setStatus(PaymentStatus.PENDING); - payment.setPaymentMethod(PaymentMethod.PAYPAL); - payment.setOrderId(generateOrderId()); - payment.setReturnUrl(returnUrl); - - // 保存支付记录 - paymentRepository.save(payment); - - // 创建API上下文 - APIContext apiContext = new APIContext(clientId, clientSecret, mode); - - // 创建支付金额 - Amount amount = new Amount(); - amount.setCurrency(payment.getCurrency()); - amount.setTotal(payment.getAmount().toString()); - - // 创建交易 - Transaction transaction = new Transaction(); - transaction.setAmount(amount); - transaction.setDescription(payment.getDescription() != null ? payment.getDescription() : "商品支付"); - - // 创建交易列表 - List transactions = new ArrayList<>(); - transactions.add(transaction); - - // 创建支付者 - Payer payer = new Payer(); - payer.setPaymentMethod("paypal"); - - // 创建支付 - com.paypal.api.payments.Payment paypalPayment = new com.paypal.api.payments.Payment(); - paypalPayment.setIntent("sale"); - paypalPayment.setPayer(payer); - paypalPayment.setTransactions(transactions); - - // 设置重定向URL - RedirectUrls redirectUrls = new RedirectUrls(); - redirectUrls.setReturnUrl(returnUrl + "?paymentId={PAY_ID}&PayerID={PAYER_ID}"); - redirectUrls.setCancelUrl(cancelUrl); - paypalPayment.setRedirectUrls(redirectUrls); - - // 创建支付 - com.paypal.api.payments.Payment createdPayment = paypalPayment.create(apiContext); - - // 更新支付记录 - payment.setExternalTransactionId(createdPayment.getId()); - paymentRepository.save(payment); - - logger.info("PayPal支付订单创建成功,订单号:{},PayPal ID:{}", - payment.getOrderId(), createdPayment.getId()); - - // 获取批准URL - for (Links link : createdPayment.getLinks()) { - if ("approval_url".equals(link.getRel())) { - return link.getHref(); - } - } - - throw new RuntimeException("未找到PayPal批准URL"); - - } catch (PayPalRESTException e) { - logger.error("PayPal API调用异常:", e); - payment.setStatus(PaymentStatus.FAILED); - paymentRepository.save(payment); - throw new RuntimeException("PayPal支付服务异常:" + e.getMessage()); - } - } - - /** - * 执行PayPal支付 - */ - public boolean executePayment(String paymentId, String payerId) { - try { - // 创建API上下文 - APIContext apiContext = new APIContext(clientId, clientSecret, mode); - - // 创建支付执行 - PaymentExecution paymentExecution = new PaymentExecution(); - paymentExecution.setPayerId(payerId); - - // 获取支付信息 - com.paypal.api.payments.Payment payment = com.paypal.api.payments.Payment.get(apiContext, paymentId); - - // 执行支付 - com.paypal.api.payments.Payment executedPayment = payment.execute(apiContext, paymentExecution); - - // 查找支付记录 - Payment paymentRecord = paymentRepository.findByExternalTransactionId(paymentId) - .orElseThrow(() -> new RuntimeException("支付记录不存在:" + paymentId)); - - // 更新支付状态 - if ("approved".equals(executedPayment.getState())) { - paymentRecord.setStatus(PaymentStatus.SUCCESS); - paymentRecord.setPaidAt(LocalDateTime.now()); - logger.info("PayPal支付成功,订单号:{}", paymentRecord.getOrderId()); - } else { - paymentRecord.setStatus(PaymentStatus.FAILED); - logger.warn("PayPal支付失败,订单号:{},状态:{}", - paymentRecord.getOrderId(), executedPayment.getState()); - } - - paymentRepository.save(paymentRecord); - return true; - - } catch (PayPalRESTException e) { - logger.error("PayPal支付执行异常:", e); - return false; - } - } - - /** - * 处理PayPal Webhook通知 - */ - public boolean handleWebhook(Map params) { - try { - String eventType = params.get("event_type"); - String resourceType = params.get("resource_type"); - - logger.info("收到PayPal Webhook通知,事件类型:{},资源类型:{}", eventType, resourceType); - - if ("PAYMENT.SALE.COMPLETED".equals(eventType) && "sale".equals(resourceType)) { - String paymentId = params.get("resource.id"); - - // 查找支付记录 - Payment payment = paymentRepository.findByExternalTransactionId(paymentId) - .orElseThrow(() -> new RuntimeException("支付记录不存在:" + paymentId)); - - // 更新支付状态 - payment.setStatus(PaymentStatus.SUCCESS); - payment.setPaidAt(LocalDateTime.now()); - paymentRepository.save(payment); - - logger.info("PayPal Webhook处理成功,订单号:{}", payment.getOrderId()); - return true; - } - - return false; - - } catch (Exception e) { - logger.error("处理PayPal Webhook异常:", e); - return false; - } - } - - /** - * 生成订单号 - */ - private String generateOrderId() { - return "PP" + System.currentTimeMillis() + UUID.randomUUID().toString().substring(0, 8).toUpperCase(); - } -} - - diff --git a/demo/src/main/resources/application-prod.properties b/demo/src/main/resources/application-prod.properties index 896e384..726a3c3 100644 --- a/demo/src/main/resources/application-prod.properties +++ b/demo/src/main/resources/application-prod.properties @@ -38,12 +38,6 @@ alipay.sign-type=RSA2 alipay.notify-url=${ALIPAY_NOTIFY_URL} alipay.return-url=${ALIPAY_RETURN_URL} -# PayPal配置 (生产环境) -paypal.client-id=${PAYPAL_CLIENT_ID} -paypal.client-secret=${PAYPAL_CLIENT_SECRET} -paypal.mode=live -paypal.return-url=${PAYPAL_RETURN_URL} -paypal.cancel-url=${PAYPAL_CANCEL_URL} # JWT配置 - 使用环境变量 jwt.secret=${JWT_SECRET} diff --git a/demo/src/main/resources/db/migration/V3__Create_Task_Queue_Table.sql b/demo/src/main/resources/db/migration/V3__Create_Task_Queue_Table.sql index 1eb5138..5944169 100644 --- a/demo/src/main/resources/db/migration/V3__Create_Task_Queue_Table.sql +++ b/demo/src/main/resources/db/migration/V3__Create_Task_Queue_Table.sql @@ -28,3 +28,4 @@ CREATE TABLE IF NOT EXISTS task_queue ( + diff --git a/demo/src/main/resources/db/migration/V4__Add_Points_Freeze_System.sql b/demo/src/main/resources/db/migration/V4__Add_Points_Freeze_System.sql index 1d502c8..5d20961 100644 --- a/demo/src/main/resources/db/migration/V4__Add_Points_Freeze_System.sql +++ b/demo/src/main/resources/db/migration/V4__Add_Points_Freeze_System.sql @@ -27,3 +27,4 @@ CREATE TABLE IF NOT EXISTS points_freeze_records ( + diff --git a/demo/src/main/resources/db/migration/V6__Create_Task_Status_Table.sql b/demo/src/main/resources/db/migration/V6__Create_Task_Status_Table.sql index 52851df..d570831 100644 --- a/demo/src/main/resources/db/migration/V6__Create_Task_Status_Table.sql +++ b/demo/src/main/resources/db/migration/V6__Create_Task_Status_Table.sql @@ -30,3 +30,4 @@ CREATE TABLE task_status ( + diff --git a/demo/src/main/resources/templates/orders/admin.html b/demo/src/main/resources/templates/orders/admin.html index c80c148..e0f9b71 100644 --- a/demo/src/main/resources/templates/orders/admin.html +++ b/demo/src/main/resources/templates/orders/admin.html @@ -574,5 +574,6 @@ + diff --git a/demo/src/main/resources/templates/orders/detail.html b/demo/src/main/resources/templates/orders/detail.html index 942713a..1fbda52 100644 --- a/demo/src/main/resources/templates/orders/detail.html +++ b/demo/src/main/resources/templates/orders/detail.html @@ -490,5 +490,6 @@ + diff --git a/demo/src/main/resources/templates/orders/form.html b/demo/src/main/resources/templates/orders/form.html index 3c1f68b..51d58eb 100644 --- a/demo/src/main/resources/templates/orders/form.html +++ b/demo/src/main/resources/templates/orders/form.html @@ -529,5 +529,6 @@ + diff --git a/demo/src/main/resources/templates/payment/form.html b/demo/src/main/resources/templates/payment/form.html index 575dc92..d94f66e 100644 --- a/demo/src/main/resources/templates/payment/form.html +++ b/demo/src/main/resources/templates/payment/form.html @@ -52,15 +52,6 @@ -
-
-
- -
PayPal
-

全球领先的在线支付

-
-
-
@@ -128,9 +119,6 @@ if (method === 'ALIPAY') { currencySelect.value = 'CNY'; currencySelect.options[0].selected = true; - } else if (method === 'PAYPAL') { - currencySelect.value = 'USD'; - currencySelect.options[1].selected = true; } } diff --git a/demo/start-image-to-video-test.bat b/demo/start-image-to-video-test.bat index 36dc864..28dfcc9 100644 --- a/demo/start-image-to-video-test.bat +++ b/demo/start-image-to-video-test.bat @@ -31,3 +31,4 @@ pause > nul + diff --git a/demo/test-api-connection.java b/demo/test-api-connection.java index c8e7275..36647d0 100644 --- a/demo/test-api-connection.java +++ b/demo/test-api-connection.java @@ -58,3 +58,4 @@ public class TestApiConnection { + diff --git a/demo/test_api.py b/demo/test_api.py index 1c832d4..e7c40ea 100644 --- a/demo/test_api.py +++ b/demo/test_api.py @@ -17,3 +17,4 @@ except Exception as e: + diff --git a/demo/test_jwt.py b/demo/test_jwt.py index f094aba..3257c96 100644 --- a/demo/test_jwt.py +++ b/demo/test_jwt.py @@ -25,3 +25,4 @@ else: + diff --git a/demo/test_payment.py b/demo/test_payment.py index bc6966f..34ef309 100644 --- a/demo/test_payment.py +++ b/demo/test_payment.py @@ -61,3 +61,4 @@ if __name__ == "__main__": + diff --git a/test_alipay_connection.py b/test_alipay_connection.py index f7c0b29..c96ad83 100644 --- a/test_alipay_connection.py +++ b/test_alipay_connection.py @@ -82,3 +82,4 @@ if __name__ == "__main__": + diff --git a/test_api.py b/test_api.py index 1c832d4..e7c40ea 100644 --- a/test_api.py +++ b/test_api.py @@ -17,3 +17,4 @@ except Exception as e: +