使用微信小程序API来审核内容的合法性
要在 Java 程序中使用微信小程序的内容审核功能（msgSecCheck 接口），您需要完成以下步骤：获取 Access Token：调用微信接口前，首先需要获取小程序的全局唯一后台接口调用凭据 access_token。调用 msgSecCheck 接口：使用获取的 access_token，向微信服务器发送内容审核请求。下面我提供一套完整的 Java 代码，包括获取 access_token 和审核内容的方法，您可以直接传入内容进行审核。package cn.sanshu.service.impl; import cn.hutool.http.HttpRequest; import cn.hutool.http.HttpResponse; import cn.hutool.http.HttpUtil; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; import java.time.Instant; public class WeChatContentCheckerServiceImpl { private static final String APPID = ""; private static final String openid = ""; private static final String APPSECRET = ""; private static final String TOKEN_FILE_PATH = "access_token.json"; // 存储 access_token 的文件路径 private static final String content = ""; public static void main(String[] args) { try { SceneType scene = SceneType.COMMENT; // 场景值（1 资料；2 评论；3 论坛；4 社交日志） String result = checkMessage(content, scene, openid); System.out.println(result); } catch (Exception e) { e.printStackTrace(); } } // 获取 access_token 的方法 public static String getAccessToken() throws IOException { String cachedToken = getCachedAccessToken(); if (cachedToken != null) { return cachedToken; } String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + APPID + "&secret=" + APPSECRET; HttpResponse response = HttpUtil.createGet(url).execute(); JSONObject json = JSONUtil.parseObj(response.body()); if (json.containsKey("access_token")) { String accessToken = json.getStr("access_token"); int expiresIn = json.getInt("expires_in"); // 缓存 access_token cacheAccessToken(accessToken, expiresIn); return accessToken; } else { throw new IOException("获取 access_token 失败：" + json.toString()); } } // 审核内容的方法，使用 Hutool 的 POST 请求 public static String checkMessage(String content, SceneType scene, String openid) throws IOException { String accessToken = getAccessToken(); String url = "https://api.weixin.qq.com/wxa/msg_sec_check?access_token=" + accessToken; // 构建请求数据 JSONObject data = new JSONObject(); data.set("content", content); data.set("version", 2); // 固定值 2 data.set("scene", scene.getCode()); // 使用枚举场景 data.set("openid", openid); // 用户 openid // 发起 POST 请求 HttpResponse response = HttpRequest.post(url) .body(data.toString()) .contentType("application/json") .execute(); JSONObject json = JSONUtil.parseObj(response.body()); int errcode = json.getInt("errcode"); System.out.println(response.body()); if (errcode == 0) { JSONObject result = json.getJSONObject("result"); String suggest = result.getStr("suggest"); int label = result.getInt("label"); // 根据 suggest 和 label 判断内容的合规性 if ("pass".equals(suggest)) { return "内容合规，可以发布。"; } else if ("review".equals(suggest)) { return "内容需要进一步人工审核，标签：" + getLabelDescription(label); } else if ("risky".equals(suggest)) { return "内容违规，禁止发布。标签：" + getLabelDescription(label); } else { return "未知的内容审核建议：" + suggest; } } else { throw new IOException("内容审核失败，错误码：" + errcode); } } // 获取标签说明 private static String getLabelDescription(int label) { switch (label) { case 100: return "正常"; case 10001: return "广告"; case 20001: return "时政"; case 20002: return "色情"; case 20003: return "辱骂"; case 20006: return "违法犯罪"; case 20008: return "欺诈"; case 20012: return "低俗"; case 20013: return "版权"; case 21000: return "其他"; default: return "未知"; } } // 获取 access_token 的缓存逻辑 private static String getCachedAccessToken() throws IOException { File file = new File(TOKEN_FILE_PATH); if (file.exists()) { String content = new String(Files.readAllBytes(Paths.get(TOKEN_FILE_PATH))); JSONObject json = JSONUtil.parseObj(content); long expiryTime = json.getLong("expiry_time"); // 检查是否过期 if (Instant.now().getEpochSecond() < expiryTime) { return json.getStr("access_token"); } } return null; // 没有有效的缓存 } // 缓存 access_token 到文件中 private static void cacheAccessToken(String accessToken, int expiresIn) throws IOException { JSONObject json = new JSONObject(); json.set("access_token", accessToken); json.set("expiry_time", Instant.now().getEpochSecond() + expiresIn - 60); // 提前60秒失效 // 写入文件 try (FileWriter file = new FileWriter(TOKEN_FILE_PATH)) { file.write(json.toString()); } } // 示例方法 public enum SceneType { PROFILE(1, "资料"), COMMENT(2, "评论"), FORUM(3, "论坛"), SOCIAL_LOG(4, "社交日志"); private final int code; private final String description; SceneType(int code, String description) { this.code = code; this.description = description; } public int getCode() { return code; } public String getDescription() { return description; } public static SceneType fromCode(int code) { for (SceneType type : SceneType.values()) { if (type.getCode() == code) { return type; } } throw new IllegalArgumentException("未知的场景代码: " + code); } } }使用说明：替换 AppID 和 AppSecret：请将 YOUR_APPID 和 YOUR_APPSECRET 替换为您小程序的实际 AppID 和 AppSecret。添加 JSON 处理库：上述代码使用了 org.json 库，您需要在项目中添加该依赖。可以通过 Maven 或手动添加 jar 包。Maven 依赖示例： cn.hutool hutool-all ${hutool.version} 调用方法：使用 checkMessage(String content) 方法，传入您需要审核的内容即可。注意事项：接口限制：msgSecCheck 接口有调用频率限制，请注意不要频繁调用。错误处理：在实际应用中，建议对可能的异常和错误代码进行更详细的处理。优化请求：为了提高效率，可以缓存 access_token，因为它的有效期为 2 小时。在有效期内重复使用即可。参考文档：[button color="info" icon="" url="https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/sec-center/sec-check/msgSecCheck.html" type=""]文本内容安全识别[/button]