在进行微信小程序开发时,用户上传的文字或图片可能包含非法内容。为了确保应用的合规性,本文将简要介绍如何使用PHP调用微信API接口进行内容检测。
根据微信小程序开发文档的说明,文本内容安全识别主要有两种方式:云调用和第三方调用。第一种方式是云开发,刚上线时几乎是免费的,目前仅提供一个月的免费配额。尽管使用云函数进行内容安全识别非常方便,但它并非完全免费。
因此,我们可以选择第二种方式,即通过第三方调用来实现。这种方式的实现也并不复杂,主要需要备案域名和HTTPS支持。让我们接下来了解一下如何通过这种方式进行内容检测。
官方文档
官方在开发文档中的描述如下:
功能描述:该接口用于检查一段文本是否含有违法违规内容。
应用场景:
- 用户个人资料中的违规文字检测;
- 媒体新闻类用户发表文章和评论内容的检测;
- 游戏类用户编辑上传的素材(例如答题类小游戏用户上传的问题及答案)的检测等。
另外,1.0版本的接口已经停止更新,我们需要使用最新版本的接口。
第三方调用
请求地址:https://api.weixin.qq.com/wxa/msg_sec_check?access_token=ACCESS_TOKEN
请求参数:
php代码实现
结构说明:
config.ini,配置文件,我们需要更改里面的WX_APPID 、WX_APPSECRT,需要在小程序开发后台获取。
Verification.php,封装了微信后台接口的调用和消息内容安全验证的功能。
api.php,主要来接收小程序提交的检查内容,与用户的openid。
config.ini
WX_APPID = ""
WX_APPSECRT = ""
Verification.php
<?php
class Util_Verification
{
private $appid;
private $appSecret;
public function __construct($ini_file) {
// 获取配置文件中的 appid 和 appsecret
$conf = parse_ini_file($ini_file);
$this->appid = $conf['WX_APPID'];
$this->appSecret = $conf['WX_APPSECRT'];
}
/**
* 获取微信 AccessToken
*/
public function getAccessToken()
{
// 从文件读取 AccessToken
$accessTokenFile = 'access_token.txt';
if (file_exists($accessTokenFile)) {
$data = json_decode(file_get_contents($accessTokenFile), true);
if ($data['expire_time'] > time()) {
return $data['access_token'];
}
}
// 获取新的 AccessToken
$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$this->appid."&secret=".$this->appSecret;
$info = curl_init();
curl_setopt($info, CURLOPT_RETURNTRANSFER, true);
curl_setopt($info, CURLOPT_HEADER, 0);
curl_setopt($info, CURLOPT_NOBODY, 0);
curl_setopt($info, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($info, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($info, CURLOPT_URL, $url);
$output = curl_exec($info);
curl_close($info);
$result = json_decode($output, true);
if (!empty($result['errcode'])) {
return $result['errmsg'];
} else {
// 保存新的 AccessToken 到文件
$accessToken = $result['access_token'];
$data = [
'access_token' => $accessToken,
'expire_time' => time() + 3600 // 假设 AccessToken 有效期为1小时
];
file_put_contents($accessTokenFile, json_encode($data));
return $accessToken;
}
}
/**
* 违规验证
* @param $content
* @param $openid
* @param $scene
* @param $version
* @param null $title
* @param null $nickname
* @param null $signature
* @return array|string
*/
public function msgSecCheck($content, $openid, $scene, $version, $title = null, $nickname = null, $signature = null)
{
$accessToken = $this->getAccessToken();
$url = "https://api.weixin.qq.com/wxa/msg_sec_check?access_token=".$accessToken;
$postData = [
'content' => $content,
'openid' => $openid,
'scene' => $scene,
'version' => $version,
'title' => $title,
'nickname' => $nickname,
'signature' => $signature
];
// 移除为空的参数
$postData = array_filter($postData);
$postdata = json_encode($postData, JSON_UNESCAPED_UNICODE);
$options = array(
'http' => array(
'method' => 'POST',
'header' => 'Content-type:application/json',
'content' => $postdata,
'timeout' => 3, // 超时时间(单位:s)
'user-Agent' => "Mozilla/5.0 (Windows NT 6.1; rv:21.0) Gecko/20100101 Firefox/21.0\r\n" .
"X-Requested-With: XMLHttpRequest",
)
);
$context = stream_context_create($options);
try {
$result = file_get_contents($url, false, $context);
$result = json_decode($result, true);
if (!$result) {
throw new Exception("获取信息失败,请重新打开页面");
}
return $result;
} catch (Exception $exception) {
return $exception->getMessage();
}
}
}
?>
api.php
<?php
error_reporting(0);
header('Content-Type: application/json; charset=utf-8');
// 包含 Util_Verification 类文件
require 'Verification.php';
// 定义配置文件路径
$ini_file = 'config.ini';
// 实例化 Util_Verification 类
$verification = new Util_Verification($ini_file);
// 获取 AccessToken
$accessToken = $verification->getAccessToken();
//echo "AccessToken: " . $accessToken . "\n";
// 获取 POST 提交的数据
$postdata = file_get_contents("php://input");
$request = json_decode($postdata);
// 提取需要的参数
$content = isset($request->content) ? $request->content : "";
$openid = isset($request->openid) ? $request->openid : "";
$scene = 1; // 资料
$version = 2; // 版本固定值
// 可选的参数
// $title = isset($request->title) ? $request->title : "";
// $nickname = isset($request->nickname) ? $request->nickname : "";
// $signature = isset($request->signature) ? $request->signature : "";
// 调用消息安全检查方法
$result = $verification->msgSecCheck($content, $openid, $scene, $version);
echo json_encode($result);
?>
以上我们只需要配置好config.ini的WX_APPID 、WX_APPSECRT,接下来我们需要完成小程序部分,即可实现提交文本内容进行监测了。
小程序js参考部分
wx.request({
url: 'https://www.qq.com/api.php', // 替换成你搭建好的接口地址
method: 'POST',
header: {
'Content-Type': 'application/json'
},
data: {
content: data, //需要检测的文本内容
openid: openid //用户openid唯一识别码
},
success: function(res) {
console.log(res.data);
if (res.data.errcode == 44004||res.data.errcode == 0 &&res.data.result.label== 100 ){
if (data) {
that.Inputsc(data) //通过检测的逻辑
} else
wx.showToast({
title: "请输入内容,不能为空",
icon: "none",
duration: 1000
});
}
else{
that.clear() //清除文本
wx.showModal({
title: '您输入的文本涉及敏感内容,请重新输入!',
icon: "none",
duration: 800
});
}
// 处理成功响应
},
fail: function(err) {
console.error(err);
// 处理失败响应
}
});
版权说明
文章采用: 《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权。版权声明:本站资源来自互联网收集,仅供用于学习和交流,请勿用于商业用途。如有侵权、不妥之处,请联系客服并出示版权证明以便删除!
发表评论