From b7d3f839f76c5f1d8662e112f5d8e3848b9d2aa0 Mon Sep 17 00:00:00 2001 From: 007gzs <007gzs@gmail.com> Date: Mon, 17 Dec 2018 22:42:23 +0800 Subject: [PATCH] =?UTF-8?q?#884=20=E5=BE=AE=E4=BF=A1=E5=85=AC=E4=BC=97?= =?UTF-8?q?=E5=8F=B7=E6=A8=A1=E5=9D=97=E5=A2=9E=E5=8A=A0=E4=B8=BB=E4=BD=93?= =?UTF-8?q?=E5=8F=98=E6=9B=B4=E8=BF=81=E7=A7=BB=E7=94=A8=E6=88=B7openid?= =?UTF-8?q?=E7=9A=84=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 增加接口 微信公众号主体变更迁移用户 openid * add test --- weixin-java-mp/pom.xml | 5 ++ .../weixin/mp/api/WxMpUserService.java | 15 ++++++ .../mp/api/impl/WxMpUserServiceImpl.java | 15 ++++++ .../mp/bean/result/WxMpChangeOpenid.java | 34 ++++++++++++ .../json/WxMpChangeOpenidGsonAdapter.java | 25 +++++++++ .../weixin/mp/util/json/WxMpGsonBuilder.java | 1 + .../mp/api/impl/WxMpUserServiceImplTest.java | 54 +++++++++++++++++++ 7 files changed, 149 insertions(+) create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpChangeOpenid.java create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpChangeOpenidGsonAdapter.java diff --git a/weixin-java-mp/pom.xml b/weixin-java-mp/pom.xml index 207ef10f..fcfce69c 100644 --- a/weixin-java-mp/pom.xml +++ b/weixin-java-mp/pom.xml @@ -36,6 +36,11 @@ testng test + + org.mockito + mockito-all + test + com.google.inject guice diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpUserService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpUserService.java index 5808077c..71b6b170 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpUserService.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpUserService.java @@ -4,6 +4,7 @@ import java.util.List; import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.mp.bean.WxMpUserQuery; +import me.chanjar.weixin.mp.bean.result.WxMpChangeOpenid; import me.chanjar.weixin.mp.bean.result.WxMpUser; import me.chanjar.weixin.mp.bean.result.WxMpUserList; @@ -17,6 +18,7 @@ public interface WxMpUserService { String USER_GET_URL = "https://api.weixin.qq.com/cgi-bin/user/get"; String USER_INFO_URL = "https://api.weixin.qq.com/cgi-bin/user/info"; String USER_INFO_UPDATE_REMARK_URL = "https://api.weixin.qq.com/cgi-bin/user/info/updateremark"; + String USER_CHANGE_OPENID_URL = "http://api.weixin.qq.com/cgi-bin/changeopenid"; /** *
@@ -94,4 +96,17 @@ public interface WxMpUserService {
    * @param nextOpenid 可选,第一个拉取的OPENID,null为从头开始拉取
    */
   WxMpUserList userList(String nextOpenid) throws WxErrorException;
+
+  /**
+   * 
+   * 微信公众号主体变更迁移用户 openid
+   * 详情请见: http://kf.qq.com/faq/170221aUnmmU170221eUZJNf.html
+   * http请求方式: POST
+   * 接口地址:https://api.weixin.qq.com/cgi-bin/changeopenid?access_token=ACCESS_TOKEN
+   * 
+ * + * @param fromAppid 原公众号的 appid + * @param openidList 需要转换的openid,这些必须是旧账号目前关注的才行,否则会出错;一次最多100个 + */ + List changeOpenid(String fromAppid, List openidList) throws WxErrorException; } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpUserServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpUserServiceImpl.java index 9af4e7b6..d8c8943d 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpUserServiceImpl.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpUserServiceImpl.java @@ -1,14 +1,19 @@ package me.chanjar.weixin.mp.api.impl; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import com.google.gson.JsonArray; import com.google.gson.JsonObject; import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.mp.api.WxMpService; import me.chanjar.weixin.mp.api.WxMpUserService; import me.chanjar.weixin.mp.bean.WxMpUserQuery; +import me.chanjar.weixin.mp.bean.result.WxMpChangeOpenid; import me.chanjar.weixin.mp.bean.result.WxMpUser; import me.chanjar.weixin.mp.bean.result.WxMpUserList; +import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; /** * Created by Binary Wang on 2016/7/21. @@ -50,6 +55,16 @@ public class WxMpUserServiceImpl implements WxMpUserService { return WxMpUserList.fromJson(responseContent); } + @Override + public List changeOpenid(String fromAppid, List openidList) throws WxErrorException { + Map map = new HashMap<>(); + map.put("from_appid", fromAppid); + map.put("openid_list", openidList); + String responseContent = this.wxMpService.post(USER_CHANGE_OPENID_URL, WxMpGsonBuilder.create().toJson(map)); + + return WxMpChangeOpenid.fromJsonList(responseContent); + } + @Override public List userInfoList(List openidList) throws WxErrorException { diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpChangeOpenid.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpChangeOpenid.java new file mode 100644 index 00000000..203aa97f --- /dev/null +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpChangeOpenid.java @@ -0,0 +1,34 @@ +package me.chanjar.weixin.mp.bean.result; + +import com.google.gson.Gson; +import com.google.gson.JsonObject; +import com.google.gson.reflect.TypeToken; +import lombok.Data; +import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; + +import java.io.Serializable; +import java.lang.reflect.Type; +import java.util.List; + +/** + * 主体变更迁移用户 openid 返回. + * + * @author 007gzs + */ +@Data +public class WxMpChangeOpenid implements Serializable { + private static final long serialVersionUID = -8132023284876534743L; + private String oriOpenid; + private String newOpenid; + private String errMsg; + public static WxMpChangeOpenid fromJson(String json) { + return WxMpGsonBuilder.create().fromJson(json, WxMpChangeOpenid.class); + } + public static List fromJsonList(String json) { + Type collectionType = new TypeToken>() { + }.getType(); + Gson gson = WxMpGsonBuilder.create(); + JsonObject jsonObject = gson.fromJson(json, JsonObject.class); + return gson.fromJson(jsonObject.get("result_list"), collectionType); + } +} diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpChangeOpenidGsonAdapter.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpChangeOpenidGsonAdapter.java new file mode 100644 index 00000000..430726ca --- /dev/null +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpChangeOpenidGsonAdapter.java @@ -0,0 +1,25 @@ +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.result.WxMpChangeOpenid; + +import java.lang.reflect.Type; + +public class WxMpChangeOpenidGsonAdapter implements JsonDeserializer { + + @Override + public WxMpChangeOpenid deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { + JsonObject o = json.getAsJsonObject(); + WxMpChangeOpenid changeOpenid = new WxMpChangeOpenid(); + changeOpenid.setOriOpenid(GsonHelper.getString(o, "ori_openid")); + changeOpenid.setNewOpenid(GsonHelper.getString(o, "new_openid")); + changeOpenid.setErrMsg(GsonHelper.getString(o, "err_msg")); + return changeOpenid; + } + +} 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 e34128ea..a4357e91 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 @@ -25,6 +25,7 @@ public class WxMpGsonBuilder { INSTANCE.registerTypeAdapter(WxMpMassTagMessage.class, new WxMpMassTagMessageGsonAdapter()); INSTANCE.registerTypeAdapter(WxMpMassOpenIdsMessage.class, new WxMpMassOpenIdsMessageGsonAdapter()); INSTANCE.registerTypeAdapter(WxMpUser.class, new WxMpUserGsonAdapter()); + INSTANCE.registerTypeAdapter(WxMpChangeOpenid.class, new WxMpChangeOpenidGsonAdapter()); INSTANCE.registerTypeAdapter(WxMpUserList.class, new WxUserListGsonAdapter()); INSTANCE.registerTypeAdapter(WxMpMassVideo.class, new WxMpMassVideoAdapter()); INSTANCE.registerTypeAdapter(WxMpMassSendResult.class, new WxMpMassSendResultAdapter()); diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpUserServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpUserServiceImplTest.java index 24351879..fa73b8f4 100644 --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpUserServiceImplTest.java +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpUserServiceImplTest.java @@ -1,8 +1,13 @@ package me.chanjar.weixin.mp.api.impl; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import me.chanjar.weixin.mp.api.WxMpUserService; +import me.chanjar.weixin.mp.bean.result.WxMpChangeOpenid; +import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; import org.testng.*; import org.testng.annotations.*; @@ -15,6 +20,9 @@ import me.chanjar.weixin.mp.bean.WxMpUserQuery; import me.chanjar.weixin.mp.bean.result.WxMpUser; import me.chanjar.weixin.mp.bean.result.WxMpUserList; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + /** * 测试用户相关的接口 * @@ -75,4 +83,50 @@ public class WxMpUserServiceImplTest { System.out.println(wxMpUserList); } + public void testChangeOpenid() throws WxErrorException { + List openids = new ArrayList<>(); + openids.add(this.configProvider.getOpenid()); + List wxMpChangeOpenidList = this.wxService.getUserService() + .changeOpenid("原公众号appid", openids); + Assert.assertNotNull(wxMpChangeOpenidList); + Assert.assertEquals(1, wxMpChangeOpenidList.size()); + WxMpChangeOpenid wxMpChangeOpenid = wxMpChangeOpenidList.get(0); + Assert.assertNotNull(wxMpChangeOpenid); + Assert.assertEquals(this.configProvider.getOpenid(), wxMpChangeOpenid.getOriOpenid()); + System.out.println(wxMpChangeOpenid); + } + + public static class MockTest { + private WxMpService wxService = mock(WxMpService.class); + @Test + public void testMockChangeOpenid() throws WxErrorException { + List openids = new ArrayList<>(); + openids.add("oEmYbwN-n24jxvk4Sox81qedINkQ"); + openids.add("oEmYbwH9uVd4RKJk7ZZg6SzL6tTo"); + String fromAppid = "old_appid"; + Map map = new HashMap<>(); + map.put("from_appid", fromAppid); + map.put("openid_list", openids); + + String returnJson = "{\"errcode\": 0,\"errmsg\": \"ok\",\"result_list\": [{\"ori_openid\": \"oEmYbwN-n24jxvk4Sox81qedINkQ\",\"new_openid\": \"o2FwqwI9xCsVadFah_HtpPfaR-X4\",\"err_msg\": \"ok\"},{\"ori_openid\": \"oEmYbwH9uVd4RKJk7ZZg6SzL6tTo\",\"err_msg\": \"ori_openid error\"}]}"; + when(wxService.post(WxMpUserService.USER_CHANGE_OPENID_URL, WxMpGsonBuilder.create().toJson(map))).thenReturn(returnJson); + List wxMpChangeOpenidList = this.wxService.getUserService() + .changeOpenid(fromAppid, openids); + Assert.assertNotNull(wxMpChangeOpenidList); + Assert.assertEquals(2, wxMpChangeOpenidList.size()); + WxMpChangeOpenid wxMpChangeOpenid = wxMpChangeOpenidList.get(0); + Assert.assertNotNull(wxMpChangeOpenid); + Assert.assertEquals("oEmYbwN-n24jxvk4Sox81qedINkQ", wxMpChangeOpenid.getOriOpenid()); + Assert.assertEquals("o2FwqwI9xCsVadFah_HtpPfaR-X4", wxMpChangeOpenid.getNewOpenid()); + Assert.assertEquals("ok", wxMpChangeOpenid.getErrMsg()); + wxMpChangeOpenid = wxMpChangeOpenidList.get(1); + Assert.assertNotNull(wxMpChangeOpenid); + Assert.assertEquals("oEmYbwH9uVd4RKJk7ZZg6SzL6tTo", wxMpChangeOpenid.getOriOpenid()); + Assert.assertNull(wxMpChangeOpenid.getNewOpenid()); + Assert.assertEquals("ori_openid error", wxMpChangeOpenid.getErrMsg()); + System.out.println(wxMpChangeOpenid); + } + + } + }