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);
+ }
+
+ }
+
}