增加支付宝支付功能
This commit is contained in:
182
src/main/java/com/sczx/pay/controller/AliPaymentController.java
Normal file
182
src/main/java/com/sczx/pay/controller/AliPaymentController.java
Normal 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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user