View Javadoc
1   package com.foxinmy.weixin4j.payment;
2   
3   import java.io.OutputStream;
4   import java.util.Date;
5   import java.util.List;
6   import java.util.concurrent.Future;
7   
8   import com.alibaba.fastjson.JSON;
9   import com.foxinmy.weixin4j.api.CashApi;
10  import com.foxinmy.weixin4j.api.CouponApi;
11  import com.foxinmy.weixin4j.api.CustomsApi;
12  import com.foxinmy.weixin4j.api.PayApi;
13  import com.foxinmy.weixin4j.exception.WeixinException;
14  import com.foxinmy.weixin4j.http.weixin.XmlResult;
15  import com.foxinmy.weixin4j.model.WeixinPayAccount;
16  import com.foxinmy.weixin4j.model.paging.Pageable;
17  import com.foxinmy.weixin4j.payment.coupon.CouponDetail;
18  import com.foxinmy.weixin4j.payment.coupon.CouponResult;
19  import com.foxinmy.weixin4j.payment.coupon.CouponStock;
20  import com.foxinmy.weixin4j.payment.mch.CorpPayment;
21  import com.foxinmy.weixin4j.payment.mch.CorpPaymentRecord;
22  import com.foxinmy.weixin4j.payment.mch.CorpPaymentResult;
23  import com.foxinmy.weixin4j.payment.mch.CustomsOrder;
24  import com.foxinmy.weixin4j.payment.mch.CustomsOrderRecord;
25  import com.foxinmy.weixin4j.payment.mch.CustomsOrderResult;
26  import com.foxinmy.weixin4j.payment.mch.MchPayPackage;
27  import com.foxinmy.weixin4j.payment.mch.MchPayRequest;
28  import com.foxinmy.weixin4j.payment.mch.MerchantResult;
29  import com.foxinmy.weixin4j.payment.mch.NativePayResponse;
30  import com.foxinmy.weixin4j.payment.mch.OpenIdResult;
31  import com.foxinmy.weixin4j.payment.mch.Order;
32  import com.foxinmy.weixin4j.payment.mch.PrePay;
33  import com.foxinmy.weixin4j.payment.mch.Redpacket;
34  import com.foxinmy.weixin4j.payment.mch.RedpacketRecord;
35  import com.foxinmy.weixin4j.payment.mch.RedpacketSendResult;
36  import com.foxinmy.weixin4j.payment.mch.RefundRecord;
37  import com.foxinmy.weixin4j.payment.mch.RefundResult;
38  import com.foxinmy.weixin4j.payment.mch.SceneInfoApp;
39  import com.foxinmy.weixin4j.payment.mch.SceneInfoStore;
40  import com.foxinmy.weixin4j.payment.mch.SettlementRecord;
41  import com.foxinmy.weixin4j.sign.WeixinSignature;
42  import com.foxinmy.weixin4j.type.CurrencyType;
43  import com.foxinmy.weixin4j.type.CustomsCity;
44  import com.foxinmy.weixin4j.type.IdQuery;
45  import com.foxinmy.weixin4j.type.TarType;
46  import com.foxinmy.weixin4j.type.mch.BillType;
47  import com.foxinmy.weixin4j.type.mch.RefundAccountType;
48  import com.foxinmy.weixin4j.util.Consts;
49  import com.foxinmy.weixin4j.util.Weixin4jConfigUtil;
50  
51  /**
52   * 微信支付接口实现
53   *
54   * @className WeixinPayProxy
55   * @author jinyu(foxinmy@gmail.com)
56   * @date 2015年1月3日
57   * @since JDK 1.6
58   * @see <a href="http://pay.weixin.qq.com/wiki/doc/api/index.html">商户平台支付API</a>
59   * @deprecated 迁移到子模块weixin4j-pay
60   */
61  @Deprecated
62  public class WeixinPayProxy {
63  
64  	/**
65  	 * 微信支付API:js支付、扫码支付等接口
66  	 */
67  	private final PayApi payApi;
68  	/**
69  	 * 代金券API
70  	 */
71  	private final CouponApi couponApi;
72  	/**
73  	 * 现金API
74  	 */
75  	private final CashApi cashApi;
76  	/**
77  	 * 海关API
78  	 */
79  	private final CustomsApi customsApi;
80  	/**
81  	 * 商户信息
82  	 */
83  	private final WeixinPayAccount weixinPayAccount;
84  
85  	/**
86  	 * 微信支付接口实现(使用weixin4j.properties配置的account商户信息)
87  	 */
88  	public WeixinPayProxy() {
89  		this(JSON.parseObject(Weixin4jConfigUtil.getValue("account"),
90  				WeixinPayAccount.class));
91  	}
92  
93  	/**
94  	 * 微信支付接口实现
95  	 *
96  	 * @param weixinPayAccount
97  	 *            微信商户信息
98  	 */
99  	public WeixinPayProxy(WeixinPayAccount weixinPayAccount) {
100 		if (weixinPayAccount == null) {
101 			throw new IllegalArgumentException(
102 					"weixinPayAccount must not be empty");
103 		}
104 		this.weixinPayAccount = weixinPayAccount;
105 		this.payApi = new PayApi(weixinPayAccount);
106 		this.couponApi = new CouponApi(weixinPayAccount);
107 		this.cashApi = new CashApi(weixinPayAccount);
108 		this.customsApi = new CustomsApi(weixinPayAccount);
109 	}
110 
111 	/**
112 	 * 获取微信商户账号信息
113 	 *
114 	 * @return
115 	 */
116 	public WeixinPayAccount getWeixinPayAccount() {
117 		return weixinPayAccount;
118 	}
119 
120 	/**
121 	 * 获取微信签名类
122 	 *
123 	 * @return
124 	 */
125 	public WeixinSignature getWeixinSignature() {
126 		return payApi.getWeixinSignature();
127 	}
128 
129 	/**
130 	 * 统一下单接口</br>
131 	 * 除被扫支付场景以外,商户系统先调用该接口在微信支付服务后台生成预支付交易单,返回正确的预支付交易回话标识后再按扫码、JSAPI
132 	 * 、APP等不同场景生成交易串调起支付。
133 	 *
134 	 * @param payPackage
135 	 *            包含订单信息的对象
136 	 * @see com.foxinmy.weixin4j.api.PayApi
137 	 * @see com.foxinmy.weixin4j.payment.mch.MchPayPackage
138 	 * @see com.foxinmy.weixin4j.payment.mch.PrePay
139 	 * @see <a href=
140 	 *      "http://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1">统一下单接口
141 	 *      </a>
142 	 * @return 预支付对象
143 	 */
144 	public PrePay createPrePay(MchPayPackage payPackage) throws WeixinException {
145 		return payApi.createPrePay(payPackage);
146 	}
147 
148 	/**
149 	 * 创建支付请求对象
150 	 *
151 	 * @param payPackage
152 	 *            支付详情
153 	 * @return 支付请求对象
154 	 * @see com.foxinmy.weixin4j.api.PayApi
155 	 * @see com.foxinmy.weixin4j.payment.mch.JSAPIPayRequest JS支付
156 	 * @see com.foxinmy.weixin4j.payment.mch.NATIVEPayRequest 扫码支付
157 	 * @see com.foxinmy.weixin4j.payment.mch.MICROPayRequest 刷卡支付
158 	 * @see com.foxinmy.weixin4j.payment.mch.APPPayRequest APP支付
159 	 * @see com.foxinmy.weixin4j.payment.mch.WAPPayRequest WAP支付
160 	 * @see com.foxinmy.weixin4j.payment.mch.MchPayRequest#toRequestString()
161 	 * @throws WeixinException
162 	 */
163 	public MchPayRequest createPayRequest(MchPayPackage payPackage)
164 			throws WeixinException {
165 		return payApi.createPayRequest(payPackage);
166 	}
167 
168 	/**
169 	 * 创建JSAPI支付请求对象
170 	 *
171 	 * @param openId
172 	 *            用户ID
173 	 * @param body
174 	 *            订单描述
175 	 * @param outTradeNo
176 	 *            订单号
177 	 * @param totalFee
178 	 *            订单总额(元)
179 	 * @param notifyUrl
180 	 *            支付通知地址
181 	 * @param createIp
182 	 *            ip地址
183 	 * @param attach
184 	 *            附加数据 非必填
185 	 * @see com.foxinmy.weixin4j.api.PayApi
186 	 * @see com.foxinmy.weixin4j.payment.mch.JSAPIPayRequest
187 	 * @see com.foxinmy.weixin4j.payment.mch.MchPayRequest#toRequestString()
188 	 * @return JSAPI支付对象
189 	 * @throws WeixinException
190 	 */
191 	public MchPayRequest createJSPayRequest(String openId, String body,
192 			String outTradeNo, double totalFee, String notifyUrl,
193 			String createIp, String attach) throws WeixinException {
194 		return payApi.createJSPayRequest(openId, body, outTradeNo, totalFee,
195 				notifyUrl, createIp, attach);
196 	}
197 
198 	/**
199 	 * <p>
200 	 * 生成编辑地址请求
201 	 * </p>
202 	 *
203 	 * err_msg edit_address:ok获取编辑收货地址成功</br> edit_address:fail获取编辑收货地址失败</br>
204 	 * userName 收货人姓名</br> telNumber 收货人电话</br> addressPostalCode 邮编</br>
205 	 * proviceFirstStageName 国标收货地址第一级地址</br> addressCitySecondStageName
206 	 * 国标收货地址第二级地址</br> addressCountiesThirdStageName 国标收货地址第三级地址</br>
207 	 * addressDetailInfo 详细收货地址信息</br> nationalCode 收货地址国家码</br>
208 	 *
209 	 * @param url
210 	 *            当前访问页的URL
211 	 * @param oauthToken
212 	 *            oauth授权时产生的token
213 	 * @see com.foxinmy.weixin4j.api.PayApi
214 	 * @see <a href=
215 	 *      "https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_8&index=7">
216 	 *      收货地址共享</a>
217 	 * @return 编辑地址请求JSON串
218 	 */
219 	public String createAddressRequestJSON(String url, String oauthToken) {
220 		return payApi.createAddressRequestJSON(url, oauthToken);
221 	}
222 
223 	/**
224 	 * 创建Native支付(扫码支付)链接【模式一】
225 	 *
226 	 * @param productId
227 	 *            与订单ID等价
228 	 * @return 支付链接
229 	 * @see com.foxinmy.weixin4j.api.PayApi
230 	 * @see <a href=
231 	 *      "https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_1">扫码支付
232 	 *      </a>
233 	 * @see <a href=
234 	 *      "https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_4">模式一
235 	 *      </a>
236 	 */
237 	public String createNativePayRequest(String productId) {
238 		return payApi.createNativePayRequest(productId);
239 	}
240 
241 	/**
242 	 * 创建Native支付(扫码支付)回调对象【模式一】
243 	 *
244 	 * @param productId
245 	 *            商品ID
246 	 * @param body
247 	 *            商品描述
248 	 * @param outTradeNo
249 	 *            商户内部唯一订单号
250 	 * @param totalFee
251 	 *            商品总额 单位元
252 	 * @param notifyUrl
253 	 *            支付回调URL
254 	 * @param createIp
255 	 *            订单生成的机器 IP
256 	 * @param attach
257 	 *            附加数据 非必填
258 	 * @return Native回调对象
259 	 * @see com.foxinmy.weixin4j.api.PayApi
260 	 * @see com.foxinmy.weixin4j.payment.mch.NativePayResponse
261 	 * @see <a href=
262 	 *      "https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_1">扫码支付
263 	 *      </a>
264 	 * @see <a href=
265 	 *      "https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_4">模式一
266 	 *      </a>
267 	 * @throws WeixinException
268 	 */
269 	public NativePayResponse createNativePayResponse(String productId,
270 			String body, String outTradeNo, double totalFee, String notifyUrl,
271 			String createIp, String attach) throws WeixinException {
272 		return payApi.createNativePayResponse(productId, body, outTradeNo,
273 				totalFee, notifyUrl, createIp, attach);
274 	}
275 
276 	/**
277 	 * 创建Native支付(扫码支付)链接【模式二】
278 	 *
279 	 * @param productId
280 	 *            商品ID
281 	 * @param body
282 	 *            商品描述
283 	 * @param outTradeNo
284 	 *            商户内部唯一订单号
285 	 * @param totalFee
286 	 *            商品总额 单位元
287 	 * @param notifyUrl
288 	 *            支付回调URL
289 	 * @param createIp
290 	 *            订单生成的机器 IP
291 	 * @param attach
292 	 *            附加数据 非必填
293 	 * @return Native支付对象
294 	 * @see com.foxinmy.weixin4j.api.PayApi
295 	 * @see com.foxinmy.weixin4j.payment.mch.NATIVEPayRequest
296 	 * @see com.foxinmy.weixin4j.payment.mch.MchPayRequest#toRequestString()
297 	 * @see <a href=
298 	 *      "https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_1">扫码支付
299 	 *      </a>
300 	 * @see <a href=
301 	 *      "https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_5">模式二
302 	 *      </a>
303 	 * @throws WeixinException
304 	 */
305 	public MchPayRequest createNativePayRequest(String productId, String body,
306 			String outTradeNo, double totalFee, String notifyUrl,
307 			String createIp, String attach) throws WeixinException {
308 		return payApi.createNativePayRequest(productId, body, outTradeNo,
309 				totalFee, notifyUrl, createIp, attach);
310 	}
311 
312 	/**
313 	 * 创建APP支付请求对象
314 	 *
315 	 * @param body
316 	 *            商品描述
317 	 * @param outTradeNo
318 	 *            商户内部唯一订单号
319 	 * @param totalFee
320 	 *            商品总额 单位元
321 	 * @param notifyUrl
322 	 *            支付回调URL
323 	 * @param createIp
324 	 *            订单生成的机器 IP
325 	 * @param attach
326 	 *            附加数据 非必填
327 	 * @param store
328 	 *            门店信息 非必填
329 	 * @return APP支付对象
330 	 * @see com.foxinmy.weixin4j.api.PayApi
331 	 * @see com.foxinmy.weixin4j.payment.mch.SceneInfoStore
332 	 * @see com.foxinmy.weixin4j.payment.mch.APPPayRequest
333 	 * @see com.foxinmy.weixin4j.payment.mch.MchPayRequest#toRequestString()
334 	 * @see <a href=
335 	 *      "https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_1">
336 	 *      APP支付</a>
337 	 * @throws WeixinException
338 	 */
339 	public MchPayRequest createAppPayRequest(String body, String outTradeNo,
340 			double totalFee, String notifyUrl, String createIp, String attach,
341 			SceneInfoStore store) throws WeixinException {
342 		return payApi.createAppPayRequest(body, outTradeNo, totalFee,
343 				notifyUrl, createIp, attach, store);
344 	}
345 
346 	/**
347 	 * 创建WAP支付请求对象
348 	 *
349 	 * @param body
350 	 *            商品描述
351 	 * @param outTradeNo
352 	 *            商户内部唯一订单号
353 	 * @param totalFee
354 	 *            商品总额 单位元
355 	 * @param notifyUrl
356 	 *            支付回调URL
357 	 * @param createIp
358 	 *            订单生成的机器 IP
359 	 * @param attach
360 	 *            附加数据 非必填
361 	 * @param app
362 	 *            应用信息
363 	 * @return WAP支付对象
364 	 * @see com.foxinmy.weixin4j.api.PayApi
365 	 * @see com.foxinmy.weixin4j.payment.mch.SceneInfoApp
366 	 * @see com.foxinmy.weixin4j.payment.mch.WAPPayRequest
367 	 * @see com.foxinmy.weixin4j.payment.mch.MchPayRequest#toRequestString()
368 	 * @see <a href=
369 	 *      "https://pay.weixin.qq.com/wiki/doc/api/wap.php?chapter=15_1">WAP支付
370 	 *      </a>
371 	 * @throws WeixinException
372 	 */
373 	public MchPayRequest createWapPayRequest(String body, String outTradeNo,
374 			double totalFee, String notifyUrl, String createIp, String attach,
375 			SceneInfoApp app) throws WeixinException {
376 		return payApi.createWapPayRequest(body, outTradeNo, totalFee,
377 				notifyUrl, createIp, attach, app);
378 	}
379 
380 	/**
381 	 * 提交被扫支付
382 	 *
383 	 * @param authCode
384 	 *            扫码支付授权码 ,设备读取用户微信中的条码或者二维码信息
385 	 * @param body
386 	 *            商品描述
387 	 * @param outTradeNo
388 	 *            商户内部唯一订单号
389 	 * @param totalFee
390 	 *            商品总额 单位元
391 	 * @param createIp
392 	 *            订单生成的机器 IP
393 	 * @param attach
394 	 *            附加数据 非必填
395 	 * @param store
396 	 *            门店信息 非必填
397 	 * @return 支付的订单信息
398 	 * @see com.foxinmy.weixin4j.api.PayApi
399 	 * @see com.foxinmy.weixin4j.payment.mch.Order
400 	 * @see com.foxinmy.weixin4j.payment.mch.SceneInfoStore
401 	 * @see com.foxinmy.weixin4j.payment.mch.MICROPayRequest
402 	 * @see com.foxinmy.weixin4j.payment.mch.MchPayRequest#toRequestString()
403 	 * @see <a href=
404 	 *      "http://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=9_10">
405 	 *      提交被扫支付API</a>
406 	 * @throws WeixinException
407 	 */
408 	public MchPayRequest createMicroPayRequest(String authCode, String body,
409 			String outTradeNo, double totalFee, String createIp, String attach,
410 			SceneInfoStore store) throws WeixinException {
411 		return payApi.createMicroPayRequest(authCode, body, outTradeNo,
412 				totalFee, createIp, attach, store);
413 	}
414 
415 	/**
416 	 * 订单查询
417 	 * <p>
418 	 * 当商户后台、网络、服务器等出现异常,商户系统最终未接收到支付通知;</br> 调用支付接口后,返回系统错误或未知交易状态情况;</br>
419 	 * 调用被扫支付API,返回USERPAYING的状态;</br> 调用关单或撤销接口API之前,需确认支付状态;
420 	 * </P>
421 	 *
422 	 * @param idQuery
423 	 *            商户系统内部的订单号, transaction_id、out_trade_no 二 选一,如果同时存在优先级:
424 	 *            transaction_id> out_trade_no
425 	 * @since V3
426 	 * @see com.foxinmy.weixin4j.payment.mch.Order
427 	 * @see com.foxinmy.weixin4j.api.PayApi
428 	 * @see <a href=
429 	 *      "http://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_2">
430 	 *      订单查询API</a>
431 	 * @return 订单详情
432 	 * @throws WeixinException
433 	 */
434 	public Order queryOrder(IdQuery idQuery) throws WeixinException {
435 		return payApi.queryOrder(idQuery);
436 	}
437 
438 	/**
439 	 * 申请退款
440 	 *
441 	 * @see PayApi#applyRefund(IdQuery, String, double, double, CurrencyType, String, String, RefundAccountType)
442 	 */
443 	public RefundResult applyRefund(IdQuery idQuery, String outRefundNo,
444 			double totalFee, double refundFee, CurrencyType refundFeeType,
445 			String opUserId, String refundDesc,
446 			RefundAccountType refundAccountType) throws WeixinException {
447 		return payApi.applyRefund(idQuery, outRefundNo, totalFee, refundFee,
448 				refundFeeType, opUserId, refundDesc, refundAccountType);
449 	}
450 
451 	/**
452 	 * 申请退款
453 	 *
454 	 * @see PayApi#applyRefund(IdQuery, String, double)
455 	 */
456 	public RefundResult applyRefund(IdQuery idQuery, String outRefundNo,
457 			double totalFee) throws WeixinException {
458 		return payApi.applyRefund(idQuery, outRefundNo, totalFee);
459 	}
460 
461 	/**
462 	 * 退款查询
463 	 * <p>
464 	 * 提交退款申请后,通过调用该接口查询退款状态。退款有一定延时,用零钱支付的退款20分钟内到账,银行卡支付的退款3个工作日后重新查询退款状态。
465 	 * </p>
466 	 *
467 	 * @param idQuery
468 	 *            单号 refund_id、out_refund_no、 out_trade_no 、 transaction_id
469 	 *            四个参数必填一个,优先级为:
470 	 *            refund_id>out_refund_no>transaction_id>out_trade_no
471 	 * @return 退款记录
472 	 * @see com.foxinmy.weixin4j.api.PayApi
473 	 * @see com.foxinmy.weixin4j.payment.mch.RefundRecord
474 	 * @see <a href=
475 	 *      "http://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_5">
476 	 *      退款查询API</a>
477 	 * @since V3
478 	 * @throws WeixinException
479 	 */
480 	public RefundRecord queryRefund(IdQuery idQuery) throws WeixinException {
481 		return payApi.queryRefund(idQuery);
482 	}
483 
484 	/**
485 	 * 下载对账单<br>
486 	 * 1.微信侧未成功下单的交易不会出现在对账单中。支付成功后撤销的交易会出现在对账 单中,跟原支付单订单号一致,bill_type 为
487 	 * REVOKED;<br>
488 	 * 2.微信在次日 9 点启动生成前一天的对账单,建议商户 9 点半后再获取;<br>
489 	 * 3.对账单中涉及金额的字段单位为“元”。<br>
490 	 *
491 	 * @param billDate
492 	 *            下载对账单的日期
493 	 * @param billType
494 	 *            下载对账单的类型 ALL,返回当日所有订单信息, 默认值 SUCCESS,返回当日成功支付的订单
495 	 *            REFUND,返回当日退款订单
496 	 * @para outputStream 输出流
497 	 * @param tarType
498 	 *            非必传参数,固定值:GZIP,返回格式为.gzip的压缩包账单。不传则默认为数据流形式。
499 	 * @since V2 & V3
500 	 * @see com.foxinmy.weixin4j.api.PayApi
501 	 * @see <a href=
502 	 *      "http://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_6">
503 	 *      下载对账单API</a>
504 	 * @throws WeixinException
505 	 */
506 	public void downloadBill(Date billDate, BillType billType,
507 			OutputStream outputStream, TarType tarType) throws WeixinException {
508 		payApi.downloadBill(billDate, billType, outputStream, tarType);
509 	}
510 
511 	/**
512 	 * 冲正订单(需要证书)</br> 当支付返回失败,或收银系统超时需要取消交易,可以调用该接口</br> 接口逻辑:支
513 	 * 付失败的关单,支付成功的撤销支付</br> <font color="red">7天以内的单可撤销,其他正常支付的单
514 	 * 如需实现相同功能请调用退款接口</font></br> <font
515 	 * color="red">调用扣款接口后请勿立即调用撤销,需要等待5秒以上。先调用查单接口,如果没有确切的返回,再调用撤销</font> </br>
516 	 *
517 	 * @param idQuery
518 	 *            商户系统内部的订单号, transaction_id 、 out_trade_no 二选一,如果同时存在优先级:
519 	 *            transaction_id> out_trade_no
520 	 * @return 撤销结果
521 	 * @see com.foxinmy.weixin4j.api.PayApi
522 	 * @since V3
523 	 * @throws WeixinException
524 	 */
525 	public MerchantResult reverseOrder(IdQuery idQuery) throws WeixinException {
526 		return payApi.reverseOrder(idQuery);
527 	}
528 
529 	/**
530 	 * 关闭订单
531 	 * <p>
532 	 * 商户订单支付失败需要生成新单号重新发起支付,要对原订单号调用关单,避免重复支付;系统下单后,用户支付超时,系统退出不再受理,避免用户继续
533 	 * ,请调用关单接口,如果关单失败,返回已完 成支付请按正常支付处理。如果出现银行掉单,调用关单成功后,微信后台会主动发起退款。
534 	 * </p>
535 	 *
536 	 * @param outTradeNo
537 	 *            商户系统内部的订单号
538 	 * @return 执行结果
539 	 * @see com.foxinmy.weixin4j.api.PayApi
540 	 * @since V3
541 	 * @throws WeixinException
542 	 * @see <a href=
543 	 *      "http://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_3">
544 	 *      关闭订单API</a>
545 	 */
546 	public MerchantResult closeOrder(String outTradeNo) throws WeixinException {
547 		return payApi.closeOrder(outTradeNo);
548 	}
549 
550 	/**
551 	 * native支付URL转短链接:用于扫码原生支付模式一中的二维码链接转成短链接(weixin://wxpay/s/XXXXXX),减小二维码数据量
552 	 * ,提升扫描速度和精确度。
553 	 *
554 	 * @param url
555 	 *            具有native标识的支付URL
556 	 * @return 转换后的短链接
557 	 * @see com.foxinmy.weixin4j.api.PayApi
558 	 * @see <a href=
559 	 *      "http://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_9">
560 	 *      转换短链接API</a>
561 	 * @since V3
562 	 * @throws WeixinException
563 	 */
564 	public String getPayShorturl(String url) throws WeixinException {
565 		return payApi.getShorturl(url);
566 	}
567 
568 	/**
569 	 * 接口上报
570 	 *
571 	 * @param interfaceUrl
572 	 *            上报对应的接口的完整 URL, 类似: https://api.mch.weixin.q
573 	 *            q.com/pay/unifiedorder
574 	 * @param executeTime
575 	 *            接口耗时情况,单位为毫秒
576 	 * @param outTradeNo
577 	 *            商户系统内部的订单号,商 户可以在上报时提供相关商户订单号方便微信支付更好 的提高服务质量。
578 	 * @param ip
579 	 *            发起接口调用时的机器 IP
580 	 * @param time
581 	 *            商户调用该接口时商户自己 系统的时间
582 	 * @param returnXml
583 	 *            调用接口返回的基本数据
584 	 * @return 处理结果
585 	 * @see com.foxinmy.weixin4j.api.PayApi
586 	 * @see <a href=
587 	 *      "http://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_8">
588 	 *      接口测试上报API</a>
589 	 * @throws WeixinException
590 	 */
591 	public XmlResult reportInterface(String interfaceUrl, int executeTime,
592 			String outTradeNo, String ip, Date time, XmlResult returnXml)
593 			throws WeixinException {
594 		return payApi.reportInterface(interfaceUrl, executeTime, outTradeNo,
595 				ip, time, returnXml);
596 	}
597 
598 	/**
599 	 * 发放代金券(需要证书)
600 	 *
601 	 * @param couponStockId
602 	 *            代金券批次id
603 	 * @param partnerTradeNo
604 	 *            商户发放凭据号(格式:商户id+日期+流水号),商户侧需保持唯一性
605 	 * @param openId
606 	 *            用户的openid
607 	 * @param opUserId
608 	 *            操作员帐号, 默认为商户号 可在商户平台配置操作员对应的api权限 可为空
609 	 * @return 发放结果
610 	 * @see com.foxinmy.weixin4j.api.CouponApi
611 	 * @see com.foxinmy.weixin4j.payment.coupon.CouponResult
612 	 * @see <a href=
613 	 *      "https://pay.weixin.qq.com/wiki/doc/api/tools/sp_coupon.php?chapter=12_3">
614 	 *      发放代金券接口</a>
615 	 * @throws WeixinException
616 	 */
617 	public CouponResult sendCoupon(String couponStockId, String partnerTradeNo,
618 			String openId, String opUserId) throws WeixinException {
619 		return couponApi.sendCoupon(couponStockId, partnerTradeNo, openId,
620 				opUserId);
621 	}
622 
623 	/**
624 	 * 查询代金券批次
625 	 *
626 	 * @param couponStockId
627 	 *            代金券批次ID
628 	 * @return 代金券批次信息
629 	 * @see com.foxinmy.weixin4j.api.CouponApi
630 	 * @see com.foxinmy.weixin4j.payment.coupon.CouponStock
631 	 * @see <a href=
632 	 *      "https://pay.weixin.qq.com/wiki/doc/api/tools/sp_coupon.php?chapter=12_4">
633 	 *      查询代金券批次信息接口</a>
634 	 * @throws WeixinException
635 	 */
636 	public CouponStock queryCouponStock(String couponStockId)
637 			throws WeixinException {
638 		return couponApi.queryCouponStock(couponStockId);
639 	}
640 
641 	/**
642 	 * 查询代金券详细
643 	 *
644 	 * @param openId
645 	 *            用户ID
646 	 * @param couponId
647 	 *            代金券ID
648 	 * @param stockId
649 	 *            代金劵对应的批次号
650 	 * @return 代金券详细信息
651 	 * @see com.foxinmy.weixin4j.api.CouponApi
652 	 * @see com.foxinmy.weixin4j.payment.coupon.CouponDetail
653 	 * @see <a href=
654 	 *      "https://pay.weixin.qq.com/wiki/doc/api/tools/sp_coupon.php?chapter=12_5">
655 	 *      查询代金券详细信息接口</a>
656 	 * @throws WeixinException
657 	 */
658 	public CouponDetail queryCouponDetail(String openId, String couponId,
659 			String stockId) throws WeixinException {
660 		return couponApi.queryCouponDetail(openId, couponId, stockId);
661 	}
662 
663 	/**
664 	 * 发放红包 企业向微信用户个人发现金红包
665 	 *
666 	 * @param redpacket
667 	 *            红包信息
668 	 * @return 发放结果
669 	 * @see com.foxinmy.weixin4j.api.CashApi
670 	 * @see com.foxinmy.weixin4j.payment.mch.Redpacket
671 	 * @see com.foxinmy.weixin4j.payment.mch.RedpacketSendResult
672 	 * @see <a href=
673 	 *      "https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapter=13_5">
674 	 *      发放现金红包接口</a>
675 	 * @see <a href=
676 	 *      "https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapter=16_5">
677 	 *      发放裂变红包接口</a>
678 	 * @throws WeixinException
679 	 */
680 	public RedpacketSendResult sendRedpack(Redpacket redpacket)
681 			throws WeixinException {
682 		return cashApi.sendRedpack(redpacket);
683 	}
684 
685 	/**
686 	 * 批量发放红包 企业向微信用户个人发现金红包
687 	 *
688 	 * @param redpacket
689 	 *            多个红包信息
690 	 * @return 发放结果
691 	 * @see com.foxinmy.weixin4j.api.CashApi
692 	 * @see #sendRedpacks(Redpacket...)
693 	 * @throws WeixinException
694 	 */
695 	public List<Future<RedpacketSendResult>> sendRedpacks(
696 			Redpacket... redpackets) {
697 		return cashApi.sendRedpacks(redpackets);
698 	}
699 
700 	/**
701 	 * 查询红包记录
702 	 *
703 	 * @param outTradeNo
704 	 *            商户发放红包的商户订单号
705 	 * @return 红包记录
706 	 * @see com.foxinmy.weixin4j.api.CashApi
707 	 * @see com.foxinmy.weixin4j.payment.mch.RedpacketRecord
708 	 * @see <a href=
709 	 *      "https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapter=13_7&index=6">
710 	 *      查询现金红包接口</a>
711 	 * @see <a href=
712 	 *      "https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapter=16_6">
713 	 *      查询裂变红包接口</a>
714 	 * @throws WeixinException
715 	 */
716 	public RedpacketRecord queryRedpack(String outTradeNo)
717 			throws WeixinException {
718 		return cashApi.queryRedpack(outTradeNo);
719 	}
720 
721 	/**
722 	 * 企业付款
723 	 *
724 	 * @see CashApi#sendCorpPayment(CorpPayment)
725 	 */
726 	public CorpPaymentResult sendCorpPayment(CorpPayment payment)
727 			throws WeixinException {
728 		return cashApi.sendCorpPayment(payment);
729 	}
730 
731 	/**
732 	 * 企业付款查询 用于商户的企业付款操作进行结果查询,返回付款操作详细结果
733 	 *
734 	 * @param outTradeNo
735 	 *            商户调用企业付款API时使用的商户订单号
736 	 * @return 付款记录
737 	 * @see com.foxinmy.weixin4j.api.CashApi
738 	 * @see com.foxinmy.weixin4j.payment.mch.CorpPaymentRecord
739 	 * @see <a href=
740 	 *      "https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_3">
741 	 *      企业付款查询接口</a>
742 	 * @throws WeixinException
743 	 */
744 	public CorpPaymentRecord queryCorpPayment(String outTradeNo)
745 			throws WeixinException {
746 		return cashApi.queryCorpPayment(outTradeNo);
747 	}
748 
749 	/**
750 	 * 授权码查询OPENID
751 	 *
752 	 * @param authCode
753 	 *            扫码支付授权码,设备读取用户微信中的条码或者二维码信息
754 	 * @return 查询结果
755 	 * @see com.foxinmy.weixin4j.api.CashApi
756 	 * @see com.foxinmy.weixin4j.payment.mch.OpenIdResult
757 	 * @see <a href=
758 	 *      "https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=9_13&index=9">
759 	 *      授权码查询OPENID</a>
760 	 * @throws WeixinException
761 	 */
762 	public OpenIdResult authCode2openId(String authCode) throws WeixinException {
763 		return payApi.authCode2openId(authCode);
764 	}
765 
766 	/**
767 	 * 查询结算资金
768 	 *
769 	 * @param status
770 	 *            是否结算
771 	 * @param pageable
772 	 *            分页数据
773 	 * @param start
774 	 *            开始日期 查询未结算记录时,该字段可不传
775 	 * @param end
776 	 *            结束日期 查询未结算记录时,该字段可不传
777 	 * @return 结算金额记录
778 	 * @throws WeixinException
779 	 * @see com.foxinmy.weixin4j.api.CashApi
780 	 * @see com.foxinmy.weixin4j.payment.mch.SettlementRecord
781 	 * @see <a href=
782 	 *      "https://pay.weixin.qq.com/wiki/doc/api/external/micropay.php?chapter=9_14&index=7">
783 	 *      查询结算资金接口</a>
784 	 */
785 	public SettlementRecord querySettlement(boolean status, Pageable pageable,
786 			Date start, Date end) throws WeixinException {
787 		return cashApi.querySettlement(status, pageable, start, end);
788 	}
789 
790 	/**
791 	 * 查询汇率
792 	 *
793 	 * @param currencyType
794 	 *            外币币种
795 	 * @param date
796 	 *            日期 不填则默认当天
797 	 * @return 汇率对象
798 	 * @throws WeixinException
799 	 * @see com.foxinmy.weixin4j.api.CashApi
800 	 * @see <a href=
801 	 *      "https://pay.weixin.qq.com/wiki/doc/api/external/micropay.php?chapter=9_15&index=8">
802 	 *      查询汇率接口</a>
803 	 */
804 	public double queryExchageRate(CurrencyType currencyType, Date date)
805 			throws WeixinException {
806 		return cashApi.queryExchageRate(currencyType, date);
807 	}
808 
809 	/**
810 	 * 订单附加信息提交
811 	 *
812 	 * @param customsOrder
813 	 *            附加订单信息
814 	 * @return 报关结果
815 	 * @see com.foxinmy.weixin4j.api.CustomsApi
816 	 * @see com.foxinmy.weixin4j.payment.mch.CustomsOrder
817 	 * @see com.foxinmy.weixin4j.payment.mch.CustomsOrderResult
818 	 * @see <a href=
819 	 *      "https://pay.weixin.qq.com/wiki/doc/api/external/declarecustom.php?chapter=18_1">
820 	 *      附加订单信息提交接口</a>
821 	 * @throws WeixinException
822 	 */
823 	public CustomsOrderResult declareCustomsOrder(CustomsOrder customsOrder)
824 			throws WeixinException {
825 		return customsApi.declareCustomsOrder(customsOrder);
826 	}
827 
828 	/**
829 	 * 订单附加信息查询
830 	 *
831 	 * @param idQuery
832 	 *            out_trade_no,transaction_id,sub_order_no,sub_order_id四选一
833 	 * @param customsCity
834 	 *            海关
835 	 * @return 报关记录
836 	 * @see com.foxinmy.weixin4j.payment.mch.CustomsOrderRecord
837 	 * @see com.foxinmy.weixin4j.api.CustomsApi
838 	 * @see <a href=
839 	 *      "https://pay.weixin.qq.com/wiki/doc/api/external/declarecustom.php?chapter=18_1">
840 	 *      附加订单信息查询接口</a>
841 	 * @throws WeixinException
842 	 */
843 	public CustomsOrderRecord queryCustomsOrder(IdQuery idQuery,
844 			CustomsCity customsCity) throws WeixinException {
845 		return customsApi.queryCustomsOrder(idQuery, customsCity);
846 	}
847 
848 	public final static String VERSION = Consts.VERSION;
849 }