要在 Java 程序中使用微信小程序的内容审核功能(msgSecCheck 接口),您需要完成以下步骤:

  1. 获取 Access Token:调用微信接口前,首先需要获取小程序的全局唯一后台接口调用凭据 access_token
  2. 调用 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_APPIDYOUR_APPSECRET 替换为您小程序的实际 AppIDAppSecret
  • 添加 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 小时。在有效期内重复使用即可。

参考文档:

最后修改:2024 年 09 月 14 日
如果觉得我的文章对你有用,请随意赞赏