diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/order/HardOrderEntity.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/order/HardOrderEntity.java index a62211489..0f1f7b4b4 100644 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/order/HardOrderEntity.java +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/order/HardOrderEntity.java @@ -35,7 +35,7 @@ public class HardOrderEntity extends Model { /** * 订单编号 */ - @Schema(description = "订单编号 目前正元正在使用") + @Schema(description = "订单编号 目前正元、微信支付、支付宝支付正在使用") private String orderNo; /** diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/config/AlipayConf.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/config/AlipayConf.java index c0d7c82ed..7aaec00d5 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/config/AlipayConf.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/config/AlipayConf.java @@ -25,6 +25,16 @@ public class AlipayConf { /** * 公钥 */ + private String publicKey; + + /** + * 支付宝公钥 + */ private String alipayPublicKey; + /** + * 回调地址 + */ + private String callbackUrl; + } diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/ali/AliPayController.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/ali/AliPayController.java new file mode 100644 index 000000000..173b1c7bf --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/ali/AliPayController.java @@ -0,0 +1,47 @@ +package com.bsd.pjcloud.hard.controller.ali; + +import com.bsd.pjcloud.common.security.annotation.Inner; +import com.bsd.pjcloud.hard.service.AlipayService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.servlet.http.HttpServletRequest; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.HashMap; +import java.util.Map; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/hard-ali-pay") +@Tag(description = "hard-ali-pay", name = "支付宝相关") +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +@Validated +public class AliPayController { + + private final AlipayService aliPayService; + + /* ************************************* start callback start ************************************* */ + + @Inner(value = false) + @PostMapping("/callback") + @Operation(summary = "支付宝回调") + public String refundCallback(HttpServletRequest request) { + Map parameterMap = request.getParameterMap(); + Map params = new HashMap<>(); + for (Map.Entry entry : parameterMap.entrySet()) { + params.put(entry.getKey(), entry.getValue()[0]); + } + return aliPayService.refundCallback(params); + } + + /* ************************************* end callback end ************************************* */ + +} diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/AlipayService.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/AlipayService.java index 1490154e5..d2c04b392 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/AlipayService.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/AlipayService.java @@ -38,5 +38,5 @@ public interface AlipayService { /** * 退款回调 */ - String refundCallback(HttpEntity httpEntity, @RequestHeader Map headers); + String refundCallback(Map params); } diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/ali/AlipayServiceImpl.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/ali/AlipayServiceImpl.java index b25b64275..8cec23710 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/ali/AlipayServiceImpl.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/ali/AlipayServiceImpl.java @@ -5,6 +5,7 @@ import com.alipay.api.AlipayClient; import com.alipay.api.AlipayConfig; import com.alipay.api.DefaultAlipayClient; import com.alipay.api.domain.*; +import com.alipay.api.internal.util.AlipaySignature; import com.alipay.api.request.*; import com.alipay.api.response.*; import com.bsd.pjcloud.hard.api.dto.ali.*; @@ -12,7 +13,6 @@ import com.bsd.pjcloud.hard.config.AlipayConf; import com.bsd.pjcloud.hard.service.AlipayService; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.http.HttpEntity; import org.springframework.stereotype.Service; import java.math.BigDecimal; @@ -71,6 +71,7 @@ public class AlipayServiceImpl implements AlipayService { // 支付场景 model.setScene("bar_code"); request.setBizModel(model); + request.setNotifyUrl(conf.getCallbackUrl()); try { AlipayTradePayResponse response = alipayClient.execute(request); String body = response.getBody(); @@ -148,6 +149,7 @@ public class AlipayServiceImpl implements AlipayService { // 退款单号 model.setOutRequestNo(String.valueOf(dto.getRefundId())); request.setBizModel(model); + request.setNotifyUrl(conf.getCallbackUrl()); try { AlipayTradeRefundResponse response = alipayClient.execute(request); String body = response.getBody(); @@ -170,6 +172,7 @@ public class AlipayServiceImpl implements AlipayService { // 退款单号 model.setOutRequestNo(String.valueOf(dto.getRefundId())); request.setBizModel(model); + request.setNotifyUrl(conf.getCallbackUrl()); try { AlipayTradeFastpayRefundQueryResponse response = alipayClient.execute(request); String body = response.getBody(); @@ -185,13 +188,19 @@ public class AlipayServiceImpl implements AlipayService { * 退款回调 */ @Override - public String refundCallback(HttpEntity httpEntity, Map headers) { - AlipayClient alipayClient = getClient(); + public String refundCallback(Map params) { + if (ObjectUtil.isEmpty(params)) return "fail"; try { - + boolean checkSignature = AlipaySignature.rsaCheckV1(params, conf.getAlipayPublicKey(), "UTF-8", "RSA2"); + if (!checkSignature) { + log.error("支付宝回调校验失败"); + return "fail"; + } + log.debug("支付宝回调参数:{}", params); + return "success"; } catch (Exception e) { log.error("退款回调", e); + return "fail"; } - return ""; } } diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardAfterSaleServiceImpl.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardAfterSaleServiceImpl.java index f9ebb11e1..cd257b370 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardAfterSaleServiceImpl.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardAfterSaleServiceImpl.java @@ -3,6 +3,7 @@ package com.bsd.pjcloud.hard.service.impl.order; import cn.hutool.core.util.ObjectUtil; import cn.hutool.extra.spring.SpringUtil; import cn.hutool.json.JSONUtil; +import com.alipay.api.response.AlipayTradeRefundResponse; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -26,6 +27,7 @@ import com.bsd.pjcloud.hard.api.constant.refund.HardAfterSaleOperateTypeEnum; import com.bsd.pjcloud.hard.api.constant.refund.HardRefundStatusEnum; import com.bsd.pjcloud.hard.api.constant.refund.HardSaleStatusEnum; import com.bsd.pjcloud.hard.api.constant.refund.HardSaleTypeEnum; +import com.bsd.pjcloud.hard.api.dto.ali.AliRefundDto; import com.bsd.pjcloud.hard.api.dto.order.HardAdminRefundDto; import com.bsd.pjcloud.hard.api.dto.order.HardAfterSaleDto; import com.bsd.pjcloud.hard.api.dto.order.HardDisagreeDto; @@ -42,6 +44,7 @@ import com.bsd.pjcloud.hard.api.vo.wechat.WechatRefundVo; import com.bsd.pjcloud.hard.mapper.order.HardAfterSaleLogMapper; import com.bsd.pjcloud.hard.mapper.order.HardAfterSaleMapper; import com.bsd.pjcloud.hard.mapper.order.HardOrderMapper; +import com.bsd.pjcloud.hard.service.AlipayService; import com.bsd.pjcloud.hard.service.HardAfterSaleService; import com.bsd.pjcloud.hard.service.HardOrderService; import com.bsd.pjcloud.hard.service.WechatPayService; @@ -73,6 +76,7 @@ public class HardAfterSaleServiceImpl extends ServiceImpl SELECT u.id, s.product_code, - s.barCode, s.pic_url, s.product_name, s.unit,