要在 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 依赖示例:
<dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>${hutool.version}</version> </dependency>
- 调用方法:使用
checkMessage(String content)
方法,传入您需要审核的内容即可。
注意事项:
- 接口限制:
msgSecCheck
接口有调用频率限制,请注意不要频繁调用。 - 错误处理:在实际应用中,建议对可能的异常和错误代码进行更详细的处理。
- 优化请求:为了提高效率,可以缓存
access_token
,因为它的有效期为 2 小时。在有效期内重复使用即可。
参考文档: