Skip to content

Commit b7d3f83

Browse files
007gzsbinarywang
authored andcommitted
#884 微信公众号模块增加主体变更迁移用户openid的接口
* 增加接口 微信公众号主体变更迁移用户 openid * add test
1 parent af68dd4 commit b7d3f83

File tree

7 files changed

+149
-0
lines changed

7 files changed

+149
-0
lines changed

weixin-java-mp/pom.xml

+5
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,11 @@
3636
<artifactId>testng</artifactId>
3737
<scope>test</scope>
3838
</dependency>
39+
<dependency>
40+
<groupId>org.mockito</groupId>
41+
<artifactId>mockito-all</artifactId>
42+
<scope>test</scope>
43+
</dependency>
3944
<dependency>
4045
<groupId>com.google.inject</groupId>
4146
<artifactId>guice</artifactId>

weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpUserService.java

+15
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
import me.chanjar.weixin.common.error.WxErrorException;
66
import me.chanjar.weixin.mp.bean.WxMpUserQuery;
7+
import me.chanjar.weixin.mp.bean.result.WxMpChangeOpenid;
78
import me.chanjar.weixin.mp.bean.result.WxMpUser;
89
import me.chanjar.weixin.mp.bean.result.WxMpUserList;
910

@@ -17,6 +18,7 @@ public interface WxMpUserService {
1718
String USER_GET_URL = "https://api.weixin.qq.com/cgi-bin/user/get";
1819
String USER_INFO_URL = "https://api.weixin.qq.com/cgi-bin/user/info";
1920
String USER_INFO_UPDATE_REMARK_URL = "https://api.weixin.qq.com/cgi-bin/user/info/updateremark";
21+
String USER_CHANGE_OPENID_URL = "http://api.weixin.qq.com/cgi-bin/changeopenid";
2022

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

weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpUserServiceImpl.java

+15
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,19 @@
11
package me.chanjar.weixin.mp.api.impl;
22

3+
import java.util.HashMap;
34
import java.util.List;
5+
import java.util.Map;
46

7+
import com.google.gson.JsonArray;
58
import com.google.gson.JsonObject;
69
import me.chanjar.weixin.common.error.WxErrorException;
710
import me.chanjar.weixin.mp.api.WxMpService;
811
import me.chanjar.weixin.mp.api.WxMpUserService;
912
import me.chanjar.weixin.mp.bean.WxMpUserQuery;
13+
import me.chanjar.weixin.mp.bean.result.WxMpChangeOpenid;
1014
import me.chanjar.weixin.mp.bean.result.WxMpUser;
1115
import me.chanjar.weixin.mp.bean.result.WxMpUserList;
16+
import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
1217

1318
/**
1419
* Created by Binary Wang on 2016/7/21.
@@ -50,6 +55,16 @@ public WxMpUserList userList(String nextOpenid) throws WxErrorException {
5055
return WxMpUserList.fromJson(responseContent);
5156
}
5257

58+
@Override
59+
public List<WxMpChangeOpenid> changeOpenid(String fromAppid, List<String> openidList) throws WxErrorException {
60+
Map<String, Object> map = new HashMap<>();
61+
map.put("from_appid", fromAppid);
62+
map.put("openid_list", openidList);
63+
String responseContent = this.wxMpService.post(USER_CHANGE_OPENID_URL, WxMpGsonBuilder.create().toJson(map));
64+
65+
return WxMpChangeOpenid.fromJsonList(responseContent);
66+
}
67+
5368
@Override
5469
public List<WxMpUser> userInfoList(List<String> openidList)
5570
throws WxErrorException {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package me.chanjar.weixin.mp.bean.result;
2+
3+
import com.google.gson.Gson;
4+
import com.google.gson.JsonObject;
5+
import com.google.gson.reflect.TypeToken;
6+
import lombok.Data;
7+
import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
8+
9+
import java.io.Serializable;
10+
import java.lang.reflect.Type;
11+
import java.util.List;
12+
13+
/**
14+
* 主体变更迁移用户 openid 返回.
15+
*
16+
* @author 007gzs
17+
*/
18+
@Data
19+
public class WxMpChangeOpenid implements Serializable {
20+
private static final long serialVersionUID = -8132023284876534743L;
21+
private String oriOpenid;
22+
private String newOpenid;
23+
private String errMsg;
24+
public static WxMpChangeOpenid fromJson(String json) {
25+
return WxMpGsonBuilder.create().fromJson(json, WxMpChangeOpenid.class);
26+
}
27+
public static List<WxMpChangeOpenid> fromJsonList(String json) {
28+
Type collectionType = new TypeToken<List<WxMpChangeOpenid>>() {
29+
}.getType();
30+
Gson gson = WxMpGsonBuilder.create();
31+
JsonObject jsonObject = gson.fromJson(json, JsonObject.class);
32+
return gson.fromJson(jsonObject.get("result_list"), collectionType);
33+
}
34+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package me.chanjar.weixin.mp.util.json;
2+
3+
import com.google.gson.JsonDeserializationContext;
4+
import com.google.gson.JsonDeserializer;
5+
import com.google.gson.JsonElement;
6+
import com.google.gson.JsonObject;
7+
import com.google.gson.JsonParseException;
8+
import me.chanjar.weixin.common.util.json.GsonHelper;
9+
import me.chanjar.weixin.mp.bean.result.WxMpChangeOpenid;
10+
11+
import java.lang.reflect.Type;
12+
13+
public class WxMpChangeOpenidGsonAdapter implements JsonDeserializer<WxMpChangeOpenid> {
14+
15+
@Override
16+
public WxMpChangeOpenid deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
17+
JsonObject o = json.getAsJsonObject();
18+
WxMpChangeOpenid changeOpenid = new WxMpChangeOpenid();
19+
changeOpenid.setOriOpenid(GsonHelper.getString(o, "ori_openid"));
20+
changeOpenid.setNewOpenid(GsonHelper.getString(o, "new_openid"));
21+
changeOpenid.setErrMsg(GsonHelper.getString(o, "err_msg"));
22+
return changeOpenid;
23+
}
24+
25+
}

weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpGsonBuilder.java

+1
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ public class WxMpGsonBuilder {
2525
INSTANCE.registerTypeAdapter(WxMpMassTagMessage.class, new WxMpMassTagMessageGsonAdapter());
2626
INSTANCE.registerTypeAdapter(WxMpMassOpenIdsMessage.class, new WxMpMassOpenIdsMessageGsonAdapter());
2727
INSTANCE.registerTypeAdapter(WxMpUser.class, new WxMpUserGsonAdapter());
28+
INSTANCE.registerTypeAdapter(WxMpChangeOpenid.class, new WxMpChangeOpenidGsonAdapter());
2829
INSTANCE.registerTypeAdapter(WxMpUserList.class, new WxUserListGsonAdapter());
2930
INSTANCE.registerTypeAdapter(WxMpMassVideo.class, new WxMpMassVideoAdapter());
3031
INSTANCE.registerTypeAdapter(WxMpMassSendResult.class, new WxMpMassSendResultAdapter());

weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpUserServiceImplTest.java

+54
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,13 @@
11
package me.chanjar.weixin.mp.api.impl;
22

33
import java.util.ArrayList;
4+
import java.util.HashMap;
45
import java.util.List;
6+
import java.util.Map;
57

8+
import me.chanjar.weixin.mp.api.WxMpUserService;
9+
import me.chanjar.weixin.mp.bean.result.WxMpChangeOpenid;
10+
import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
611
import org.testng.*;
712
import org.testng.annotations.*;
813

@@ -15,6 +20,9 @@
1520
import me.chanjar.weixin.mp.bean.result.WxMpUser;
1621
import me.chanjar.weixin.mp.bean.result.WxMpUserList;
1722

23+
import static org.mockito.Mockito.mock;
24+
import static org.mockito.Mockito.when;
25+
1826
/**
1927
* 测试用户相关的接口
2028
*
@@ -75,4 +83,50 @@ public void testUserList() throws WxErrorException {
7583
System.out.println(wxMpUserList);
7684
}
7785

86+
public void testChangeOpenid() throws WxErrorException {
87+
List<String> openids = new ArrayList<>();
88+
openids.add(this.configProvider.getOpenid());
89+
List<WxMpChangeOpenid> wxMpChangeOpenidList = this.wxService.getUserService()
90+
.changeOpenid("原公众号appid", openids);
91+
Assert.assertNotNull(wxMpChangeOpenidList);
92+
Assert.assertEquals(1, wxMpChangeOpenidList.size());
93+
WxMpChangeOpenid wxMpChangeOpenid = wxMpChangeOpenidList.get(0);
94+
Assert.assertNotNull(wxMpChangeOpenid);
95+
Assert.assertEquals(this.configProvider.getOpenid(), wxMpChangeOpenid.getOriOpenid());
96+
System.out.println(wxMpChangeOpenid);
97+
}
98+
99+
public static class MockTest {
100+
private WxMpService wxService = mock(WxMpService.class);
101+
@Test
102+
public void testMockChangeOpenid() throws WxErrorException {
103+
List<String> openids = new ArrayList<>();
104+
openids.add("oEmYbwN-n24jxvk4Sox81qedINkQ");
105+
openids.add("oEmYbwH9uVd4RKJk7ZZg6SzL6tTo");
106+
String fromAppid = "old_appid";
107+
Map<String, Object> map = new HashMap<>();
108+
map.put("from_appid", fromAppid);
109+
map.put("openid_list", openids);
110+
111+
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\"}]}";
112+
when(wxService.post(WxMpUserService.USER_CHANGE_OPENID_URL, WxMpGsonBuilder.create().toJson(map))).thenReturn(returnJson);
113+
List<WxMpChangeOpenid> wxMpChangeOpenidList = this.wxService.getUserService()
114+
.changeOpenid(fromAppid, openids);
115+
Assert.assertNotNull(wxMpChangeOpenidList);
116+
Assert.assertEquals(2, wxMpChangeOpenidList.size());
117+
WxMpChangeOpenid wxMpChangeOpenid = wxMpChangeOpenidList.get(0);
118+
Assert.assertNotNull(wxMpChangeOpenid);
119+
Assert.assertEquals("oEmYbwN-n24jxvk4Sox81qedINkQ", wxMpChangeOpenid.getOriOpenid());
120+
Assert.assertEquals("o2FwqwI9xCsVadFah_HtpPfaR-X4", wxMpChangeOpenid.getNewOpenid());
121+
Assert.assertEquals("ok", wxMpChangeOpenid.getErrMsg());
122+
wxMpChangeOpenid = wxMpChangeOpenidList.get(1);
123+
Assert.assertNotNull(wxMpChangeOpenid);
124+
Assert.assertEquals("oEmYbwH9uVd4RKJk7ZZg6SzL6tTo", wxMpChangeOpenid.getOriOpenid());
125+
Assert.assertNull(wxMpChangeOpenid.getNewOpenid());
126+
Assert.assertEquals("ori_openid error", wxMpChangeOpenid.getErrMsg());
127+
System.out.println(wxMpChangeOpenid);
128+
}
129+
130+
}
131+
78132
}

0 commit comments

Comments
 (0)