- 1.背景
- 2.策略
- 3.实现
- 1. 调用auth.getAccessToken,获取接口调用凭证
- 2. 调用security.msgSecCheck检测文本内容
- 4.遇到的问题
- 5.工具类完整代码
- 6.使用方式
1.背景
发布小程序的时候,没有通过审核,审核结果为
提示要完善内容审核机制。
2.策略
微信服务端内容安全模块提供了内容审核的接口
security.msgSecCheck
检查一段文本是否含有违法违规内容。
应用场景举例:
- 用户个人资料违规文字检测;
- 媒体新闻类用户发表文章,评论内容检测;
- 游戏类用户编辑上传的素材(如答题类小游戏用户上传的问题及答案)检测等。
频率限制:
单个 appId 调用上限为 4000 次/分钟,2,000,000 次/天
调用方式:
- HTTPS 调用
- 云调用
- 增量调用(加强版)
这里我们使用HTTPS调用的方式。
3.实现
1. 调用auth.getAccessToken,获取接口调用凭证
详情可参考微信公众平台文档 《获取access_token》
使用map存储获取的access_token,建立定时任务,每个7000s更新一次,如果项目中引入了Redis,最好使用Redis存储。原本项目中没有引入Redis,这里就偷了个懒
import cn.hutool.http.HttpUtil;import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.Scheduled;import java.util.HashMap;
import java.util.Map;@Configuration
public class WeiXinUtil {@Value("${app.appid}")String APPID;@Value("${app.secret}")String SECRET;@Value("${app.grant_type}")String AUTHORIZATION_CODE;@AutowiredWxCryptUtils wxCryptUtils;public static Map<String, String> accessTokenMap;public static final String ACCESS_TOKEN_KEY="accessToken";static {accessTokenMap = new HashMap<String, String>(1);}/*** 功能描述: 获取access_token,每隔7000s获取一次* @author jiaoqianjin* Date: 2020/11/23 14:33*/@Scheduled(fixedDelay = 2*3000*1000)public void getAccessToken() {//利用hutool发送https请求Map<String, Object> paramMap = new HashMap<String, Object>(3);paramMap.put("appid", APPID);paramMap.put("secret", SECRET);paramMap.put("grant_type", AUTHORIZATION_CODE);// 利用Hutool工具包的HttpUtilObject result = HttpUtil.get("https://api.weixin.qq.com/cgi-bin/token?", paramMap);JSONObject jsonObject = JSONUtil.parseObj(result);WeiXinUtil.accessTokenMap.put(WeiXinUtil.ACCESS_TOKEN_KEY,jsonObject.getStr("access_token"));}
}
.yml
app:appid: wx23eb370840c******secret: 8a665bce9dcc74e6e30e1c849******grant_type: client_credential
启动类
添加注解@EnableScheduling,开启定时任务
@EnableScheduling
@SpringBootApplication
public class AppRun {public static void main( String[] args ) {SpringApplication.run(AppRun.class, args);}}
2. 调用security.msgSecCheck检测文本内容
/*** 功能描述:检查一段文本是否含有违法违规内容。** @param content 待检测文本* @author jiaoqianjin* Date: 2020/11/23 14:41*/public boolean msgCheck(String content) {String token = WeiXinUtil.accessTokenMap.get(WeiXinUtil.ACCESS_TOKEN_KEY);Map<String, Object> paramMap = new HashMap<String, Object>(1);paramMap.put("content", content);Object result = HttpUtil.post("https://api.weixin.qq.com/wxa/msg_sec_check?access_token=" + token, JparamMap);JSONObject jsonObject = JSONUtil.parseObj(result);System.out.println(jsonObject);boolean flag = false;//87014 内容含有违法违规内容int errCode = 87014;if (jsonObject.getInt("errcode") == errCode) {flag = true;}return flag;}
4.遇到的问题
{“errcode”:47001,“errmsg”:"data format error rid: *** "}
请求格式不正确
hutool给出的post请求例子
发现自己没有用错,但是请求格式就是不对,发现post请求参数,请发送前还是要转为JSON格式
Map<String, Object> paramMap = new HashMap<String, Object>(1);paramMap.put("content", content);Object result = HttpUtil.post("https://api.weixin.qq.com/wxa/msg_sec_check?access_token=" + token, JSONUtil.toJsonPrettyStr(paramMap));
5.工具类完整代码
import cn.hutool.http.HttpUtil;import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.Scheduled;import java.util.HashMap;
import java.util.Map;@Configuration
public class WeiXinUtil {@Value("${app.appid}")String APPID;@Value("${app.secret}")String SECRET;@Value("${app.grant_type}")String AUTHORIZATION_CODE;@AutowiredWxCryptUtils wxCryptUtils;public static Map<String, String> accessTokenMap;public static final String ACCESS_TOKEN_KEY="accessToken";static {accessTokenMap = new HashMap<String, String>(1);}/*** 功能描述: 获取access_token,每隔7000s获取一次* @author jiaoqianjin* Date: 2020/11/23 14:33*/@Scheduled(fixedDelay = 2*3000*1000)public void getAccessToken() {//利用hutool发送https请求Map<String, Object> paramMap = new HashMap<String, Object>(3);paramMap.put("appid", APPID);paramMap.put("secret", SECRET);paramMap.put("grant_type", AUTHORIZATION_CODE);// 利用Hutool工具包的HttpUtilObject result = HttpUtil.get("https://api.weixin.qq.com/cgi-bin/token?", paramMap);JSONObject jsonObject = JSONUtil.parseObj(result);WeiXinUtil.accessTokenMap.put(WeiXinUtil.ACCESS_TOKEN_KEY,jsonObject.getStr("access_token"));}/*** 功能描述:检查一段文本是否含有违法违规内容。** @param content 待检测文本* @author jiaoqianjin* Date: 2020/11/23 14:41*/public boolean msgCheck(String content) {String token = WeiXinUtil.accessTokenMap.get(WeiXinUtil.ACCESS_TOKEN_KEY);Map<String, Object> paramMap = new HashMap<String, Object>(1);paramMap.put("content", content);Object result = HttpUtil.post("https://api.weixin.qq.com/wxa/msg_sec_check?access_token=" + token, JSONUtil.toJsonPrettyStr(paramMap));JSONObject jsonObject = JSONUtil.parseObj(result);System.out.println(jsonObject);boolean flag = false;//87014 内容含有违法违规内容int errCode = 87014;if (jsonObject.getInt("errcode") == errCode) {flag = true;}return flag;}
}
6.使用方式
// 通知内容添加文本铭感词汇过滤boolean isSensitive = new WeiXinUtil().msgCheck(info.getContent());if (isSensitive) {log.error("【发布通知失败,含有违法违规内容】: objId: " + updateObjectDTO.getId());throw new BaseException(ResponseEnum.CONTENT_IS_SENSITIVE);}