废话不多说,直接上代码
文档地址:文本内容安全识别 | 微信开放文档
地址中有下列参数
其中access_token需要调用接口获取
文档地址:获取稳定版接口调用凭据 | 微信开放文档
获取access_token的代码,我走的get请求:
public String getTokenUrl() {
String requestUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=XXXXXX&secret=XXXXXX";
try {
URL url = new URL(requestUrl);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setDoOutput(true);
OutputStream outputStream = connection.getOutputStream();
byte[] input = requestUrl.getBytes("utf-8");
outputStream.write(input, 0, input.length);
BufferedReader bufferedReader = new BufferedReader(
new InputStreamReader(connection.getInputStream(), "utf-8"));
StringBuilder response = new StringBuilder();
String responseLine = null;
while ((responseLine = bufferedReader.readLine()) != null) {
response.append(responseLine.trim());
}
//关闭资源
outputStream.close();
bufferedReader.close();
connection.disconnect();
Map map = JSONObject.parseObject(String.valueOf(response), Map.class);
return (String) map.get("access_token");
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
调用文本识别的代码:
public Boolean msgSecCheck(String content, Integer scene, String openid) {
String token = getTokenUrl();
//微信接口url
String requestUrl = "https://api.weixin.qq.com/wxa/msg_sec_check?access_token=" + token;
// Map<String, Object> paramMap = new HashMap<>();
JSONObject paramMap = new JSONObject();
paramMap.put("content", content);
paramMap.put("version", 2);
paramMap.put("scene", scene);
paramMap.put("openid", openid);
try {
URL url = new URL(requestUrl);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("POST");
connection.setRequestProperty("Content-Type", "application/json");
connection.setDoInput(true);
connection.setDoOutput(true);
String requestBody = paramMap.toString();
OutputStream outputStream = connection.getOutputStream();
byte[] input = requestBody.getBytes("utf-8");
outputStream.write(input, 0, input.length);
BufferedReader bufferedReader = new BufferedReader(
new InputStreamReader(connection.getInputStream(), "utf-8"));
StringBuilder response = new StringBuilder();
String responseLine = null;
while ((responseLine = bufferedReader.readLine()) != null) {
response.append(responseLine.trim());
}
//关闭资源
outputStream.close();
bufferedReader.close();
connection.disconnect();
Map map = JSONObject.parseObject(String.valueOf(response), Map.class);
if (map.isEmpty()) {
return false;
}
if (0 == (Integer) map.get("errcode") && map.containsKey("result")) {
String result = map.get("result").toString();
Map resultMap = JSONObject.parseObject(result.toString(), Map.class);
if (resultMap.isEmpty()) {
return false;
}
String suggest = (String) resultMap.get("suggest");
System.out.println("suggest = " + suggest);
if ("pass".equals(suggest)) {
return true;
}
}
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
踩了个大坑:
{"errcode":47001,"errmsg":"data format error rid: 663e39a5-08c8e2a6-5bb1407d"}
这个错误的官方解释是入参一定要是Json或者Xml格式,一开始入参我用的Map,一直报错47001,后来改用JSONObject后成功调通,下面是Map和JSONObject打印出来的区别:
Map:
{openid:owCC-XXXXXX,version:2,content:测试文章,scene:3}
JSONObject:
{"openid":"owCC-XXXXXX","version":2,"content":"测试文章","scene":3}
所以入参一定使用JSONObject格式
调用完接口后根据返回值判断,如果返回值中errorcode的值是0说明调用成功