Skip to content

Commit 9368177

Browse files
mgcnrx11binarywang
authored andcommitted
增加会员卡管理服务的更新会员信息接口的实现 (binarywang#283)
* 修复UserInfo反序列化的bug,补充其单元测试 * 增加`更新会员信息`接口的实现 * 增加会员卡相关接口的测试类 包含下述方法: 1. 会员卡激活接口 2. 会员信息获取接口 3. 更新会员信息接口
1 parent 22287a4 commit 9368177

12 files changed

+574
-4
lines changed

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

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
import me.chanjar.weixin.common.exception.WxErrorException;
44
import me.chanjar.weixin.mp.bean.membercard.WxMpMemberCardActivatedMessage;
5+
import me.chanjar.weixin.mp.bean.membercard.WxMpMemberCardUpdateMessage;
6+
import me.chanjar.weixin.mp.bean.membercard.WxMpMemberCardUpdateResult;
57
import me.chanjar.weixin.mp.bean.membercard.WxMpMemberCardUserInfoResult;
68

79
/**
@@ -35,4 +37,17 @@ public interface WxMpMemberCardService {
3537
* @throws WxErrorException 接口调用失败抛出的异常
3638
*/
3739
WxMpMemberCardUserInfoResult getUserInfo(String cardId, String code) throws WxErrorException;
40+
41+
/**
42+
* 当会员持卡消费后,支持开发者调用该接口更新会员信息。会员卡交易后的每次信息变更需通过该接口通知微信,便于后续消息通知及其他扩展功能。
43+
*
44+
* 1.开发者可以同时传入add_bonus和bonus解决由于同步失败带来的幂等性问题。同时传入add_bonus和bonus时
45+
* add_bonus作为积分变动消息中的变量值,而bonus作为卡面上的总积分额度显示。余额变动同理。
46+
* 2.开发者可以传入is_notify_bonus控制特殊的积分对账变动不发送消息,余额变动同理。
47+
*
48+
* @param updateUserMessage 更新会员信息所需字段消息
49+
* @return 调用返回的JSON字符串。
50+
* @throws WxErrorException 接口调用失败抛出的异常
51+
*/
52+
WxMpMemberCardUpdateResult updateUserMemberCard(WxMpMemberCardUpdateMessage updateUserMessage) throws WxErrorException;
3853
}

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

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
import me.chanjar.weixin.mp.api.WxMpMemberCardService;
1010
import me.chanjar.weixin.mp.api.WxMpService;
1111
import me.chanjar.weixin.mp.bean.membercard.WxMpMemberCardActivatedMessage;
12+
import me.chanjar.weixin.mp.bean.membercard.WxMpMemberCardUpdateMessage;
13+
import me.chanjar.weixin.mp.bean.membercard.WxMpMemberCardUpdateResult;
1214
import me.chanjar.weixin.mp.bean.membercard.WxMpMemberCardUserInfoResult;
1315
import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
1416
import org.slf4j.Logger;
@@ -26,6 +28,7 @@ public class WxMpMemberCardServiceImpl implements WxMpMemberCardService {
2628

2729
private static final String MEMBER_CARD_ACTIVATE = "https://api.weixin.qq.com/card/membercard/activate";
2830
private static final String MEMBER_CARD_USER_INFO_GET = "https://api.weixin.qq.com/card/membercard/userinfo/get";
31+
private static final String MEMBER_CARD_UPDATE_USER = "https://api.weixin.qq.com/card/membercard/updateuser";
2932

3033
private WxMpService wxMpService;
3134

@@ -75,4 +78,27 @@ public WxMpMemberCardUserInfoResult getUserInfo(String cardId, String code) thro
7578
new TypeToken<WxMpMemberCardUserInfoResult>() {
7679
}.getType());
7780
}
81+
82+
/**
83+
* 当会员持卡消费后,支持开发者调用该接口更新会员信息。会员卡交易后的每次信息变更需通过该接口通知微信,便于后续消息通知及其他扩展功能。
84+
*
85+
* 1.开发者可以同时传入add_bonus和bonus解决由于同步失败带来的幂等性问题。同时传入add_bonus和bonus时
86+
* add_bonus作为积分变动消息中的变量值,而bonus作为卡面上的总积分额度显示。余额变动同理。
87+
* 2.开发者可以传入is_notify_bonus控制特殊的积分对账变动不发送消息,余额变动同理。
88+
*
89+
* @param updateUserMessage 更新会员信息所需字段消息
90+
* @return 调用返回的JSON字符串。
91+
* @throws WxErrorException 接口调用失败抛出的异常
92+
*/
93+
@Override
94+
public WxMpMemberCardUpdateResult updateUserMemberCard(WxMpMemberCardUpdateMessage updateUserMessage)
95+
throws WxErrorException {
96+
97+
String responseContent = this.getWxMpService().post(MEMBER_CARD_UPDATE_USER, GSON.toJson(updateUserMessage));
98+
99+
JsonElement tmpJsonElement = new JsonParser().parse(responseContent);
100+
return WxMpGsonBuilder.INSTANCE.create().fromJson(tmpJsonElement,
101+
new TypeToken<WxMpMemberCardUpdateResult>() {
102+
}.getType());
103+
}
78104
}
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
package me.chanjar.weixin.mp.bean.membercard;
2+
3+
import com.google.gson.annotations.SerializedName;
4+
5+
/**
6+
* 控制原生消息结构体,包含各字段的消息控制字段。
7+
*
8+
* 用于 `7 更新会员信息` 的接口参数调用
9+
* https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1451025283
10+
*
11+
* @author YuJian(mgcnrx11@gmail.com)
12+
* @version 2017/7/15
13+
*/
14+
public class NotifyOptional {
15+
16+
// 积分变动时是否触发系统模板消息,默认为true
17+
@SerializedName("is_notify_bonus")
18+
private Boolean isNotifyBonus;
19+
20+
// 余额变动时是否触发系统模板消息,默认为true
21+
@SerializedName("is_notify_balance")
22+
private Boolean isNotifyBalance;
23+
24+
// 自定义group1变动时是否触发系统模板消息,默认为false。(2、3同理)
25+
@SerializedName("is_notify_custom_field1")
26+
private Boolean isNotifyCustomField1;
27+
28+
@SerializedName("is_notify_custom_field2")
29+
private Boolean isNotifyCustomField2;
30+
31+
@SerializedName("is_notify_custom_field3")
32+
private Boolean isNotifyCustomField3;
33+
34+
public Boolean getNotifyBonus() {
35+
return isNotifyBonus;
36+
}
37+
38+
public void setNotifyBonus(Boolean notifyBonus) {
39+
isNotifyBonus = notifyBonus;
40+
}
41+
42+
public Boolean getNotifyBalance() {
43+
return isNotifyBalance;
44+
}
45+
46+
public void setNotifyBalance(Boolean notifyBalance) {
47+
isNotifyBalance = notifyBalance;
48+
}
49+
50+
public Boolean getNotifyCustomField1() {
51+
return isNotifyCustomField1;
52+
}
53+
54+
public void setNotifyCustomField1(Boolean notifyCustomField1) {
55+
isNotifyCustomField1 = notifyCustomField1;
56+
}
57+
58+
public Boolean getNotifyCustomField2() {
59+
return isNotifyCustomField2;
60+
}
61+
62+
public void setNotifyCustomField2(Boolean notifyCustomField2) {
63+
isNotifyCustomField2 = notifyCustomField2;
64+
}
65+
66+
public Boolean getNotifyCustomField3() {
67+
return isNotifyCustomField3;
68+
}
69+
70+
public void setNotifyCustomField3(Boolean notifyCustomField3) {
71+
isNotifyCustomField3 = notifyCustomField3;
72+
}
73+
}
Lines changed: 156 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,156 @@
1+
package me.chanjar.weixin.mp.bean.membercard;
2+
3+
import com.google.gson.annotations.SerializedName;
4+
5+
/**
6+
* 更新会员信息所需字段消息。
7+
*
8+
* 1.开发者可以同时传入add_bonus和bonus解决由于同步失败带来的幂等性问题。同时传入add_bonus和bonus时
9+
* add_bonus作为积分变动消息中的变量值,而bonus作为卡面上的总积分额度显示。余额变动同理。
10+
* 2.开发者可以传入is_notify_bonus控制特殊的积分对账变动不发送消息,余额变动同理。
11+
*
12+
* @author YuJian(mgcnrx11@gmail.com)
13+
* @version 2017/7/15
14+
*/
15+
public class WxMpMemberCardUpdateMessage {
16+
17+
// 领取会员卡用户获得的code
18+
private String code;
19+
// 卡券ID,自定义code卡券必填
20+
@SerializedName("card_id")
21+
private String cardId;
22+
// 支持商家激活时针对单个会员卡分配自定义的会员卡背景
23+
@SerializedName("background_pic_url")
24+
private String backgroundPicUrl;
25+
// 需要设置的积分全量值,传入的数值会直接显示
26+
private Integer bonus;
27+
// 本次积分变动值,传负数代表减少
28+
@SerializedName("add_bonus")
29+
private Integer addBounus;
30+
// 商家自定义积分消耗记录,不超过14个汉字
31+
@SerializedName("record_bonus")
32+
private String recordBonus;
33+
// 需要设置的余额全量值,传入的数值会直接显示在卡面
34+
private Integer balance;
35+
// 本次余额变动值,传负数代表减少
36+
@SerializedName("add_balance")
37+
private Integer addBalance;
38+
// 商家自定义金额消耗记录,不超过14个汉字。
39+
@SerializedName("record_balance")
40+
private String recordBalance;
41+
42+
// 创建时字段custom_field定义类型的最新数值,限制为4个汉字,12字节。
43+
@SerializedName("custom_field_value1")
44+
private String customFieldValue1;
45+
@SerializedName("custom_field_value2")
46+
private String customFieldValue2;
47+
@SerializedName("custom_field_value3")
48+
private String customFieldValue3;
49+
50+
@SerializedName("notify_optional")
51+
private NotifyOptional notifyOptional;
52+
53+
public String getCode() {
54+
return code;
55+
}
56+
57+
public void setCode(String code) {
58+
this.code = code;
59+
}
60+
61+
public String getCardId() {
62+
return cardId;
63+
}
64+
65+
public void setCardId(String cardId) {
66+
this.cardId = cardId;
67+
}
68+
69+
public String getBackgroundPicUrl() {
70+
return backgroundPicUrl;
71+
}
72+
73+
public void setBackgroundPicUrl(String backgroundPicUrl) {
74+
this.backgroundPicUrl = backgroundPicUrl;
75+
}
76+
77+
public Integer getBonus() {
78+
return bonus;
79+
}
80+
81+
public void setBonus(Integer bonus) {
82+
this.bonus = bonus;
83+
}
84+
85+
public Integer getAddBounus() {
86+
return addBounus;
87+
}
88+
89+
public void setAddBounus(Integer addBounus) {
90+
this.addBounus = addBounus;
91+
}
92+
93+
public String getRecordBonus() {
94+
return recordBonus;
95+
}
96+
97+
public void setRecordBonus(String recordBonus) {
98+
this.recordBonus = recordBonus;
99+
}
100+
101+
public Integer getBalance() {
102+
return balance;
103+
}
104+
105+
public void setBalance(Integer balance) {
106+
this.balance = balance;
107+
}
108+
109+
public Integer getAddBalance() {
110+
return addBalance;
111+
}
112+
113+
public void setAddBalance(Integer addBalance) {
114+
this.addBalance = addBalance;
115+
}
116+
117+
public String getRecordBalance() {
118+
return recordBalance;
119+
}
120+
121+
public void setRecordBalance(String recordBalance) {
122+
this.recordBalance = recordBalance;
123+
}
124+
125+
public String getCustomFieldValue1() {
126+
return customFieldValue1;
127+
}
128+
129+
public void setCustomFieldValue1(String customFieldValue1) {
130+
this.customFieldValue1 = customFieldValue1;
131+
}
132+
133+
public String getCustomFieldValue2() {
134+
return customFieldValue2;
135+
}
136+
137+
public void setCustomFieldValue2(String customFieldValue2) {
138+
this.customFieldValue2 = customFieldValue2;
139+
}
140+
141+
public String getCustomFieldValue3() {
142+
return customFieldValue3;
143+
}
144+
145+
public void setCustomFieldValue3(String customFieldValue3) {
146+
this.customFieldValue3 = customFieldValue3;
147+
}
148+
149+
public NotifyOptional getNotifyOptional() {
150+
return notifyOptional;
151+
}
152+
153+
public void setNotifyOptional(NotifyOptional notifyOptional) {
154+
this.notifyOptional = notifyOptional;
155+
}
156+
}
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
package me.chanjar.weixin.mp.bean.membercard;
2+
3+
import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
4+
5+
import java.io.Serializable;
6+
7+
/**
8+
* 用于 `7 更新会员信息` 的接口调用后的返回结果
9+
* https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1451025283
10+
*
11+
* @author YuJian(mgcnrx11@gmail.com)
12+
* @version 2017/7/15
13+
*/
14+
public class WxMpMemberCardUpdateResult implements Serializable {
15+
16+
private static final long serialVersionUID = 9084886191442098311L;
17+
18+
private String errorCode;
19+
20+
private String errorMsg;
21+
22+
private String openId;
23+
24+
private Integer resultBonus;
25+
26+
private Integer resultBalance;
27+
28+
public String getErrorCode() {
29+
return errorCode;
30+
}
31+
32+
public void setErrorCode(String errorCode) {
33+
this.errorCode = errorCode;
34+
}
35+
36+
public String getErrorMsg() {
37+
return errorMsg;
38+
}
39+
40+
public void setErrorMsg(String errorMsg) {
41+
this.errorMsg = errorMsg;
42+
}
43+
44+
public String getOpenId() {
45+
return openId;
46+
}
47+
48+
public void setOpenId(String openId) {
49+
this.openId = openId;
50+
}
51+
52+
public Integer getResultBonus() {
53+
return resultBonus;
54+
}
55+
56+
public void setResultBonus(Integer resultBonus) {
57+
this.resultBonus = resultBonus;
58+
}
59+
60+
public Integer getResultBalance() {
61+
return resultBalance;
62+
}
63+
64+
public void setResultBalance(Integer resultBalance) {
65+
this.resultBalance = resultBalance;
66+
}
67+
68+
@Override
69+
public String toString() {
70+
return "WxMpMemberCardUpdateResult{" +
71+
"errorCode='" + errorCode + '\'' +
72+
", errorMsg='" + errorMsg + '\'' +
73+
", openId='" + openId + '\'' +
74+
", resultBonus=" + resultBonus +
75+
", resultBalance=" + resultBalance +
76+
'}';
77+
}
78+
79+
public static WxMpMemberCardUpdateResult fromJson(String json) {
80+
return WxMpGsonBuilder.INSTANCE.create().fromJson(json, WxMpMemberCardUpdateResult.class);
81+
}
82+
}

0 commit comments

Comments
 (0)