diff --git a/src/main/java/com/sczx/pay/controller/AliPayOrderCloseController.java b/src/main/java/com/sczx/pay/controller/AliPayOrderCloseController.java new file mode 100644 index 0000000..015d37a --- /dev/null +++ b/src/main/java/com/sczx/pay/controller/AliPayOrderCloseController.java @@ -0,0 +1,44 @@ +package com.sczx.pay.controller; + +import com.alipay.api.*; + +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; +import lombok.extern.slf4j.Slf4j; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +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; + +import javax.servlet.http.HttpServletRequest; + + +@Api(value = "支付宝租赁订单关闭接口", tags = "支付宝租赁订单关闭接口") +@Slf4j +@RestController +@RequestMapping("/alipay/orderClose") +public class AliPayOrderCloseController { + private static final Logger logger = LoggerFactory.getLogger(AliPayOrderCloseController.class); + + @Autowired + private AliPayOrderCloseService aliPayOrderCloseService; + + /** + * 支付宝订单关闭接口 + */ + @ApiOperation(value = "支付宝订单关闭接口") + @PostMapping("/orderClose") + public AlipayCommerceRentOrderCloseResponse aliPayOrderClose(@RequestBody AlipayOrderCloseRequest alipayOrderCloseRequest) { + log.info("支付宝订单关闭接口请求: {}", alipayOrderCloseRequest); + return aliPayOrderCloseService.aliPayOrderClose(alipayOrderCloseRequest); + } + + + +} diff --git a/src/main/java/com/sczx/pay/dto/AlipayOrderCloseRequest.java b/src/main/java/com/sczx/pay/dto/AlipayOrderCloseRequest.java new file mode 100644 index 0000000..b1d6caf --- /dev/null +++ b/src/main/java/com/sczx/pay/dto/AlipayOrderCloseRequest.java @@ -0,0 +1,15 @@ +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; // 买家支付宝用户唯一标识 + +} diff --git a/src/main/java/com/sczx/pay/entity/ReasonCodes.java b/src/main/java/com/sczx/pay/entity/ReasonCodes.java new file mode 100644 index 0000000..e886e27 --- /dev/null +++ b/src/main/java/com/sczx/pay/entity/ReasonCodes.java @@ -0,0 +1,165 @@ +package com.sczx.pay.entity; + +public enum ReasonCodes { + + /** + * 用户租赁计划有变 + */ + USER_LEASE_PLAN_CHANGED("3103", "用户租赁计划有变"), + + /** + * 用户订单信息错误(租期、地址、商品信息等) + */ + USER_ORDER_INFO_ERROR("3104", "用户订单信息错误(租期、地址、商品信息等)"), + + /** + * 用户测试或误操作 + */ + USER_TEST_OR_MISOPERATION("3105", "用户测试或误操作"), + + /** + * 用户重复下单 + */ + USER_DUPLICATE_ORDER("3106", "用户重复下单"), + + /** + * 用户不接电话 + */ + USER_NOT_ANSWERING_CALLS("3107", "用户不接电话"), + + /** + * 租金扣款失败 + */ + RENT_DEDUCTION_FAILED("3108", "租金扣款失败"), + + /** + * 用户不愿意预付租金 + */ + USER_REFUSES_PREPAY_RENT("3109", "用户不愿意预付租金"), + + /** + * 用户不愿意付押金 + */ + USER_REFUSES_DEPOSIT("3110", "用户不愿意付押金"), + + /** + * 用户对价格不认可 + */ + USER_PRICE_DISAGREEMENT("3111", "用户对价格不认可"), + + /** + * 用户担心非正品 + */ + USER_WORRIED_NOT_AUTHENTIC("3132", "用户担心非正品"), + + /** + * 用户担心商品损坏 + */ + USER_WORRIED_PRODUCT_DAMAGE("3133", "用户担心商品损坏"), + + /** + * 用户不要监管机 + */ + USER_REFUSES_SUPERVISED_DEVICE("3134", "用户不要监管机"), + + /** + * 收货地区不支持发货 + */ + DELIVERY_AREA_NOT_SUPPORTED("3135", "收货地区不支持发货"), + + /** + * 已购买同款商品 + */ + ALREADY_PURCHASED_SAME_PRODUCT("3136", "已购买同款商品"), + + /** + * 用户电话空号/关机 + */ + USER_PHONE_UNAVAILABLE("3137", "用户电话空号/关机"), + + /** + * 用户提供虚假信息 + */ + USER_PROVIDED_FALSE_INFO("3112", "用户提供虚假信息"), + + /** + * 用户不配合补充审核资料 + */ + USER_NOT_COOPERATING_AUDIT("3113", "用户不配合补充审核资料"), + + /** + * 用户资质问题 + */ + USER_QUALIFICATION_ISSUES("3114", "用户资质问题"), + + /** + * 智安盾高风险用户 + */ + HIGH_RISK_USER("3115", "智安盾高风险用户"), + + /** + * 审核时间过长 + */ + AUDIT_TIME_TOO_LONG("3138", "审核时间过长"), + + /** + * 商家私下要我隐私资料 + */ + MERCHANT_ASKING_PRIVATE_INFO("3139", "商家私下要我隐私资料"), + + /** + * 发货时间来不及 + */ + DELIVERY_TIME_INSUFFICIENT("3116", "发货时间来不及"), + + /** + * 商品缺货 + */ + PRODUCT_OUT_OF_STOCK("3117", "商品缺货"), + + /** + * 无物流信息 + */ + NO_LOGISTICS_INFO("3140", "无物流信息"), + + /** + * 服务态度差 + */ + POOR_SERVICE_ATTITUDE("3141", "服务态度差"), + + /** + * 私下收不合理费用 + */ + UNREASONABLE_PRIVATE_CHARGES("3142", "私下收不合理费用"), + + /** + * 联系不上商家 + */ + CANNOT_CONTACT_MERCHANT("3143", "联系不上商家"), + + /** + * 让我其他方式交易 + */ + ASKED_FOR_OTHER_TRANSACTION_METHOD("3144", "让我其他方式交易"); + + private final String code; + private final String description; + + ReasonCodes(String code, String description) { + this.code = code; + this.description = description; + } + + public String getCode() { + return code; + } + + public String getDescription() { + return description; + } + + @Override + public String toString() { + return code; + } +} diff --git a/src/main/java/com/sczx/pay/service/AliPayOrderCloseService.java b/src/main/java/com/sczx/pay/service/AliPayOrderCloseService.java new file mode 100644 index 0000000..8dacf4f --- /dev/null +++ b/src/main/java/com/sczx/pay/service/AliPayOrderCloseService.java @@ -0,0 +1,15 @@ +package com.sczx.pay.service; + +import com.alipay.api.response.AlipayCommerceRentOrderCloseResponse; +import com.sczx.pay.dto.AlipayOrderCloseRequest; + +public interface AliPayOrderCloseService { + + /** + * 支付宝订单关闭接口 + * @param alipayOrderCloseRequest + * @return + */ + public AlipayCommerceRentOrderCloseResponse aliPayOrderClose(AlipayOrderCloseRequest alipayOrderCloseRequest); + +} diff --git a/src/main/java/com/sczx/pay/service/impl/AliPayOrderCloseServiceImpl.java b/src/main/java/com/sczx/pay/service/impl/AliPayOrderCloseServiceImpl.java new file mode 100644 index 0000000..1a11458 --- /dev/null +++ b/src/main/java/com/sczx/pay/service/impl/AliPayOrderCloseServiceImpl.java @@ -0,0 +1,74 @@ +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.PayStatus; +import com.sczx.pay.entity.ReasonCodes; +import com.sczx.pay.mapper.OrderPayMapper; +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 +@Service +public class AliPayOrderCloseServiceImpl implements AliPayOrderCloseService { + + @Autowired + private AlipaySdkUtil alipaySdkUtil; + @Autowired + private OrderPayMapper orderPayMapper; + + /** + * 支付宝订单关闭接口 + * + * @param alipayOrderCloseRequest + * @return + */ + @Override + public AlipayCommerceRentOrderCloseResponse aliPayOrderClose(AlipayOrderCloseRequest alipayOrderCloseRequest) { + 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()); + + // 设置关单原因说明 + model.setReasonDesc(ReasonCodes.USER_QUALIFICATION_ISSUES.getDescription()); + + request.setBizModel(model); + // 第三方代调用模式下请设置app_auth_token + // request.putOtherTextParam("app_auth_token", "<-- 请填写应用授权令牌 -->"); + + response = alipaySdkUtil.execute(request); + log.info("支付宝订单关闭接口响应 : {}",response.getBody()); + if (response.isSuccess()) { + log.info("支付宝订单关闭接口调用成功,开始更新订单状态"); + /** 更新订单状态 */ + orderPayMapper.updateOrderStatus(alipayOrderCloseRequest.getOutOrderId(), PayStatus.CLOSED.getCode()); + } + } catch (Exception e) { + log.error("支付宝关闭异常,订单号: {}", alipayOrderCloseRequest.getOutOrderId(), e); + response.setCode("FAIL"); + response.setMsg("关闭订单失败异常: " + e.getMessage()); + } + return response; + } +}