From d42cf407aa95bcf1bc27ee0f54654f6707a7b119 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=B7=E5=86=B7?= <2270033969@qq.com> Date: Thu, 9 Jan 2025 23:11:43 +0800 Subject: [PATCH] =?UTF-8?q?refactor(pay):=20=E4=BC=98=E5=8C=96=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E5=9B=9E=E8=B0=83=E9=93=BE=E6=8E=A5=E6=A0=B9=E6=8D=AE?= =?UTF-8?q?=E6=9E=B6=E6=9E=84=E8=87=AA=E5=8A=A8=E9=80=82=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/AlipayWapPayOrderHandler.java | 18 ++- .../handler/impl/WeChatMpPayOrderHandler.java | 27 ++-- .../impl/YungouosMergePayOrderHandler.java | 130 ++++++++++-------- .../impl/PayRefundOrderServiceImpl.java | 45 +++--- 4 files changed, 127 insertions(+), 93 deletions(-) diff --git a/pigx-visual/pigx-pay-platform/src/main/java/com/pig4cloud/pigx/pay/handler/impl/AlipayWapPayOrderHandler.java b/pigx-visual/pigx-pay-platform/src/main/java/com/pig4cloud/pigx/pay/handler/impl/AlipayWapPayOrderHandler.java index 82eef0c82..30f92d448 100644 --- a/pigx-visual/pigx-pay-platform/src/main/java/com/pig4cloud/pigx/pay/handler/impl/AlipayWapPayOrderHandler.java +++ b/pigx-visual/pigx-pay-platform/src/main/java/com/pig4cloud/pigx/pay/handler/impl/AlipayWapPayOrderHandler.java @@ -20,6 +20,7 @@ package com.pig4cloud.pigx.pay.handler.impl; import cn.hutool.core.util.CharsetUtil; import cn.hutool.core.util.NumberUtil; import cn.hutool.extra.servlet.ServletUtil; +import cn.hutool.extra.spring.SpringUtil; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import com.alipay.api.AlipayApiException; @@ -80,10 +81,14 @@ public class AlipayWapPayOrderHandler extends AbstractPayOrderHandler { } JSONObject params = JSONUtil.parseObj(channel.getParam()); - AliPayApiConfig aliPayApiConfig = AliPayApiConfig.builder().setAppId(channel.getAppId()) - .setPrivateKey(params.getStr("privateKey")).setCharset(CharsetUtil.UTF_8) - .setAliPayPublicKey(params.getStr("publicKey")).setServiceUrl(params.getStr("serviceUrl")) - .setSignType("RSA2").build(); + AliPayApiConfig aliPayApiConfig = AliPayApiConfig.builder() + .setAppId(channel.getAppId()) + .setPrivateKey(params.getStr("privateKey")) + .setCharset(CharsetUtil.UTF_8) + .setAliPayPublicKey(params.getStr("publicKey")) + .setServiceUrl(params.getStr("serviceUrl")) + .setSignType("RSA2") + .build(); AliPayApiConfigKit.setThreadLocalAliPayApiConfig(aliPayApiConfig); return channel; } @@ -126,10 +131,13 @@ public class AlipayWapPayOrderHandler extends AbstractPayOrderHandler { model.setTotalAmount(NumberUtil.div(tradeOrder.getAmount(), "100", 2).toString()); model.setProductCode(goodsOrder.getGoodsId()); model.setPassbackParams(String.valueOf(TenantContextHolder.getTenantId())); + + Boolean isMicro = SpringUtil.getProperty("security.micro", Boolean.class, true); + try { log.info("拉起支付宝wap 支付参数 {}", model); AliPayApi.wapPay(response, model, ChannelPayApiConfigKit.get().getReturnUrl(), - ChannelPayApiConfigKit.get().getNotifyUrl() + "/admin/notify/ali/callbak"); + String.format("%s/api/%s/notify/ali/callbak", ChannelPayApiConfigKit.get().getNotifyUrl(), isMicro ? "pay" : "admin")); } catch (AlipayApiException e) { log.error("支付宝手机支付失败", e); diff --git a/pigx-visual/pigx-pay-platform/src/main/java/com/pig4cloud/pigx/pay/handler/impl/WeChatMpPayOrderHandler.java b/pigx-visual/pigx-pay-platform/src/main/java/com/pig4cloud/pigx/pay/handler/impl/WeChatMpPayOrderHandler.java index 18702db96..69558e129 100644 --- a/pigx-visual/pigx-pay-platform/src/main/java/com/pig4cloud/pigx/pay/handler/impl/WeChatMpPayOrderHandler.java +++ b/pigx-visual/pigx-pay-platform/src/main/java/com/pig4cloud/pigx/pay/handler/impl/WeChatMpPayOrderHandler.java @@ -18,6 +18,7 @@ package com.pig4cloud.pigx.pay.handler.impl; import cn.hutool.extra.servlet.ServletUtil; +import cn.hutool.extra.spring.SpringUtil; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.core.toolkit.Wrappers; @@ -78,8 +79,11 @@ public class WeChatMpPayOrderHandler extends AbstractPayOrderHandler { } JSONObject params = JSONUtil.parseObj(channel.getParam()); - WxPayApiConfig wx = WxPayApiConfig.builder().appId(channel.getAppId()).mchId(channel.getChannelMchId()) - .partnerKey(params.getStr("partnerKey")).build(); + WxPayApiConfig wx = WxPayApiConfig.builder() + .appId(channel.getAppId()) + .mchId(channel.getChannelMchId()) + .partnerKey(params.getStr("partnerKey")) + .build(); WxPayApiConfigKit.setThreadLocalWxPayApiConfig(wx); return channel; @@ -115,14 +119,21 @@ public class WeChatMpPayOrderHandler extends AbstractPayOrderHandler { String ip = ServletUtil.getClientIP(request); WxPayApiConfig wxPayApiConfig = WxPayApiConfigKit.getWxPayApiConfig(); - // 预订单参数 - Map params = UnifiedOrderModel.builder().appid(wxPayApiConfig.getAppId()) - .mch_id(wxPayApiConfig.getMchId()).nonce_str(WxPayKit.generateStr()).body(goodsOrder.getGoodsName()) + // 判断是否是单体架构 + Boolean isMicro = SpringUtil.getProperty("security.micro", Boolean.class, true); + Map params = UnifiedOrderModel.builder() + .appid(wxPayApiConfig.getAppId()) + .mch_id(wxPayApiConfig.getMchId()) + .nonce_str(WxPayKit.generateStr()) + .body(goodsOrder.getGoodsName()) .attach(TenantContextHolder.getTenantId().toString()) - .out_trade_no(String.valueOf(tradeOrder.getOrderId())).total_fee(goodsOrder.getAmount()) + .out_trade_no(String.valueOf(tradeOrder.getOrderId())) + .total_fee(goodsOrder.getAmount()) .spbill_create_ip(ip) - .notify_url(ChannelPayApiConfigKit.get().getNotifyUrl() + "/admin/notify/wx/callbak") - .trade_type(TradeType.JSAPI.getTradeType()).openid(goodsOrder.getUserId()).build() + .notify_url(String.format("%s/api/%s/notify/wx/callbak", ChannelPayApiConfigKit.get().getNotifyUrl(), isMicro ? "pay" : "admin")) + .trade_type(TradeType.JSAPI.getTradeType()) + .openid(goodsOrder.getUserId()) + .build() .createSign(wxPayApiConfig.getPartnerKey(), SignType.HMACSHA256); String xmlResult = WxPayApi.pushOrder(false, params); diff --git a/pigx-visual/pigx-pay-platform/src/main/java/com/pig4cloud/pigx/pay/handler/impl/YungouosMergePayOrderHandler.java b/pigx-visual/pigx-pay-platform/src/main/java/com/pig4cloud/pigx/pay/handler/impl/YungouosMergePayOrderHandler.java index 8b8f44d63..e62d78bcf 100644 --- a/pigx-visual/pigx-pay-platform/src/main/java/com/pig4cloud/pigx/pay/handler/impl/YungouosMergePayOrderHandler.java +++ b/pigx-visual/pigx-pay-platform/src/main/java/com/pig4cloud/pigx/pay/handler/impl/YungouosMergePayOrderHandler.java @@ -2,6 +2,7 @@ package com.pig4cloud.pigx.pay.handler.impl; import cn.hutool.core.util.NumberUtil; import cn.hutool.extra.servlet.ServletUtil; +import cn.hutool.extra.spring.SpringUtil; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.pig4cloud.pigx.common.data.tenant.TenantContextHolder; import com.pig4cloud.pigx.pay.entity.PayChannel; @@ -31,77 +32,84 @@ import javax.servlet.http.HttpServletRequest; @RequiredArgsConstructor public class YungouosMergePayOrderHandler extends AbstractPayOrderHandler { - private final PayTradeOrderMapper tradeOrderMapper; + private final PayTradeOrderMapper tradeOrderMapper; - private final PayGoodsOrderMapper goodsOrderMapper; + private final PayGoodsOrderMapper goodsOrderMapper; - private final PayChannelMapper channelMapper; + private final PayChannelMapper channelMapper; - private final HttpServletRequest request; + private final HttpServletRequest request; - /** - * 准备支付参数 - * @return - */ - @Override - public PayChannel preparePayParams() { - PayChannel channel = channelMapper.selectOne( - Wrappers.lambdaQuery().eq(PayChannel::getChannelId, PayChannelNameEnum.MERGE_PAY.name())); + /** + * 准备支付参数 + * + * @return + */ + @Override + public PayChannel preparePayParams() { + PayChannel channel = channelMapper.selectOne( + Wrappers.lambdaQuery().eq(PayChannel::getChannelId, PayChannelNameEnum.MERGE_PAY.name())); - if (channel == null) { - throw new IllegalArgumentException("聚合支付渠道配置为空"); - } + if (channel == null) { + throw new IllegalArgumentException("聚合支付渠道配置为空"); + } - return channel; - } + return channel; + } - /** - * 创建交易订单 - * @param goodsOrder 商品订单 - * @return - */ - @Override - public PayTradeOrder createTradeOrder(PayGoodsOrder goodsOrder) { - PayTradeOrder tradeOrder = new PayTradeOrder(); - tradeOrder.setOrderId(goodsOrder.getPayOrderId()); - tradeOrder.setAmount(goodsOrder.getAmount()); - tradeOrder.setChannelId(PayChannelNameEnum.MERGE_PAY.getName()); - tradeOrder.setChannelMchId(ChannelPayApiConfigKit.get().getChannelMchId()); - tradeOrder.setClientIp(ServletUtil.getClientIP(request)); - tradeOrder.setCurrency("CNY"); - tradeOrder.setStatus(OrderStatusEnum.INIT.getStatus()); - tradeOrder.setBody(goodsOrder.getGoodsName()); - tradeOrderMapper.insert(tradeOrder); - return tradeOrder; - } + /** + * 创建交易订单 + * + * @param goodsOrder 商品订单 + * @return + */ + @Override + public PayTradeOrder createTradeOrder(PayGoodsOrder goodsOrder) { + PayTradeOrder tradeOrder = new PayTradeOrder(); + tradeOrder.setOrderId(goodsOrder.getPayOrderId()); + tradeOrder.setAmount(goodsOrder.getAmount()); + tradeOrder.setChannelId(PayChannelNameEnum.MERGE_PAY.getName()); + tradeOrder.setChannelMchId(ChannelPayApiConfigKit.get().getChannelMchId()); + tradeOrder.setClientIp(ServletUtil.getClientIP(request)); + tradeOrder.setCurrency("CNY"); + tradeOrder.setStatus(OrderStatusEnum.INIT.getStatus()); + tradeOrder.setBody(goodsOrder.getGoodsName()); + tradeOrderMapper.insert(tradeOrder); + return tradeOrder; + } - /** - * 调起渠道支付 - * @param goodsOrder 商品订单 - * @param tradeOrder 交易订单 - * @return obj - */ - @Override - public Object pay(PayGoodsOrder goodsOrder, PayTradeOrder tradeOrder) { - PayChannel channel = ChannelPayApiConfigKit.get(); + /** + * 调起渠道支付 + * + * @param goodsOrder 商品订单 + * @param tradeOrder 交易订单 + * @return obj + */ + @Override + public Object pay(PayGoodsOrder goodsOrder, PayTradeOrder tradeOrder) { + PayChannel channel = ChannelPayApiConfigKit.get(); - String money = NumberUtil.div(tradeOrder.getAmount(), "100", 2).toString(); + String money = NumberUtil.div(tradeOrder.getAmount(), "100", 2).toString(); - return MergePay.nativePay(String.valueOf(tradeOrder.getOrderId()), money, channel.getChannelMchId(), - tradeOrder.getBody(), "1", TenantContextHolder.getTenantId().toString(), - ChannelPayApiConfigKit.get().getNotifyUrl() + "/admin/notify/merge/callbak", - ChannelPayApiConfigKit.get().getReturnUrl(), "", "", "", channel.getParam()); - } + // 判断是否是单体架构 + Boolean isMicro = SpringUtil.getProperty("security.micro", Boolean.class, true); - /** - * 更新订单信息 - * @param goodsOrder 商品订单 - * @param tradeOrder 交易订单 - */ - @Override - public void updateOrder(PayGoodsOrder goodsOrder, PayTradeOrder tradeOrder) { - tradeOrderMapper.updateById(tradeOrder); - goodsOrderMapper.updateById(goodsOrder); - } + return MergePay.nativePay(String.valueOf(tradeOrder.getOrderId()), money, channel.getChannelMchId(), + tradeOrder.getBody(), "1", TenantContextHolder.getTenantId().toString(), + String.format("%s/api/%s/notify/merge/callbak", ChannelPayApiConfigKit.get().getNotifyUrl(), isMicro ? "pay" : "admin"), + ChannelPayApiConfigKit.get().getReturnUrl(), "", "", "", channel.getParam()); + } + + /** + * 更新订单信息 + * + * @param goodsOrder 商品订单 + * @param tradeOrder 交易订单 + */ + @Override + public void updateOrder(PayGoodsOrder goodsOrder, PayTradeOrder tradeOrder) { + tradeOrderMapper.updateById(tradeOrder); + goodsOrderMapper.updateById(goodsOrder); + } } diff --git a/pigx-visual/pigx-pay-platform/src/main/java/com/pig4cloud/pigx/pay/service/impl/PayRefundOrderServiceImpl.java b/pigx-visual/pigx-pay-platform/src/main/java/com/pig4cloud/pigx/pay/service/impl/PayRefundOrderServiceImpl.java index 18459cf00..1b8fdabf8 100755 --- a/pigx-visual/pigx-pay-platform/src/main/java/com/pig4cloud/pigx/pay/service/impl/PayRefundOrderServiceImpl.java +++ b/pigx-visual/pigx-pay-platform/src/main/java/com/pig4cloud/pigx/pay/service/impl/PayRefundOrderServiceImpl.java @@ -17,11 +17,15 @@ package com.pig4cloud.pigx.pay.service.impl; import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.pig4cloud.pigx.pay.entity.PayChannel; import com.pig4cloud.pigx.pay.entity.PayRefundOrder; import com.pig4cloud.pigx.pay.handler.PayOrderRefundHandler; +import com.pig4cloud.pigx.pay.mapper.PayChannelMapper; import com.pig4cloud.pigx.pay.mapper.PayRefundOrderMapper; import com.pig4cloud.pigx.pay.service.PayRefundOrderService; +import com.pig4cloud.pigx.pay.utils.PayChannelNameEnum; import com.pig4cloud.pigx.pay.utils.RefundNameEnum; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -37,26 +41,29 @@ import java.util.Map; @Service @RequiredArgsConstructor public class PayRefundOrderServiceImpl extends ServiceImpl - implements PayRefundOrderService { + implements PayRefundOrderService { - private final Map refundHandlerMap; + private final Map refundHandlerMap; - /** - * 退款操作 - * @param refundOrder refundOrder - * @return true/false - */ - @Override - public Boolean refund(PayRefundOrder refundOrder) { - String channelId = refundOrder.getChannelId(); - // 判断用哪个通道 - if (StrUtil.containsAnyIgnoreCase(channelId, "ali")) { - refundHandlerMap.get(RefundNameEnum.ALIPAY.getName()).handle(refundOrder); - } - else { - throw new UnsupportedOperationException(); - } - return null; - } + private final PayChannelMapper channelMapper; + + /** + * 退款操作 + * + * @param refundOrder refundOrder + * @return true/false + */ + @Override + public Boolean refund(PayRefundOrder refundOrder) { + PayChannel payChannel = channelMapper.selectOne(Wrappers.lambdaQuery().eq(PayChannel::getChannelMchId, refundOrder.getChannelMchId())); + + + // 判断用哪个通道 + if (StrUtil.equals(payChannel.getChannelId(), PayChannelNameEnum.ALIPAY_WAP.getName())) { + refundHandlerMap.get(RefundNameEnum.ALIPAY.getName()).handle(refundOrder); + } + + throw new UnsupportedOperationException("暂不支持该渠道退款"); + } }