增加支付宝支付功能

This commit is contained in:
2025-09-02 00:11:37 +08:00
parent 081a9491fd
commit 91c52a1281
15 changed files with 1000 additions and 0 deletions

View File

@ -0,0 +1,182 @@
package com.sczx.pay.controller;
import com.sczx.pay.dto.*;
import com.sczx.pay.service.AlipayService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
@Slf4j
@RestController
@RequestMapping("/api/alipay")
public class AliPaymentController {
@Autowired
private AlipayService alipayService;
/**
* 支付宝统一下单接口
*/
@PostMapping("/unifiedOrder")
public AlipayCreateResponse unifiedOrder(@RequestBody AlipayCreateRequest request) {
log.info("收到支付宝支付请求: {}", request);
return alipayService.unifiedOrder(request);
}
/**
* 查询订单接口
*/
@GetMapping("/query/{companyId}/{outTradeNo}")
public AlipayQueryResponse orderQuery(@PathVariable Long companyId, @PathVariable String outTradeNo) {
log.info("收到支付宝订单查询请求公司ID: {}, 订单号: {}", companyId, outTradeNo);
return alipayService.orderQuery(companyId, outTradeNo);
}
/**
* 关闭订单接口
*/
@PostMapping("/close")
public AlipayResponse closeOrder(@RequestBody AlipayCloseRequest request) {
log.info("收到支付宝关闭订单请求: {}", request);
return alipayService.closeOrder(request);
}
/**
* 申请退款接口
*/
@PostMapping("/refund")
public AlipayResponse refund(@RequestBody AlipayRefundRequest request) {
log.info("收到支付宝退款请求: {}", request);
return alipayService.refund(request);
}
/**
* 查询退款接口
*/
@PostMapping("/refundQuery")
public AlipayResponse refundQuery(@RequestBody AlipayRefundRequest request) {
log.info("收到支付宝退款查询请求: {}", request);
return alipayService.refundQuery(request);
}
/**
* 支付宝支付结果通知
*/
@PostMapping("/notify")
public String notify(HttpServletRequest request) {
try {
// 读取支付宝回调数据
Map<String, String> params = new HashMap<>();
Map<String, String[]> requestParams = request.getParameterMap();
for (Iterator<String> iter = requestParams.keySet().iterator(); iter.hasNext();) {
String name = iter.next();
String[] values = requestParams.get(name);
String valueStr = "";
for (int i = 0; i < values.length; i++) {
valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ",";
}
params.put(name, valueStr);
}
String outTradeNo = params.get("out_trade_no");
String companyIdStr = params.get("passback_params"); // 通过回传参数获取公司ID
Long companyId = companyIdStr != null ? Long.parseLong(companyIdStr) : null;
log.info("收到支付宝支付通知,数据: {}, 公司ID: {}, 订单号: {}", params, companyId, outTradeNo);
// 验证签名
if (!alipayService.verifyNotifySign(companyId, params)) {
log.warn("支付宝支付通知签名验证失败公司ID: {}", companyId);
return buildResponse("failure");
}
String tradeStatus = params.get("trade_status");
if (!"TRADE_SUCCESS".equals(tradeStatus) && !"TRADE_FINISHED".equals(tradeStatus)) {
log.warn("支付宝支付通知状态失败公司ID: {}: {}", companyId, tradeStatus);
return buildResponse("success"); // 状态不是成功时也返回success避免重复通知
}
// 处理支付成功的业务逻辑
String tradeNo = params.get("trade_no");
String totalAmount = params.get("total_amount");
// 更新数据库中的订单状态
boolean success = alipayService.processPaySuccessNotify(companyId, params);
if (success) {
log.info("支付宝支付成功公司ID: {}, 订单号: {}, 支付宝交易号: {}, 金额: {}",
companyId, outTradeNo, tradeNo, totalAmount);
return buildResponse("success");
} else {
log.error("更新支付宝支付状态失败公司ID: {}, 订单号: {}", companyId, outTradeNo);
return buildResponse("failure");
}
} catch (Exception e) {
log.error("处理支付宝支付通知异常", e);
return buildResponse("failure");
}
}
/**
* 支付宝退款结果通知
*/
@PostMapping("/refundNotify")
public String refundNotify(HttpServletRequest request) {
try {
// 读取支付宝退款回调数据
Map<String, String> params = new HashMap<>();
Map<String, String[]> requestParams = request.getParameterMap();
for (Iterator<String> iter = requestParams.keySet().iterator(); iter.hasNext();) {
String name = iter.next();
String[] values = requestParams.get(name);
String valueStr = "";
for (int i = 0; i < values.length; i++) {
valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ",";
}
params.put(name, valueStr);
}
log.info("收到支付宝退款通知, 数据: {}", params);
// 验证签名
// 注意:支付宝退款通知的签名验证方式可能与支付通知不同
// 这里简化处理,实际应根据支付宝文档实现
String outTradeNo = params.get("out_trade_no");
String refundStatus = params.get("refund_status");
if (!"REFUND_SUCCESS".equals(refundStatus)) {
log.warn("支付宝退款通知状态失败: {}", refundStatus);
return buildResponse("success");
}
// 处理退款通知的业务逻辑
String outRequestNo = params.get("out_request_no");
String refundAmount = params.get("refund_amount");
// 更新数据库中的退款状态
boolean success = alipayService.processRefundNotify(params);
if (success) {
log.info("支付宝退款处理完成,订单号: {}, 退款请求号: {}, 退款金额: {}, 状态: {}",
outTradeNo, outRequestNo, refundAmount, refundStatus);
return buildResponse("success");
} else {
log.error("更新支付宝退款状态失败,订单号: {}, 退款请求号: {}", outTradeNo, outRequestNo);
return buildResponse("failure");
}
} catch (Exception e) {
log.error("处理支付宝退款通知异常", e);
return buildResponse("failure");
}
}
private String buildResponse(String result) {
return result;
}
}