View Javadoc
1   package com.foxinmy.weixin4j.pay.api;
2   
3   import com.alibaba.fastjson.TypeReference;
4   import com.foxinmy.weixin4j.exception.WeixinException;
5   import com.foxinmy.weixin4j.http.weixin.WeixinResponse;
6   import com.foxinmy.weixin4j.pay.model.WeixinPayAccount;
7   import com.foxinmy.weixin4j.pay.payment.coupon.CouponDetail;
8   import com.foxinmy.weixin4j.pay.payment.coupon.CouponResult;
9   import com.foxinmy.weixin4j.pay.payment.coupon.CouponStock;
10  import com.foxinmy.weixin4j.util.StringUtil;
11  import com.foxinmy.weixin4j.xml.XmlStream;
12  
13  import java.util.Map;
14  
15  /**
16   * 代金券API
17   *
18   * @className CouponApi
19   * @author jinyu(foxinmy@gmail.com)
20   * @date 2015年3月25日
21   * @since JDK 1.6
22   * @see <a href=
23   *      "https://pay.weixin.qq.com/wiki/doc/api/tools/sp_coupon.php?chapter=12_1">代金券</a>
24   */
25  public class CouponApi extends MchApi {
26  
27  	public CouponApi(WeixinPayAccount weixinAccount) {
28  		super(weixinAccount);
29  	}
30  
31  	/**
32  	 * 发放代金券(需要证书)
33  	 *
34  	 * @param couponStockId
35  	 *            代金券批次id
36  	 * @param partnerTradeNo
37  	 *            商户发放凭据号(格式:商户id+日期+流水号),商户侧需保持唯一性
38  	 * @param openId
39  	 *            用户的openid
40  	 * @param opUserId
41  	 *            操作员帐号, 默认为商户号 可在商户平台配置操作员对应的api权限 可为空
42  	 * @return 发放结果
43  	 * @see CouponResult
44  	 * @see <a href=
45  	 *      "https://pay.weixin.qq.com/wiki/doc/api/tools/sp_coupon.php?chapter=12_3">发放代金券接口</a>
46  	 * @throws WeixinException
47  	 */
48  	public CouponResult sendCoupon(String couponStockId, String partnerTradeNo,
49  			String openId, String opUserId) throws WeixinException {
50  		Map<String, String> map = createBaseRequestMap(null);
51  		map.put("coupon_stock_id", couponStockId);
52  		map.put("partner_trade_no", partnerTradeNo);
53  		map.put("openid", openId);
54  		// openid记录数(目前支持num=1)
55  		map.put("openid_count", "1");
56  		// 操作员帐号, 默认为商户号 可在商户平台配置操作员对应的api权限
57  		if (StringUtil.isBlank(opUserId)) {
58  			opUserId = weixinAccount.getMchId();
59  		}
60  		map.put("op_user_id", opUserId);
61  		map.put("version", "1.0");
62  		map.put("type", "XML");
63  		map.put("sign", weixinSignature.sign(map));
64  		String param = XmlStream.map2xml(map);
65  		WeixinResponse response = getWeixinSSLExecutor().post(
66  				getRequestUri("coupon_send_uri"), param);
67  		return response.getAsObject(new TypeReference<CouponResult>() {
68  		});
69  	}
70  
71  	/**
72  	 * 查询代金券批次
73  	 *
74  	 * @param couponStockId
75  	 *            代金券批次ID
76  	 * @return 代金券批次信息
77  	 * @see CouponStock
78  	 * @see <a href=
79  	 *      "https://pay.weixin.qq.com/wiki/doc/api/tools/sp_coupon.php?chapter=12_4">查询代金券批次信息接口</a>
80  	 * @throws WeixinException
81  	 */
82  	public CouponStock queryCouponStock(String couponStockId)
83  			throws WeixinException {
84  		Map<String, String> map = createBaseRequestMap(null);
85  		map.put("coupon_stock_id", couponStockId);
86  		map.put("sign", weixinSignature.sign(map));
87  		String param = XmlStream.map2xml(map);
88  		WeixinResponse response = weixinExecutor.post(
89  				getRequestUri("couponstock_query_uri"), param);
90  		return response.getAsObject(new TypeReference<CouponStock>() {
91  		});
92  	}
93  
94  	/**
95  	 * 查询代金券详细
96  	 *
97  	 * @param openId
98  	 *            用户ID
99  	 * @param couponId
100 	 *            代金券ID
101 	 * @param stockId
102 	 *            代金劵对应的批次号
103 	 * @return 代金券详细信息
104 	 * @see CouponDetail
105 	 * @see <a href=
106 	 *      "https://pay.weixin.qq.com/wiki/doc/api/tools/sp_coupon.php?chapter=12_5">查询代金券详细信息接口</a>
107 	 * @throws WeixinException
108 	 */
109 	public CouponDetail queryCouponDetail(String openId, String couponId,
110 			String stockId) throws WeixinException {
111 		Map<String, String> map = createBaseRequestMap(null);
112 		map.put("openid", openId);
113 		map.put("coupon_id", couponId);
114 		map.put("stock_id", stockId);
115 		map.put("sign", weixinSignature.sign(map));
116 		String param = XmlStream.map2xml(map);
117 		WeixinResponse response = weixinExecutor.post(
118 				getRequestUri("coupondetail_query_uri"), param);
119 		return response.getAsObject(new TypeReference<CouponDetail>() {
120 		});
121 	}
122 }