PHP之 微信【内容安全】“文字、图片” 校验代码

附加内容:

1、微信文档 https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/sec-check/security.imgSecCheck.html
2、PHP5.4,json_encode函数,新增了一个参数选项,JSON_UNESCAPED_UNICODE,中文不编码,内容原样输出

第一部分:【违规文字】检查校验

文件:index

/**
 * 微信-违规【文字】检测
 * @return mixed
 */
public function test_wx_check()
{
    $param = '神鼎飞丹砂发生的';
    $type = 1;
    $result = $this->wx_check($param, $type);
    echo'<pre>';var_dump($result);exit();
}

第二部分:【违规图片】检查校验

文件:index

a、表单部分
<form action="upload_file.php" method="post"
enctype="multipart/form-data">
    <label for="file">Filename:</label>
    <input type="file" name="uploadImg" id="uploadImg" />
    <br />
    <input type="submit" name="submit" value="Submit" />
</form>

b、后端部分

/**
 * 微信-违规【图片】检测
 * @return mixed
 */
public function test_wx_check()
{
    $param = $_FILE['uploadImg'];
    $type = 1;
    $result = $this->wx_check($param, $type);
    echo'<pre>';var_dump($result);exit();
}

第三部分:核心代码部分

文件:index

/**
 * 微信-违规【文字/图片】检测
 * @param $param
 * @return mixed
 */
public function wx_check($param, $type=1)
{
    // 对参数进行验证,空直接返回false
    if(!$param || !$type){
        return false;
    }

    // 参数分类处理
    if($type==1){
        $data = ['content'=>$param];
    }else if($type==2){
        $data = ['media'=>$param];
    }

    // 获取access_token
    $this->load->service('order_service');
    $access_token = $this->order_service->get_access_token();

    // access_token不能为空
    if(!$access_token){
        return false;
    }

    // 请求地址
    $this->load->config('dict/dict_wx_check');
    $config = $this->config->item('wx_check_config');
    $url = ($type==1?$config['content_url']:$config['img_url']).'?access_token='.$access_token;

    // 请求数据
    $result = $this->curl_post_weixin($url, $data);

    // json结果反转
    return json_decode($result, true);
}

/**
 * cURL方式POST数据到微信
 * @param string $url 请求地址
 * @param array $data 发送数据
 * @return mixed
 * @author LiuDongrang
 * @time   2019/05/19
 */
private function curl_post_weixin($url, $data)
{
    if($url && count($data)){
        $headers = ['Content-Type:application/json'];
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); // 关键点
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data, JSON_UNESCAPED_UNICODE)); // 【* 关键点】
        $res = curl_exec($ch);
        curl_close($ch);
        return $res;
    }
}

文件:order_service

/**
 * 获取token
 * @author LiuDongrang
 * @time  2019/07/05
 */
public function take_access_token()
{
    $access_token = $this->get_access_token();
    // 获取存入redis
    $this->load->library('dbredis');
    $this->dbredis->set('redis_access_token', $access_token);
    return $this->dbredis->get('redis_access_token');
}

/**
 * 获取access_token值
 * @return string $access_token
 * @author LiuDongrang
 * @time   2019/05/19
 */
public function get_access_token()
{
    $appConfig = [
        'app_id' => 'wxsdfdsfsdfsdfdfdefc',
        'secret' => 'ecsdfsdfdfuyttrrlo9887jfa7d29106'
    ];
    $url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='.$appConfig['app_id'].'&secret='.$appConfig['secret'];
    $ch = curl_init(); // 创建句柄
    curl_setopt($ch, CURLOPT_URL, $url); // 通过url获取数据
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // 获取的信息以文件流的形式返回
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);// 跳过证书验证
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // 从证书中检查SSL加密算法是
    $output = json_decode(curl_exec($ch));
    $access_token = $output->access_token;
    curl_close($ch);
    return $access_token;
}

文件:dict/dict_wx_check

/**
 * 微信【图文】违规校验 - 配置文件
 */

/** 图文校验请求地址 **/
$config['wx_check_config'] = [
    'content_url'=>'https://api.weixin.qq.com/wxa/msg_sec_check',
    'img_url'=>'https://api.weixin.qq.com/wxa/img_sec_check',
];

最后总结:

    图文内容校验(涉黄、涉政)本身没有什么难点,但是,却有需要注意的地方!
    图片检查这块,微信端要求的图片参数media的格式为form-data,因此,表单属性必须有 enctype="multipart/form-data",否则,测试的时候就会报“格式错误”的提示,切记!
    文字检查这块,有一个关键点,就是对content内容,转为json格式传输的时候,json_encode这个函数,必须要加 "JSON_UNESCAPED_UNICODE" 这个参数,否则,那些敏感词汇根本测不出来!这是为什么呢?因为json_encode在处理中文的时候,中文都会被编码,变成类似 "\u****" 的不可读的格式,这样,微信端接受的都是一堆这样的字符,敏感词汇当然检验不出来了!而JSON_UNESCAPED_UNICODE这个参数,加到json_encode函数里后,所有的中文字符,将原样输出,这样,就可以过滤出敏感内容来了!
发布了59 篇原创文章 · 获赞 2 · 访问量 5582

猜你喜欢

转载自blog.csdn.net/LDR1109/article/details/101221187
今日推荐