Skip to content

Commit d1586ae

Browse files
billytomatobinarywang
authored andcommitted
binarywang#1157 增加网络检测接口
1 parent 6e1d7fc commit d1586ae

8 files changed

Lines changed: 197 additions & 0 deletions

File tree

weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxConsts.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -380,4 +380,19 @@ public static class MaterialType {
380380
public static final String VIDEO = "video";
381381
}
382382

383+
384+
/**
385+
* 网络检测入参.
386+
*/
387+
public static class NetCheckArgs {
388+
public static final String ACTIONDNS = "dns";
389+
public static final String ACTIONPING = "ping";
390+
public static final String ACTIONALL = "all";
391+
public static final String OPERATORUNICOM = "UNICOM";
392+
public static final String OPERATORCHINANET = "CHINANET";
393+
public static final String OPERATORCAP = "CAP";
394+
public static final String OPERATORDEFAULT = "DEFAULT";
395+
}
396+
397+
383398
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package me.chanjar.weixin.common.bean;
2+
3+
import lombok.Data;
4+
import me.chanjar.weixin.common.util.json.WxGsonBuilder;
5+
6+
import java.io.Serializable;
7+
import java.util.ArrayList;
8+
import java.util.List;
9+
10+
/**
11+
* 网络检测.
12+
* @author billytomato
13+
*/
14+
@Data
15+
public class WxNetCheckResult implements Serializable {
16+
17+
private static final long serialVersionUID = 6918924418847404172L;
18+
19+
private List<WxNetCheckDnsInfo> dnsInfos = new ArrayList<>();
20+
private List<WxNetCheckPingInfo> pingInfos = new ArrayList<>();
21+
22+
public static WxNetCheckResult fromJson(String json) {
23+
return WxGsonBuilder.create().fromJson(json, WxNetCheckResult.class);
24+
}
25+
26+
@Data
27+
public static class WxNetCheckDnsInfo implements Serializable{
28+
private static final long serialVersionUID = 82631178029516008L;
29+
private String ip;
30+
private String realOperator;
31+
}
32+
33+
@Data
34+
public static class WxNetCheckPingInfo implements Serializable{
35+
private static final long serialVersionUID = -1871970825359178319L;
36+
private String ip;
37+
private String fromOperator;
38+
private String packageLoss;
39+
private String time;
40+
}
41+
}
42+
43+

weixin-java-common/src/main/java/me/chanjar/weixin/common/util/json/WxGsonBuilder.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.google.gson.Gson;
44
import com.google.gson.GsonBuilder;
55
import me.chanjar.weixin.common.bean.WxAccessToken;
6+
import me.chanjar.weixin.common.bean.WxNetCheckResult;
67
import me.chanjar.weixin.common.bean.menu.WxMenu;
78
import me.chanjar.weixin.common.error.WxError;
89
import me.chanjar.weixin.common.bean.result.WxMediaUploadResult;
@@ -21,6 +22,8 @@ public class WxGsonBuilder {
2122
INSTANCE.registerTypeAdapter(WxError.class, new WxErrorAdapter());
2223
INSTANCE.registerTypeAdapter(WxMenu.class, new WxMenuGsonAdapter());
2324
INSTANCE.registerTypeAdapter(WxMediaUploadResult.class, new WxMediaUploadResultAdapter());
25+
INSTANCE.registerTypeAdapter(WxNetCheckResult.class, new WxNetCheckResultGsonAdapter());
26+
2427
}
2528

2629
public static Gson create() {
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package me.chanjar.weixin.common.util.json;
2+
3+
import com.google.gson.*;
4+
import me.chanjar.weixin.common.bean.WxNetCheckResult;
5+
6+
import java.lang.reflect.Type;
7+
import java.util.ArrayList;
8+
import java.util.List;
9+
10+
11+
/**
12+
* @author billytomato
13+
*/
14+
public class WxNetCheckResultGsonAdapter implements JsonDeserializer<WxNetCheckResult> {
15+
16+
17+
@Override
18+
public WxNetCheckResult deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
19+
WxNetCheckResult result = new WxNetCheckResult();
20+
21+
JsonArray dnssJson = json.getAsJsonObject().get("dns").getAsJsonArray();
22+
List<WxNetCheckResult.WxNetCheckDnsInfo> dnsInfoList = new ArrayList<>();
23+
if (dnssJson != null && dnssJson.size() > 0) {
24+
for (int i = 0; i < dnssJson.size(); i++) {
25+
JsonObject buttonJson = dnssJson.get(i).getAsJsonObject();
26+
WxNetCheckResult.WxNetCheckDnsInfo dnsInfo = new WxNetCheckResult.WxNetCheckDnsInfo();
27+
dnsInfo.setIp(GsonHelper.getString(buttonJson, "ip"));
28+
dnsInfo.setRealOperator(GsonHelper.getString(buttonJson, "real_operator"));
29+
dnsInfoList.add(dnsInfo);
30+
}
31+
}
32+
33+
JsonArray pingsJson = json.getAsJsonObject().get("ping").getAsJsonArray();
34+
List<WxNetCheckResult.WxNetCheckPingInfo> pingInfoList = new ArrayList<>();
35+
if (pingsJson != null && pingsJson.size() > 0) {
36+
for (int i = 0; i < pingsJson.size(); i++) {
37+
JsonObject pingJson = pingsJson.get(i).getAsJsonObject();
38+
WxNetCheckResult.WxNetCheckPingInfo pingInfo = new WxNetCheckResult.WxNetCheckPingInfo();
39+
pingInfo.setIp(GsonHelper.getString(pingJson, "ip"));
40+
pingInfo.setFromOperator(GsonHelper.getString(pingJson, "from_operator"));
41+
pingInfo.setPackageLoss(GsonHelper.getString(pingJson, "package_loss"));
42+
pingInfo.setTime(GsonHelper.getString(pingJson, "time"));
43+
pingInfoList.add(pingInfo);
44+
}
45+
}
46+
result.setDnsInfos(dnsInfoList);
47+
result.setPingInfos(pingInfoList);
48+
return result;
49+
}
50+
51+
}

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

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package me.chanjar.weixin.mp.api;
22

33
import me.chanjar.weixin.common.bean.WxJsapiSignature;
4+
import me.chanjar.weixin.common.bean.WxNetCheckResult;
45
import me.chanjar.weixin.common.error.WxErrorException;
56
import me.chanjar.weixin.common.util.http.MediaUploadRequestExecutor;
67
import me.chanjar.weixin.common.util.http.RequestExecutor;
@@ -178,6 +179,20 @@ public interface WxMpService {
178179
*/
179180
String[] getCallbackIP() throws WxErrorException;
180181

182+
183+
/**
184+
* <pre>
185+
* 网络检测
186+
* https://mp.weixin.qq.com/wiki?t=resource/res_main&id=21541575776DtsuT
187+
* 为了帮助开发者排查回调连接失败的问题,提供这个网络检测的API。它可以对开发者URL做域名解析,然后对所有IP进行一次ping操作,得到丢包率和耗时。
188+
* </pre>
189+
*
190+
* @param action 执行的检测动作
191+
* @param operator 指定平台从某个运营商进行检测
192+
* @throws WxErrorException
193+
*/
194+
WxNetCheckResult netCheck(String action, String operator) throws WxErrorException;
195+
181196
/**
182197
* <pre>
183198
* 获取公众号的自动回复规则.

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import com.google.gson.JsonParser;
99
import lombok.extern.slf4j.Slf4j;
1010
import me.chanjar.weixin.common.bean.WxJsapiSignature;
11+
import me.chanjar.weixin.common.bean.WxNetCheckResult;
1112
import me.chanjar.weixin.common.error.WxError;
1213
import me.chanjar.weixin.common.error.WxErrorException;
1314
import me.chanjar.weixin.common.session.StandardSessionManager;
@@ -236,6 +237,15 @@ public String[] getCallbackIP() throws WxErrorException {
236237
return ipArray;
237238
}
238239

240+
@Override
241+
public WxNetCheckResult netCheck(String action, String operator) throws WxErrorException {
242+
JsonObject o = new JsonObject();
243+
o.addProperty("action", action);
244+
o.addProperty("check_operator", operator);
245+
String responseContent = this.post(NETCHECK_URL, o.toString());
246+
return WxNetCheckResult.fromJson(responseContent);
247+
}
248+
239249
@Override
240250
public WxMpCurrentAutoReplyInfo getCurrentAutoReplyInfo() throws WxErrorException {
241251
return WxMpCurrentAutoReplyInfo.fromJson(this.get(GET_CURRENT_AUTOREPLY_INFO_URL, null));

weixin-java-mp/src/main/java/me/chanjar/weixin/mp/enums/WxMpApiUrl.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,10 @@ enum Other implements WxMpApiUrl {
110110
* 获取微信服务器IP地址.
111111
*/
112112
GET_CALLBACK_IP_URL(API_DEFAULT_HOST_URL, "/cgi-bin/getcallbackip"),
113+
/**
114+
* 网络检测.
115+
*/
116+
NETCHECK_URL(API_DEFAULT_HOST_URL, "/cgi-bin/callback/check"),
113117
/**
114118
* 第三方使用网站应用授权登录的url.
115119
*/

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

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
package me.chanjar.weixin.mp.api.impl;
22

33
import com.google.inject.Inject;
4+
import me.chanjar.weixin.common.api.WxConsts;
5+
import me.chanjar.weixin.common.bean.WxNetCheckResult;
46
import me.chanjar.weixin.common.error.WxErrorException;
57
import me.chanjar.weixin.mp.api.WxMpService;
68
import me.chanjar.weixin.mp.api.test.ApiTestModule;
79
import me.chanjar.weixin.mp.util.WxMpConfigStorageHolder;
10+
import org.testng.Assert;
811
import org.testng.annotations.Guice;
912
import org.testng.annotations.Test;
1013

@@ -37,4 +40,57 @@ public void testSwitchoverTo() throws WxErrorException {
3740
assertThat(this.wxService.switchoverTo("another").getAccessToken()).isNotEmpty();
3841
assertThat(WxMpConfigStorageHolder.get()).isEqualTo("another");
3942
}
43+
44+
@Test
45+
public void testNetCheck() throws WxErrorException {
46+
WxNetCheckResult result = this.wxService.netCheck(WxConsts.NetCheckArgs.ACTIONALL, WxConsts.NetCheckArgs.OPERATORDEFAULT);
47+
Assert.assertNotNull(result);
48+
49+
}
50+
51+
@Test
52+
public void testNectCheckResult() {
53+
String json = "{\n" +
54+
" \"dns\": [\n" +
55+
" {\n" +
56+
" \"ip\": \"111.161.64.40\", \n" +
57+
" \"real_operator\": \"UNICOM\"\n" +
58+
" }, \n" +
59+
" {\n" +
60+
" \"ip\": \"111.161.64.48\", \n" +
61+
" \"real_operator\": \"UNICOM\"\n" +
62+
" }\n" +
63+
" ], \n" +
64+
" \"ping\": [\n" +
65+
" {\n" +
66+
" \"ip\": \"111.161.64.40\", \n" +
67+
" \"from_operator\": \"UNICOM\"," +
68+
" \"package_loss\": \"0%\", \n" +
69+
" \"time\": \"23.079ms\"\n" +
70+
" }, \n" +
71+
" {\n" +
72+
" \"ip\": \"111.161.64.48\", \n" +
73+
" \"from_operator\": \"UNICOM\", \n" +
74+
" \"package_loss\": \"0%\", \n" +
75+
" \"time\": \"21.434ms\"\n" +
76+
" }\n" +
77+
" ]\n" +
78+
"}";
79+
WxNetCheckResult result = WxNetCheckResult.fromJson(json);
80+
Assert.assertNotNull(result);
81+
Assert.assertNotNull(result.getDnsInfos());
82+
83+
WxNetCheckResult.WxNetCheckDnsInfo dnsInfo = new WxNetCheckResult.WxNetCheckDnsInfo();
84+
dnsInfo.setIp("111.161.64.40");
85+
dnsInfo.setRealOperator("UNICOM");
86+
Assert.assertEquals(result.getDnsInfos().get(0), dnsInfo);
87+
88+
WxNetCheckResult.WxNetCheckPingInfo pingInfo = new WxNetCheckResult.WxNetCheckPingInfo();
89+
pingInfo.setTime("21.434ms");
90+
pingInfo.setFromOperator("UNICOM");
91+
pingInfo.setIp("111.161.64.48");
92+
pingInfo.setPackageLoss("0%");
93+
Assert.assertEquals(result.getPingInfos().get(1), pingInfo);
94+
95+
}
4096
}

0 commit comments

Comments
 (0)