Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import java.util.List;
import java.util.Map;

import com.thoughtworks.xstream.annotations.XStreamImplicit;
import org.apache.commons.io.IOUtils;

import com.thoughtworks.xstream.annotations.XStreamAlias;
Expand Down Expand Up @@ -247,6 +248,13 @@ public class WxCpXmlMessage implements Serializable {
@XStreamConverter(value = XStreamCDataConverter.class)
private String telephone;

/**
* 地址.
*/
@XStreamAlias("Address")
@XStreamConverter(value = XStreamCDataConverter.class)
private String address;

/**
* 扩展属性.
*/
Expand Down Expand Up @@ -327,17 +335,20 @@ public class WxCpXmlMessage implements Serializable {
*/
@XStreamAlias("TotalCount")
private Integer totalCount;

/**
* 过滤.
* (过滤是指特定地区、性别的过滤、用户设置拒收的过滤,用户接收已超4条的过滤)后,准备发送的粉丝数,原则上,filterCount = sentCount + errorCount
*/
@XStreamAlias("FilterCount")
private Integer filterCount;

/**
* 发送成功的粉丝数.
*/
@XStreamAlias("SentCount")
private Integer sentCount;

/**
* 发送失败的粉丝数.
*/
Expand Down Expand Up @@ -411,9 +422,11 @@ public static class ScanCodeInfo {

@Data
public static class ExtAttr {
@XStreamAlias("Item")

@XStreamImplicit(itemFieldName = "Item")
protected final List<Item> items = new ArrayList<>();

@XStreamAlias("Item")
@Data
public static class Item {
@XStreamAlias("Name")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -117,4 +117,36 @@ public void testSendPicsInfo() {
assertEquals(wxMessage.getSendPicsInfo().getPicList().get(0).getPicMd5Sum(), "aef52ae501537e552725c5d7f99c1741");
assertEquals(wxMessage.getSendPicsInfo().getPicList().get(1).getPicMd5Sum(), "c4564632a4fab91378c39bea6aad6f9e");
}

public void testExtAttr() {

String xml = "<xml>" +
" <ToUserName><![CDATA[w56c9fe3d50ad1ea2]]></ToUserName>" +
" <FromUserName><![CDATA[sys]]></FromUserName>" +
" <CreateTime>1557241961</CreateTime>" +
" <MsgType><![CDATA[event]]></MsgType>" +
" <Event><![CDATA[change_contact]]></Event>" +
" <ChangeType><![CDATA[update_user]]></ChangeType>" +
" <UserID><![CDATA[zhangsan]]></UserID>" +
" <ExtAttr>" +
" <Item><Name><![CDATA[爱好]]></Name><Value><![CDATA[111]]></Value><Text><Value><![CDATA[111]]></Value></Text></Item>" +
" <Item><Name><![CDATA[入职时间]]></Name><Value><![CDATA[11111]]></Value><Text><Value><![CDATA[11111]]></Value></Text></Item>" +
" <Item><Name><![CDATA[城市]]></Name><Value><![CDATA[11111]]></Value><Text><Value><![CDATA[11111]]></Value></Text></Item>" +
" </ExtAttr>" +
" <Address><![CDATA[11111]]></Address>" +
"</xml>";
WxCpXmlMessage wxMessage = WxCpXmlMessage.fromXml(xml);
assertEquals(wxMessage.getToUserName(), "w56c9fe3d50ad1ea2");
assertEquals(wxMessage.getFromUserName(), "sys");
assertEquals(wxMessage.getCreateTime(), new Long(1557241961));
assertEquals(wxMessage.getMsgType(), WxConsts.XmlMsgType.EVENT);
assertEquals(wxMessage.getEvent(), "change_contact");
assertEquals(wxMessage.getChangeType(), "update_user");
assertEquals(wxMessage.getUserId(), "zhangsan");
assertNotNull(wxMessage.getExtAttrs());
assertNotNull(wxMessage.getExtAttrs().getItems());
assertEquals(wxMessage.getExtAttrs().getItems().size(), 3);
assertEquals(wxMessage.getExtAttrs().getItems().get(0).getName(), "爱好");

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,7 @@
import me.chanjar.weixin.mp.bean.card.MemberCardActivateUserFormResult;
import me.chanjar.weixin.mp.bean.card.MemberCardUpdateRequest;
import me.chanjar.weixin.mp.bean.card.WxMpCardCreateResult;
import me.chanjar.weixin.mp.bean.membercard.ActivatePluginParam;
import me.chanjar.weixin.mp.bean.membercard.WxMpMemberCardActivatedMessage;
import me.chanjar.weixin.mp.bean.membercard.WxMpMemberCardCreateMessage;
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.*;

/**
* 会员卡相关接口.
Expand Down Expand Up @@ -41,27 +36,41 @@ public interface WxMpMemberCardService {
*/
String MEMBER_CARD_UPDATE = "https://api.weixin.qq.com/card/update";

/**
* 跳转型会员卡开卡字段,获取用户提交资料(wx_activate=true情况调用),开发者根据activate_ticket获取到用户填写的信息
*/
String MEMBER_CARD_ACTIVATE_TEMP_INFO = "https://api.weixin.qq.com/card/membercard/activatetempinfo/get";

/**
* 得到WxMpService.
*
* @return WxMpService
*/
WxMpService getWxMpService();

/**
* 会员卡创建接口.
*
* @param createJson 会员卡json字符串
* @return 返回json字符串
* @throws WxErrorException 接口调用失败抛出的异常
*/
WxMpCardCreateResult createMemberCard(String createJson) throws WxErrorException;

/**
* 会员卡创建接口.
* 会员卡创建接口
*
* @param createMessageMessage 会员卡创建对象
* @return 会员卡信息的结果对象
* @throws WxErrorException 接口调用失败抛出的异常
*/
WxMpCardCreateResult createMemberCard(WxMpMemberCardCreateMessage createMessageMessage) throws WxErrorException;

/**
* 会员卡激活接口.
*
* @param activatedMessage 激活所需参数
* @return 返回json字符串
* @return 会员卡激活后的json字符串
* @throws WxErrorException 接口调用失败抛出的异常
*/
String activateMemberCard(WxMpMemberCardActivatedMessage activatedMessage) throws WxErrorException;
Expand Down Expand Up @@ -91,16 +100,40 @@ public interface WxMpMemberCardService {

/**
* 设置会员卡激活的字段(会员卡设置:wx_activate=true 时需要).
*
* @param userFormRequest 会员卡激活字段对象
* @return 会员卡激活后结果对象
* @throws WxErrorException 接口调用失败抛出的异常
*/
MemberCardActivateUserFormResult setActivateUserForm(MemberCardActivateUserFormRequest userFormRequest) throws WxErrorException;

/**
* 获取会员卡开卡插件参数(跳转型开卡组件需要参数).
*
* @param cardId 会员卡的CardId,微信分配
* @param outStr 会员卡设置商户的渠道
* @return 会员卡开卡插件参数结果对象
* @throws WxErrorException 接口调用失败抛出的异常
*/
ActivatePluginParam getActivatePluginParam(String cardId, String outStr) throws WxErrorException;

/**
* 更新会员卡信息.
*
* @param memberCardUpdateRequest 会员卡更新对象
* @return 会员卡更新后结果对象
* @throws WxErrorException 接口调用失败抛出的异常
*/
CardUpdateResult updateCardInfo(MemberCardUpdateRequest memberCardUpdateRequest) throws WxErrorException;

/**
* 解析跳转型开卡字段用户提交的资料
* 开发者在URL上截取ticket后须先进行urldecode
*
* @param activateTicket 用户提交的资料
* @return 开卡字段的会员信息对象
* @throws WxErrorException 接口调用失败抛出的异常
*/
WxMpMemberCardActivateTempInfoResult getActivateTempInfo(String activateTicket) throws WxErrorException;

}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import java.util.HashMap;
import java.util.Map;

import me.chanjar.weixin.mp.bean.membercard.*;
import org.apache.commons.lang3.StringUtils;

import com.google.gson.Gson;
Expand All @@ -30,13 +31,6 @@
import me.chanjar.weixin.mp.bean.card.enums.BusinessServiceType;
import me.chanjar.weixin.mp.bean.card.enums.CardColor;
import me.chanjar.weixin.mp.bean.card.enums.DateInfoType;
import me.chanjar.weixin.mp.bean.membercard.ActivatePluginParam;
import me.chanjar.weixin.mp.bean.membercard.ActivatePluginParamResult;
import me.chanjar.weixin.mp.bean.membercard.WxMpMemberCardActivatedMessage;
import me.chanjar.weixin.mp.bean.membercard.WxMpMemberCardCreateMessage;
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.util.json.WxMpGsonBuilder;

/**
Expand Down Expand Up @@ -284,6 +278,15 @@ public CardUpdateResult updateCardInfo(MemberCardUpdateRequest memberCardUpdateR
return result;
}

@Override
public WxMpMemberCardActivateTempInfoResult getActivateTempInfo(String activateTicket) throws WxErrorException {
JsonObject params = new JsonObject();
params.addProperty("activate_ticket", activateTicket);
String response = this.wxMpService.post(MEMBER_CARD_ACTIVATE_TEMP_INFO, GSON.toJson(params));
WxMpMemberCardActivateTempInfoResult result = GSON.fromJson(response, WxMpMemberCardActivateTempInfoResult.class);
return result;
}

private static String truncateUrlPage(String strURL) {
String strAllParam = null;
String[] arrSplit;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package me.chanjar.weixin.mp.bean.membercard;

import lombok.Data;
import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;


/**
* @author thomas
* @date 2019/4/26
*/
@Data
public class WxMpMemberCardActivateTempInfoResult {

private String errorCode;

private String errorMsg;

private MemberCardUserInfo userInfo;

public static WxMpMemberCardActivateTempInfoResult fromJson(String json) {
return WxMpGsonBuilder.create().fromJson(json, WxMpMemberCardActivateTempInfoResult.class);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import me.chanjar.weixin.mp.bean.datacube.WxDataCubeUserCumulate;
import me.chanjar.weixin.mp.bean.datacube.WxDataCubeUserSummary;
import me.chanjar.weixin.mp.bean.kefu.WxMpKefuMessage;
import me.chanjar.weixin.mp.bean.membercard.WxMpMemberCardActivateTempInfoResult;
import me.chanjar.weixin.mp.bean.membercard.WxMpMemberCardUpdateResult;
import me.chanjar.weixin.mp.bean.membercard.WxMpMemberCardUserInfoResult;
import me.chanjar.weixin.mp.bean.material.*;
Expand Down Expand Up @@ -58,6 +59,7 @@ public class WxMpGsonBuilder {
INSTANCE.registerTypeAdapter(WxMpUserBlacklistGetResult.class, new WxUserBlacklistGetResultGsonAdapter());
INSTANCE.registerTypeAdapter(WxMpMemberCardUserInfoResult.class, new WxMpMemberCardUserInfoResultGsonAdapter());
INSTANCE.registerTypeAdapter(WxMpMemberCardUpdateResult.class, new WxMpMemberCardUpdateResultGsonAdapter());
INSTANCE.registerTypeAdapter(WxMpMemberCardActivateTempInfoResult.class, new WxMpMemberCardActivateTempInfoResultGsonAdapter());
}

public static Gson create() {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
package me.chanjar.weixin.mp.util.json;

import com.google.gson.*;
import me.chanjar.weixin.common.util.json.GsonHelper;
import me.chanjar.weixin.mp.bean.membercard.MemberCardUserInfo;
import me.chanjar.weixin.mp.bean.membercard.NameValues;
import me.chanjar.weixin.mp.bean.membercard.WxMpMemberCardActivateTempInfoResult;

import java.lang.reflect.Type;

/**
* Json to WxMpMemberCardActivateTempInfoResultGsonAdapter 的转换适配器
*
* @author thomas(351402401 @ qq.com)
* @version 2019/4/26
*/
public class WxMpMemberCardActivateTempInfoResultGsonAdapter implements JsonDeserializer<WxMpMemberCardActivateTempInfoResult> {

@Override
public WxMpMemberCardActivateTempInfoResult deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException {
WxMpMemberCardActivateTempInfoResult result = new WxMpMemberCardActivateTempInfoResult();

JsonObject jsonObject = jsonElement.getAsJsonObject();

result.setErrorCode(GsonHelper.getString(jsonObject, "errcode"));
result.setErrorMsg(GsonHelper.getString(jsonObject, "errmsg"));

JsonObject userInfoJsonObject = jsonObject.getAsJsonObject("info");
MemberCardUserInfo cardUserInfo = new MemberCardUserInfo();

JsonArray commonFieldListObj = userInfoJsonObject.getAsJsonArray("common_field_list");
NameValues[] commonFieldListValues = new NameValues[commonFieldListObj.size()];
for (int i = 0; i < commonFieldListObj.size(); i++) {
JsonObject commonField = commonFieldListObj.get(i).getAsJsonObject();
NameValues commonNameValues = new NameValues();
commonNameValues.setName(GsonHelper.getString(commonField, "name"));
commonNameValues.setValue(GsonHelper.getString(commonField, "value"));
commonFieldListValues[i] = commonNameValues;
}
cardUserInfo.setCommonFieldList(commonFieldListValues);

JsonArray customFieldListObj = userInfoJsonObject.getAsJsonArray("custom_field_list");
NameValues[] customFieldListValues = new NameValues[customFieldListObj.size()];
for (int i = 0; i < customFieldListObj.size(); i++) {
JsonObject customField = customFieldListObj.get(i).getAsJsonObject();
NameValues customNameValues = new NameValues();
customNameValues.setName(GsonHelper.getString(customField, "name"));
customNameValues.setValue(GsonHelper.getString(customField, "value"));

JsonArray valueListArray = customField.getAsJsonArray("value_list");
String[] valueList = new String[valueListArray.size()];
for (int j = 0; j < valueListArray.size(); j++) {
valueList[j] = valueListArray.get(j).getAsString();
}
customNameValues.setValueList(valueList);
customFieldListValues[i] = customNameValues;
}
cardUserInfo.setCustomFieldList(customFieldListValues);

result.setUserInfo(cardUserInfo);

return result;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,9 @@ public class WxMpMemberCardServiceImplTest {

@Inject
protected WxMpService wxService;
private String cardId = "p2iQk1uwOUYlzHm4s-UYdZnABW88";
private String code = "435223630779";
private String openId = "o2iQk1u5X-XIJkatmAK1Q8VVuS90";
private String cardId = "p4p-v1bKn9tiQHxyO79aKmuTIZlQ";
private String code = "224765120681";
private String openId = "o4p-v1TIemEIpBSrSrTprkCaG6Xc";

@Test
public void createMemberCard() throws Exception {
Expand Down Expand Up @@ -150,6 +150,15 @@ public void testGetActivateUrl() throws Exception {
WxMpMemberCardService memberCardService = this.wxService.getMemberCardService();
ActivatePluginParam response = memberCardService.getActivatePluginParam(cardId, "test");
System.out.println(response);
}

@Test
public void testGetActivateTempInfo() throws Exception {
String activateTicket = "fDZv9eMQAFfrNr3XBoqhb8eUX67DFb6h8yXDelGSMDLfg2OAIGQcU7mEKecnWZBK%2B%2Bvm%2FtZxZJrbRkdJB%2FUmpVoJkEsbeH%2BOefcntAsYDKA%3D";
WxMpMemberCardService memberCardService = this.wxService.getMemberCardService();
WxMpMemberCardActivateTempInfoResult result = memberCardService.getActivateTempInfo(activateTicket);
assertNotNull(result);
System.out.println(result);
}

}