调用 WxPayService 的 <T> T createOrder(WxPayUnifiedOrderRequest request) 时,经常找源码来看返回什么样的实体类,再强制转换。 通常在业务中使用此方法时,可以明确交易类型,所以添加一个交易类型的类,设置交易类型的同时,顺便作为确定 createOrder 返回类型的参数传入。dev1
| @@ -1,5 +1,10 @@ | |||||
| package com.github.binarywang.wxpay.constant; | 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 com.google.common.collect.Lists; | ||||
| import org.apache.commons.lang3.time.FastDateFormat; | import org.apache.commons.lang3.time.FastDateFormat; | ||||
| @@ -103,6 +108,55 @@ public class WxPayConstants { | |||||
| * 刷卡支付有单独的支付接口,不调用统一下单接口 | * 刷卡支付有单独的支付接口,不调用统一下单接口 | ||||
| */ | */ | ||||
| public static final String MICROPAY = "MICROPAY"; | public static final String MICROPAY = "MICROPAY"; | ||||
| @SuppressWarnings("unused") | |||||
| public abstract static class Specific<R> { | |||||
| public abstract String getType(); | |||||
| private Specific() { | |||||
| } | |||||
| public static Specific<WxPayNativeOrderResult> NATIVE = | |||||
| new Specific<WxPayNativeOrderResult>() { | |||||
| @Override | |||||
| public String getType() { | |||||
| return TradeType.NATIVE; | |||||
| } | |||||
| }; | |||||
| public static Specific<WxPayAppOrderResult> APP = | |||||
| new Specific<WxPayAppOrderResult>() { | |||||
| @Override | |||||
| public String getType() { | |||||
| return TradeType.APP; | |||||
| } | |||||
| }; | |||||
| public static Specific<WxPayMpOrderResult> JSAPI = | |||||
| new Specific<WxPayMpOrderResult>() { | |||||
| @Override | |||||
| public String getType() { | |||||
| return TradeType.JSAPI; | |||||
| } | |||||
| }; | |||||
| public static Specific<WxPayMwebOrderResult> MWEB = | |||||
| new Specific<WxPayMwebOrderResult>() { | |||||
| @Override | |||||
| public String getType() { | |||||
| return TradeType.MWEB; | |||||
| } | |||||
| }; | |||||
| public static Specific<WxPayMicropayResult> MICROPAY = | |||||
| new Specific<WxPayMicropayResult>() { | |||||
| @Override | |||||
| public String getType() { | |||||
| return TradeType.MICROPAY; | |||||
| } | |||||
| }; | |||||
| } | |||||
| } | } | ||||
| /** | /** | ||||
| @@ -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.request.*; | ||||
| import com.github.binarywang.wxpay.bean.result.*; | import com.github.binarywang.wxpay.bean.result.*; | ||||
| import com.github.binarywang.wxpay.config.WxPayConfig; | import com.github.binarywang.wxpay.config.WxPayConfig; | ||||
| import com.github.binarywang.wxpay.constant.WxPayConstants; | |||||
| import com.github.binarywang.wxpay.exception.WxPayException; | import com.github.binarywang.wxpay.exception.WxPayException; | ||||
| import java.io.File; | import java.io.File; | ||||
| @@ -166,6 +167,17 @@ public interface WxPayService { | |||||
| */ | */ | ||||
| <T> T createOrder(WxPayUnifiedOrderRequest request) throws WxPayException; | <T> 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> T createOrder(WxPayConstants.TradeType.Specific<T> specificTradeType, WxPayUnifiedOrderRequest request) throws WxPayException; | |||||
| /** | /** | ||||
| * 统一下单(详见https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_1) | * 统一下单(详见https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_1) | ||||
| * 在发起微信支付前,需要调用统一下单接口,获取"预支付交易会话标识" | * 在发起微信支付前,需要调用统一下单接口,获取"预支付交易会话标识" | ||||
| @@ -351,6 +351,15 @@ public abstract class BaseWxPayServiceImpl implements WxPayService { | |||||
| } | } | ||||
| @Override | |||||
| public <T> T createOrder(TradeType.Specific<T> specificTradeType, WxPayUnifiedOrderRequest request) throws WxPayException { | |||||
| if (specificTradeType == null) { | |||||
| throw new IllegalArgumentException("specificTradeType 不能为 null"); | |||||
| } | |||||
| request.setTradeType(specificTradeType.getType()); | |||||
| return createOrder(request); | |||||
| } | |||||
| @Override | @Override | ||||
| public WxPayUnifiedOrderResult unifiedOrder(WxPayUnifiedOrderRequest request) throws WxPayException { | public WxPayUnifiedOrderResult unifiedOrder(WxPayUnifiedOrderRequest request) throws WxPayException { | ||||
| request.checkAndSign(this.getConfig()); | request.checkAndSign(this.getConfig()); | ||||
| @@ -144,6 +144,24 @@ public class BaseWxPayServiceImplTest { | |||||
| log.warn(this.payService.getWxApiData().toString()); | 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. | * Test get pay info. | ||||
| * | * | ||||