Skip to content

Commit d3b58e3

Browse files
authored
🎨 #1458 微信支付createOrder方法增加一个重载实现
调用 WxPayService 的 <T> T createOrder(WxPayUnifiedOrderRequest request) 时,经常找源码来看返回什么样的实体类,再强制转换。 通常在业务中使用此方法时,可以明确交易类型,所以添加一个交易类型的类,设置交易类型的同时,顺便作为确定 createOrder 返回类型的参数传入。
1 parent 6f7bc7c commit d3b58e3

File tree

4 files changed

+93
-0
lines changed

4 files changed

+93
-0
lines changed

weixin-java-pay/src/main/java/com/github/binarywang/wxpay/constant/WxPayConstants.java

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
package com.github.binarywang.wxpay.constant;
22

3+
import com.github.binarywang.wxpay.bean.order.WxPayAppOrderResult;
4+
import com.github.binarywang.wxpay.bean.order.WxPayMpOrderResult;
5+
import com.github.binarywang.wxpay.bean.order.WxPayMwebOrderResult;
6+
import com.github.binarywang.wxpay.bean.order.WxPayNativeOrderResult;
7+
import com.github.binarywang.wxpay.bean.result.WxPayMicropayResult;
38
import com.google.common.collect.Lists;
49
import org.apache.commons.lang3.time.FastDateFormat;
510

@@ -103,6 +108,55 @@ public static class TradeType {
103108
* 刷卡支付有单独的支付接口,不调用统一下单接口
104109
*/
105110
public static final String MICROPAY = "MICROPAY";
111+
112+
@SuppressWarnings("unused")
113+
public abstract static class Specific<R> {
114+
115+
public abstract String getType();
116+
117+
private Specific() {
118+
}
119+
120+
public static Specific<WxPayNativeOrderResult> NATIVE =
121+
new Specific<WxPayNativeOrderResult>() {
122+
@Override
123+
public String getType() {
124+
return TradeType.NATIVE;
125+
}
126+
};
127+
128+
public static Specific<WxPayAppOrderResult> APP =
129+
new Specific<WxPayAppOrderResult>() {
130+
@Override
131+
public String getType() {
132+
return TradeType.APP;
133+
}
134+
};
135+
136+
public static Specific<WxPayMpOrderResult> JSAPI =
137+
new Specific<WxPayMpOrderResult>() {
138+
@Override
139+
public String getType() {
140+
return TradeType.JSAPI;
141+
}
142+
};
143+
144+
public static Specific<WxPayMwebOrderResult> MWEB =
145+
new Specific<WxPayMwebOrderResult>() {
146+
@Override
147+
public String getType() {
148+
return TradeType.MWEB;
149+
}
150+
};
151+
152+
public static Specific<WxPayMicropayResult> MICROPAY =
153+
new Specific<WxPayMicropayResult>() {
154+
@Override
155+
public String getType() {
156+
return TradeType.MICROPAY;
157+
}
158+
};
159+
}
106160
}
107161

108162
/**

weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/WxPayService.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import com.github.binarywang.wxpay.bean.request.*;
99
import com.github.binarywang.wxpay.bean.result.*;
1010
import com.github.binarywang.wxpay.config.WxPayConfig;
11+
import com.github.binarywang.wxpay.constant.WxPayConstants;
1112
import com.github.binarywang.wxpay.exception.WxPayException;
1213

1314
import java.io.File;
@@ -166,6 +167,17 @@ public interface WxPayService {
166167
*/
167168
<T> T createOrder(WxPayUnifiedOrderRequest request) throws WxPayException;
168169

170+
/**
171+
* 调用统一下单接口,并组装生成支付所需参数对象.
172+
*
173+
* @see WxPayService#createOrder(WxPayUnifiedOrderRequest)
174+
* @param specificTradeType 将使用的交易方式,不能为 null
175+
* @param request 统一下单请求参数,设定的 tradeType 及配置里的 tradeType 将被忽略,转而使用 specificTradeType
176+
* @return 返回 {@link WxPayConstants.TradeType.Specific} 指定的类
177+
* @throws WxPayException the wx pay exception
178+
*/
179+
<T> T createOrder(WxPayConstants.TradeType.Specific<T> specificTradeType, WxPayUnifiedOrderRequest request) throws WxPayException;
180+
169181
/**
170182
* 统一下单(详见https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_1)
171183
* 在发起微信支付前,需要调用统一下单接口,获取"预支付交易会话标识"

weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/BaseWxPayServiceImpl.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -351,6 +351,15 @@ public <T> T createOrder(WxPayUnifiedOrderRequest request) throws WxPayException
351351

352352
}
353353

354+
@Override
355+
public <T> T createOrder(TradeType.Specific<T> specificTradeType, WxPayUnifiedOrderRequest request) throws WxPayException {
356+
if (specificTradeType == null) {
357+
throw new IllegalArgumentException("specificTradeType 不能为 null");
358+
}
359+
request.setTradeType(specificTradeType.getType());
360+
return createOrder(request);
361+
}
362+
354363
@Override
355364
public WxPayUnifiedOrderResult unifiedOrder(WxPayUnifiedOrderRequest request) throws WxPayException {
356365
request.checkAndSign(this.getConfig());

weixin-java-pay/src/test/java/com/github/binarywang/wxpay/service/impl/BaseWxPayServiceImplTest.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,24 @@ public void testCreateOrder_native() throws Exception {
144144
log.warn(this.payService.getWxApiData().toString());
145145
}
146146

147+
@Test
148+
public void testCreateOrderSpecific() throws Exception {
149+
// Won't compile
150+
// WxPayMpOrderResult result = payService.createOrder(TradeType.Specific.APP, new WxPayUnifiedOrderRequest());
151+
payService.createOrder(
152+
TradeType.Specific.JSAPI,
153+
WxPayUnifiedOrderRequest.newBuilder()
154+
.body("我去")
155+
.totalFee(1)
156+
.productId("aaa")
157+
.spbillCreateIp("11.1.11.1")
158+
.notifyUrl("111111")
159+
.outTradeNo("111111290")
160+
.build()
161+
)
162+
.getAppId();
163+
}
164+
147165
/**
148166
* Test get pay info.
149167
*

0 commit comments

Comments
 (0)