Hello, I’m Shendi
最近小程序要接入微信的内容安全方面
这里记录一下
获取 Token 封装
首先这两个接口都需要使用到 Token
这里我直接贴上代码,其中的参数都是直接追加在 url 上
JSON方面使用的是 fastjson
/*** 判断返回的数据是否为错误数据.* @param json 返回的数据* @return true为错误数据,false为正确数据*/public static boolean isError(JSONObject json) {return json.getString("errcode") != null && !json.getString("errcode").equals("0");}/*** 获取token,有几率获取失败,所以连续获取三次.* @param num 当num<3时将会递归* @return token,当获取失败时返回null*/private static String getToken(int num) {/*get https://api./cgi-bin/token三个参数 grant_type=client_credential,appid,secret例如https://api./cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET正常情况下,微信会返回下述JSON数据包给公众号: {"access_token":"ACCESS_TOKEN","expires_in":7200}*/if (token == null || System.currentTimeMillis() - tokenTimestamp > tokenTime) {HttpsURLConnection huc = null;try {huc = (HttpsURLConnection) new URL(API的url地址带上对应参数).openConnection();huc.setRequestMethod("GET");huc.setDoInput(true);huc.setDoOutput(true);String data = new String(huc.getInputStream().readAllBytes());JSONObject result = (JSONObject) JSONObject.parse(data);if (isError(result)) {Log.printErr("获取token失败%s: %s", num, result);return ++num < 3 ? getToken(num) : null;} else {token = result.getString("access_token");tokenTime = result.getInteger("expires_in");tokenTimestamp = System.currentTimeMillis();}} catch (IOException e) {e.printStackTrace();Log.printErr("获取Token失败: %s", e.getMessage());} finally {if (huc != null) huc.disconnect();}}return token;}/** @return token,失败为null */public static String getToken() {return getToken(0); }
文本内容验证
因为我使用的是小程序,此接口需要用户的 appid 才能正常调用
其中token需要追加到 url 后面
还算简单,代码如下
/*** 小程序验证文字是否违规.* 创建时间 12月3日 下午2:12:29* @author Shendi <a href='tencent://AddContact/?fromId=45&fromSubId=1&subcmd=all&uin=1711680493'>QQ</a>* @param openid用户id* @param txt文字内容* @return true 不违规*/public static boolean securityMsgSecCheck(String openid, String txt) {// POST https://api./wxa/msg_sec_check?access_token=ACCESS_TOKENif (IsNullUtil.strsIsNull(openid, txt)) return false;String token = getToken();if (token == null) {Log.printAlarm("检查一段文本是否含有违法违规内容失败,无法获取到token");return false;}HttpsURLConnection huc = null;try {// 这里的 SECURITY_MSG_SEC_CHECK 是接口地址(不带参数的),后面追加一个tokenhuc = (HttpsURLConnection) new URL(SECURITY_MSG_SEC_CHECK.concat("?access_token=").concat(token)).openConnection();huc.setRequestMethod("POST");huc.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");huc.setDoInput(true);huc.setDoOutput(true);JSONObject param = new JSONObject();param.put("version", "2");param.put("openid", openid);param.put("scene", "1");param.put("content", txt);huc.getOutputStream().write(param.toString().getBytes());String data = new String(huc.getInputStream().readAllBytes());JSONObject result = (JSONObject) JSONObject.parse(data);if (isError(result)) {Log.printAlarm("小程序检测文字是否违规失败: ".concat(result.toJSONString()));return false;} else {/*"result": {"suggest": "risky","label": 20001},*/JSONObject r = result.getJSONObject("result");if ("pass".equals(r.getString("suggest"))) {return true;} else {Log.print("小程序检测文字结果违规,文字=%s, result=%s", txt, result);return false;}}} catch (IOException e) {e.printStackTrace();Log.printExcept("小程序检测文字是否违规失败失败: %s", e.getMessage());} finally {if (huc != null) huc.disconnect();}return false;}
这个接口效果不怎么样,只有特别直白的文字才会被…
图片接口
这个搞了我好久,因为参数使用的 FromData 形式的,关于 Java 这方面的,都是47001,后来使用了SpringBoot提供的接口,就没问题了
代码如下
/*** 小程序验证图片是否违规.* 创建时间 12月3日 下午5:11:42* @author Shendi <a href='tencent://AddContact/?fromId=45&fromSubId=1&subcmd=all&uin=1711680493'>QQ</a>* @param path 图片路径* @return true不违规*/public static boolean securityImgSecCheck(String path) {// POST https://api./wxa/img_sec_check?access_token=ACCESS_TOKENif (path == null) return false;String token = getToken();if (token == null) {Log.printAlarm("检查图片是否含有违法违规内容失败,无法获取到token");return false;}RestTemplate http = new RestTemplate();HttpHeaders heads = new HttpHeaders();heads.setContentType(MediaType.MULTIPART_FORM_DATA);MultiValueMap<String, Object> param = new LinkedMultiValueMap<>();// 这个地方只能使用 FileSystemResource 的形式,我直接用 byte[] 的话,接口给我返回的 47001 参数错误param.add("media", new FileSystemResource(new File(path)));HttpEntity<MultiValueMap<String, Object>> entity = new HttpEntity<>(param, heads);String data = http.postForObject(SECURITY_IMG_SEC_CHECK.concat("?access_token=").concat(token), entity, String.class);JSONObject result = (JSONObject) JSONObject.parse(data);System.out.println(result);if (isError(result))return false;else return true;}
因为使用到了 SpringBoot 这里贴出引入的包
import org.springframework.core.io.FileSystemResource;import org.springframework.http.HttpEntity;import org.springframework.http.HttpHeaders;import org.springframework.http.MediaType;import org.springframework.util.LinkedMultiValueMap;import org.springframework.util.MultiValueMap;import org.springframework.web.client.RestTemplate;
如果觉得《Java接入微信内容安全(文本-security.imgSecCheck/图片-security.imgSecCheck)》对你有帮助,请点赞、收藏,并留下你的观点哦!