小程序使用时,难免会需要用户上传图片,为了规范上传图片,微信提供了图片内容审核为了保障小程序内容合规,发布时事新闻、具有社交属性或以视频、电台为载体的小程序需在上线前,完成向省/自治区/直辖市属地网信部门申请报备的工作。特别是,为避免小程序违法违规风险,UGC小程序需要对用户发布的内容做好安全审查措施。
下面是PHP使用imgSecCheck验证图安全的方法
//基于ThinkPHP
/**
* 获取access_token
*/
public function get_access_token($appid,$appsecret){
//提取缓存中的access_token
$token = Cache::get('access_token');
if ($token){
return self::to_array(1,$token);
}
//获取access_token
$url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='.$appid.'&secret='.$appsecret;
//获取access_token
$get_token = curl_get($url);
//错误结果
$msg =[
'-1' =>'系统繁忙,此时请开发者稍候再试',
'0' =>'请求成功',
'40001' =>'AppSecret错误或者AppSecret不属于这个公众号,请开发者确认AppSecret的正确性',
'40002' =>'请确保grant_type字段值为client_credential',
'40164' =>'调用接口的IP地址不在白名单中,请在接口IP白名单中进行设置。(小程序及小游戏调用不要求IP地址在白名单内。)',
];
//access_token解析
$get_token = json_decode($get_token,true);
if (!empty($get_token['access_token'])){
//保存token 2小时
Cache::set('access_token',$get_token['access_token'],7200);
return self::to_array(1,$get_token['access_token']);
}else{
//返回错误
return self::to_array(0,$msg[$get_token['errcode']],$get_token);
}
}
/**
* 图像校验
* @param $filePath 图片本地位置
*/
public function checkImg($filePath){
//获取微信token
$appid ='微信APPid';
$secret = '微信秘钥';
$get_access = self::get_access_token($appid,$secret);
if (empty($get_access['status'])) return self::to_array(0,'调用失败');
//获取token
$access_token = $get_access['data'];
//数据处理
$obj = new \CURLFile(realpath($filePath));
$obj->setMimeType('image/jpeg');
$file['media'] = $obj;
$url = 'https://api.weixin.qq.com/wxa/img_sec_check?access_token='.$access_token;
$info = self::curl_post($url,$file,[]);
//返回解析
$res = json_decode($info,true);
//返回结果 errcode 为0 则图片为安全图片
if ($res['errcode'] == 0){
return self::to_array(1,$res['errmsg']);
}else{
return self::to_array(0,$res['errmsg']);
}
}
/**
* 结果返回
* @param [状态] $status [结果状态 1为成功,0为失败]
* @param [说明] $msg [返回说明]
* @param [数据] $data [其他数据,status为1是返回]
* @return [array] [结果集合]
*/
private function to_array($status,$msg,$data='')
{
$back['status']=$status;
$back['msg']=$msg;
$back['data']=$data;
return $back;
}
/**
* @param string $url 请求连接
* @param array $post_data 请求数据
* @param array | boolean $header 请求头
* @return mixed
*/
private function curl_post($url,$post_data,$header)
{
//开启curl
$ch = curl_init();
//设置请求地址
curl_setopt($ch, CURLOPT_URL, $url);
// 执行后不直接打印出来
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// 设置请求方式为post
curl_setopt($ch, CURLOPT_POST, true);
// post的变量
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
// 请求头,可以传数组
curl_setopt($ch, CURLOPT_HEADER, $header);
// 跳过证书检查
//curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
// 不从证书中检查SSL加密算法是否存在
//curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
$output = curl_exec($ch);
curl_close($ch);
return $output;
}
代码为提取出来的,实际应用中可能需要调整下。