From d3b58e3174cb5db681044af7eb09a8961bb09b15 Mon Sep 17 00:00:00 2001 From: JoeWoo Date: Sun, 22 Mar 2020 11:13:36 +0800 Subject: [PATCH] =?UTF-8?q?:art:=20#1458=20=E5=BE=AE=E4=BF=A1=E6=94=AF?= =?UTF-8?q?=E4=BB=98createOrder=E6=96=B9=E6=B3=95=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E4=B8=80=E4=B8=AA=E9=87=8D=E8=BD=BD=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 调用 WxPayService 的 T createOrder(WxPayUnifiedOrderRequest request) 时,经常找源码来看返回什么样的实体类,再强制转换。 通常在业务中使用此方法时,可以明确交易类型,所以添加一个交易类型的类,设置交易类型的同时,顺便作为确定 createOrder 返回类型的参数传入。 --- .../wxpay/constant/WxPayConstants.java | 54 +++++++++++++++++++ .../wxpay/service/WxPayService.java | 12 +++++ .../service/impl/BaseWxPayServiceImpl.java | 9 ++++ .../impl/BaseWxPayServiceImplTest.java | 18 +++++++ 4 files changed, 93 insertions(+) diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/constant/WxPayConstants.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/constant/WxPayConstants.java index 4f8480b6a..fbc499fed 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/constant/WxPayConstants.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/constant/WxPayConstants.java @@ -1,5 +1,10 @@ package com.github.binarywang.wxpay.constant; +import com.github.binarywang.wxpay.bean.order.WxPayAppOrderResult; +import com.github.binarywang.wxpay.bean.order.WxPayMpOrderResult; +import com.github.binarywang.wxpay.bean.order.WxPayMwebOrderResult; +import com.github.binarywang.wxpay.bean.order.WxPayNativeOrderResult; +import com.github.binarywang.wxpay.bean.result.WxPayMicropayResult; import com.google.common.collect.Lists; import org.apache.commons.lang3.time.FastDateFormat; @@ -103,6 +108,55 @@ public class WxPayConstants { * 刷卡支付有单独的支付接口,不调用统一下单接口 */ public static final String MICROPAY = "MICROPAY"; + + @SuppressWarnings("unused") + public abstract static class Specific { + + public abstract String getType(); + + private Specific() { + } + + public static Specific NATIVE = + new Specific() { + @Override + public String getType() { + return TradeType.NATIVE; + } + }; + + public static Specific APP = + new Specific() { + @Override + public String getType() { + return TradeType.APP; + } + }; + + public static Specific JSAPI = + new Specific() { + @Override + public String getType() { + return TradeType.JSAPI; + } + }; + + public static Specific MWEB = + new Specific() { + @Override + public String getType() { + return TradeType.MWEB; + } + }; + + public static Specific MICROPAY = + new Specific() { + @Override + public String getType() { + return TradeType.MICROPAY; + } + }; + } } /** diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/WxPayService.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/WxPayService.java index 52f99af6c..109ce34b9 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/WxPayService.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/WxPayService.java @@ -8,6 +8,7 @@ import com.github.binarywang.wxpay.bean.notify.WxScanPayNotifyResult; import com.github.binarywang.wxpay.bean.request.*; import com.github.binarywang.wxpay.bean.result.*; import com.github.binarywang.wxpay.config.WxPayConfig; +import com.github.binarywang.wxpay.constant.WxPayConstants; import com.github.binarywang.wxpay.exception.WxPayException; import java.io.File; @@ -166,6 +167,17 @@ public interface WxPayService { */ T createOrder(WxPayUnifiedOrderRequest request) throws WxPayException; + /** + * 调用统一下单接口,并组装生成支付所需参数对象. + * + * @see WxPayService#createOrder(WxPayUnifiedOrderRequest) + * @param specificTradeType 将使用的交易方式,不能为 null + * @param request 统一下单请求参数,设定的 tradeType 及配置里的 tradeType 将被忽略,转而使用 specificTradeType + * @return 返回 {@link WxPayConstants.TradeType.Specific} 指定的类 + * @throws WxPayException the wx pay exception + */ + T createOrder(WxPayConstants.TradeType.Specific specificTradeType, WxPayUnifiedOrderRequest request) throws WxPayException; + /** * 统一下单(详见https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_1) * 在发起微信支付前,需要调用统一下单接口,获取"预支付交易会话标识" diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/BaseWxPayServiceImpl.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/BaseWxPayServiceImpl.java index 61dcee09b..abf9a41e0 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/BaseWxPayServiceImpl.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/BaseWxPayServiceImpl.java @@ -351,6 +351,15 @@ public abstract class BaseWxPayServiceImpl implements WxPayService { } + @Override + public T createOrder(TradeType.Specific specificTradeType, WxPayUnifiedOrderRequest request) throws WxPayException { + if (specificTradeType == null) { + throw new IllegalArgumentException("specificTradeType 不能为 null"); + } + request.setTradeType(specificTradeType.getType()); + return createOrder(request); + } + @Override public WxPayUnifiedOrderResult unifiedOrder(WxPayUnifiedOrderRequest request) throws WxPayException { request.checkAndSign(this.getConfig()); diff --git a/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/service/impl/BaseWxPayServiceImplTest.java b/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/service/impl/BaseWxPayServiceImplTest.java index de7b1e586..dfb4ffb8c 100644 --- a/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/service/impl/BaseWxPayServiceImplTest.java +++ b/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/service/impl/BaseWxPayServiceImplTest.java @@ -144,6 +144,24 @@ public class BaseWxPayServiceImplTest { log.warn(this.payService.getWxApiData().toString()); } + @Test + public void testCreateOrderSpecific() throws Exception { + // Won't compile + // WxPayMpOrderResult result = payService.createOrder(TradeType.Specific.APP, new WxPayUnifiedOrderRequest()); + payService.createOrder( + TradeType.Specific.JSAPI, + WxPayUnifiedOrderRequest.newBuilder() + .body("我去") + .totalFee(1) + .productId("aaa") + .spbillCreateIp("11.1.11.1") + .notifyUrl("111111") + .outTradeNo("111111290") + .build() + ) + .getAppId(); + } + /** * Test get pay info. *