Skip to content

Commit b5986cf

Browse files
committed
Merge pull request #263 from mgcnrx11/feat_card_coupon
Feature card coupon
2 parents c8ed773 + 54ced62 commit b5986cf

File tree

12 files changed

+731
-2
lines changed

12 files changed

+731
-2
lines changed

weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxConsts.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ public class WxConsts {
4747
///////////////////////
4848
public static final String MASS_ST_SUCCESS = "send success";
4949
public static final String MASS_ST_FAIL = "send fail";
50-
public static final String MASS_ST_涉嫌广告 = "err(10001)";
50+
public static final String MASS_ST_涉嫌广告 = "err(10001)";
5151
public static final String MASS_ST_涉嫌政治 = "err(20001)";
5252
public static final String MASS_ST_涉嫌社会 = "err(20004)";
5353
public static final String MASS_ST_涉嫌色情 = "err(20002)";
@@ -93,6 +93,15 @@ public class WxConsts {
9393
public static final String EVT_LOCATION_SELECT = "location_select";
9494
public static final String EVT_TEMPLATESENDJOBFINISH = "TEMPLATESENDJOBFINISH";
9595
public static final String EVT_ENTER_AGENT = "enter_agent";
96+
public static final String EVT_CARD_PASS_CHECK = "card_pass_check";
97+
public static final String EVT_CARD_NOT_PASS_CHECK = "card_not_pass_check";
98+
public static final String EVT_USER_GET_CARD = "user_get_card";
99+
public static final String EVT_USER_DEL_CARD = "user_del_card";
100+
public static final String EVT_USER_CONSUME_CARD = "user_consume_card";
101+
public static final String EVT_USER_PAY_FROM_PAY_CELL = "user_pay_from_pay_cell";
102+
public static final String EVT_USER_VIEW_CARD = "user_view_card";
103+
public static final String EVT_USER_ENTER_SESSION_FROM_CARD = "user_enter_session_from_card";
104+
public static final String EVT_CARD_SKU_REMIND = "card_sku_remind"; // 库存报警
96105

97106
///////////////////////
98107
// 上传多媒体文件的类型
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
package me.chanjar.weixin.common.bean;
2+
3+
import java.io.Serializable;
4+
5+
/**
6+
* 卡券Api签名
7+
*
8+
* @author YuJian
9+
* @version 15/11/8
10+
*/
11+
public class WxCardApiSignature implements Serializable {
12+
13+
private String appId;
14+
15+
private String cardId;
16+
17+
private String cardType;
18+
19+
private String locationId;
20+
21+
private String code;
22+
23+
private String openId;
24+
25+
private Long timestamp;
26+
27+
private String nonceStr;
28+
29+
private String signature;
30+
31+
public String getAppId() {
32+
return appId;
33+
}
34+
35+
public void setAppId(String appId) {
36+
this.appId = appId;
37+
}
38+
39+
public String getCardId() {
40+
return cardId;
41+
}
42+
43+
public void setCardId(String cardId) {
44+
this.cardId = cardId;
45+
}
46+
47+
public String getCardType() {
48+
return cardType;
49+
}
50+
51+
public void setCardType(String cardType) {
52+
this.cardType = cardType;
53+
}
54+
55+
public String getLocationId() {
56+
return locationId;
57+
}
58+
59+
public void setLocationId(String locationId) {
60+
this.locationId = locationId;
61+
}
62+
63+
public String getCode() {
64+
return code;
65+
}
66+
67+
public void setCode(String code) {
68+
this.code = code;
69+
}
70+
71+
public String getOpenId() {
72+
return openId;
73+
}
74+
75+
public void setOpenId(String openId) {
76+
this.openId = openId;
77+
}
78+
79+
public Long getTimestamp() {
80+
return timestamp;
81+
}
82+
83+
public void setTimestamp(Long timestamp) {
84+
this.timestamp = timestamp;
85+
}
86+
87+
public String getNonceStr() {
88+
return nonceStr;
89+
}
90+
91+
public void setNonceStr(String nonceStr) {
92+
this.nonceStr = nonceStr;
93+
}
94+
95+
public String getSignature() {
96+
return signature;
97+
}
98+
99+
public void setSignature(String signature) {
100+
this.signature = signature;
101+
}
102+
}

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

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,21 @@ public interface WxMpConfigStorage {
5050
*/
5151
public void updateJsapiTicket(String jsapiTicket, int expiresInSeconds);
5252

53+
public String getCardApiTicket();
54+
55+
public boolean isCardApiTicketExpired();
56+
57+
/**
58+
* 强制将卡券api ticket过期掉
59+
*/
60+
public void expireCardApiTicket();
61+
62+
/**
63+
* 应该是线程安全的
64+
* @param cardApiTicket
65+
*/
66+
public void updateCardApiTicket(String cardApiTicket, int expiresInSeconds);
67+
5368
public String getAppId();
5469

5570
public String getSecret();

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

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@ public class WxMpInMemoryConfigStorage implements WxMpConfigStorage {
3232
protected volatile String jsapiTicket;
3333
protected volatile long jsapiTicketExpiresTime;
3434

35+
protected volatile String cardApiTicket;
36+
protected volatile long cardApiTicketExpiresTime;
37+
3538
/**
3639
* 临时文件目录
3740
*/
@@ -90,6 +93,27 @@ public void expireJsapiTicket() {
9093
this.jsapiTicketExpiresTime = 0;
9194
}
9295

96+
/**
97+
* 卡券api_ticket
98+
*/
99+
public String getCardApiTicket() {
100+
return cardApiTicket;
101+
}
102+
103+
public boolean isCardApiTicketExpired() {
104+
return System.currentTimeMillis() > this.cardApiTicketExpiresTime;
105+
}
106+
107+
public synchronized void updateCardApiTicket(String cardApiTicket, int expiresInSeconds) {
108+
this.cardApiTicket = cardApiTicket;
109+
// 预留200秒的时间
110+
this.cardApiTicketExpiresTime = System.currentTimeMillis() + (expiresInSeconds - 200) * 1000l;
111+
}
112+
113+
public void expireCardApiTicket() {
114+
this.cardApiTicketExpiresTime = 0;
115+
}
116+
93117
public String getAppId() {
94118
return this.appId;
95119
}
@@ -192,6 +216,8 @@ public String toString() {
192216
", http_proxy_password='" + http_proxy_password + '\'' +
193217
", jsapiTicket='" + jsapiTicket + '\'' +
194218
", jsapiTicketExpiresTime='" + jsapiTicketExpiresTime + '\'' +
219+
", cardApiTicket='" + cardApiTicket + '\'' +
220+
", cardApiTicketExpiresTime='" + cardApiTicketExpiresTime + '\'' +
195221
", tmpDirFile='" + tmpDirFile + '\'' +
196222
'}';
197223
}

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

Lines changed: 79 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package me.chanjar.weixin.mp.api;
22

3+
import me.chanjar.weixin.common.bean.WxCardApiSignature;
34
import me.chanjar.weixin.common.bean.WxMenu;
45
import me.chanjar.weixin.common.bean.WxJsapiSignature;
56
import me.chanjar.weixin.common.bean.result.WxMediaUploadResult;
@@ -770,12 +771,89 @@ public interface WxMpService {
770771
* @return
771772
*/
772773
public boolean checkJSSDKCallbackDataSignature(Map<String, String> kvm, String signature);
773-
774+
774775
/**
775776
* 发送微信红包给个人用户
776777
* @param parameters
777778
* @return
778779
* @throws WxErrorException
779780
*/
780781
public WxRedpackResult sendRedpack(Map<String, String> parameters) throws WxErrorException;
782+
783+
/**
784+
* 获得卡券api_ticket,不强制刷新卡券api_ticket
785+
* @see #getCardApiTicket(boolean)
786+
* @return 卡券api_ticket
787+
* @throws WxErrorException
788+
*/
789+
public String getCardApiTicket() throws WxErrorException;
790+
791+
/**
792+
* <pre>
793+
* 获得卡券api_ticket
794+
* 获得时会检查卡券apiToken是否过期,如果过期了,那么就刷新一下,否则就什么都不干
795+
*
796+
* 详情请见:http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html#.E9.99.84.E5.BD.954-.E5.8D.A1.E5.88.B8.E6.89.A9.E5.B1.95.E5.AD.97.E6.AE.B5.E5.8F.8A.E7.AD.BE.E5.90.8D.E7.94.9F.E6.88.90.E7.AE.97.E6.B3.95
797+
* </pre>
798+
* @param forceRefresh 强制刷新
799+
* @return 卡券api_ticket
800+
* @throws WxErrorException
801+
*/
802+
public String getCardApiTicket(boolean forceRefresh) throws WxErrorException;
803+
804+
/**
805+
* <pre>
806+
* 创建调用卡券api时所需要的签名
807+
*
808+
* 详情请见:http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html#.E9.99.84.E5.BD
809+
* .954-.E5.8D.A1.E5.88.B8.E6.89.A9.E5.B1.95.E5.AD.97.E6.AE.B5.E5.8F.8A.E7.AD.BE.E5.90.8D.E7.94
810+
* .9F.E6.88.90.E7.AE.97.E6.B3.95
811+
* </pre>
812+
*
813+
* @param optionalSignParam 参与签名的参数数组。
814+
* 可以为下列字段:app_id, card_id, card_type, code, openid, location_id
815+
* @return 卡券Api签名对象
816+
*/
817+
public WxCardApiSignature createCardApiSignature(String... optionalSignParam) throws
818+
WxErrorException;
819+
820+
/**
821+
* 卡券Code解码
822+
* @param encryptCode 加密Code,通过JSSDK的chooseCard接口获得
823+
* @return 解密后的Code
824+
* @throws WxErrorException
825+
*/
826+
public String decryptCardCode(String encryptCode) throws WxErrorException;
827+
828+
/**
829+
* 卡券Code查询
830+
* @param cardId 卡券ID代表一类卡券
831+
* @param code 单张卡券的唯一标准
832+
* @param checkConsume 是否校验code核销状态,填入true和false时的code异常状态返回数据不同
833+
* @return WxMpCardResult对象
834+
* @throws WxErrorException
835+
*/
836+
public WxMpCardResult queryCardCode(String cardId, String code, boolean checkConsume)
837+
throws WxErrorException;
838+
839+
/**
840+
* 卡券Code核销。核销失败会抛出异常
841+
* @param code 单张卡券的唯一标准
842+
* @return
843+
* @throws WxErrorException
844+
*/
845+
public void consumeCardCode(String code) throws WxErrorException;
846+
847+
/**
848+
* 卡券Mark接口。
849+
* 开发者在帮助消费者核销卡券之前,必须帮助先将此code(卡券串码)与一个openid绑定(即mark住),
850+
* 才能进一步调用核销接口,否则报错。
851+
* @param code 卡券的code码
852+
* @param cardId 卡券的ID
853+
* @param openId 用券用户的openid
854+
* @param isMark 是否要mark(占用)这个code,填写true或者false,表示占用或解除占用
855+
* @throws WxErrorException
856+
*/
857+
public void markCardCode(String code, String cardId, String openId, boolean isMark) throws
858+
WxErrorException;
781859
}

0 commit comments

Comments
 (0)