From a16e0f4c88405547c11dfe8847c493aec23f420a Mon Sep 17 00:00:00 2001 From: thomas2050 <37628237+thomas2050@users.noreply.github.com> Date: Sat, 27 Apr 2019 20:39:23 +0800 Subject: [PATCH] =?UTF-8?q?#1025=20=E4=BC=9A=E5=91=98=E5=8D=A1=E6=A8=A1?= =?UTF-8?q?=E5=9D=97=E6=96=B0=E5=A2=9E=E8=B7=B3=E8=BD=AC=E5=9E=8B=E4=BC=9A?= =?UTF-8?q?=E5=91=98=E5=8D=A1=E7=94=A8=E6=88=B7=E6=8F=90=E4=BA=A4=E8=B5=84?= =?UTF-8?q?=E6=96=99=E7=9A=84=E4=BF=A1=E6=81=AF=E5=8F=82=E6=95=B0=E8=A7=A3?= =?UTF-8?q?=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../weixin/mp/api/WxMpMemberCardService.java | 49 +++++++++++--- .../api/impl/WxMpMemberCardServiceImpl.java | 17 +++-- .../WxMpMemberCardActivateTempInfoResult.java | 24 +++++++ .../weixin/mp/util/json/WxMpGsonBuilder.java | 2 + ...CardActivateTempInfoResultGsonAdapter.java | 65 +++++++++++++++++++ .../impl/WxMpMemberCardServiceImplTest.java | 15 ++++- 6 files changed, 154 insertions(+), 18 deletions(-) create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/membercard/WxMpMemberCardActivateTempInfoResult.java create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMemberCardActivateTempInfoResultGsonAdapter.java diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMemberCardService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMemberCardService.java index b0719804..ba79d785 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMemberCardService.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMemberCardService.java @@ -6,12 +6,7 @@ import me.chanjar.weixin.mp.bean.card.MemberCardActivateUserFormRequest; 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.*; /** * 会员卡相关接口. @@ -41,19 +36,33 @@ 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; @@ -61,7 +70,7 @@ public interface WxMpMemberCardService { * 会员卡激活接口. * * @param activatedMessage 激活所需参数 - * @return 返回json字符串 + * @return 会员卡激活后的json字符串 * @throws WxErrorException 接口调用失败抛出的异常 */ String activateMemberCard(WxMpMemberCardActivatedMessage activatedMessage) throws WxErrorException; @@ -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; + } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpMemberCardServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpMemberCardServiceImpl.java index d0a1c347..6e4143ba 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpMemberCardServiceImpl.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpMemberCardServiceImpl.java @@ -5,6 +5,7 @@ import java.net.URLDecoder; 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; @@ -30,13 +31,6 @@ import me.chanjar.weixin.mp.bean.card.WxMpCardCreateResult; 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; /** @@ -284,6 +278,15 @@ public class WxMpMemberCardServiceImpl implements WxMpMemberCardService { 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; diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/membercard/WxMpMemberCardActivateTempInfoResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/membercard/WxMpMemberCardActivateTempInfoResult.java new file mode 100644 index 00000000..120e3267 --- /dev/null +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/membercard/WxMpMemberCardActivateTempInfoResult.java @@ -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); + } + +} diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpGsonBuilder.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpGsonBuilder.java index e6a60c34..b16775b4 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpGsonBuilder.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpGsonBuilder.java @@ -8,6 +8,7 @@ import me.chanjar.weixin.mp.bean.card.WxMpCardResult; 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.*; @@ -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() { diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMemberCardActivateTempInfoResultGsonAdapter.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMemberCardActivateTempInfoResultGsonAdapter.java new file mode 100644 index 00000000..a38a27aa --- /dev/null +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMemberCardActivateTempInfoResultGsonAdapter.java @@ -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 { + + @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; + } + +} diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpMemberCardServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpMemberCardServiceImplTest.java index fbdb7cea..96eb6713 100644 --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpMemberCardServiceImplTest.java +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpMemberCardServiceImplTest.java @@ -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 { @@ -150,6 +150,15 @@ public class WxMpMemberCardServiceImplTest { 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); } + }