Requests.php 6.7 KB
Newer Older
李光春's avatar
李光春 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
<?php

// +----------------------------------------------------------------------
// | ThinkLibrary 6.0 for ThinkPhP 6.0
// +----------------------------------------------------------------------
// | 版权所有 2017~2020 [ https://www.dtapp.net ]
// +----------------------------------------------------------------------
// | 官方网站: https://gitee.com/liguangchun/ThinkLibrary
// +----------------------------------------------------------------------
// | 开源协议 ( https://mit-license.org )
// +----------------------------------------------------------------------
// | gitee 仓库地址 :https://gitee.com/liguangchun/ThinkLibrary
// | github 仓库地址 :https://github.com/GC0202/ThinkLibrary
// | Packagist 地址 :https://packagist.org/packages/liguangchun/think-library
// +----------------------------------------------------------------------
李光春's avatar
李光春 已提交
16

李光春's avatar
李光春 已提交
17
declare (strict_types=1);
李光春's avatar
李光春 已提交
18 19 20 21 22

namespace DtApp\ThinkLibrary\helper;

/**
 * 请求管理类
李光春's avatar
李光春 已提交
23
 * @mixin Requests
李光春's avatar
李光春 已提交
24 25 26 27 28 29 30 31
 * @package DtApp\ThinkLibrary\helper
 */
class Requests
{
    /**
     * 判断输入的参数
     * @param array $data
     * @param array $arr
李光春's avatar
李光春 已提交
32
     * @return array
李光春's avatar
李光春 已提交
33
     */
李光春's avatar
李光春 已提交
34
    public function isEmpty(array $data, array $arr): array
李光春's avatar
李光春 已提交
35
    {
李光春's avatar
李光春 已提交
36
        foreach ($arr as $k => $v) {
李光春's avatar
李光春 已提交
37
            if (empty($data[(string)$v] ?? '')) {
李光春's avatar
李光春 已提交
38 39 40
                return [];
            }
        }
李光春's avatar
李光春 已提交
41 42 43 44 45 46 47 48 49
        return $data;
    }

    /**
     * 判断输入的参数为空就返回Json错误
     * @param array $data
     * @param array $arr
     * @return array
     */
李光春's avatar
李光春 已提交
50
    public function isEmptyRet(array $data, array $arr): array
李光春's avatar
李光春 已提交
51
    {
李光春's avatar
李光春 已提交
52
        foreach ($arr as $k => $v) {
李光春's avatar
李光春 已提交
53
            if (empty($data[(string)$v] ?? '')) {
54
                (new Returns)->jsonError('请检查参数', 102);
李光春's avatar
李光春 已提交
55 56
            }
        }
李光春's avatar
李光春 已提交
57 58 59 60 61 62 63
        return $data;
    }

    /**
     * 判断是否为GET方式
     * @return bool
     */
李光春's avatar
李光春 已提交
64
    public function isGet(): bool
李光春's avatar
李光春 已提交
65 66 67 68 69 70 71 72
    {
        return request()->isGet();
    }

    /**
     * 判断是否为POST方式
     * @return bool
     */
李光春's avatar
李光春 已提交
73
    public function isPost(): bool
李光春's avatar
李光春 已提交
74 75 76 77 78 79 80 81
    {
        return request()->isPost();
    }

    /**
     * 判断是否为PUT方式
     * @return boolean
     */
李光春's avatar
李光春 已提交
82
    public function isPut(): bool
李光春's avatar
李光春 已提交
83 84 85 86 87 88 89 90
    {
        return request()->isPut();
    }

    /**
     * 判断是否为DELETE方式
     * @return boolean
     */
李光春's avatar
李光春 已提交
91
    public function isDelete(): bool
李光春's avatar
李光春 已提交
92 93 94 95 96 97 98 99
    {
        return request()->isDelete();
    }

    /**
     * 判断是否为Ajax方式
     * @return bool
     */
李光春's avatar
李光春 已提交
100
    public function isAjax(): bool
李光春's avatar
李光春 已提交
101 102 103 104
    {
        return request()->isAjax();
    }

李光春's avatar
李光春 已提交
105 106 107 108 109 110 111
    /**
     * 判断是否为移动端访问
     * @return bool
     */
    public function isMobile(): bool
    {
        // 如果有HTTP_X_WAP_PROFILE则一定是移动设备
李光春's avatar
李光春 已提交
112 113 114
        if (isset($_SERVER['HTTP_X_WAP_PROFILE'])) {
            return true;
        }
李光春's avatar
李光春 已提交
115 116
        //如果via信息含有wap则一定是移动设备,部分服务商会屏蔽该信息
        //找不到为flase,否则为true
李光春's avatar
李光春 已提交
117
        if (isset($_SERVER['HTTP_VIA'])) {
李光春's avatar
李光春 已提交
118
            return stripos(request()->server('HTTP_VIA'), "wap") !== false;
李光春's avatar
李光春 已提交
119
        }
李光春's avatar
李光春 已提交
120 121 122 123 124 125 126 127 128
        //判断手机发送的客户端标志
        if (isset($_SERVER['HTTP_USER_AGENT'])) {
            $clientkeywords = [
                'nokia', 'sony', 'ericsson', 'mot', 'samsung', 'htc', 'sgh', 'lg', 'sharp',
                'sie-', 'philips', 'panasonic', 'alcatel', 'lenovo', 'iphone', 'ipod', 'blackberry', 'meizu',
                'android', 'netfront', 'symbian', 'ucweb', 'windowsce', 'palm', 'operamini', 'operamobi',
                'openwave', 'nexusone', 'cldc', 'midp', 'wap', 'mobile', 'alipay'
            ];
            // 从HTTP_USER_AGENT中查找手机浏览器的关键字
李光春's avatar
李光春 已提交
129 130 131
            if (preg_match("/(" . implode('|', $clientkeywords) . ")/i", strtolower(request()->server('HTTP_USER_AGENT')))) {
                return true;
            }
李光春's avatar
李光春 已提交
132 133
        }
        //协议法,因为有可能不准确,放到最后判断
李光春's avatar
李光春 已提交
134 135 136
        // 如果只支持wml并且不支持html那一定是移动设备
        // 如果支持wml和html但是wml在html之前则是移动设备
        return isset($_SERVER['HTTP_ACCEPT']) && (strpos(request()->server('HTTP_ACCEPT'), 'vnd.wap.wml') !== false) && (strpos(request()->server('HTTP_ACCEPT'), 'text/html') === false || (strpos(request()->server('HTTP_ACCEPT'), 'vnd.wap.wml') < strpos(request()->server('HTTP_ACCEPT'), 'text/html')));
李光春's avatar
李光春 已提交
137 138 139 140 141 142
    }

    /**
     * 判断是否微信内置浏览器访问
     * @return bool
     */
143
    public function isWeiXin(): bool
李光春's avatar
李光春 已提交
144
    {
李光春's avatar
李光春 已提交
145
        return strpos(request()->server('HTTP_USER_AGENT'), 'MicroMessenger') !== false;
李光春's avatar
李光春 已提交
146 147
    }

148 149 150 151
    /**
     * 判断是否为微信小程序访问
     * @return bool
     */
152
    public function isWeiXinMp(): bool
153
    {
李光春's avatar
李光春 已提交
154
        return strpos(request()->server('HTTP_USER_AGENT'), 'miniProgram') !== false;
155 156
    }

李光春's avatar
李光春 已提交
157 158 159 160 161 162
    /**
     * 判断是否支付宝内置浏览器访问
     * @return bool
     */
    public function isAliPay(): bool
    {
李光春's avatar
李光春 已提交
163
        return strpos(request()->server('HTTP_USER_AGENT'), 'Alipay') !== false;
李光春's avatar
李光春 已提交
164 165 166 167 168 169 170 171
    }

    /**
     * 判断是否QQ内置浏览器访问
     * @return bool
     */
    public function isQQ(): bool
    {
李光春's avatar
李光春 已提交
172
        return (strpos(request()->server('HTTP_USER_AGENT'), 'QQ') !== false) && strpos(request()->server('HTTP_USER_AGENT'), '_SQ_') !== false;
李光春's avatar
李光春 已提交
173 174 175 176 177 178 179 180 181
    }

    /**
     * 判断是否QQ浏览器访问
     * @return bool
     */
    public function isQQBrowser(): bool
    {
        if (strpos(request()->server('HTTP_USER_AGENT'), 'QQ') !== false) {
李光春's avatar
李光春 已提交
182
            return !(strpos(request()->server('HTTP_USER_AGENT'), '_SQ_') !== false);
李光春's avatar
李光春 已提交
183 184 185 186
        }
        return false;
    }

李光春's avatar
李光春 已提交
187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210
    /**
     * 获取客户端类型
     * @return string
     */
    public function getDeviceType()
    {
        $agent = strtolower(request()->server('HTTP_USER_AGENT'));
        if (strpos($agent, 'iphone') || strpos($agent, 'ipad') || strpos($agent, 'android')) {
            $type = 'mobile';
        } else {
            $type = 'computer';
        }
        return $type;
    }

    /**
     * 获取手机设备类型
     * @return string
     */
    public function getMobileType()
    {
        $agent = strtolower(request()->server('HTTP_USER_AGENT'));
        $type = 'other';
        if (strpos($agent, 'iphone') || strpos($agent, 'ipad')) {
211
            $type = 'ios';
李光春's avatar
李光春 已提交
212 213 214 215 216 217 218
        }
        if (strpos($agent, 'android')) {
            $type = 'android';
        }
        return $type;
    }

李光春's avatar
李光春 已提交
219 220 221 222
    /**
     * 获取域名地址
     * @return string
     */
李光春's avatar
李光春 已提交
223
    public function getWebsiteAddress(): string
李光春's avatar
李光春 已提交
224
    {
李光春's avatar
李光春 已提交
225
        $http_type = ((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on') || (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https')) ? 'https://' : 'http://';
李光春's avatar
李光春 已提交
226 227 228
        return $http_type . $_SERVER['HTTP_HOST'] . "/";
    }
}