Bläddra i källkod

#884 微信公众号模块增加主体变更迁移用户openid的接口

* 增加接口 微信公众号主体变更迁移用户 openid

* add test
007gzs 6 år sedan
förälder
incheckning
b7d3f839f7

+ 5 - 0
weixin-java-mp/pom.xml

@@ -37,6 +37,11 @@
       <scope>test</scope>
     </dependency>
     <dependency>
+      <groupId>org.mockito</groupId>
+      <artifactId>mockito-all</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
       <groupId>com.google.inject</groupId>
       <artifactId>guice</artifactId>
       <scope>test</scope>

+ 15 - 0
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";
 
   /**
    * <pre>
@@ -94,4 +96,17 @@ public interface WxMpUserService {
    * @param nextOpenid 可选,第一个拉取的OPENID,null为从头开始拉取
    */
   WxMpUserList userList(String nextOpenid) throws WxErrorException;
+
+  /**
+   * <pre>
+   * 微信公众号主体变更迁移用户 openid
+   * 详情请见: http://kf.qq.com/faq/170221aUnmmU170221eUZJNf.html
+   * http请求方式: POST
+   * 接口地址:https://api.weixin.qq.com/cgi-bin/changeopenid?access_token=ACCESS_TOKEN
+   * </pre>
+   *
+   * @param fromAppid 原公众号的 appid
+   * @param openidList 需要转换的openid,这些必须是旧账号目前关注的才行,否则会出错;一次最多100个
+   */
+  List<WxMpChangeOpenid> changeOpenid(String fromAppid, List<String> openidList) throws WxErrorException;
 }

+ 15 - 0
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.
@@ -51,6 +56,16 @@ public class WxMpUserServiceImpl implements WxMpUserService {
   }
 
   @Override
+  public List<WxMpChangeOpenid> changeOpenid(String fromAppid, List<String> openidList) throws WxErrorException {
+    Map<String, Object> 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<WxMpUser> userInfoList(List<String> openidList)
     throws WxErrorException {
     return this.userInfoList(new WxMpUserQuery(openidList));

+ 34 - 0
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<WxMpChangeOpenid> fromJsonList(String json) {
+    Type collectionType = new TypeToken<List<WxMpChangeOpenid>>() {
+    }.getType();
+    Gson gson = WxMpGsonBuilder.create();
+    JsonObject jsonObject = gson.fromJson(json, JsonObject.class);
+    return gson.fromJson(jsonObject.get("result_list"), collectionType);
+  }
+}

+ 25 - 0
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<WxMpChangeOpenid> {
+
+  @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;
+  }
+
+}

+ 1 - 0
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());

+ 54 - 0
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<String> openids = new ArrayList<>();
+    openids.add(this.configProvider.getOpenid());
+    List<WxMpChangeOpenid> 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<String> openids = new ArrayList<>();
+      openids.add("oEmYbwN-n24jxvk4Sox81qedINkQ");
+      openids.add("oEmYbwH9uVd4RKJk7ZZg6SzL6tTo");
+      String fromAppid = "old_appid";
+      Map<String, Object> 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<WxMpChangeOpenid> 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);
+    }
+
+  }
+
 }