Merge branch 'main' into zhangli-test

This commit is contained in:
2025-09-08 01:54:35 +08:00
8 changed files with 172 additions and 91 deletions

View File

@ -1,9 +1,7 @@
package com.sczx.pay.controller;
import com.alipay.api.*;
import com.alipay.api.domain.AlipayCommerceRentOrderCloseModel;
import com.alipay.api.response.AlipayCommerceRentOrderCloseResponse;
import com.sczx.pay.dto.AlipayOrderCloseRequest;
import com.sczx.pay.service.AliPayOrderCloseService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@ -30,9 +28,9 @@ public class AliPayOrderCloseController {
*/
@ApiOperation(value = "支付宝订单关闭接口")
@PostMapping("/orderClose")
public AlipayCommerceRentOrderCloseResponse aliPayOrderClose(@RequestBody AlipayOrderCloseRequest alipayOrderCloseRequest) {
log.info("支付宝订单关闭接口请求: {}", alipayOrderCloseRequest);
return aliPayOrderCloseService.aliPayOrderClose(alipayOrderCloseRequest);
public AlipayCommerceRentOrderCloseResponse aliPayOrderClose(@RequestBody AlipayCommerceRentOrderCloseModel model) {
log.info("支付宝订单关闭接口请求: {}", model);
return aliPayOrderCloseService.aliPayOrderClose(model);
}

View File

@ -0,0 +1,49 @@
package com.sczx.pay.controller;
import com.alipay.api.domain.AlipayCommerceRentOrderFulfillmentFinishModel;
import com.alipay.api.response.AlipayCommerceRentOrderFulfillmentApproveResponse;
import com.alipay.api.domain.AlipayCommerceRentOrderFulfillmentApproveModel;
import com.alipay.api.response.AlipayCommerceRentOrderFulfillmentFinishResponse;
import com.sczx.pay.service.AliPayOrderFulfillmentService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Api(value = "支付宝订单履约接口", tags = "支付宝租赁履约接口")
@Slf4j
@RestController
@RequestMapping("/alipay/orderFulfillment")
public class AliPayOrderFulfillmentController {
@Autowired
private AliPayOrderFulfillmentService aliPayOrderFulfillmentService;
/**
* 支付宝订单履约审核接口
*/
@ApiOperation(value = "支付宝订单履约审核接口")
@PostMapping("/approve")
public AlipayCommerceRentOrderFulfillmentApproveResponse aliPayOrderFulfillmentApprove(@RequestBody AlipayCommerceRentOrderFulfillmentApproveModel model) {
log.info("支付宝订单履约审核接口请求: {}", model);
return aliPayOrderFulfillmentService.aliPayOrderFulfillmentApprove(model);
}
/**
* 支付宝订单履约完成接口
*/
@ApiOperation(value = "支付宝订单履约完成接口")
@PostMapping("/finish")
public AlipayCommerceRentOrderFulfillmentFinishResponse aliPayOrderFulfillmentFinish(@RequestBody AlipayCommerceRentOrderFulfillmentFinishModel model) {
log.info("支付宝订单履约审核接口请求: {}", model);
return aliPayOrderFulfillmentService.aliPayOrderFulfillmentFinish(model);
}
}

View File

@ -1,15 +0,0 @@
package com.sczx.pay.dto;
import lombok.Data;
@Data
public class AlipayOrderCloseRequest {
private String reasonCode; // 关单原因编码
private String reasonDesc; // 关单原因说明
private String orderId; // 交易组件订单号 orderId 和 outOrderId参数 二选一 传入
private String outOrderId; // 商户订单号
private String buyerId; // 买家ID buyerId 和 buyerOpenId 参数 二选一 传入
private String buyerOpenId; // 买家支付宝用户唯一标识
}

View File

@ -1,15 +1,15 @@
package com.sczx.pay.service;
import com.alipay.api.domain.AlipayCommerceRentOrderCloseModel;
import com.alipay.api.response.AlipayCommerceRentOrderCloseResponse;
import com.sczx.pay.dto.AlipayOrderCloseRequest;
public interface AliPayOrderCloseService {
/**
* 支付宝订单关闭接口
* @param alipayOrderCloseRequest
* @param model
* @return
*/
public AlipayCommerceRentOrderCloseResponse aliPayOrderClose(AlipayOrderCloseRequest alipayOrderCloseRequest);
public AlipayCommerceRentOrderCloseResponse aliPayOrderClose(AlipayCommerceRentOrderCloseModel model);
}

View File

@ -0,0 +1,25 @@
package com.sczx.pay.service;
import com.alipay.api.domain.AlipayCommerceRentOrderFulfillmentApproveModel;
import com.alipay.api.domain.AlipayCommerceRentOrderFulfillmentFinishModel;
import com.alipay.api.response.AlipayCommerceRentOrderFulfillmentApproveResponse;
import com.alipay.api.response.AlipayCommerceRentOrderFulfillmentFinishResponse;
public interface AliPayOrderFulfillmentService {
/**
* 支付宝订单履约审核
* @param model
* @return
*/
public AlipayCommerceRentOrderFulfillmentApproveResponse aliPayOrderFulfillmentApprove(AlipayCommerceRentOrderFulfillmentApproveModel model);
/**
* 支付宝订单履约完成
* @param model
* @return
*/
public AlipayCommerceRentOrderFulfillmentFinishResponse aliPayOrderFulfillmentFinish(AlipayCommerceRentOrderFulfillmentFinishModel model);
}

View File

@ -412,11 +412,6 @@ public class WechatPayService {
if(OrderStatus.equals("WAIT_PAY")){
orderPayMapper.updateOrderStatus(orderMain.getOrderNo(),"WAIT_PICK");
String subOrderId = orderPayMapper.getSubOrderIdByTradeNo(outTradeNo).toString();
if (!subOrderId.isEmpty()) {
String result = sendSubOrderId(subOrderId);
logger.info("调用subOrder接口结果: {}", result);
}
}else if (OrderStatus.equals("RERENT_WAIT_PAY")){
OrderSub orderSub = orderPayMapper.getSubOrderByTradeNo(outTradeNo);
orderPayMapper.updateOrderStatusAndEndRentTime(orderMain.getOrderNo(),orderSub.getReturnTime(),0,orderMain.getOrderAmount().add(orderSub.getAmount()),"RENT_ING");
@ -565,49 +560,4 @@ public class WechatPayService {
}
}
/**
* 发送subOrderId到指定接口
* @param subOrderId 子订单ID
* @return 响应结果
*/
public String sendSubOrderId(String subOrderId) {
try {
// 构造完整的URL将subOrderId作为参数传递
String url = "http://115.190.8.52:8016/send/subOrder/" + subOrderId;
// 创建URL对象
java.net.URL obj = new java.net.URL(url);
java.net.HttpURLConnection connection = (java.net.HttpURLConnection) obj.openConnection();
// 设置请求方法为GET
connection.setRequestMethod("GET");
// 设置连接超时和读取超时
connection.setConnectTimeout(5000);
connection.setReadTimeout(5000);
// 获取响应码
int responseCode = connection.getResponseCode();
logger.info("发送subOrderId请求URL: {}, 响应码: {}", url, responseCode);
// 读取响应内容
java.io.BufferedReader in = new java.io.BufferedReader(
new java.io.InputStreamReader(connection.getInputStream())
);
String inputLine;
StringBuilder response = new StringBuilder();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
return response.toString();
} catch (Exception e) {
logger.error("发送subOrderId到接口失败subOrderId: {}", subOrderId, e);
return "ERROR: " + e.getMessage();
}
}
}

View File

@ -1,10 +1,9 @@
package com.sczx.pay.service.impl;
import com.alipay.api.AlipayResponse;
import com.alipay.api.domain.AlipayCommerceRentOrderCloseModel;
import com.alipay.api.request.AlipayCommerceRentOrderCloseRequest;
import com.alipay.api.response.AlipayCommerceRentOrderCloseResponse;
import com.sczx.pay.dto.AlipayOrderCloseRequest;
import com.sczx.pay.entity.OrderMain;
import com.sczx.pay.entity.PayStatus;
import com.sczx.pay.entity.ReasonCodes;
import com.sczx.pay.mapper.OrderPayMapper;
@ -12,7 +11,6 @@ import com.sczx.pay.service.AliPayOrderCloseService;
import com.sczx.pay.utils.AlipaySdkUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
@Slf4j
@ -27,25 +25,15 @@ public class AliPayOrderCloseServiceImpl implements AliPayOrderCloseService {
/**
* 支付宝订单关闭接口
*
* @param alipayOrderCloseRequest
* @param model
* @return
*/
@Override
public AlipayCommerceRentOrderCloseResponse aliPayOrderClose(AlipayOrderCloseRequest alipayOrderCloseRequest) {
public AlipayCommerceRentOrderCloseResponse aliPayOrderClose(AlipayCommerceRentOrderCloseModel model) {
AlipayCommerceRentOrderCloseResponse response = new AlipayCommerceRentOrderCloseResponse();
try{
// 构造请求参数以调用接口
AlipayCommerceRentOrderCloseRequest request = new AlipayCommerceRentOrderCloseRequest();
AlipayCommerceRentOrderCloseModel model = new AlipayCommerceRentOrderCloseModel();
// 设置交易组件订单号
model.setOrderId(alipayOrderCloseRequest.getOrderId());
// 设置商户订单号
model.setOutOrderId(alipayOrderCloseRequest.getOutOrderId());
// 设置买家支付宝用户唯一标识
model.setBuyerOpenId(alipayOrderCloseRequest.getBuyerOpenId());
// 设置关单原因编码
model.setReasonCode(ReasonCodes.USER_QUALIFICATION_ISSUES.getCode());
@ -62,10 +50,14 @@ public class AliPayOrderCloseServiceImpl implements AliPayOrderCloseService {
if (response.isSuccess()) {
log.info("支付宝订单关闭接口调用成功,开始更新订单状态");
/** 更新订单状态 */
orderPayMapper.updateOrderStatus(alipayOrderCloseRequest.getOutOrderId(), PayStatus.CLOSED.getCode());
/** 履约审核通过,更新订单状态为租赁中 */
OrderMain orderMain = orderPayMapper.getOrderStatusByOrderNo(model.getOutOrderId());
orderPayMapper.updateOrderStatus(orderMain.getOrderNo(), PayStatus.CLOSED.getCode());
}else{
log.error("支付宝订单关闭接口调用失败OutOrderId: {}", model.getOutOrderId());
}
} catch (Exception e) {
log.error("支付宝关闭异常,订单号: {}", alipayOrderCloseRequest.getOutOrderId(), e);
log.error("支付宝关闭异常,OutOrderId: {}", model.getOutOrderId(), e);
response.setCode("FAIL");
response.setMsg("关闭订单失败异常: " + e.getMessage());
}

View File

@ -0,0 +1,82 @@
package com.sczx.pay.service.impl;
import com.alipay.api.domain.AlipayCommerceRentOrderFulfillmentApproveModel;
import com.alipay.api.domain.AlipayCommerceRentOrderFulfillmentFinishModel;
import com.alipay.api.request.AlipayCommerceRentOrderFulfillmentApproveRequest;
import com.alipay.api.request.AlipayCommerceRentOrderFulfillmentFinishRequest;
import com.alipay.api.response.AlipayCommerceRentOrderFulfillmentApproveResponse;
import com.alipay.api.response.AlipayCommerceRentOrderFulfillmentFinishResponse;
import com.sczx.pay.entity.OrderMain;
import com.sczx.pay.entity.OrderSub;
import com.sczx.pay.entity.PayStatus;
import com.sczx.pay.mapper.OrderPayMapper;
import com.sczx.pay.service.AliPayOrderFulfillmentService;
import com.sczx.pay.utils.AlipaySdkUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Slf4j
@Service
public class AliPayOrderFulfillmentServiceImpl implements AliPayOrderFulfillmentService {
@Autowired
private AlipaySdkUtil alipaySdkUtil;
@Autowired
private OrderPayMapper orderPayMapper;
public AlipayCommerceRentOrderFulfillmentApproveResponse aliPayOrderFulfillmentApprove(AlipayCommerceRentOrderFulfillmentApproveModel model) {
AlipayCommerceRentOrderFulfillmentApproveResponse response = new AlipayCommerceRentOrderFulfillmentApproveResponse();
try{
// 构造请求参数以调用接口
AlipayCommerceRentOrderFulfillmentApproveRequest request = new AlipayCommerceRentOrderFulfillmentApproveRequest();
request.setBizModel(model);
response = alipaySdkUtil.execute(request);
log.info("支付宝订单履约审核接口响应 : {}",response.getBody());
if (response.isSuccess()) {
log.info("支付宝订单履约审核接口调用成功,更新订单状态为租赁中,订单号: {}", model.getOutOrderId());
/** 履约审核通过,更新订单状态为租赁中 */
OrderMain orderMain = orderPayMapper.getOrderStatusByOrderNo(model.getOutOrderId());
orderPayMapper.updateOrderStatus(orderMain.getOrderNo(),"RENT_ING");
} else {
log.error("支付宝订单履约审核接口调用失败,OutOrderId: {}", model.getOutOrderId());
}
} catch (Exception e) {
log.error("支付宝订单履约审核异常,OutOrderId: {}", model.getOutOrderId(), e);
response.setCode("FAIL");
response.setMsg("支付宝订单履约审核失败异常: " + e.getMessage());
}
return response;
}
@Override
public AlipayCommerceRentOrderFulfillmentFinishResponse aliPayOrderFulfillmentFinish(AlipayCommerceRentOrderFulfillmentFinishModel model) {
AlipayCommerceRentOrderFulfillmentFinishResponse response = new AlipayCommerceRentOrderFulfillmentFinishResponse();
try{
// 构造请求参数以调用接口
AlipayCommerceRentOrderFulfillmentFinishRequest request = new AlipayCommerceRentOrderFulfillmentFinishRequest();
request.setBizModel(model);
response = alipaySdkUtil.execute(request);
log.info("支付宝订单履约完成接口响应 : {}",response.getBody());
if (response.isSuccess()) {
log.info("支付宝订单履约完成接口调用成功,更新订单状态为己结束-还车,订单号: {}", model.getOutOrderId());
/** 支付宝订单履约完成通过,更新订单状态为己结束-还车 */
//更新主订单状态
OrderMain orderMain = orderPayMapper.getOrderStatusByOrderNo(model.getOutOrderId());
orderPayMapper.updateOrderStatus(orderMain.getOrderNo(),"AUTO_END");
} else {
log.error("支付宝订单履约完成接口调用失败,OutOrderId: {}", model.getOutOrderId());
}
} catch (Exception e) {
log.error("支付宝订单履约完成异常,OutOrderId: {}", model.getOutOrderId(), e);
response.setCode("FAIL");
response.setMsg("支付宝订单履约完成异常: " + e.getMessage());
}
return response;
}
}