微信小程序和QQ小程序图片安全内容检测接口之ThinkPHP实现

由于相关管控,UGC小程序的开发者,必须要过滤违法违规内容(如黄)。

UGC小程序官方定义:

小程序中的功能或服务中,涉及用户将自己自定义编辑的文字、图片、音频、视频等内容通过小程序进行展示或提供给其他用户的,属于UGC小程序。

拒审条例:

存在平台为允许的服务内容,违反《微信小程序平台运营规范常见拒绝情形3.2》

原因:

小程序提供用户图片处理功能,但是未接入图片安全内容检测接口https://api.weixin.qq.com/wxa/img_sec_check

注意:不要尝试做假调用,审核人员真的会用有颜色的图片来测试!!!

解决方案:


尝试过小程序云开发,但是云函数大小有限制太死,行不通。改自己服务器用php实现安全校验接口。用的是ThinkPHP,你们自行调整。

其实微信小程序和QQ小程序的安全检测接口思路和代码差不多一次,但是为了大家方便参考比对和Copy,就全贴出来了。

微信小程序服务端相关代码

  • 图片敏感检测接口
	//微信小程序图片敏感检测
    public function wxImgSecCheck() {
        $access_token = $this->getMiniToken();
        $img = request()->param('img');
        if (empty($img)) {
            return RJson::error("");
        }
        
        $filePath = $this->saveBase64Image($img, 0);
        if (empty($filePath)) {
            return RJson::error("");
        }
        $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 = $this->httpRequest($url,$file);
        return RJson::success($info);
    }
  • 获取access_token
	//微信小程序获取access_token
	private function getMiniToken() {
        $cacheKey = 'miniRcubeAccessToken';
        $access_token = Cache::get($cacheKey); 
        if (empty($token)) {
            $appid = "你的APPID";
            $secret = "你的SECRET";
            $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" . $appid . "&secret=" . $secret;
            $jsonResult = file_get_contents($url);
            $resultArray = json_decode($jsonResult, true);
            $access_token = $resultArray["access_token"];
            Cache::set($cacheKey,$access_token,180);
        }
        return $access_token;
    }

QQ小程序服务端相关代码

  • 图片敏感检测接口
	//QQ小程序图片敏感检测
    public function qqImgSecCheck() {
        $access_token = $this->getQQMiniToken();
        $img = request()->param('img');
        if (empty($img)) {
            return RJson::error("");
        }
       	
        $filePath = $this->saveBase64Image($img, 1);
        if (empty($filePath)) {
            return RJson::error("");
        }
        $obj = new \CURLFile(realpath($filePath));
        $obj->setMimeType("image/jpeg");
        $file['media'] = $obj;
        $url = "https://api.q.qq.com/api/json/security/ImgSecCheck?access_token=".$access_token;
        $info = $this->httpRequest($url,$file);
        return RJson::success($info);
    }
  • 获取access_token
	//QQ小程序获取access_token
	private function getQQMiniToken() {
        $cacheKey = 'miniQQRcubeAccessToken';
        $access_token = Cache::get($cacheKey); 
        if (empty($token)) {
            $appid = "你的APPID";
            $secret = "你的SECRET";
            $url = "https://api.q.qq.com/api/getToken?grant_type=client_credential&appid=" . $appid . "&secret=" . $secret;
            $jsonResult = file_get_contents($url);
            $resultArray = json_decode($jsonResult, true);
            $access_token = $resultArray["access_token"];
            Cache::set($cacheKey,$access_token,180);
        }
        return $access_token;
    }

主要代码到这里就完了,下面补充用到的私有方法和类:

  • HTTP请求(支持HTTP/HTTPS,支持GET/POST)
	//HTTP请求(支持HTTP/HTTPS,支持GET/POST)
    private function httpRequest($url, $data = null)
    {
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, $url);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);

        if (!empty($data)) {
            curl_setopt($curl, CURLOPT_POST, TRUE);
            curl_setopt($curl, CURLOPT_POSTFIELDS,$data);
        }
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
        $output = curl_exec($curl);
        curl_close($curl);
        return $output;
    }
  • 保存Base64图片
	private function saveBase64Image($base64_image, $ptype) {
        //保存位置--图片名
        $image_name =date('His').str_pad(mt_rand(1, 99999), 5, '0', STR_PAD_LEFT).".jpg";
        $group_name = "_" . date('Ymd');
        $group_path = ROOT_PATH . 'public' . DS . 'static' . DS . 'jjfly'. DS . $group_name;
        $image_path = $group_path .'/'.$image_name;
        $http_path = "https://www.iftangtang.com/static/jjfly/" . $group_name . '/'.$image_name;
        if (!file_exists($group_path)) {
            mkdir ($group_path,0777,true);
        }
            
        //解码
        $base64_image = str_replace (" ","+", $base64_image);
        $base64_image = str_replace('data:image/jpg;base64,', '', $base64_image);
        $base64_image = str_replace('\n', '', $base64_image);
        $base64_image = str_replace('\t', '', $base64_image);
        
        $decode = base64_decode($base64_image);
        if (file_put_contents($image_path, $decode)){
            return $image_path;
        }
        return false;
    }
  • 简易封装接口用到的Json返回类:RJson.php
 $data,
            'msg' => $msg,
            'code' => $code
        ];

        return json_encode($result, JSON_UNESCAPED_UNICODE);
    }
    //请求失败返回json格式数据
    public static function error($msg='操作失败',$code=201,$data=''){
        $result = [
            'data' => $data,
            'msg' => $msg,
            'code' => $code
        ];

        return json_encode($result, JSON_UNESCAPED_UNICODE);
    }
}

你可能感兴趣的:(PHP,微信公众号,微信小程序,小程序,微信)