From 84c10d7f4f3f6474d56555cfa37fa7b3b4f438e6 Mon Sep 17 00:00:00 2001 From: dzc <2388224167@qq.com> Date: Fri, 6 Jun 2025 15:43:31 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E5=AE=8C=E6=88=90=E4=BB=98=E6=AC=BE?= =?UTF-8?q?=E7=A0=81=E6=94=AF=E4=BB=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/dto/wechat/WechantReverseDto.java | 21 ++++++++ .../api/dto/wechat/WechatMicropayDto.java | 8 +++- .../hard/api/dto/wechat/WechatRefundDto.java | 6 +++ .../hard/api/vo/wechat/WechantReverseVo.java | 44 +++++++++++++++++ .../hard/service/HardOrderService.java | 3 ++ .../hard/service/WechatPayService.java | 15 +++--- .../impl/order/HardOrderServiceImpl.java | 26 ++++++++-- .../impl/wechat/WechatPayServiceImpl.java | 48 +++++++++++++++++-- .../utils/constant/WechantPayConstant.java | 2 +- .../com/bsd/pjcloud/hard}/WechatPayTest.java | 23 +++++---- .../wechant/WechantPayController.java | 40 ---------------- 11 files changed, 167 insertions(+), 69 deletions(-) create mode 100644 pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/wechat/WechantReverseDto.java create mode 100644 pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/wechat/WechantReverseVo.java rename {pjcloud-wallet/pjcloud-wallet-biz/src/test/java/com/bsd/pjcloud/wallet => pjcloud-hardware/pjcloud-hardware-biz/src/test/java/hard/com/bsd/pjcloud/hard}/WechatPayTest.java (71%) delete mode 100644 pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/wechant/WechantPayController.java diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/wechat/WechantReverseDto.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/wechat/WechantReverseDto.java new file mode 100644 index 000000000..71e2ca977 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/wechat/WechantReverseDto.java @@ -0,0 +1,21 @@ +package com.bsd.pjcloud.hard.api.dto.wechat; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 撤销订单入参 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class WechantReverseDto { + + private Long orderId; + + private String wechantOrderId; + +} diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/wechat/WechatMicropayDto.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/wechat/WechatMicropayDto.java index 79b1b40d4..cdcecd72b 100644 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/wechat/WechatMicropayDto.java +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/wechat/WechatMicropayDto.java @@ -1,8 +1,14 @@ package com.bsd.pjcloud.hard.api.dto.wechat; +import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Data; +import lombok.NoArgsConstructor; @Data +@Builder +@AllArgsConstructor +@NoArgsConstructor public class WechatMicropayDto { /** @@ -18,7 +24,7 @@ public class WechatMicropayDto { /** * 支付金额(分) */ - private Long price; + private Integer price; /** * 微信付款码code diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/wechat/WechatRefundDto.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/wechat/WechatRefundDto.java index b3e67c85c..5fa3552c4 100644 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/wechat/WechatRefundDto.java +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/wechat/WechatRefundDto.java @@ -1,11 +1,17 @@ package com.bsd.pjcloud.hard.api.dto.wechat; +import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Data; +import lombok.NoArgsConstructor; /** * 退款入参 */ @Data +@Builder +@AllArgsConstructor +@NoArgsConstructor public class WechatRefundDto { private String orderId; diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/wechat/WechantReverseVo.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/wechat/WechantReverseVo.java new file mode 100644 index 000000000..b9bd73a5c --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/wechat/WechantReverseVo.java @@ -0,0 +1,44 @@ +package com.bsd.pjcloud.hard.api.vo.wechat; + +import cn.hutool.core.util.ObjectUtil; +import lombok.Data; + +/** + * 撤销订单返回 + */ +@Data +public class WechantReverseVo { + public static final String SUCCESS = "SUCCESS"; + + private String return_code; + + private String return_msg; + + private String appid; + + private String mch_id; + + private String nonce_str; + + private String sign; + + private String result_code; + + private String err_code; + + private String err_code_des; + + private String recall; + + public boolean isHttpSucess() { + return ObjectUtil.equals(WechatMicropayVo.SUCCESS, return_code); + } + + public boolean isPaySucess() { + return ObjectUtil.equals(WechatMicropayVo.SUCCESS, result_code); + } + + public boolean isAllSuccess() { + return isHttpSucess() && isPaySucess(); + } +} diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardOrderService.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardOrderService.java index 0cc4b93f6..9e04e2013 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardOrderService.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardOrderService.java @@ -35,6 +35,9 @@ public interface HardOrderService extends IService { HardOrderVo join(Long id); + /** + * 创建订单 + */ Long createOrder(HardCreateOrderDto dto); /** diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/WechatPayService.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/WechatPayService.java index e939494e4..f2f85f0a6 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/WechatPayService.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/WechatPayService.java @@ -1,14 +1,8 @@ package com.bsd.pjcloud.hard.service; -import com.bsd.pjcloud.hard.api.dto.wechat.WechatMicropayDto; -import com.bsd.pjcloud.hard.api.dto.wechat.WechatQueryDto; -import com.bsd.pjcloud.hard.api.dto.wechat.WechatRefundDto; -import com.bsd.pjcloud.hard.api.dto.wechat.WechatRefundQueryDto; -import com.bsd.pjcloud.hard.api.vo.wechat.WechatMicropayVo; -import com.bsd.pjcloud.hard.api.vo.wechat.WechatQueryVo; -import com.bsd.pjcloud.hard.api.vo.wechat.WechatRefundQueryVo; -import com.bsd.pjcloud.hard.api.vo.wechat.WechatRefundVo; +import com.bsd.pjcloud.hard.api.dto.wechat.*; +import com.bsd.pjcloud.hard.api.vo.wechat.*; import org.springframework.http.HttpEntity; import org.springframework.web.bind.annotation.RequestHeader; @@ -29,6 +23,11 @@ public interface WechatPayService { */ WechatQueryVo query(WechatQueryDto dto); + /** + * 撤销订单 + */ + WechantReverseVo reverse(WechantReverseDto dto); + /** * 申请退款 */ diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardOrderServiceImpl.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardOrderServiceImpl.java index 5afcb52fa..29ee720d5 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardOrderServiceImpl.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardOrderServiceImpl.java @@ -34,6 +34,9 @@ import com.bsd.pjcloud.hard.api.dto.order.HardCreateCarDto; import com.bsd.pjcloud.hard.api.dto.order.HardOrderDto; import com.bsd.pjcloud.hard.api.dto.order.app.HardAppCreateOrderDto; import com.bsd.pjcloud.hard.api.dto.spu.DeductionSpuStockDto; +import com.bsd.pjcloud.hard.api.dto.wechat.WechantReverseDto; +import com.bsd.pjcloud.hard.api.dto.wechat.WechatMicropayDto; +import com.bsd.pjcloud.hard.api.dto.wechat.WechatRefundDto; import com.bsd.pjcloud.hard.api.entity.HardApptEntity; import com.bsd.pjcloud.hard.api.entity.manager.HardManagerEntity; import com.bsd.pjcloud.hard.api.entity.order.HardCarEntity; @@ -45,6 +48,9 @@ import com.bsd.pjcloud.hard.api.vo.HardDoorFlowVo; import com.bsd.pjcloud.hard.api.vo.manager.HardManagerVo; import com.bsd.pjcloud.hard.api.vo.order.HardCarVo; import com.bsd.pjcloud.hard.api.vo.order.HardOrderVo; +import com.bsd.pjcloud.hard.api.vo.wechat.WechantReverseVo; +import com.bsd.pjcloud.hard.api.vo.wechat.WechatMicropayVo; +import com.bsd.pjcloud.hard.api.vo.wechat.WechatRefundVo; import com.bsd.pjcloud.hard.mapper.manager.HardManagerMapper; import com.bsd.pjcloud.hard.mapper.order.HardOrderMapper; import com.bsd.pjcloud.hard.service.*; @@ -105,6 +111,7 @@ public class HardOrderServiceImpl extends ServiceImpl params = new HashMap<>(); + // 公众账号ID + params.put("appid", wechatPay.getAppId()); + // 商户号 + params.put("mch_id", wechatPay.getMerchantId()); + // 微信订单号 + params.put("transaction_id", dto.getWechantOrderId()); + // 商户订单号 + params.put("out_trade_no", dto.getOrderId()); + // 随机字符串 + params.put("nonce_str", getNonceStr()); + // 签名 + params.put("sign", ""); + // 签名类型 + params.put("sign_type", "MD5"); + // 生成签名 + params.put("sign", generateSign(params)); + WechantPayConstant.Api api = initApi(WechantPayConstant.REVERSE); + api.setSslSocketFactory(createSSLSocketFactory()); + String res = api.getHttpRequest().body(XmlUtil.mapToXmlStr(params)).execute().body(); + log.debug("撤销订单,json,xml|{}", res); + if (ObjectUtil.isEmpty(res)) { + log.error("撤销订单,res为空"); + return null; + } + WechantReverseVo vo = JSONUtil.toBean(JSONUtil.toJsonStr(XmlUtil.xmlToMap(res)), WechantReverseVo.class); + log.debug("撤销订单,json,res|{}", JSONUtil.toJsonStr(vo)); + if (!vo.isHttpSucess()) { + return null; + } + return vo; + } catch (Exception e) { + log.error("撤销订单,异常", e); + return null; + } + } + /** * 申请退款 */ diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/utils/constant/WechantPayConstant.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/utils/constant/WechantPayConstant.java index 7b44a4638..551b87bca 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/utils/constant/WechantPayConstant.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/utils/constant/WechantPayConstant.java @@ -19,7 +19,7 @@ public class WechantPayConstant { public static final Api QUERY = Api.builder().summary("查询订单").url("/pay/orderquery").method(HttpMethod.POST).isNeedCertificate(false).build(); - public static final Api REVERSE = Api.builder().summary("撤销订单").url("/pay/reverse").method(HttpMethod.POST).isNeedCertificate(false).build(); + public static final Api REVERSE = Api.builder().summary("撤销订单").url("/secapi/pay/reverse").method(HttpMethod.POST).isNeedCertificate(true).build(); public static final Api REFUND = Api.builder().summary("申请退款").url("/secapi/pay/refund").method(HttpMethod.POST).isNeedCertificate(true).build(); diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/test/java/com/bsd/pjcloud/wallet/WechatPayTest.java b/pjcloud-hardware/pjcloud-hardware-biz/src/test/java/hard/com/bsd/pjcloud/hard/WechatPayTest.java similarity index 71% rename from pjcloud-wallet/pjcloud-wallet-biz/src/test/java/com/bsd/pjcloud/wallet/WechatPayTest.java rename to pjcloud-hardware/pjcloud-hardware-biz/src/test/java/hard/com/bsd/pjcloud/hard/WechatPayTest.java index c655e14d9..a47d09da5 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/test/java/com/bsd/pjcloud/wallet/WechatPayTest.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/test/java/hard/com/bsd/pjcloud/hard/WechatPayTest.java @@ -1,15 +1,14 @@ -package com.bsd.pjcloud.wallet; +package hard.com.bsd.pjcloud.hard; import cn.hutool.json.JSONUtil; -import com.bsd.pjcloud.thirdparty.dto.lb.LbH5LoginDto; -import com.bsd.pjcloud.thirdparty.vo.lb.LbH5LoginVo; -import com.bsd.pjcloud.wallet.api.dto.wechat.WechatMicropayDto; -import com.bsd.pjcloud.wallet.api.dto.wechat.WechatQueryDto; -import com.bsd.pjcloud.wallet.api.dto.wechat.WechatRefundDto; -import com.bsd.pjcloud.wallet.api.vo.wechat.WechatMicropayVo; -import com.bsd.pjcloud.wallet.api.vo.wechat.WechatQueryVo; -import com.bsd.pjcloud.wallet.api.vo.wechat.WechatRefundVo; -import com.bsd.pjcloud.wallet.service.WechatPayService; +import com.bsd.pjcloud.hard.HardApp; +import com.bsd.pjcloud.hard.api.dto.wechat.WechatMicropayDto; +import com.bsd.pjcloud.hard.api.dto.wechat.WechatQueryDto; +import com.bsd.pjcloud.hard.api.dto.wechat.WechatRefundDto; +import com.bsd.pjcloud.hard.api.vo.wechat.WechatMicropayVo; +import com.bsd.pjcloud.hard.api.vo.wechat.WechatQueryVo; +import com.bsd.pjcloud.hard.api.vo.wechat.WechatRefundVo; +import com.bsd.pjcloud.hard.service.WechatPayService; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; @@ -19,7 +18,7 @@ import org.springframework.boot.test.context.SpringBootTest; * 微信支付配置 */ @Slf4j -@SpringBootTest(classes = WalletApp.class) +@SpringBootTest(classes = HardApp.class) public class WechatPayTest { @Resource @@ -32,7 +31,7 @@ public class WechatPayTest { WechatMicropayDto dto = new WechatMicropayDto(); dto.setMerId(currentTimeMillis); dto.setOrderId(currentTimeMillis); - dto.setPrice(1L); + dto.setPrice(1); dto.setWechatQrCode("132796932599913148"); WechatMicropayVo micropay = wechatPayService.micropay(dto); diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/wechant/WechantPayController.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/wechant/WechantPayController.java deleted file mode 100644 index 120b9125f..000000000 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/wechant/WechantPayController.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.bsd.pjcloud.wallet.controller.wechant; - -import com.bsd.pjcloud.common.core.util.R; -import com.bsd.pjcloud.common.security.annotation.Inner; -import com.bsd.pjcloud.wallet.api.dto.WalletActiveDto; -import com.bsd.pjcloud.wallet.service.WechatPayService; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.security.SecurityRequirement; -import io.swagger.v3.oas.annotations.tags.Tag; -import lombok.RequiredArgsConstructor; -import org.springdoc.core.annotations.ParameterObject; -import org.springframework.http.HttpEntity; -import org.springframework.http.HttpHeaders; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.util.Map; - -@RestController -@RequiredArgsConstructor -@RequestMapping("/wallet-wechant-pay") -@Tag(description = "wallet-wechant", name = "微信相关") -@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) -@Validated -public class WechantPayController { - - private final WechatPayService wechatPayService; - - /* ************************************* start callback start ************************************* */ - - @Inner(value = false) - @PostMapping("/callback/refund") - @Operation(summary = "微信退款回调") - public String refundCallback(HttpEntity httpEntity, @RequestHeader Map headers) { - return wechatPayService.refundCallback(httpEntity, headers); - } - - /* ************************************* end callback end ************************************* */ - -}