Skip to content

Commit 3512930

Browse files
silloybinarywang
authored andcommitted
#1213 增加部分微信卡券接口
1 parent 2d0cb1a commit 3512930

File tree

13 files changed

+576
-6
lines changed

13 files changed

+576
-6
lines changed

weixin-java-common/src/main/java/me/chanjar/weixin/common/error/WxMpErrorMsgEnum.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -632,7 +632,17 @@ public enum WxMpErrorMsgEnum {
632632
/**
633633
* 查询起始值 begin 不合法.
634634
*/
635-
CODE_9001036(9001036, "查询起始值 begin 不合法");
635+
CODE_9001036(9001036, "查询起始值 begin 不合法"),
636+
637+
/**
638+
* 设置的 speed 参数不在0到4的范围内
639+
*/
640+
CODE_45083(45083, "设置的 speed 参数不在0到4的范围内"),
641+
642+
/**
643+
* 没有设置 speed 参数
644+
*/
645+
CODE_45084(45084, "没有设置 speed 参数");
636646

637647
private int code;
638648
private String msg;

weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpCardService.java

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
import me.chanjar.weixin.common.error.WxErrorException;
55
import me.chanjar.weixin.mp.bean.card.*;
66

7+
import java.util.List;
8+
79
/**
810
* 卡券相关接口.
911
*
@@ -207,4 +209,78 @@ WxMpCardLandingPageCreateResult createLandingPage(WxMpCardLandingPageCreateReque
207209
*/
208210
WxMpCardDeleteResult deleteCard(String cardId) throws WxErrorException;
209211

212+
213+
/**
214+
* 导入自定义code(仅对自定义code商户)
215+
*
216+
* @param cardId 卡券id
217+
* @param codeList 需导入微信卡券后台的自定义code,上限为100个。
218+
*/
219+
WxMpCardCodeDepositResult cardCodeDeposit(String cardId, List<String> codeList) throws WxErrorException;
220+
221+
/**
222+
* 查询导入code数目接口
223+
*
224+
* @param cardId 卡券id
225+
*/
226+
WxMpCardCodeDepositCountResult cardCodeDepositCount(String cardId) throws WxErrorException;
227+
228+
229+
/**
230+
* 核查code接口
231+
*
232+
* @param cardId 卡券id
233+
* @param codeList 已经微信卡券后台的自定义code,上限为100个
234+
*/
235+
WxMpCardCodeCheckcodeResult cardCodeCheckcode(String cardId, List<String> codeList) throws WxErrorException;
236+
237+
/**
238+
* 图文消息群发卡券获取内嵌html
239+
*
240+
* @param cardId 卡券id
241+
*/
242+
WxMpCardMpnewsGethtmlResult cardMpnewsGethtml(String cardId) throws WxErrorException;
243+
244+
245+
/**
246+
* 修改库存接口
247+
* https://developers.weixin.qq.com/doc/offiaccount/Cards_and_Offer/Managing_Coupons_Vouchers_and_Cards.html#5
248+
*
249+
* @param cardId 卡券ID
250+
* @param changeValue 库存变更值,负值为减少库存
251+
*/
252+
void cardModifyStock(String cardId, Integer changeValue) throws WxErrorException;
253+
254+
255+
/**
256+
* 更改Code接口
257+
* https://developers.weixin.qq.com/doc/offiaccount/Cards_and_Offer/Managing_Coupons_Vouchers_and_Cards.html#6
258+
*
259+
* @param cardId 卡券ID
260+
* @param oldCode 需变更的Code码
261+
* @param newCode 变更后的有效Code码
262+
*/
263+
void cardCodeUpdate(String cardId, String oldCode, String newCode) throws WxErrorException;
264+
265+
/**
266+
* 设置买单接口
267+
* https://developers.weixin.qq.com/doc/offiaccount/Cards_and_Offer/Create_a_Coupon_Voucher_or_Card.html#12
268+
*
269+
* @param cardId 卡券ID
270+
* @param isOpen 是否开启买单功能,填true/false
271+
*/
272+
void cardPaycellSet(String cardId, Boolean isOpen) throws WxErrorException;
273+
274+
/**
275+
* 设置自助核销
276+
* https://developers.weixin.qq.com/doc/offiaccount/Cards_and_Offer/Create_a_Coupon_Voucher_or_Card.html#14
277+
*
278+
* @param cardId 卡券ID
279+
* @param isOpen 是否开启自助核销功能
280+
* @param needVerifyCod 用户核销时是否需要输入验证码, 填true/false, 默认为false
281+
* @param needRemarkAmount 用户核销时是否需要备注核销金额, 填true/false, 默认为false
282+
*/
283+
void cardSelfConsumeCellSet(String cardId, Boolean isOpen,
284+
Boolean needVerifyCod, Boolean needRemarkAmount) throws WxErrorException;
285+
210286
}

weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMassMessageService.java

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22

33
import me.chanjar.weixin.common.error.WxErrorException;
44
import me.chanjar.weixin.mp.bean.*;
5+
import me.chanjar.weixin.mp.bean.result.WxMpMassGetResult;
56
import me.chanjar.weixin.mp.bean.result.WxMpMassSendResult;
7+
import me.chanjar.weixin.mp.bean.result.WxMpMassSpeedGetResult;
68
import me.chanjar.weixin.mp.bean.result.WxMpMassUploadResult;
79

810
/**
@@ -92,4 +94,36 @@ public interface WxMpMassMessageService {
9294
*/
9395
void delete(Long msgId, Integer articleIndex) throws WxErrorException;
9496

97+
98+
/**
99+
* 获取群发速度
100+
* https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Batch_Sends_and_Originality_Checks.html#9
101+
*/
102+
WxMpMassSpeedGetResult messageMassSpeedGet() throws WxErrorException;
103+
104+
105+
/**
106+
* 设置群发速度
107+
* https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Batch_Sends_and_Originality_Checks.html#9
108+
*
109+
* @param speed 群发速度的级别,是一个0到4的整数,数字越大表示群发速度越慢。
110+
* speed realspeed
111+
* 0 80w/分钟
112+
* 1 60w/分钟
113+
* 2 45w/分钟
114+
* 3 30w/分钟
115+
* 4 10w/分钟
116+
*/
117+
void messageMassSpeedSet(Integer speed) throws WxErrorException;
118+
119+
120+
/**
121+
* 查询群发消息发送状态【订阅号与服务号认证后均可用】
122+
* https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Batch_Sends_and_Originality_Checks.html#%E6%9F%A5%E8%AF%A2%E7%BE%A4%E5%8F%91%E6%B6%88%E6%81%AF%E5%8F%91%E9%80%81%E7%8A%B6%E6%80%81%E3%80%90%E8%AE%A2%E9%98%85%E5%8F%B7%E4%B8%8E%E6%9C%8D%E5%8A%A1%E5%8F%B7%E8%AE%A4%E8%AF%81%E5%90%8E%E5%9D%87%E5%8F%AF%E7%94%A8%E3%80%91
123+
*
124+
* @param msgId 群发消息后返回的消息id
125+
* @return 消息发送后的状态,SEND_SUCCESS表示发送成功,SENDING表示发送中,SEND_FAIL表示发送失败,DELETE表示已删除
126+
*/
127+
WxMpMassGetResult messageMassGet(Long msgId) throws WxErrorException;
128+
95129
}

weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpCardServiceImpl.java

Lines changed: 111 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,19 @@
99
import me.chanjar.weixin.common.error.WxErrorException;
1010
import me.chanjar.weixin.common.util.RandomUtils;
1111
import me.chanjar.weixin.common.util.http.SimpleGetRequestExecutor;
12+
import me.chanjar.weixin.common.util.json.WxGsonBuilder;
1213
import me.chanjar.weixin.mp.api.WxMpCardService;
1314
import me.chanjar.weixin.mp.api.WxMpService;
1415
import me.chanjar.weixin.mp.bean.card.*;
16+
import me.chanjar.weixin.mp.bean.result.WxMpResult;
1517
import me.chanjar.weixin.mp.enums.TicketType;
1618
import me.chanjar.weixin.mp.enums.WxMpApiUrl;
1719
import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
1820
import org.apache.commons.codec.digest.DigestUtils;
1921
import org.apache.commons.lang3.StringUtils;
2022

2123
import java.util.Arrays;
24+
import java.util.List;
2225
import java.util.concurrent.locks.Lock;
2326

2427
/**
@@ -241,12 +244,117 @@ public String unavailableCardCode(String cardId, String code, String reason) thr
241244

242245
@Override
243246
public WxMpCardDeleteResult deleteCard(String cardId) throws WxErrorException {
244-
if (StringUtils.isEmpty(cardId)) {
245-
throw new WxErrorException(WxError.builder().errorCode(41012).errorMsg("cardId不能为空").build());
246-
}
247+
checkCardId(cardId);
247248
JsonObject param = new JsonObject();
248249
param.addProperty("card_id", cardId);
249250
String response = this.wxMpService.post(WxMpApiUrl.Card.CARD_DELETE, param.toString());
250251
return WxMpCardDeleteResult.fromJson(response);
251252
}
253+
254+
255+
@Override
256+
public WxMpCardCodeDepositResult cardCodeDeposit(String cardId, List<String> codeList) throws WxErrorException {
257+
checkCardId(cardId);
258+
if (codeList.size() == 0 || codeList.size() > 100) {
259+
throw new WxErrorException(WxError.builder().errorCode(40109).errorMsg("code数量为0或者code数量超过100个").build());
260+
}
261+
JsonObject param = new JsonObject();
262+
param.addProperty("card_id", cardId);
263+
param.add("code",
264+
WxGsonBuilder.create().toJsonTree(codeList, new TypeToken<List<String>>() {
265+
}.getType()).getAsJsonArray());
266+
String response = this.wxMpService.post(WxMpApiUrl.Card.CARD_CODE_DEPOSIT, param.toString());
267+
return WxMpCardCodeDepositResult.fromJson(response);
268+
}
269+
270+
271+
@Override
272+
public WxMpCardCodeDepositCountResult cardCodeDepositCount(String cardId) throws WxErrorException {
273+
checkCardId(cardId);
274+
JsonObject param = new JsonObject();
275+
param.addProperty("card_id", cardId);
276+
String response = this.wxMpService.post(WxMpApiUrl.Card.CARD_CODE_DEPOSIT_COUNT, param.toString());
277+
return WxMpCardCodeDepositCountResult.fromJson(response);
278+
}
279+
280+
281+
@Override
282+
public WxMpCardCodeCheckcodeResult cardCodeCheckcode(String cardId, List<String> codeList) throws WxErrorException {
283+
checkCardId(cardId);
284+
if (codeList.size() == 0 || codeList.size() > 100) {
285+
throw new WxErrorException(WxError.builder().errorCode(40109).errorMsg("code数量为0或者code数量超过100个").build());
286+
}
287+
JsonObject param = new JsonObject();
288+
param.addProperty("card_id", cardId);
289+
param.add("code",
290+
WxGsonBuilder.create().toJsonTree(codeList, new TypeToken<List<String>>() {
291+
}.getType()).getAsJsonArray());
292+
String response = this.wxMpService.post(WxMpApiUrl.Card.CARD_CODE_CHECKCODE, param.toString());
293+
return WxMpCardCodeCheckcodeResult.fromJson(response);
294+
}
295+
296+
297+
@Override
298+
public WxMpCardMpnewsGethtmlResult cardMpnewsGethtml(String cardId) throws WxErrorException {
299+
checkCardId(cardId);
300+
JsonObject param = new JsonObject();
301+
param.addProperty("card_id", cardId);
302+
String response = this.wxMpService.post(WxMpApiUrl.Card.CARD_MPNEWS_GETHTML, param.toString());
303+
return WxMpCardMpnewsGethtmlResult.fromJson(response);
304+
}
305+
306+
307+
@Override
308+
public void cardModifyStock(String cardId, Integer changeValue) throws WxErrorException {
309+
checkCardId(cardId);
310+
JsonObject param = new JsonObject();
311+
param.addProperty("card_id", cardId);
312+
if (changeValue > 0) {
313+
param.addProperty("increase_stock_value", changeValue);
314+
} else {
315+
param.addProperty("reduce_stock_value", Math.abs(changeValue));
316+
}
317+
this.wxMpService.post(WxMpApiUrl.Card.CARD_MODIFY_STOCK, param.toString());
318+
}
319+
320+
321+
@Override
322+
public void cardCodeUpdate(String cardId, String oldCode, String newCode) throws WxErrorException {
323+
checkCardId(cardId);
324+
JsonObject param = new JsonObject();
325+
param.addProperty("card_id", cardId);
326+
param.addProperty("code", oldCode);
327+
param.addProperty("new_code", newCode);
328+
this.wxMpService.post(WxMpApiUrl.Card.CARD_CODE_UPDATE, param.toString());
329+
}
330+
331+
332+
@Override
333+
public void cardPaycellSet(String cardId, Boolean isOpen) throws WxErrorException {
334+
checkCardId(cardId);
335+
JsonObject param = new JsonObject();
336+
param.addProperty("card_id", cardId);
337+
param.addProperty("is_open", isOpen);
338+
this.wxMpService.post(WxMpApiUrl.Card.CARD_PAYCELL_SET, param.toString());
339+
}
340+
341+
342+
@Override
343+
public void cardSelfConsumeCellSet(String cardId, Boolean isOpen,
344+
Boolean needVerifyCod, Boolean needRemarkAmount) throws WxErrorException {
345+
checkCardId(cardId);
346+
JsonObject param = new JsonObject();
347+
param.addProperty("card_id", cardId);
348+
param.addProperty("is_open", isOpen);
349+
param.addProperty("need_verify_cod", needVerifyCod);
350+
param.addProperty("need_remark_amount", needRemarkAmount);
351+
this.wxMpService.post(WxMpApiUrl.Card.CARD_SELF_CONSUME_CELL_SET, param.toString());
352+
}
353+
354+
355+
private void checkCardId(String cardId) throws WxErrorException {
356+
if (StringUtils.isEmpty(cardId)) {
357+
throw new WxErrorException(WxError.builder().errorCode(41012).errorMsg("cardId不能为空").build());
358+
}
359+
}
252360
}

weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpMassMessageServiceImpl.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@
77
import me.chanjar.weixin.mp.api.WxMpMassMessageService;
88
import me.chanjar.weixin.mp.api.WxMpService;
99
import me.chanjar.weixin.mp.bean.*;
10+
import me.chanjar.weixin.mp.bean.result.WxMpMassGetResult;
1011
import me.chanjar.weixin.mp.bean.result.WxMpMassSendResult;
12+
import me.chanjar.weixin.mp.bean.result.WxMpMassSpeedGetResult;
1113
import me.chanjar.weixin.mp.bean.result.WxMpMassUploadResult;
1214
import me.chanjar.weixin.mp.enums.WxMpApiUrl;
1315

@@ -64,4 +66,29 @@ public void delete(Long msgId, Integer articleIndex) throws WxErrorException {
6466
this.wxMpService.post(MassMessage.MESSAGE_MASS_DELETE_URL, jsonObject.toString());
6567
}
6668

69+
70+
@Override
71+
public WxMpMassSpeedGetResult messageMassSpeedGet() throws WxErrorException {
72+
JsonObject jsonObject = new JsonObject();
73+
String response = this.wxMpService.post(MassMessage.MESSAGE_MASS_SPEED_GET_URL, jsonObject.toString());
74+
return WxMpMassSpeedGetResult.fromJson(response);
75+
}
76+
77+
78+
@Override
79+
public void messageMassSpeedSet(Integer speed) throws WxErrorException {
80+
JsonObject jsonObject = new JsonObject();
81+
jsonObject.addProperty("speed", speed);
82+
this.wxMpService.post(MassMessage.MESSAGE_MASS_SPEED_SET_URL, jsonObject.toString());
83+
}
84+
85+
86+
@Override
87+
public WxMpMassGetResult messageMassGet(Long msgId) throws WxErrorException {
88+
JsonObject jsonObject = new JsonObject();
89+
jsonObject.addProperty("msg_id", msgId);
90+
String response = this.wxMpService.post(MassMessage.MESSAGE_MASS_GET_URL, jsonObject.toString());
91+
return WxMpMassGetResult.fromJson(response);
92+
}
93+
6794
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package me.chanjar.weixin.mp.bean.card;
2+
3+
import com.google.gson.annotations.SerializedName;
4+
import lombok.Data;
5+
import me.chanjar.weixin.mp.bean.result.WxMpResult;
6+
import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
7+
8+
import java.io.Serializable;
9+
import java.util.List;
10+
11+
12+
@Data
13+
public class WxMpCardCodeCheckcodeResult extends WxMpResult implements Serializable {
14+
15+
private static final long serialVersionUID = -5128692403997016750L;
16+
17+
/**
18+
* 已经成功存入的code数目
19+
*/
20+
@SerializedName("exist_code")
21+
private List<String> existCode;
22+
23+
@SerializedName("not_exist_code")
24+
private List<String> notExistCode;
25+
26+
27+
public static WxMpCardCodeCheckcodeResult fromJson(String json) {
28+
return WxMpGsonBuilder.create().fromJson(json, WxMpCardCodeCheckcodeResult.class);
29+
}
30+
31+
32+
@Override
33+
public String toString() {
34+
return WxMpGsonBuilder.create().toJson(this);
35+
}
36+
37+
}
38+

0 commit comments

Comments
 (0)