* 修复UserInfo反序列化的bug,补充其单元测试 * 增加`更新会员信息`接口的实现 * 增加会员卡相关接口的测试类 包含下述方法: 1. 会员卡激活接口 2. 会员信息获取接口 3. 更新会员信息接口master
@@ -2,6 +2,8 @@ package me.chanjar.weixin.mp.api; | |||||
import me.chanjar.weixin.common.exception.WxErrorException; | import me.chanjar.weixin.common.exception.WxErrorException; | ||||
import me.chanjar.weixin.mp.bean.membercard.WxMpMemberCardActivatedMessage; | import me.chanjar.weixin.mp.bean.membercard.WxMpMemberCardActivatedMessage; | ||||
import me.chanjar.weixin.mp.bean.membercard.WxMpMemberCardUpdateMessage; | |||||
import me.chanjar.weixin.mp.bean.membercard.WxMpMemberCardUpdateResult; | |||||
import me.chanjar.weixin.mp.bean.membercard.WxMpMemberCardUserInfoResult; | import me.chanjar.weixin.mp.bean.membercard.WxMpMemberCardUserInfoResult; | ||||
/** | /** | ||||
@@ -35,4 +37,17 @@ public interface WxMpMemberCardService { | |||||
* @throws WxErrorException 接口调用失败抛出的异常 | * @throws WxErrorException 接口调用失败抛出的异常 | ||||
*/ | */ | ||||
WxMpMemberCardUserInfoResult getUserInfo(String cardId, String code) throws WxErrorException; | WxMpMemberCardUserInfoResult getUserInfo(String cardId, String code) throws WxErrorException; | ||||
/** | |||||
* 当会员持卡消费后,支持开发者调用该接口更新会员信息。会员卡交易后的每次信息变更需通过该接口通知微信,便于后续消息通知及其他扩展功能。 | |||||
* | |||||
* 1.开发者可以同时传入add_bonus和bonus解决由于同步失败带来的幂等性问题。同时传入add_bonus和bonus时 | |||||
* add_bonus作为积分变动消息中的变量值,而bonus作为卡面上的总积分额度显示。余额变动同理。 | |||||
* 2.开发者可以传入is_notify_bonus控制特殊的积分对账变动不发送消息,余额变动同理。 | |||||
* | |||||
* @param updateUserMessage 更新会员信息所需字段消息 | |||||
* @return 调用返回的JSON字符串。 | |||||
* @throws WxErrorException 接口调用失败抛出的异常 | |||||
*/ | |||||
WxMpMemberCardUpdateResult updateUserMemberCard(WxMpMemberCardUpdateMessage updateUserMessage) throws WxErrorException; | |||||
} | } |
@@ -9,6 +9,8 @@ import me.chanjar.weixin.common.exception.WxErrorException; | |||||
import me.chanjar.weixin.mp.api.WxMpMemberCardService; | import me.chanjar.weixin.mp.api.WxMpMemberCardService; | ||||
import me.chanjar.weixin.mp.api.WxMpService; | import me.chanjar.weixin.mp.api.WxMpService; | ||||
import me.chanjar.weixin.mp.bean.membercard.WxMpMemberCardActivatedMessage; | import me.chanjar.weixin.mp.bean.membercard.WxMpMemberCardActivatedMessage; | ||||
import me.chanjar.weixin.mp.bean.membercard.WxMpMemberCardUpdateMessage; | |||||
import me.chanjar.weixin.mp.bean.membercard.WxMpMemberCardUpdateResult; | |||||
import me.chanjar.weixin.mp.bean.membercard.WxMpMemberCardUserInfoResult; | import me.chanjar.weixin.mp.bean.membercard.WxMpMemberCardUserInfoResult; | ||||
import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; | import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; | ||||
import org.slf4j.Logger; | import org.slf4j.Logger; | ||||
@@ -26,6 +28,7 @@ public class WxMpMemberCardServiceImpl implements WxMpMemberCardService { | |||||
private static final String MEMBER_CARD_ACTIVATE = "https://api.weixin.qq.com/card/membercard/activate"; | private static final String MEMBER_CARD_ACTIVATE = "https://api.weixin.qq.com/card/membercard/activate"; | ||||
private static final String MEMBER_CARD_USER_INFO_GET = "https://api.weixin.qq.com/card/membercard/userinfo/get"; | private static final String MEMBER_CARD_USER_INFO_GET = "https://api.weixin.qq.com/card/membercard/userinfo/get"; | ||||
private static final String MEMBER_CARD_UPDATE_USER = "https://api.weixin.qq.com/card/membercard/updateuser"; | |||||
private WxMpService wxMpService; | private WxMpService wxMpService; | ||||
@@ -75,4 +78,27 @@ public class WxMpMemberCardServiceImpl implements WxMpMemberCardService { | |||||
new TypeToken<WxMpMemberCardUserInfoResult>() { | new TypeToken<WxMpMemberCardUserInfoResult>() { | ||||
}.getType()); | }.getType()); | ||||
} | } | ||||
/** | |||||
* 当会员持卡消费后,支持开发者调用该接口更新会员信息。会员卡交易后的每次信息变更需通过该接口通知微信,便于后续消息通知及其他扩展功能。 | |||||
* | |||||
* 1.开发者可以同时传入add_bonus和bonus解决由于同步失败带来的幂等性问题。同时传入add_bonus和bonus时 | |||||
* add_bonus作为积分变动消息中的变量值,而bonus作为卡面上的总积分额度显示。余额变动同理。 | |||||
* 2.开发者可以传入is_notify_bonus控制特殊的积分对账变动不发送消息,余额变动同理。 | |||||
* | |||||
* @param updateUserMessage 更新会员信息所需字段消息 | |||||
* @return 调用返回的JSON字符串。 | |||||
* @throws WxErrorException 接口调用失败抛出的异常 | |||||
*/ | |||||
@Override | |||||
public WxMpMemberCardUpdateResult updateUserMemberCard(WxMpMemberCardUpdateMessage updateUserMessage) | |||||
throws WxErrorException { | |||||
String responseContent = this.getWxMpService().post(MEMBER_CARD_UPDATE_USER, GSON.toJson(updateUserMessage)); | |||||
JsonElement tmpJsonElement = new JsonParser().parse(responseContent); | |||||
return WxMpGsonBuilder.INSTANCE.create().fromJson(tmpJsonElement, | |||||
new TypeToken<WxMpMemberCardUpdateResult>() { | |||||
}.getType()); | |||||
} | |||||
} | } |
@@ -0,0 +1,73 @@ | |||||
package me.chanjar.weixin.mp.bean.membercard; | |||||
import com.google.gson.annotations.SerializedName; | |||||
/** | |||||
* 控制原生消息结构体,包含各字段的消息控制字段。 | |||||
* | |||||
* 用于 `7 更新会员信息` 的接口参数调用 | |||||
* https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1451025283 | |||||
* | |||||
* @author YuJian(mgcnrx11@gmail.com) | |||||
* @version 2017/7/15 | |||||
*/ | |||||
public class NotifyOptional { | |||||
// 积分变动时是否触发系统模板消息,默认为true | |||||
@SerializedName("is_notify_bonus") | |||||
private Boolean isNotifyBonus; | |||||
// 余额变动时是否触发系统模板消息,默认为true | |||||
@SerializedName("is_notify_balance") | |||||
private Boolean isNotifyBalance; | |||||
// 自定义group1变动时是否触发系统模板消息,默认为false。(2、3同理) | |||||
@SerializedName("is_notify_custom_field1") | |||||
private Boolean isNotifyCustomField1; | |||||
@SerializedName("is_notify_custom_field2") | |||||
private Boolean isNotifyCustomField2; | |||||
@SerializedName("is_notify_custom_field3") | |||||
private Boolean isNotifyCustomField3; | |||||
public Boolean getNotifyBonus() { | |||||
return isNotifyBonus; | |||||
} | |||||
public void setNotifyBonus(Boolean notifyBonus) { | |||||
isNotifyBonus = notifyBonus; | |||||
} | |||||
public Boolean getNotifyBalance() { | |||||
return isNotifyBalance; | |||||
} | |||||
public void setNotifyBalance(Boolean notifyBalance) { | |||||
isNotifyBalance = notifyBalance; | |||||
} | |||||
public Boolean getNotifyCustomField1() { | |||||
return isNotifyCustomField1; | |||||
} | |||||
public void setNotifyCustomField1(Boolean notifyCustomField1) { | |||||
isNotifyCustomField1 = notifyCustomField1; | |||||
} | |||||
public Boolean getNotifyCustomField2() { | |||||
return isNotifyCustomField2; | |||||
} | |||||
public void setNotifyCustomField2(Boolean notifyCustomField2) { | |||||
isNotifyCustomField2 = notifyCustomField2; | |||||
} | |||||
public Boolean getNotifyCustomField3() { | |||||
return isNotifyCustomField3; | |||||
} | |||||
public void setNotifyCustomField3(Boolean notifyCustomField3) { | |||||
isNotifyCustomField3 = notifyCustomField3; | |||||
} | |||||
} |
@@ -0,0 +1,156 @@ | |||||
package me.chanjar.weixin.mp.bean.membercard; | |||||
import com.google.gson.annotations.SerializedName; | |||||
/** | |||||
* 更新会员信息所需字段消息。 | |||||
* | |||||
* 1.开发者可以同时传入add_bonus和bonus解决由于同步失败带来的幂等性问题。同时传入add_bonus和bonus时 | |||||
* add_bonus作为积分变动消息中的变量值,而bonus作为卡面上的总积分额度显示。余额变动同理。 | |||||
* 2.开发者可以传入is_notify_bonus控制特殊的积分对账变动不发送消息,余额变动同理。 | |||||
* | |||||
* @author YuJian(mgcnrx11@gmail.com) | |||||
* @version 2017/7/15 | |||||
*/ | |||||
public class WxMpMemberCardUpdateMessage { | |||||
// 领取会员卡用户获得的code | |||||
private String code; | |||||
// 卡券ID,自定义code卡券必填 | |||||
@SerializedName("card_id") | |||||
private String cardId; | |||||
// 支持商家激活时针对单个会员卡分配自定义的会员卡背景 | |||||
@SerializedName("background_pic_url") | |||||
private String backgroundPicUrl; | |||||
// 需要设置的积分全量值,传入的数值会直接显示 | |||||
private Integer bonus; | |||||
// 本次积分变动值,传负数代表减少 | |||||
@SerializedName("add_bonus") | |||||
private Integer addBounus; | |||||
// 商家自定义积分消耗记录,不超过14个汉字 | |||||
@SerializedName("record_bonus") | |||||
private String recordBonus; | |||||
// 需要设置的余额全量值,传入的数值会直接显示在卡面 | |||||
private Integer balance; | |||||
// 本次余额变动值,传负数代表减少 | |||||
@SerializedName("add_balance") | |||||
private Integer addBalance; | |||||
// 商家自定义金额消耗记录,不超过14个汉字。 | |||||
@SerializedName("record_balance") | |||||
private String recordBalance; | |||||
// 创建时字段custom_field定义类型的最新数值,限制为4个汉字,12字节。 | |||||
@SerializedName("custom_field_value1") | |||||
private String customFieldValue1; | |||||
@SerializedName("custom_field_value2") | |||||
private String customFieldValue2; | |||||
@SerializedName("custom_field_value3") | |||||
private String customFieldValue3; | |||||
@SerializedName("notify_optional") | |||||
private NotifyOptional notifyOptional; | |||||
public String getCode() { | |||||
return code; | |||||
} | |||||
public void setCode(String code) { | |||||
this.code = code; | |||||
} | |||||
public String getCardId() { | |||||
return cardId; | |||||
} | |||||
public void setCardId(String cardId) { | |||||
this.cardId = cardId; | |||||
} | |||||
public String getBackgroundPicUrl() { | |||||
return backgroundPicUrl; | |||||
} | |||||
public void setBackgroundPicUrl(String backgroundPicUrl) { | |||||
this.backgroundPicUrl = backgroundPicUrl; | |||||
} | |||||
public Integer getBonus() { | |||||
return bonus; | |||||
} | |||||
public void setBonus(Integer bonus) { | |||||
this.bonus = bonus; | |||||
} | |||||
public Integer getAddBounus() { | |||||
return addBounus; | |||||
} | |||||
public void setAddBounus(Integer addBounus) { | |||||
this.addBounus = addBounus; | |||||
} | |||||
public String getRecordBonus() { | |||||
return recordBonus; | |||||
} | |||||
public void setRecordBonus(String recordBonus) { | |||||
this.recordBonus = recordBonus; | |||||
} | |||||
public Integer getBalance() { | |||||
return balance; | |||||
} | |||||
public void setBalance(Integer balance) { | |||||
this.balance = balance; | |||||
} | |||||
public Integer getAddBalance() { | |||||
return addBalance; | |||||
} | |||||
public void setAddBalance(Integer addBalance) { | |||||
this.addBalance = addBalance; | |||||
} | |||||
public String getRecordBalance() { | |||||
return recordBalance; | |||||
} | |||||
public void setRecordBalance(String recordBalance) { | |||||
this.recordBalance = recordBalance; | |||||
} | |||||
public String getCustomFieldValue1() { | |||||
return customFieldValue1; | |||||
} | |||||
public void setCustomFieldValue1(String customFieldValue1) { | |||||
this.customFieldValue1 = customFieldValue1; | |||||
} | |||||
public String getCustomFieldValue2() { | |||||
return customFieldValue2; | |||||
} | |||||
public void setCustomFieldValue2(String customFieldValue2) { | |||||
this.customFieldValue2 = customFieldValue2; | |||||
} | |||||
public String getCustomFieldValue3() { | |||||
return customFieldValue3; | |||||
} | |||||
public void setCustomFieldValue3(String customFieldValue3) { | |||||
this.customFieldValue3 = customFieldValue3; | |||||
} | |||||
public NotifyOptional getNotifyOptional() { | |||||
return notifyOptional; | |||||
} | |||||
public void setNotifyOptional(NotifyOptional notifyOptional) { | |||||
this.notifyOptional = notifyOptional; | |||||
} | |||||
} |
@@ -0,0 +1,82 @@ | |||||
package me.chanjar.weixin.mp.bean.membercard; | |||||
import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; | |||||
import java.io.Serializable; | |||||
/** | |||||
* 用于 `7 更新会员信息` 的接口调用后的返回结果 | |||||
* https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1451025283 | |||||
* | |||||
* @author YuJian(mgcnrx11@gmail.com) | |||||
* @version 2017/7/15 | |||||
*/ | |||||
public class WxMpMemberCardUpdateResult implements Serializable { | |||||
private static final long serialVersionUID = 9084886191442098311L; | |||||
private String errorCode; | |||||
private String errorMsg; | |||||
private String openId; | |||||
private Integer resultBonus; | |||||
private Integer resultBalance; | |||||
public String getErrorCode() { | |||||
return errorCode; | |||||
} | |||||
public void setErrorCode(String errorCode) { | |||||
this.errorCode = errorCode; | |||||
} | |||||
public String getErrorMsg() { | |||||
return errorMsg; | |||||
} | |||||
public void setErrorMsg(String errorMsg) { | |||||
this.errorMsg = errorMsg; | |||||
} | |||||
public String getOpenId() { | |||||
return openId; | |||||
} | |||||
public void setOpenId(String openId) { | |||||
this.openId = openId; | |||||
} | |||||
public Integer getResultBonus() { | |||||
return resultBonus; | |||||
} | |||||
public void setResultBonus(Integer resultBonus) { | |||||
this.resultBonus = resultBonus; | |||||
} | |||||
public Integer getResultBalance() { | |||||
return resultBalance; | |||||
} | |||||
public void setResultBalance(Integer resultBalance) { | |||||
this.resultBalance = resultBalance; | |||||
} | |||||
@Override | |||||
public String toString() { | |||||
return "WxMpMemberCardUpdateResult{" + | |||||
"errorCode='" + errorCode + '\'' + | |||||
", errorMsg='" + errorMsg + '\'' + | |||||
", openId='" + openId + '\'' + | |||||
", resultBonus=" + resultBonus + | |||||
", resultBalance=" + resultBalance + | |||||
'}'; | |||||
} | |||||
public static WxMpMemberCardUpdateResult fromJson(String json) { | |||||
return WxMpGsonBuilder.INSTANCE.create().fromJson(json, WxMpMemberCardUpdateResult.class); | |||||
} | |||||
} |
@@ -1,5 +1,7 @@ | |||||
package me.chanjar.weixin.mp.bean.membercard; | package me.chanjar.weixin.mp.bean.membercard; | ||||
import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; | |||||
import java.io.Serializable; | import java.io.Serializable; | ||||
/** | /** | ||||
@@ -133,5 +135,9 @@ public class WxMpMemberCardUserInfoResult implements Serializable { | |||||
", hasActive=" + hasActive + | ", hasActive=" + hasActive + | ||||
'}'; | '}'; | ||||
} | } | ||||
public static WxMpMemberCardUserInfoResult fromJson(String json) { | |||||
return WxMpGsonBuilder.INSTANCE.create().fromJson(json, WxMpMemberCardUserInfoResult.class); | |||||
} | |||||
} | } | ||||
@@ -6,6 +6,7 @@ import me.chanjar.weixin.mp.bean.*; | |||||
import me.chanjar.weixin.mp.bean.datacube.WxDataCubeUserCumulate; | import me.chanjar.weixin.mp.bean.datacube.WxDataCubeUserCumulate; | ||||
import me.chanjar.weixin.mp.bean.datacube.WxDataCubeUserSummary; | import me.chanjar.weixin.mp.bean.datacube.WxDataCubeUserSummary; | ||||
import me.chanjar.weixin.mp.bean.kefu.WxMpKefuMessage; | import me.chanjar.weixin.mp.bean.kefu.WxMpKefuMessage; | ||||
import me.chanjar.weixin.mp.bean.membercard.WxMpMemberCardUpdateResult; | |||||
import me.chanjar.weixin.mp.bean.membercard.WxMpMemberCardUserInfoResult; | import me.chanjar.weixin.mp.bean.membercard.WxMpMemberCardUserInfoResult; | ||||
import me.chanjar.weixin.mp.bean.material.*; | import me.chanjar.weixin.mp.bean.material.*; | ||||
import me.chanjar.weixin.mp.bean.result.*; | import me.chanjar.weixin.mp.bean.result.*; | ||||
@@ -51,6 +52,7 @@ public class WxMpGsonBuilder { | |||||
INSTANCE.registerTypeAdapter(WxMpTemplateIndustry.class, new WxMpIndustryGsonAdapter()); | INSTANCE.registerTypeAdapter(WxMpTemplateIndustry.class, new WxMpIndustryGsonAdapter()); | ||||
INSTANCE.registerTypeAdapter(WxMpUserBlacklistGetResult.class, new WxUserBlacklistGetResultGsonAdapter()); | INSTANCE.registerTypeAdapter(WxMpUserBlacklistGetResult.class, new WxUserBlacklistGetResultGsonAdapter()); | ||||
INSTANCE.registerTypeAdapter(WxMpMemberCardUserInfoResult.class, new WxMpMemberCardUserInfoResultGsonAdapter()); | INSTANCE.registerTypeAdapter(WxMpMemberCardUserInfoResult.class, new WxMpMemberCardUserInfoResultGsonAdapter()); | ||||
INSTANCE.registerTypeAdapter(WxMpMemberCardUpdateResult.class, new WxMpMemberCardUpdateResultGsonAdapter()); | |||||
} | } | ||||
public static Gson create() { | public static Gson create() { | ||||
@@ -0,0 +1,37 @@ | |||||
package me.chanjar.weixin.mp.util.json; | |||||
import com.google.gson.JsonDeserializationContext; | |||||
import com.google.gson.JsonDeserializer; | |||||
import com.google.gson.JsonElement; | |||||
import com.google.gson.JsonObject; | |||||
import com.google.gson.JsonParseException; | |||||
import me.chanjar.weixin.common.util.json.GsonHelper; | |||||
import me.chanjar.weixin.mp.bean.membercard.WxMpMemberCardUpdateResult; | |||||
import java.lang.reflect.Type; | |||||
/** | |||||
* Json to WxMpMemberCardUpdateResult 的转换适配器 | |||||
* | |||||
* @author YuJian | |||||
* @version 2017/7/15 | |||||
*/ | |||||
public class WxMpMemberCardUpdateResultGsonAdapter implements JsonDeserializer<WxMpMemberCardUpdateResult> { | |||||
@Override | |||||
public WxMpMemberCardUpdateResult deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext | |||||
jsonDeserializationContext) throws JsonParseException { | |||||
WxMpMemberCardUpdateResult result = new WxMpMemberCardUpdateResult(); | |||||
JsonObject jsonObject = jsonElement.getAsJsonObject(); | |||||
result.setOpenId(GsonHelper.getString(jsonObject, "openid")); | |||||
result.setErrorCode(GsonHelper.getString(jsonObject, "errcode")); | |||||
result.setErrorMsg(GsonHelper.getString(jsonObject, "errmsg")); | |||||
result.setResultBalance(GsonHelper.getInteger(jsonObject, "result_balance")); | |||||
result.setResultBonus(GsonHelper.getInteger(jsonObject, "result_bonus")); | |||||
return result; | |||||
} | |||||
} |
@@ -9,9 +9,9 @@ import me.chanjar.weixin.mp.bean.membercard.WxMpMemberCardUserInfoResult; | |||||
import java.lang.reflect.Type; | import java.lang.reflect.Type; | ||||
/** | /** | ||||
* Created by YuJian on 2017/7/11. | |||||
* Json to WxMpMemberCardUserInfoResult 的转换适配器 | |||||
* | * | ||||
* @author YuJian | |||||
* @author YuJian(mgcnrx11@gmail.com) | |||||
* @version 2017/7/11 | * @version 2017/7/11 | ||||
*/ | */ | ||||
public class WxMpMemberCardUserInfoResultGsonAdapter implements JsonDeserializer<WxMpMemberCardUserInfoResult> { | public class WxMpMemberCardUserInfoResultGsonAdapter implements JsonDeserializer<WxMpMemberCardUserInfoResult> { | ||||
@@ -57,8 +57,7 @@ public class WxMpMemberCardUserInfoResultGsonAdapter implements JsonDeserializer | |||||
JsonArray valueListArray = customField.getAsJsonArray("value_list"); | JsonArray valueListArray = customField.getAsJsonArray("value_list"); | ||||
String[] valueList = new String[valueListArray.size()]; | String[] valueList = new String[valueListArray.size()]; | ||||
for (int j = 0; j < valueListArray.size(); j++) { | for (int j = 0; j < valueListArray.size(); j++) { | ||||
JsonObject valueListObj = valueListArray.getAsJsonObject(); | |||||
valueList[i] = valueListObj.getAsString(); | |||||
valueList[j] = valueListArray.get(j).getAsString(); | |||||
} | } | ||||
customNameValues.setValueList(valueList); | customNameValues.setValueList(valueList); | ||||
customFieldListValues[i] = customNameValues; | customFieldListValues[i] = customNameValues; | ||||
@@ -0,0 +1,61 @@ | |||||
package me.chanjar.weixin.mp.api.impl; | |||||
import com.google.inject.Inject; | |||||
import me.chanjar.weixin.mp.api.WxMpService; | |||||
import me.chanjar.weixin.mp.api.test.ApiTestModule; | |||||
import me.chanjar.weixin.mp.bean.membercard.WxMpMemberCardActivatedMessage; | |||||
import me.chanjar.weixin.mp.bean.membercard.WxMpMemberCardUpdateMessage; | |||||
import me.chanjar.weixin.mp.bean.membercard.WxMpMemberCardUpdateResult; | |||||
import me.chanjar.weixin.mp.bean.membercard.WxMpMemberCardUserInfoResult; | |||||
import org.testng.annotations.Guice; | |||||
import org.testng.annotations.Test; | |||||
import static org.testng.AssertJUnit.assertNotNull; | |||||
/** | |||||
* 会员卡相关接口的测试类。 | |||||
* 数据均为测试数据,由于直接与调用微信的接口,需要填写真实数据进行测试才能通过。 | |||||
*/ | |||||
@Test | |||||
@Guice(modules = ApiTestModule.class) | |||||
public class WxMpMemberCardServiceImplTest { | |||||
@Inject | |||||
protected WxMpService wxService; | |||||
private String cardId = "abc"; | |||||
private String code = "123"; | |||||
private String openId = "xyz"; | |||||
@Test | |||||
public void testActivateMemberCard() throws Exception { | |||||
WxMpMemberCardActivatedMessage activatedMessage = new WxMpMemberCardActivatedMessage(); | |||||
activatedMessage.setMembershipNumber(openId); | |||||
activatedMessage.setCode(code); | |||||
activatedMessage.setCardId(cardId); | |||||
activatedMessage.setInitBonus(2000); | |||||
activatedMessage.setInitBonusRecord("测试激活送积分"); | |||||
String response = this.wxService.getMemberCardService().activateMemberCard(activatedMessage); | |||||
assertNotNull(response); | |||||
System.out.println(response); | |||||
} | |||||
@Test | |||||
public void testGetUserInfo() throws Exception { | |||||
WxMpMemberCardUserInfoResult result = this.wxService.getMemberCardService().getUserInfo(cardId, code); | |||||
assertNotNull(result); | |||||
System.out.println(result); | |||||
} | |||||
@Test | |||||
public void testUpdateUserMemberCard() throws Exception { | |||||
WxMpMemberCardUpdateMessage updateMessage = new WxMpMemberCardUpdateMessage(); | |||||
updateMessage.setAddBounus(100); | |||||
updateMessage.setBonus(1000); | |||||
updateMessage.setCardId(cardId); | |||||
updateMessage.setCode(code); | |||||
WxMpMemberCardUpdateResult result = this.wxService.getMemberCardService().updateUserMemberCard(updateMessage); | |||||
assertNotNull(result); | |||||
System.out.println(result); | |||||
} | |||||
} |
@@ -0,0 +1,33 @@ | |||||
package me.chanjar.weixin.mp.bean.membercard; | |||||
import org.testng.annotations.Test; | |||||
import static org.testng.Assert.assertFalse; | |||||
import static org.testng.Assert.assertNotNull; | |||||
import static org.testng.Assert.assertTrue; | |||||
/** | |||||
* | |||||
* @author YuJian | |||||
* @version 2017/7/15 | |||||
*/ | |||||
public class WxMpMemberCardUpdateResultTest { | |||||
@Test | |||||
public void testFromJson() throws Exception { | |||||
String json = "{\n" + | |||||
" \"errcode\": 0,\n" + | |||||
" \"errmsg\": \"ok\",\n" + | |||||
" \"result_bonus\": 100,\n" + | |||||
" \"result_balance\": 200,\n" + | |||||
" \"openid\": \"oFS7Fjl0WsZ9AMZqrI80nbIq8xrA\"\n" + | |||||
"}"; | |||||
WxMpMemberCardUpdateResult result = WxMpMemberCardUpdateResult.fromJson(json); | |||||
assertNotNull(result); | |||||
assertTrue(result.getErrorCode().equalsIgnoreCase("0")); | |||||
System.out.println(result); | |||||
} | |||||
} |
@@ -0,0 +1,80 @@ | |||||
package me.chanjar.weixin.mp.bean.membercard; | |||||
import org.testng.annotations.Test; | |||||
import static org.testng.Assert.assertFalse; | |||||
import static org.testng.Assert.assertNotNull; | |||||
import static org.testng.Assert.assertTrue; | |||||
/** | |||||
* | |||||
* @author YuJian | |||||
* @version 2017/7/15 | |||||
*/ | |||||
public class WxMpMemberCardUserInfoResultTest { | |||||
@Test | |||||
public void testFromJson() throws Exception { | |||||
String json = "{\n" + | |||||
" \"errcode\": 0,\n" + | |||||
" \"errmsg\": \"ok\",\n" + | |||||
" \"openid\": \"obLatjjwDolFj******wNqRXw\",\n" + | |||||
" \"nickname\": \"*******\",\n" + | |||||
" \"membership_number\": \"658*****445\",\n" + | |||||
" \"bonus\": 995,\n" + | |||||
" \"sex\": \"MALE\",\n" + | |||||
" \"user_info\": {\n" + | |||||
" \"common_field_list\": [\n" + | |||||
" {\n" + | |||||
" \"name\": \"USER_FORM_INFO_FLAG_MOBILE\",\n" + | |||||
" \"value\": \"15*****518\"\n" + | |||||
" },\n" + | |||||
" {\n" + | |||||
" \"name\": \"USER_FORM_INFO_FLAG_NAME\",\n" + | |||||
" \"value\": \"HK\"\n" + | |||||
" },\n" + | |||||
" {\n" + | |||||
" \"name\": \"USER_FORM_INFO_FLAG_EDUCATION_BACKGROUND\",\n" + | |||||
" \"value\": \"研究生\"\n" + | |||||
" }\n" + | |||||
" ],\n" + | |||||
" \"custom_field_list\": [\n" + | |||||
" {\n" + | |||||
" \"name\": \"兴趣\",\n" + | |||||
" \"value\": \"钢琴\",\n" + | |||||
" \"value_list\": []\n" + | |||||
" },\n" + | |||||
" {\n" + | |||||
" \"name\": \"喜好\",\n" + | |||||
" \"value\": \"郭敬明\",\n" + | |||||
" \"value_list\": []\n" + | |||||
" },\n" + | |||||
" {\n" + | |||||
" \"name\": \"职业\",\n" + | |||||
" \"value\": \"\",\n" + | |||||
" \"value_list\": [\n" + | |||||
" \"赛车手\",\n" + | |||||
" \"旅行家\"\n" + | |||||
" ]\n" + | |||||
" }\n" + | |||||
" ]\n" + | |||||
" },\n" + | |||||
" \"user_card_status\": \"NORMAL\",\n" + | |||||
" \"has_active\": false\n" + | |||||
"}"; | |||||
WxMpMemberCardUserInfoResult userInfoResult = WxMpMemberCardUserInfoResult.fromJson(json); | |||||
assertNotNull(userInfoResult); | |||||
assertFalse(userInfoResult.getHasActive()); | |||||
assertTrue(userInfoResult.getSex().equalsIgnoreCase("MALE")); | |||||
assertNotNull(userInfoResult.getUserInfo()); | |||||
assertNotNull(userInfoResult.getUserInfo().getCommonFieldList()); | |||||
assertNotNull(userInfoResult.getUserInfo().getCustomFieldList()); | |||||
assertTrue(userInfoResult.getUserInfo().getCommonFieldList().length == 3); | |||||
assertTrue(userInfoResult.getUserInfo().getCustomFieldList()[2].getValueList()[0].equalsIgnoreCase("赛车手")); | |||||
System.out.println(userInfoResult); | |||||
} | |||||
} |