PHP微信小程序获取access_token

上代码再说:

appId = $appId;
        $this->appSecret = $appSecret;
        $this->pub = new ALLClass();
    }

    public function getSignPackage() {
        $this->pub->data_log('getSignPackage_start', $this->file_path_log);
        $jsapiTicket = $this->getJsApiTicket();
        $url = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
        $timestamp = time();
        $nonceStr = $this->createNonceStr();

        $string = "jsapi_ticket=$jsapiTicket&noncestr=$nonceStr×tamp=$timestamp&url=$url";

        $signature = sha1($string);

        $signPackage = array(
            "appId" => $this->appId,
            "nonceStr" => $nonceStr,
            "timestamp" => $timestamp,
            "url" => $url,
            "signature" => $signature,
            "rawString" => $string
        );
        $this->pub->data_log($signPackage, $this->file_path_log);
        $this->pub->data_log('getSignPackage_End', $this->file_path_log);
        return $signPackage;
    }

    private function createNonceStr($length = 16) {
        $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        $str = "";
        for ($i = 0; $i < $length; $i++) {
            $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
        }
        return $str;
    }

    private function getJsApiTicket() {
        $data = json_decode(file_get_contents(dirname(WY_ROOT) .$this->jsapi_ticket_path));
        $this->pub->data_log('getJsApiTicket_start',$this->file_path_log);
        if ($data->expire_time < time()) {
            $accessToken = $this->getAccessToken();
            $url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token=$accessToken";
            $res = json_decode($this->pub->httpRequest($url));
            $ticket = $res->ticket;
            $this->pub->data_log('getAccessToken',$this->file_path_log);
            $this->pub->data_log($res, $this->file_path_log);
            if ($ticket) {
                $data->expire_time = time() + 7000;
                $data->jsapi_ticket = $ticket;
                $this->pub->data_log($data);
                $fp = @fopen(dirname(WY_ROOT) . $this->jsapi_ticket_path, "w");
                @flock($fp, LOCK_EX | LOCK_NB); //文件上锁
                @fwrite($fp, json_encode($data));
                @flock($fp, LOCK_UN); //解锁
                @fclose($fp);
            }
        } else {
            $ticket = $data->jsapi_ticket;
        }

        $this->pub->data_log('getJsApiTicket_start_end', $this->file_path_log);
        return $ticket;
    }

    public function getAccessToken() {
        $this->pub->data_log('getAccessToken_start',$this->file_path_log);
        $path = dirname(WY_ROOT) . $this->token_path;
//        $data = json_decode(file_get_contents($path));
        $data='';//其他web跳转小程序 调用,该token缓存失效
        //无文件补丁
        if(!$data){
            $data=(object)['expire_time'=>0];
        }
        if ($data->expire_time < time()) {
            $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$this->appId&secret=$this->appSecret";
            $res = json_decode($this->pub->httpRequest($url));
            if (isset($res->errcode)) {
                $this->pub->data_log($res->errmsg, $this->file_path_log);
                echo json_encode(['code' => $res->errcode, 'msg' => $res->errmsg]);
                die;
            }
            $access_token = $res->access_token;
            if ($access_token) {
                $data->expire_time = time() + 7000;
                $data->access_token = $access_token;
                $this->pub->data_log($data);
                $fp = @fopen($path, "w");
                @flock($fp, LOCK_EX | LOCK_NB); //文件上锁
                @fwrite($fp, json_encode($data));
                @flock($fp, LOCK_UN); //解锁
                @fclose($fp);
            }
        } else {
            $access_token = $data->access_token;
        }
        $this->pub->data_log('getAccessToken_end',  $this->file_path_log);
        return $access_token;
    }

    public function httpGet($url) {
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_TIMEOUT, 500);
        curl_setopt($curl, CURLOPT_URL, $url);

        $res = curl_exec($curl);
        curl_close($curl);

        return $res;
    }

}

好像还有个allclass的公共类,我找找。

ALLClass.php

database['database'];
        }
        // 创建连接
        $conn = new mysqli($this->database['localhost'], $this->database['username'], $this->database['password'], "", $this->database['port']);
// 检测连接
        if ($conn->connect_error) {
            die("连接失败: " . $conn->connect_error);
        }
// 创建数据库
        $sql = "CREATE DATABASE if not exists " . $database;
        $bb = $conn->query($sql);
        if ($bb === TRUE) {
            //更新文件
            $str = '"' . $database . '",'
                    . '    "username"=>"' . $this->database['username'] . '",'
                    . '    "password"=>"' . $this->database['password'] . '",'
                    . '    "localhost"=>"' . $this->database['localhost'] . '",'
                    . '    "port"=>"' . $this->database['port'] . '",'//
                    . '];';
            $path = dirname(__FILE__) . "/databases.php";
            $this->database['database'] = $database;
            $fp = fopen($path, "w"); //尝试打开该文件,如不存在则创建,存在清空内容 指针移向末尾
            flock($fp, LOCK_EX | LOCK_NB); //文件上锁
            fwrite($fp, $str); //写入
            flock($fp, LOCK_UN); //解锁
            fclose($fp); //关闭
//            $numbytes = file_put_contents($path, $str); //如果文件不存在创建文件,并写入内容
            if (!$numbytes) {
                $this->data_log("数据库文件更新失败" . $path . $sql, "file_err.txt");
            }
        } else {
            echo "Error creating database: " . $conn->error;
            die;
        }
        $conn->close();
    }

    /**
     * 取小数点后两位
     * 截取点后面两位拼接
     * @param type $str 带小数的数字
     * @return type     返回准确截取两位的小数
     */
    function num_format($str) {
        if (strpos($str, '.') === false) {
            return $str;
        }
        $retArr = explode(".", $str);
        $strs = substr($retArr[1], 0, 2);
        return $retArr[0] . "." . $strs;
    }

    /**
     * 二维数组转三维,按键值分组
     * @param type $arr
     * @param type $key
     * @return type
     */
    function group_same_key($arr, $key) {
        $new_arr = array();
        foreach ($arr as $k => $v) {
            if ($v[$key] == '') {
//                 $v[$key]='';
            }
            $new_arr[$v[$key]][] = $v;
        }
        return $new_arr;
    }

    /**
     * 二维数组转三维,按键值分组
     * @param type $arr
     * @param type $key
     * @return type
     */
    function group_same_key2($arr, $key) {
        $new_arr = $this->group_same_key($arr, $key);
        $i = 0;
        $new_new_arr = [];
        //没有的放前面
        foreach ($new_arr as $k => $val) {
            if (empty($k)) {
                foreach ($val as $v) {
                    $new_new_arr[] = $v;
                }
                unset($new_arr[$k]);
            }
        }
        foreach ($new_arr as $k => $val) {
            foreach ($val as $v) {
                $new_new_arr[] = $v;
            }
        }
        return $new_new_arr;
    }

    /**
     * 解码出邀请码
     */
    function decodeInviteCode_copy($code) {
        $code = strtoupper($code);
        static $source_string = 'E5FCDG3HQA4B1NOPIJ2RSTUV67MWX89KLYZ';
        if (strrpos($code, '0') !== false)
            $code = substr($code, strrpos($code, '0') + 1);
        $len = strlen($code);
        $code = strrev($code);
        $num = 0;
        for ($i = 0; $i < $len; $i++) {
            $num += strpos($source_string, $code[$i]) * pow(35, $i);
        }
        return $num;
    }

    /**
     * 生成邀请码
     */
    function createInviteCode_copy($user_id) {
        static $source_string = 'E5FCDG3HQA4B1NOPIJ2RSTUV67MWX89KLYZ';
        $num = $user_id;
        $code = '';
        while ($num > 0) {
            $mod = $num % 35;
            $num = ($num - $mod) / 35;
            $code = $source_string[$mod] . $code;
        }
        if (empty($code[3])) {
            $code = str_pad($code, 4, '0', STR_PAD_LEFT);
        }
        $new_code = '';
        for ($i = 0; $i < strlen($code); $i++) {//遍历字符串追加给数组
            if ($i == 0 || $i == 3) {
                $new_code.= strtolower($code[$i]);
            } else {
                $new_code.= $code[$i];
            }
        }
        return $new_code;
    }

    /**
     * 解密apptoken
     */
    function decode_apptoken($apptoken = '') {
        if (empty($apptoken)) {
            return false;
        }
        $id = decodeInviteCode_copy(str_replace(DB_DB_ME, '', str_replace(DB_JHS, '', base64_decode($apptoken))));
        return --$id;
    }

    /**
     * 生成唯一标识apptoken
     */
    function encode_apptoken($lastInsID) {
        if (empty($lastInsID)) {
            return false;
        }
        ++$lastInsID;
        $apptoken = base64_encode(DB_JHS . createInviteCode_copy($lastInsID) . DB_ME);
        return $apptoken;
    }

    /**
     * 冒泡排序
     * @param ary $arr      数组
     * @param string $type  asc | desc
     * @return $arr         排序后数组
     */
    function maopao($arr, $type = 'asc') {
        //定义一个变量保存交换的值
        $temp = 0;
        for ($i = 0; $i < count($arr); $i++) {
            for ($j = 0; $j < count($arr) - $i - 1; $j++) {
                if ($type == 'asc') {
                    if ($arr[$j] > $arr[$j + 1]) {
                        //如果前面的那个数大于后面的那个数,那么他们就进行交换
                        $temp = $arr[$j];
                        $arr[$j] = $arr[$j + 1];
                        $arr[$j + 1] = $temp;
                    }
                } else {
                    if ($arr[$j] < $arr[$j + 1]) {
                        //如果前面的那个数小于后面的那个数,那么他们就进行交换
                        $temp = $arr[$j];
                        $arr[$j] = $arr[$j + 1];
                        $arr[$j + 1] = $temp;
                    }
                }
            }
        }
        return $arr;
    }

    /**
     * 两层冒泡排序
     * @param ary $arr      数组
     * @param type $field   排序数组中用来排序的字段名
     * @param string $type  asc | desc
     * @return $arr         排序后数组
     */
    function maopao2($arr, $field = '', $type = 'asc') {
        if (empty($field)) {
            return false;
        }
        //定义一个变量保存交换的值
        $temp = 0;
        for ($i = 0; $i < count($arr); $i++) {
            for ($j = 0; $j < count($arr) - $i - 1; $j++) {
                if ($type == 'asc') {
                    if ($arr[$j][$field] > $arr[$j + 1][$field]) {
                        //如果前面的那个数大于后面的那个数,那么他们就进行交换
                        $temp = $arr[$j];
                        $arr[$j] = $arr[$j + 1];
                        $arr[$j + 1] = $temp;
                    }
                } else {
                    if ($arr[$j][$field] < $arr[$j + 1][$field]) {
                        //如果前面的那个数小于后面的那个数,那么他们就进行交换
                        $temp = $arr[$j];
                        $arr[$j] = $arr[$j + 1];
                        $arr[$j + 1] = $temp;
                    }
                }
            }
        }
        return $arr;
    }

    /**
     * 时间转换
     */
    function tranTime($time) {
        $time2 = $time;
        $rtime = date("m-d H:i", $time);
        $htime = date("H:i", $time);
        $time = time() - $time;
        if ($time < 60) {
            $str = '刚刚';
        } elseif ($time < 60 * 60) {
            $min = floor($time / 60);
            $str = $min . '分钟前';
        } elseif ($time < 60 * 60 * 24) {
            $h = floor($time / (60 * 60));
            $str = $h . '小时前 ' . $htime;
        } elseif ($time < 60 * 60 * 24 * 3) {
            $d = floor($time / (60 * 60 * 24));
            if ($d == 1) {
                $str = '昨天 ' . $rtime;
            } else
            if ($d == 1) {
                $str = '前天 ' . $rtime;
            } else
            if ($d == 2) {
                $str = '大前天 ' . $rtime;
            } else {
                $str = $rtime;
            }
        } else {
            $str = date("Y-m-d H:i", $time2);
        }
        return $str;
    }

    /**
     * 打印输出
     * @param type $obj     要输出对象
     * @param type $die     是否输出后停止运行
     * @param type $msg     停止运行输出字符
     */
    function pre($obj, $die = true, $msg = "") {
        echo "
";
        var_dump($obj);
        echo "
"; if ($die) die($msg); } /** * 返回经addslashes处理过的字符串或数组 * @param $string 需要处理的字符串或数组 * @return mixed */ function new_addslashes($string) { if (!is_array($string)) return addslashes($string); foreach ($string as $key => $val) $string[$key] = $this->new_addslashes($val); return $string; } /** * 返回经stripslashes处理过的字符串或数组 * @param $string 需要处理的字符串或数组 * @return mixed */ function new_stripslashes($string) { if (!is_array($string)) return stripslashes($string); foreach ($string as $key => $val) $string[$key] = new_stripslashes($val); return $string; } /** * 返回经htmlspecialchars处理过的字符串或数组 * @param $obj 需要处理的字符串或数组 * @return mixed */ function new_html_special_chars($string) { $encoding = 'utf-8'; if (strtolower(CHARSET) == 'gbk') $encoding = 'ISO-8859-15'; if (!is_array($string)) return htmlspecialchars($string, ENT_QUOTES, $encoding); foreach ($string as $key => $val) $string[$key] = new_html_special_chars($val); return $string; } function new_html_entity_decode($string) { $encoding = 'utf-8'; if (strtolower(CHARSET) == 'gbk') $encoding = 'ISO-8859-15'; return html_entity_decode($string, ENT_QUOTES, $encoding); } function new_htmlentities($string) { $encoding = 'utf-8'; if (strtolower(CHARSET) == 'gbk') $encoding = 'ISO-8859-15'; return htmlentities($string, ENT_QUOTES, $encoding); } /** * 安全过滤函数 * * @param $string * @return string */ function safe_replace($string) { $string = str_replace('%20', '', $string); $string = str_replace('%27', '', $string); $string = str_replace('%2527', '', $string); $string = str_replace('*', '', $string); $string = str_replace('"', '"', $string); $string = str_replace("'", '', $string); $string = str_replace('"', '', $string); $string = str_replace(';', '', $string); $string = str_replace('<', '<', $string); $string = str_replace('>', '>', $string); $string = str_replace("{", '', $string); $string = str_replace('}', '', $string); $string = str_replace('\\', '', $string); return $string; } /** * xss过滤函数 * * @param $string * @return string */ function remove_xss($string) { $string = preg_replace('/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]+/S', '', $string); $parm1 = Array('javascript', 'vbscript', 'expression', 'applet', 'meta', 'xml', 'blink', 'link', 'script', 'embed', 'object', 'iframe', 'frame', 'frameset', 'ilayer', 'layer', 'bgsound', 'title', 'base'); $parm2 = Array('onabort', 'onactivate', 'onafterprint', 'onafterupdate', 'onbeforeactivate', 'onbeforecopy', 'onbeforecut', 'onbeforedeactivate', 'onbeforeeditfocus', 'onbeforepaste', 'onbeforeprint', 'onbeforeunload', 'onbeforeupdate', 'onblur', 'onbounce', 'oncellchange', 'onchange', 'onclick', 'oncontextmenu', 'oncontrolselect', 'oncopy', 'oncut', 'ondataavailable', 'ondatasetchanged', 'ondatasetcomplete', 'ondblclick', 'ondeactivate', 'ondrag', 'ondragend', 'ondragenter', 'ondragleave', 'ondragover', 'ondragstart', 'ondrop', 'onerror', 'onerrorupdate', 'onfilterchange', 'onfinish', 'onfocus', 'onfocusin', 'onfocusout', 'onhelp', 'onkeydown', 'onkeypress', 'onkeyup', 'onlayoutcomplete', 'onload', 'onlosecapture', 'onmousedown', 'onmouseenter', 'onmouseleave', 'onmousemove', 'onmouseout', 'onmouseover', 'onmouseup', 'onmousewheel', 'onmove', 'onmoveend', 'onmovestart', 'onpaste', 'onpropertychange', 'onreadystatechange', 'onreset', 'onresize', 'onresizeend', 'onresizestart', 'onrowenter', 'onrowexit', 'onrowsdelete', 'onrowsinserted', 'onscroll', 'onselect', 'onselectionchange', 'onselectstart', 'onstart', 'onstop', 'onsubmit', 'onunload'); $parm = array_merge($parm1, $parm2); for ($i = 0; $i < sizeof($parm); $i++) { $pattern = '/'; for ($j = 0; $j < strlen($parm[$i]); $j++) { if ($j > 0) { $pattern .= '('; $pattern .= '(&#[x|X]0([9][a][b]);?)?'; $pattern .= '|(�([9][10][13]);?)?'; $pattern .= ')?'; } $pattern .= $parm[$i][$j]; } $pattern .= '/i'; $string = preg_replace($pattern, ' ', $string); } return $string; } /** * 过滤ASCII码从0-28的控制字符 * @return String */ function trim_unsafe_control_chars($str) { $rule = '/[' . chr(1) . '-' . chr(8) . chr(11) . '-' . chr(12) . chr(14) . '-' . chr(31) . ']*/'; return str_replace(chr(0), '', preg_replace($rule, '', $str)); } /** * 格式化文本域内容 * * @param $string 文本域内容 * @return string */ function trim_textarea($string) { $string = nl2br(str_replace(' ', ' ', $string)); return $string; } /** * redis队列添加 * @param type $select 数据库名称 * @param type $obj 数据 */ function redis_add($obj = 1, $key = "id", $select = 0) { $redis = new Redis(); $redis->connect('127.0.0.1', 6379); $redis->auth(); $redis->select($select); return $redis->lPush($key, $obj); //加入队列 返回队列总数 } /** * 获取Redis队列 * @param type $key 数据 * @param type $select * @return type */ function redis_sel($key = "id", $select = 0) { $redis = new Redis(); $redis->connect('127.0.0.1', 6379); $redis->auth(); $redis->select($select); $id = $redis->lPop($key); //出队 return $id; } /** * php字符串截取固定值并且多余部分用省略号代替 * utf8编码下:中文占 3个字节,英文和数字占 1个字节(可变编码)(变长编码) * gbk编码下:所有的中文、英文、数字都占2个字节(定长编码) * @param type $str 字符串 * @param type $len 控制长度 * @return type */ function GetPartStr($str, $len) {//$str字符串   $len 控制长度 $one = 0; $partstr = ''; for ($i = 0; $i < $len; $i++) { $sstr = substr($str, $one, 1); if (ord($sstr) > 224) { $partstr .= substr($str, $one, 3); $one += 3; } elseif (ord($sstr) > 192) { $partstr .= substr($str, $one, 2); $one += 2; } elseif (ord($sstr) < 192) { $partstr .= substr($str, $one, 1); $one += 1; } } if (strlen($str) < $one) { return $partstr; } else { return $partstr . '....'; } } /** * 查询快递 * @param $postcom 快递公司编码 * @param $getNu 快递单号 * @return array 物流跟踪信息数组 */ function queryExpress($postcom, $getNu) { $url = "https://m.kuaidi100.com/query?type=" . $postcom . "&postid=" . $getNu . "&id=1&valicode=&temp=0.49738534969422676"; $resp = httpRequest($url, "GET"); return json_decode($resp, true); } /** * 异步上传,直接访问全局文件变量 * @return type 返回路径 */ function ajaxfile() { foreach ($_FILES as $key => $val) { if (!empty($val) && $val['error'] == 0) $fileurl = $this->file_copy($val); else $fileurl = 0; break; } $fileurl = ltrim($fileurl, "/"); // echo ($fileurl); return $fileurl; } /** * 创建多级目录 * mkdir() 只能在已经存在的目录中创建创建文件夹(即父级必须有才行)。 * mkdirs() 可以在不存在的目录中创建文件夹。诸如:a\b,既可以创建多级目录。 * dirname() 是返回路径中的目录部分。 * is_dir() 用于判断给出的文件名是否是一个有效的目录 * * */ function create_folders($dir) { return is_dir($dir) or ( $this->create_folders(dirname($dir)) and @ mkdir(iconv("UTF-8", "GBK", $dir), 0777, true)); } /** * 上传文件 * @param type $file 上传的文件 * @return string 服务器路径 */ public function file_copy($file, $bool = true) { //判断是否存在日期文件 $filename = "/public/Uploads/file/" . date("Ymd"); if (!file_exists("." . $filename)) { $this->create_folders("." . $filename); } //获取后缀 $ary = explode('.', $file['name']); $su = end($ary); //文件名 $filenames = $filename . "/" . time() . rand(1, 10000) . "." . $su; move_uploaded_file($file['tmp_name'], "." . $filenames); if ($bool) $_SESSION['ajaxfile'][] = $filenames; return $filenames; } /** * 删除图片 */ function delajaxfile($filename) { if (isset($_SESSION['ajaxfile'])) { //删除图片 foreach ($_SESSION['ajaxfile'] as $key => $val) { if ($val != $filename) { $val2 = "." . $val; if (file_exists($val2)) { $filename2 = trim($val, "/"); unlink($filename2); } } $_SESSION['ajaxfile'][$key] = null; unset($_SESSION['ajaxfile'][$key]); } } else { return 0; } } /** * 数据插入 特殊字符处理 */ function isyy($ary, $bool = true) { //如果是数组 if ($bool) { foreach ($ary as $key => $val) { $ary[$key] = addslashes($val); if (!is_array($val)) { $ary[$key] = addslashes($val); } } } else { $ary = addslashes($ary); } return $ary; } /** * 获取二维数组中的 某个 值 为索引 某个值 为值 的一维索引数组 * 适用于以某个唯一索引为外表链接的主表内容 * @param type $array 二维数组 * @param type $keyname 新数组键名 * @param type $valname 新数组键名对应值 * @return type */ function aryary21($array = array(), $keyname, $valname) { $ary21 = array(); foreach ($array as $k => $v) { $ary21[$v[$keyname]] = $v[$valname]; } return $ary21; } /** * 设置脚本运行时间 为 运行结束 */ function client_max_time() { set_time_limit(0); //设置不超时,程序一直运行。 ignore_user_abort(true); //即使Client断开(如关掉浏览器),PHP脚本也可以继续执行. } /** * // 读取nlp text 并存到mongodb * @param type $file 要读取的文件 * @param type $return * @return boolean */ public function read_file($filePath = "", $return = array("code" => 200, "msg" => "Success over")) { $this->client_max_time(); $firststr = substr($filePath, 0, 1); if ($firststr != "/" && $firststr != ".") { $filePath = $_SERVER["DOCUMENT_ROOT"] . "/{$filePath}"; } else if ($firststr != ".") { // $_SERVER["DOCUMENT_ROOT"],获取当前运行脚本所在文档根目录。$filePath为.txt文件所在路径 $filePath = $_SERVER["DOCUMENT_ROOT"] . $filePath; } $newfilepath = basename($filePath); // var_dump($newfilepath);die; try { $file = fopen($filePath, "r"); // 以只读的方式打开文件 if (empty($file)) { $return['code'] = 201; $return["msg"] = "file not found"; return $return; } $i = 0; //输出文本中所有的行,直到文件结束为止。 while (!feof($file)) { $itemStr = fgets($file); //fgets()函数从文件指针中读取一行 //去掉结尾的/r/n $itemStr = str_replace(PHP_EOL, '', $itemStr); $itemArray = explode(",", $itemStr); // 将tab分割的各部分内容提取出来 //提取安全码 写入文件 $part = "safezm="; $safezm = substr($itemArray[0], strripos($itemArray[0], $part) + strlen($part)); //截取safezm 参数值 $msg = $itemStr . ",{$safezm}"; $this->data_log($msg, $newfilepath); //保存到新文件 ++$i; if ($i % 5000 == 1) { $this->output("已处理{$i}条数据"); } } fclose($file); //关闭文件 } catch (Exception $exception) { $return['code'] = $exception->getCode(); $return['msg'] = $exception->getMessage(); } return $return; } /** * 使用QQ邮箱发送邮件 * @param type $subject 邮件主题 * @param type $body 邮件内容 * @param type $address 收件人--多个收件人用数组传值 * @param type $fromName 发件人昵称 * @param type $isHTML 邮件正文是否为html编码 * @param type $username SMTP帐号-- QQ邮箱 * @param type $password 授权码 * @param type $SMTPDebug 是否开启调试(1|0) * @return type */ function send_email_qq($subject = '邮件主题', $body = '

Hello World.test

', $address = "[email protected]", $fromName = "发件人昵称", $isHTML = false, $username = '[email protected]', $password = 'nqvvyoyvqitgigbf', $SMTPDebug = 0) { // 引入PHPMailer的核心文件 require_once "../classes/PHPMailer-master/src/PHPMailer.php"; require_once "../classes/PHPMailer-master/src/SMTP.php"; $mail = new PHPMailer(); // 实例化PHPMailer核心类 // $SMTPDebug=1;//调试使用 $mail->SMTPDebug = $SMTPDebug; // 是否启用smtp的debug进行调试 开发环境建议开启 生产环境注释掉即可 默认关闭debug调试模式 $mail->isSMTP(); // 使用smtp鉴权方式发送邮件 $mail->SMTPAuth = true; // smtp需要鉴权 这个必须是true $mail->Host = 'smtp.qq.com'; // 链接qq域名邮箱的服务器地址 $mail->SMTPSecure = 'ssl'; // 设置使用ssl加密方式登录鉴权 $mail->Port = 465; // 设置ssl连接smtp服务器的远程服务器端口号 $mail->CharSet = 'UTF-8'; // 设置发送的邮件的编码 $mail->FromName = $fromName; // 设置发件人昵称 显示在收件人邮件的发件人邮箱地址前的发件人姓名 $mail->Username = $username; // smtp登录的账号 QQ邮箱即可 $mail->Password = $password; // smtp登录的密码 使用生成的授权码 $mail->From = $username; // 设置发件人邮箱地址 同登录账号 $mail->isHTML($isHTML); // 邮件正文是否为html编码 注意此处是一个方法 // 设置收件人邮箱地址 //$mail->addAddress('[email protected]'); // 添加多个收件人 则多次调用方法即可 if (is_array($address)) { foreach ($address as $val) { $mail->addAddress($val); } } else { $mail->addAddress($address); } $mail->Subject = $subject; // 添加该邮件的主题 // 添加邮件正文 $mail->Body = $body; //$mail->addAttachment('./example.pdf');// 为该邮件添加附件 $status = $mail->send(); // 发送邮件 返回状态 return $status; } /** * 创建文件并写入数据 * @param type $obj 要写入数据 * @param type $filename 要写入文件 的文件名 * @param type $files 文件隶属 的文件夹 * @param type $datatime 数据写入开头是否添加时间 */ function data_log($obj = "error", $filename = "error.txt", $files = "/error", $datatime = true) { $path = dirname(__FILE__); $filename = ltrim($filename, "/"); // if (strpos($files, $path) === false) { $files = $path . $files; } $files = rtrim($files, "/"); //方便拼接 // if (empty($files)) { // $files .= "."; // } if (is_object($obj)) { $obj = (array) $obj; } if (is_array($obj)) { $this->data_log(print_r($obj, true), $filename, $files); } else { $msg = $datatime ? date("Y-m-d H:i:s") . " " . $obj : $obj; $files .= "/" . date("Ymd"); if (!is_dir($files) && $files != "." && !file_exists($files)) { $this->create_folders($files); //创建目录 } $filePath = $files . "/{$filename}"; $fp = @fopen($filePath, "a+"); //尝试打开该文件,如不存在则创建,存在指针移向末尾 @flock($fp, LOCK_EX | LOCK_NB); //文件上锁 @fwrite($fp, $msg . "\r\n"); //文件末尾添加换行 @flock($fp, LOCK_UN); //解锁 @fclose($fp); //关闭 } } /** * 读文件 * @param type $filePath 文件路径 * @return boolean 文件内容 * r 只读。在文件的开头开始。 * r+ 读/写。在文件的开头开始。 * w 只写。打开并清空文件的内容;如果文件不存在,则创建新文件。 * w+ 读/写。打开并清空文件的内容;如果文件不存在,则创建新文件。 * a 追加。打开并向文件文件的末端进行写操作,如果文件不存在,则创建新文件。 * a+ 读/追加。通过向文件末端写内容,来保持文件内容。 * x 只写。创建新文件。如果文件已存在,则返回 FALSE。 * x+ 读/写。创建新文件。如果文件已存在,则返回 FALSE 和一个错误。 */ function reading_file($filePath = 'reading_file.log') { if (empty($filePath)) { return false; } $files = dirname($filePath); if (!is_dir($files) && $files != '.' && !file_exists($files)) { $this->create_folders($files); //创建目录 } $str = ''; //判定文件是否存在 if (file_exists($filePath) && filesize($filePath) > 0) { $fp = @fopen($filePath, 'r'); //只读 @flock($fp, LOCK_SH | LOCK_NB); //文件上锁 共享锁,避免dirty数据 $str = @fread($fp, filesize($filePath)); @flock($fp, LOCK_UN); //解锁 @fclose($fp); //关闭 } else { //创建该文件 $fp = @fopen($filePath, 'w'); // @fclose($fp); /* * mode 参数由 4 个数字组成: * 第一个数字通常是 0 * 第二个数字规定所有者的权限 * 第三个数字规定所有者所属的用户组的权限 * 第四个数字规定其他所有人的权限 * 可能的值(如需设置多个权限,请对下面的数字进行总计): * 1 = 执行权限 * 2 = 写权限 * 4 = 读权限 */ @chmod($filePath, 0777); //给予文件权限 } return $str; } /** * 写文件 * @param type $obj 要写入的内容 * @param type $filePath 写入的文件路径 * @return boolean true | false */ function written_file($obj = '', $filePath = 'written_file.log') { if (empty($filePath)) { return false; } $files = dirname($filePath); if (!is_dir($files) && $files != "." && !file_exists($files)) { $this->create_folders($files); //创建目录 } $fp = @fopen($filePath, "w"); //尝试打开该文件,如不存在则创建,且清空文件内容 @flock($fp, LOCK_EX | LOCK_NB); //文件上锁 排他锁 @fwrite($fp, $obj); //文件内容写入 @flock($fp, LOCK_UN); //解锁 @fclose($fp); //关闭 $str = $this->reading_file($filePath); if ($str == $obj) { return true; } return false; } /** * 纵向数组横向排 * select 查询数据结果集 纵向数组横向排 */ function aryy_x($ary) { $ary2 = array(); //返回数组 $column = array(); foreach ($ary[0] as $k => $v) { $column[] = $k; //字段名 } $arylength = count($ary); //总公多少数据 $columnlength = count($column); //总公多少字段 for ($i = 0; $i < $columnlength; $i++) { $value = array(); for ($j = 0; $j < $arylength; $j++) { $value[] = $ary[$j][$column[$i]]; //竖排集合 } $ary2[$column[$i]] = $value; //竖排集合 -- 以列名 作为键值 } return $ary2; } /** * 实时输出打印 * @param type $msg 需要打印的消息 * @param type $datetime 是否打印时间 * @param type $sleep 是否需要输出间歇时间 * @param type $size 缓冲区大小 默认 4096 * @param type $br 打印BR个数 默认2 */ function output($msg = "This is test.", $datetime = true, $sleep = true, $size = '', $br = 2) { if ($datetime) { echo date("Y-m-d H:i:s"); } if (empty($size)) { $size = ini_get('output_buffering'); } if (is_array($msg)) { var_dump($msg); } else { echo " $msg"; } for ($i = 0; $i < $br; $i++) { echo "
"; } echo str_pad(' ', $size); //使缓冲区溢出 复制输出4096个字节 ob_flush(); //释放php内置缓存 flush(); //输出送出的缓冲内容 到浏览器 if ($sleep === true) { sleep(1); } else if (is_numeric($sleep) && $sleep > 0) { sleep($sleep); } else { //不休息 } } /** * 数据输出并结束运行 * @param type $msg 需要打印的数据 */ function dump($msg) { echo "
";
        print_r($msg);
        echo "
"; die; } /** * 返回上一页 * @param type $num 返回的页数,默认返回上一页 */ function history($num = 1) { echo ""; exit(); } /** * URL重定向 * @param string $url 重定向的URL地址 * @param integer $time 重定向的等待时间(秒) * @param string $msg 重定向前的提示信息 * @return void */ public function redirect($url, $time = 3, $msg = '') { //多行URL地址支持 $url = str_replace(array("\n", "\r"), '', $url); if (empty($msg)) $msg = "系统将在" . $time . "秒之后自动跳转到" . $url . "!"; if (!headers_sent()) { // redirect if (0 === $time) { header('Location: ' . $url); } else { header("refresh:" . $time . ";url=" . $url); echo($msg); } exit(); } else { $str = ""; if ($time != 0) $str .= $msg; exit($str); } } /** * 浏览器友好的变量输出 * @param mixed $var 变量 * @param boolean $echo 是否输出 默认为True 如果为false 则返回输出字符串 * @param string $label 标签 默认为空 * @param boolean $strict 是否严谨 默认为true * @return void|string */ function dump2($var, $echo = true, $label = null, $strict = true) { $label = ($label === null) ? '' : rtrim($label) . ' '; if (!$strict) { if (ini_get('html_errors')) { $output = print_r($var, true); $output = '
' . $label . htmlspecialchars($output, ENT_QUOTES) . '
'; } else { $output = $label . print_r($var, true); } } else { ob_start(); var_dump($var); $output = ob_get_clean(); if (!extension_loaded('xdebug')) { $output = preg_replace('/\]\=\>\n(\s+)/m', '] => ', $output); $output = '
' . $label . htmlspecialchars($output, ENT_QUOTES) . '
'; } } if ($echo) { echo($output); return null; } else return $output; } /** * 计算使用内存 * @param type $unit 单位,默认kb * @param type $bool 是否开启MB以上单位 * @return type 返回 存储单位 */ function memory($unit = "kb", $bool = false) { $return = 0; $bit = memory_get_usage(); //比特 $byte = ceil($bit / 8); //字节 $KiloByte = ceil($byte / 1024); //KB $MegaByte = ceil($KiloByte / 1024 * 100) / 100; //MB if ($bool) { $GigaByte = ceil($MegaByte / 1024 * 100) / 100; //GB $TeraByte = ceil($GigaByte / 1024 * 100) / 100; //TB } switch ($unit) { case "bit": $return = $bit . " Bit"; break; case "byte": $return = $byte . " Byte"; break; case "kb": $return = $KiloByte . " KB"; break; case "mb": $return = $MegaByte . " MB"; break; case "gb": $return = $GigaByte . " GB"; break; case "tb": $return = $TeraByte . " TB"; break; } return $return; } /** * 链接数据库 * @param type $database 数据库名称 * @param type $username 访问用户 * @param type $password 用户密码 * @param type $localhost 访问主机地址 * @return type 链接标识 */ function linkmysql($database = '', $username = '', $password = '', $localhost = '', $port = "") { if (empty($this->database)) { $this->database = require_once 'databases.php'; $this->create_database("lianyu"); } if (!empty($this->database)) { $database = $database ? $database : $this->database['database']; $username = $username ? $username : $this->database['username']; $password = $password ? $password : $this->database['password']; $localhost = $localhost ? $localhost : $this->database['localhost']; $port = $port ? $port : $this->database['port']; } $conn = @new mysqli($localhost, $username, $password, $database, $port); if ($conn->connect_errno) { //返回链接错误号 // 返回链接错误信息 die("数据库链接失败:" . $conn->connect_error); } $conn->select_db($database) or die("选择数据库失败:" . $conn->error); // 3.设置字符集编码 $conn->set_charset("utf8") or die("设置字符集失败:" . $conn->error); $this->mysqli = $conn; /** * 4准备SQL语句 * 6. 返回结果集中的字段数 var_dump($res->field_count); 返回结果集中的总行数 var_dump($res->num_rows); 7. 返回关联数组和索引数组 var_dump($res->fetch_array()); 返回索引数组 var_dump($res->fetch_row()); 返回关联数组 var_dump($res->fetch_assoc()); 返回一个对象 var_dump($res->fetch_object()); 8. 将结果集指针移到指定位置 $res->data_seek(0); 9. 返回结果集中的一个字段,并将指针移到下一列 var_dump($res->fetch_field()); 直接返回结果集中的所有字段 var_dump($res->fetch_fields()); */ return $conn; } /** * 处理mysql 返回结果集 * @param type $obj mysql 结果集 * @param type $type 转换类型 1为关联数组,2为 索引数组,3为关联索引数组 * @return array 翻译数组 */ function mysql_parsing($obj, $type = 1) { $result = array(); if (!empty($obj)) { while ($res = $obj->fetch_assoc()) { $result[] = $res; } } return $result; } /** * mysql 直接返回关联数组 * @param type $sql sql语句,当不传参时返回数据库所有表 * @param type $bool 返回结果是否需要处理,默认处理为数组 * @return string 运行sql结果集,如果未链接数据,则返回503错误 */ function query($sql = "show tables", $bool = true) { $return = array("msg" => "数据库链接失败", "code" => "503", "state" => 0); if (!empty($this->mysqli)) { $result = $this->mysqli->query($sql); if ($result) { if ($bool) return $this->mysql_parsing($result); else return $result; } $return = array( "msg" => "错误sql:{$sql}", "code" => "400", "state" => 0, ); } return $return; } /** * 判定表是否存在数据库中 * @param type $table 表名 * @param type $database 数据库名 * @return boolean 如果不存在返回false,如果存在返回表结构 */ function exists_table($table, $database = "") { $database2 = $database ? $database : $this->database['database']; // $this->mysqli->query("drop table ".$table); $seltable = "SELECT TABLE_NAME,COLUMN_NAME,IS_NULLABLE,DATA_TYPE,COLUMN_TYPE,COLUMN_KEY,COLUMN_COMMENT " . "FROM information_schema.COLUMNS WHERE table_schema = '" . $database2 . "' "//. "#表所在数据库 " . "AND table_name = '" . $table . "';"; //#你要查的表 // $seltable = "SELECT TABLE_NAME AS tableName,TABLE_COMMENT AS tableComment,CREATE_TIME AS createTime " // . "FROM information_schema.TABLES " // . "WHERE TABLE_SCHEMA = (SELECT DATABASE ()) and TABLE_NAME = '".$table."' ";//查询表是否存在,存在返回表名和创建时间及注释 $tabledec = $this->mysqli->query($seltable); if ($tabledec->num_rows == 0) { /** * 判断表创建文件是否存在 */ $file_path = "../sql/" . $table . ".php"; if (file_exists($file_path) && $this->bool) { $this->bool = false; //控制建表,防止死循环 $creatable = require_once "$file_path"; $this->mysqli->query($creatable); return $this->exists_table($table); } $tabledec = false; } else { $tabledec = $this->mysql_parsing($tabledec); } $this->bool = true; //解锁,防止只能创建第一张表 if ($tabledec === false) { $str = "警告!" . $table . "表不存在!"; $this->data_log($str, "table_err.txt"); die($str); } return $tabledec; } /** * 设置数据库某表某列的值 * @param type $setname 列名称 * @param type $setvalue 设置值 * @param type $table 表名 * @return type 返回受影响行数 */ function setField($setname, $setvalue, $table) { $sql = "update " . $table . " set `" . $setname . "` = '" . $setvalue . "' where " . $this->where; return $this->query($sql); } /** * * @param type $where 数据库检索条件 */ function where($where = "") { if (empty($where)) { $this->where = " 1 "; } if (is_string($where)) { $this->where = $where; } else if (is_array($where)) { $ary = $this->isyy($where); $this->where = ""; foreach ($ary as $key => $val) { if (empty($this->where)) { $this->where.="`" . $key . "` = '" . $val . "'"; } else { $this->where.=" and `" . $key . "` = '" . $val . "'"; } } } } /** * 数据库 一维关联数组 添加数据 * @param type $data 需要添加的数据 * @param type $table 需要添加的表 * @param type $insert_id 是否需要返回自增长ID,默认为返回 * @return string 返回添加标识 */ function insert($data, $table, $insert_id = true) { $this->exists_table($table); $return = array("msg" => "数据库链接失败", "code" => "503", "state" => 0); if (empty($data)) { $return = array("msg" => "数据为空", "code" => "417", "state" => 0); } else if (!empty($this->mysqli)) { $data = $this->isyy($data); //去除特殊字符 转义特殊字符,输出如有异常,则使用 stripslashes() $sql = "insert into {$table}("; foreach ($data as $key => $val) { $sql .= "`" . $key . "`,"; } $sql = rtrim($sql, ","); $sql .= ") values("; foreach ($data as $val) { $sql .= "'" . $val . "',"; } $sql = rtrim($sql, ","); $sql .= ");"; if ($result = $this->mysqli->query($sql)) { if ($insert_id) { $result = mysqli_insert_id($this->mysqli); } return $result; } $return = array( "msg" => "错误sql:{$sql}", "code" => "400", "state" => 0, ); } if ($return['code'] > 0) { $this->data_log($return['msg'], "insert.sql"); } return $return; } /** * 关闭数据库 * * @param type $mysql 数据库链接标识 */ function closemysql($mysql = 0) { //关闭数据库连接 if (empty($mysql)) { return $this->mysqli->close(); } else { return $mysql->close(); } } /** * 获取客户端IP地址 * @param integer $type 返回类型 0 返回IP地址 1 返回IPV4地址数字 * @return mixed */ function get_client_ip($type = 0) { $type = $type ? 1 : 0; static $ip = NULL; if ($ip !== NULL) return $ip[$type]; if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { $arr = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']); $pos = array_search('unknown', $arr); if (false !== $pos) unset($arr[$pos]); $ip = trim($arr[0]); } elseif (isset($_SERVER['HTTP_CLIENT_IP'])) { $ip = $_SERVER['HTTP_CLIENT_IP']; } elseif (isset($_SERVER['REMOTE_ADDR'])) { $ip = $_SERVER['REMOTE_ADDR']; } // IP地址合法验证 $long = sprintf("%u", ip2long($ip)); $ip = $long ? array($ip, $long) : array('0.0.0.0', 0); return $ip[$type]; } //获取用户真实IP function get_user_ip() { if (getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown')) { $onlineip = getenv('HTTP_CLIENT_IP'); } elseif (getenv('HTTP_X_FORWARDED_FOR') && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown')) { $onlineip = getenv('HTTP_X_FORWARDED_FOR'); } elseif (getenv('REMOTE_ADDR') && strcasecmp(getenv('REMOTE_ADDR'), 'unknown')) { $onlineip = getenv('REMOTE_ADDR'); } elseif (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown')) { $onlineip = $_SERVER['REMOTE_ADDR']; } preg_match("/[\d\.]{7,15}/", $onlineip, $onlineipmatches); return $onlineipmatches[0] ? $onlineipmatches[0] : $this->get_client_ip(); } // 过滤表单中的表达式 function think_filter(&$value) { // TODO 其他安全过滤 // 过滤查询特殊字符 if (preg_match('/^(EXP|NEQ|GT|EGT|LT|ELT|OR|LIKE|NOTLIKE|NOTBETWEEN|NOT BETWEEN|BETWEEN|NOTIN|NOT IN|IN)$/i', $value)) { $value .= ' '; } } /** * CURL请求 * @param $url 请求url地址 * @param $method 请求方法 get post * @param null $postfields post数据数组 * @param array $headers 请求header信息 * @param bool|false $debug 调试开启 默认false * @return mixed */ function httpRequest($url, $method = "GET", $postfields = [], $headers = array(), $debug = false) { $method = strtoupper($method); $ci = curl_init(); /* Curl settings */ curl_setopt($ci, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0); curl_setopt($ci, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0"); curl_setopt($ci, CURLOPT_CONNECTTIMEOUT, 60); /* 在发起连接前等待的时间,如果设置为0,则无限等待 */ curl_setopt($ci, CURLOPT_TIMEOUT, 7); /* 设置cURL允许执行的最长秒数 */ curl_setopt($ci, CURLOPT_RETURNTRANSFER, true); switch ($method) { case "POST": curl_setopt($ci, CURLOPT_POST, true); if (!empty($postfields)) { $tmpdatastr = is_array($postfields) ? http_build_query($postfields) : $postfields; curl_setopt($ci, CURLOPT_POSTFIELDS, $tmpdatastr); } if (empty($headers)) { $postfields = is_array($postfields) ? json_encode($postfields) : $postfields; $headers = [ 'Content-Type: application/json', 'Content-Length: ' . strlen($postfields), ]; } break; case "GET": $params = ""; foreach ($postfields as $k => $v) { $params .= $k . "=" . urlencode($v) . "&"; } curl_setopt($ci, CURLOPT_POSTFIELDS, $params); break; case 'GANK': //抓取不需要使用方法 break; default: curl_setopt($ci, CURLOPT_CUSTOMREQUEST, $method); /* //设置请求方式 */ break; } $ssl = preg_match('/^https:\/\//i', $url) ? TRUE : FALSE; curl_setopt($ci, CURLOPT_URL, $url); if ($ssl) { curl_setopt($ci, CURLOPT_SSL_VERIFYPEER, FALSE); // https请求 不验证证书和hosts curl_setopt($ci, CURLOPT_SSL_VERIFYHOST, FALSE); // 不从证书中检查SSL加密算法是否存在 } //curl_setopt($ci, CURLOPT_HEADER, true); /*启用时会将头文件的信息作为数据流输出*/ curl_setopt($ci, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ci, CURLOPT_MAXREDIRS, 2); /* 指定最多的HTTP重定向的数量,这个选项是和CURLOPT_FOLLOWLOCATION一起使用的 */ curl_setopt($ci, CURLOPT_HTTPHEADER, $headers); curl_setopt($ci, CURLINFO_HEADER_OUT, true); /* curl_setopt($ci, CURLOPT_COOKIE, $Cookiestr); * *COOKIE带过去** */ $response = curl_exec($ci); $requestinfo = curl_getinfo($ci); $http_code = curl_getinfo($ci, CURLINFO_HTTP_CODE); if ($debug) { echo "=====post data======\r\n"; var_dump($postfields); echo "=====info===== \r\n"; print_r($requestinfo); echo "=====response=====\r\n"; print_r($response); } curl_close($ci); return $response; //return array($http_code, $response,$requestinfo); } /** * 检查手机号码格式 * @param $mobile 手机号码 */ function check_mobile($mobile) { if (preg_match('/1[34578]\d{9}$/', $mobile)) return true; return false; } /** * 检查邮箱地址格式 * @param $email 邮箱地址 */ function check_email($email) { if (filter_var($email, FILTER_VALIDATE_EMAIL)) return true; return false; } /** * json格式输出 * @param type $msg 消息 * @param type $code 状态码 */ function json_output($msg, $code = 1) { $data = [ "msg" => $msg, "code" => $code, ]; echo json_encode($data); die; } /** * 实现中文字串截取无乱码的方法 */ function getSubstr($string, $start, $length) { if (mb_strlen($string, 'utf-8') > $length) { $str = mb_substr($string, $start, $length, 'utf-8'); return $str . '...'; } else { return $string; } } /** * 是否移动端访问访问 * * @return bool */ function isMobile() { // 如果有HTTP_X_WAP_PROFILE则一定是移动设备 if (isset($_SERVER['HTTP_X_WAP_PROFILE'])) return true; // 如果via信息含有wap则一定是移动设备,部分服务商会屏蔽该信息 if (isset($_SERVER['HTTP_VIA'])) { // 找不到为flase,否则为true return stristr($_SERVER['HTTP_VIA'], "wap") ? true : false; } // 脑残法,判断手机发送的客户端标志,兼容性有待提高 if (isset($_SERVER['HTTP_USER_AGENT'])) { $clientkeywords = array('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'); // 从HTTP_USER_AGENT中查找手机浏览器的关键字 if (preg_match("/(" . implode('|', $clientkeywords) . ")/i", strtolower($_SERVER['HTTP_USER_AGENT']))) return true; } // 协议法,因为有可能不准确,放到最后判断 if (isset($_SERVER['HTTP_ACCEPT'])) { // 如果只支持wml并且不支持html那一定是移动设备 // 如果支持wml和html但是wml在html之前则是移动设备 if ((strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') !== false) && (strpos($_SERVER['HTTP_ACCEPT'], 'text/html') === false || (strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') < strpos($_SERVER['HTTP_ACCEPT'], 'text/html')))) { return true; } } return false; } function is_weixin() { if (strpos($_SERVER['HTTP_USER_AGENT'], 'MicroMessenger') !== false) { return true; } return false; } function is_qq() { if (strpos($_SERVER['HTTP_USER_AGENT'], 'QQ') !== false) { return true; } return false; } function is_alipay() { if (strpos($_SERVER['HTTP_USER_AGENT'], 'AlipayClient') !== false) { return true; } return false; } function ajaxReturn($result = array()) { if (is_string($result)) { $msg = $result; $result = []; $result['msg'] = $msg; } if (empty($result['data'])) { $result['data'] = (object) []; } // else if (empty($result['data']['list'])) { $result['data']['list'] = []; } $result['code'] = isset($result['code']) ? $result['code'] : 200; $result['msg'] = empty($result['msg']) ? "Success." : $result['msg']; header('Content-Type:application/json; charset=utf-8'); exit(json_encode($result, 256)); } /** * 根据ip地址获取地址信息 * @param string $ip * @return bool|mixed */ function GetIpLookup($ip = '') { if (empty($ip)) { $ip = $this->ip(); } $res = @file_get_contents('http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js&ip=' . $ip); if (empty($res)) { return false; } $jsonMatches = array(); preg_match('#\{.+?\}#', $res, $jsonMatches); if (!isset($jsonMatches[0])) { return false; } $json = json_decode($jsonMatches[0], true); if (isset($json['ret']) && $json['ret'] == 1) { $json['ip'] = $ip; unset($json['ret']); } else { return false; } return $json; } /** * 获取客户端IP地址 * @param integer $type 返回类型 0 返回IP地址 1 返回IPV4地址数字 * @param boolean $adv 是否进行高级模式获取(有可能被伪装) * @return mixed */ public function ip($type = 0, $adv = false) { $type = $type ? 1 : 0; static $ip = null; if (null !== $ip) { return $ip[$type]; } if ($adv) { if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { $arr = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']); $pos = array_search('unknown', $arr); if (false !== $pos) { unset($arr[$pos]); } $ip = trim(current($arr)); } elseif (isset($_SERVER['HTTP_CLIENT_IP'])) { $ip = $_SERVER['HTTP_CLIENT_IP']; } elseif (isset($_SERVER['REMOTE_ADDR'])) { $ip = $_SERVER['REMOTE_ADDR']; } } elseif (isset($_SERVER['REMOTE_ADDR'])) { $ip = $_SERVER['REMOTE_ADDR']; } // IP地址合法验证 $long = sprintf("%u", ip2long($ip)); $ip = $long ? [$ip, $long] : ['0.0.0.0', 0]; return $ip[$type]; } public function getip() { if (getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown')) { $onlineip = getenv('HTTP_CLIENT_IP'); } elseif (getenv('HTTP_X_FORWARDED_FOR') && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown')) { $onlineip = getenv('HTTP_X_FORWARDED_FOR'); } elseif (getenv('REMOTE_ADDR') && strcasecmp(getenv('REMOTE_ADDR'), 'unknown')) { $onlineip = getenv('REMOTE_ADDR'); } elseif (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown')) { $onlineip = $_SERVER['REMOTE_ADDR']; } preg_match("/[\d\.]{7,15}/", $onlineip, $onlineipmatches); return $onlineipmatches[0] ? $onlineipmatches[0] : 'unknown'; } /** * 获取时间戳 * @param type $type 默认0,今日的开始时间和结束时间 | 2=>昨日 | 3=>上周 |4=>本月 * @return type */ function gettime($type = 0) { $time = array(); switch ($type) { case 2: //php获取昨日起始时间戳和结束时间戳 $time['start_time'] = mktime(0, 0, 0, date('m'), date('d') - 1, date('Y')); $time['end_time'] = mktime(0, 0, 0, date('m'), date('d'), date('Y')) - 1; break; case 3: //php获取上周起始时间戳和结束时间戳 $time['start_time'] = mktime(0, 0, 0, date('m'), date('d') - date('w') + 1 - 7, date('Y')); $time['end_time'] = mktime(23, 59, 59, date('m'), date('d') - date('w') + 7 - 7, date('Y')); break; case 4: //php获取本月起始时间戳和结束时间戳 $time['start_time'] = mktime(0, 0, 0, date('m'), 1, date('Y')); $time['end_time'] = mktime(23, 59, 59, date('m'), date('t'), date('Y')); break; default: //php获取今日开始时间戳和结束时间戳 $time['start_time'] = mktime(0, 0, 0, date('m'), date('d'), date('Y')); $time['end_time'] = mktime(0, 0, 0, date('m'), date('d') + 1, date('Y')) - 1; break; } return $time; } /** * 时间转中文 * @param type $poortime 所用时间 */ function chtime($poortime) { $seconds = $poortime; $minute = 0; //分 $hour = 0; //时 $day = 0; //天 if ($poortime > 60) { $seconds = $poortime % 60; $minute = floor($poortime / 60); if ($minute > 60) { $hour = floor($minute / 60); $minute = $minute % 60; if ($hour > 24) { $day = floor($hour / 24); $hour = $hour % 24; } } } $datatime = "{$day} 天 {$hour} 时 {$minute} 分 {$seconds} 秒"; return $datatime; } /** * 从服务器下载文件 * @param type $fileurl 服务器路径 * @param type $filename 下载到本地的文件名 */ function download($fileurl, $filename = "") { if (empty($filename)) { //获取文件后缀 $filename = basename($fileurl); } header("Content-Disposition: attachment; filename=" . $filename); //告诉浏览器通过附件形式来处理文件 header('Content-Length: ' . filesize($fileurl)); //下载文件大小 readfile($fileurl); //读取文件内容 } /** * 数据导入 * @param string $file excel文件 * @param string $sheet * @return string 返回解析数据 * @throws PHPExcel_Exception * @throws PHPExcel_Reader_Exception */ function importExecl($file = '', $sheet = 0) { $file = iconv("utf-8", "gb2312", $file); //转码 if (empty($file) OR ! file_exists($file)) { die('file not exists!'); } include ('./Classes/PHPExcel.php'); //必须类 // include('PHPExcel.php'); //引入PHP EXCEL类 $objRead = new PHPExcel_Reader_Excel2007(); //建立reader对象 if (!$objRead->canRead($file)) { $objRead = new PHPExcel_Reader_Excel5(); if (!$objRead->canRead($file)) { die('No Excel!'); } } $cellName = array('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'AA', 'AB', 'AC', 'AD', 'AE', 'AF', 'AG', 'AH', 'AI', 'AJ', 'AK', 'AL', 'AM', 'AN', 'AO', 'AP', 'AQ', 'AR', 'AS', 'AT', 'AU', 'AV', 'AW', 'AX', 'AY', 'AZ'); $obj = $objRead->load($file); //建立excel对象 $currSheet = $obj->getSheet($sheet); //获取指定的sheet表 $columnH = $currSheet->getHighestColumn(); //取得最大的列号 $columnCnt = array_search($columnH, $cellName); $rowCnt = $currSheet->getHighestRow(); //获取总行数 // output("统计完成,共 {$rowCnt} 行数据。"); $data = array(); $ALLClass = new ALLClass(); for ($_row = 1; $_row <= $rowCnt; $_row++) { //读取内容 for ($_column = 0; $_column <= $columnCnt; $_column++) { $cellId = $cellName[$_column] . $_row; $cellValue = $currSheet->getCell($cellId)->getValue(); //$cellValue = $currSheet->getCell($cellId)->getCalculatedValue(); #获取公式计算的值 if ($cellValue instanceof PHPExcel_RichText) { //富文本转换字符串 $cellValue = $cellValue->__toString(); } if ($cellName[$_column] == "A") { $cellValue = PHPExcel_Shared_Date::ExcelToPHP($cellValue); } $data[$_row][$cellName[$_column]] = $cellValue; } if ($_row % 5000 == 0) { $this->output("第 {$_row} 行数据已读取"); // output($ALLClass->memory()); } } $this->output("读取完成,数据存档中。。。"); return $data; } /** * 处理Excel导出 * @param $datas array 设置表格数据 * @param $datas array 导出文件名称 */ function excelData($datas, $filename) { $filename .= ".xls"; $str = "\r\n\r\n\r\n\r\n"; $str .= ""; // $str.="

曾经沧海难为水,除去巫山不是云

"; $str .= $datas; if (is_array($datas)) { foreach ($datas as $key => $rt) { $str .= ""; foreach ($rt as $k => $v) { $str .= ""; } $str .= "\n"; } } $str .= "
{$v}
"; header("Content-Type: application/vnd.ms-excel; name='excel'"); header("Content-type: application/octet-stream"); header("Content-Disposition: attachment; filename=" . $filename); header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); header("Pragma: no-cache"); header("Expires: 0"); exit($str); } /** * 删除指定目录 * [delAllFiles description] 删除指定目录 * @param [type] $dirName [description] 目录 * @param [type] $file [description] 记录的过程文件 * @param integer $type [description] 第一次默认打开新文件,第二次调用不打开 * @return [type] [description] * * 删除一个目录相对比较简单,基本步骤为: 1、判断是否是目录,是目录则递归调用自己,否则直接删除文件; 2、判断目录是否为空,不为空 rmdir会抛出错误; 3、文件权限的问题(window,这个不是什么问题) */ public function delAllFiles($dirName, $file = "./DelLog.txt", $type = 1) { $bool = false; /** * 判断是文件还是文件夹 */ if (is_file($dirName)) { unlink($dirName); //删除文件 $this->data_log("{$dirName}清理完成\r\n", $file, ""); $bool = true; } if (is_dir($dirName)) { $re = $this->checkDir($dirName); //默认第一次打开文件 if ($type) { $file = fopen($file, 'a+'); //打开日志文件 } if ($re) { $this->delFile($dirName, $file); } else { fwrite($file, "{$dirName}清理完成\r\n"); } $bool = true; } return $bool; } /** * 创建excel文件 */ function wr_excel() { include_once 'public/classes/PHPExcel.php'; // 插件主文件 $objExcel = new PHPExcel(); $objWriter = new PHPExcel_Writer_Excel5($objExcel); // 用于其他版本格式 $objExcel->setActiveSheetIndex(0); $objActSheet = $objExcel->getActiveSheet(); //设置当前活动sheet的名称 $objActSheet->setTitle('sheet1'); $objActSheet->setCellValue('A2', '中国11'); // 设置Excel中的内容 A2表示坐标 //生成excel到文件 $objWriter->save('./test.xls'); } /** * [checkDir description] 检测文件夹是否为空,为空直接删除 * @param [type] $dirName [description] 文件夹名 * @return [type] [description] */ private function checkDir($dirName) { $a = scandir($dirName); //列出 images 目录中的文件和目录: //只包含.和..目录的文件夹为空文件夹 if (sizeof($a) == 2) { rmdir($dirName); return false; } return true; } /** * [delFile description] 上传文件的方法 * @param [type] $dirName [description] 目录 * @param [type] $file [description] 记录的文件 * @return [type] [description] */ private function delFile($dirName, $file) { $dh = openDir($dirName); while ($handle = readdir($dh)) { if ($handle == '.' || $handle == '..') { continue; } $resource = $dirName . '/' . $handle; //判断是否是文件夹 if (is_dir($resource)) { //判断文件夹是否为空 $re = $this->checkDir($dirName); if ($re) { $this->delAllFiles($resource, $file, 0); } else { fwrite($file, "{$resource}清理完成\r\n"); continue; } } else { unlink($resource); fwrite($file, "{$resource}清理完成\r\n"); } } // 关掉资源,删除目录 // closedir($dh); //关闭目录资源 // fwrite($file, "{$dirName}清理完成\r\n"); // rmdir($dirName); //删除空目录 //每次目录层级高了就报错,故加个循环处理 $i = 1; while ($i) { $re = $this->checkDir($dirName); // echo "$dirName $i 次

"; $i++; if (!$re) { $i = 0; closedir($dh); //关闭目录资源 fwrite($file, "{$dirName}清理完成\r\n"); } } } /** * 获得随机字符串 * @param int $len 需要的长度 * @param int $size 是否大写 1为小写 2为大写,0为不变 * @param boolen $special 是否需要特殊符号 * @return string 返回随机字符串 */ function getRandomStr($len = "4", $size = 1, $special = false) { $chars = array( "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" ); if ($special) { $chars = array_merge($chars, array( "!", "@", "#", "$", "?", "|", "{", "/", ":", ";", "%", "^", "&", "*", "(", ")", "-", "_", "[", "]", "}", "<", ">", "~", "+", "=", ",", "." )); } $charsLen = count($chars) - 1; shuffle($chars); //打乱数组顺序 $str = ''; for ($i = 0; $i < $len; $i++) { $str .= $chars[mt_rand(0, $charsLen)]; //随机取出一位 } switch ($size) { case 0: break; case 1: $str = strtolower($str); break; case 2: $str = strtoupper($str); break; } return $str; } /** * 威盾PHP加密专家解密算法 * @param type $file_path 要解密的文件路径 * @param type $file_url 解密之后保存的文件路径 */ function weidun_jm($file_path = 'test_jiami/IndexAction.class.php', $file_url = "jiemi.php") { $filename = $file_path; //要解密的文件 $lines = file($filename); //0,1,2行 //第一次base64解密 $content = ""; if (preg_match("/O0O0000O0\('.*'\)/", $lines[1], $y)) { $content = str_replace("O0O0000O0('", "", $y[0]); $content = str_replace("')", "", $content); $content = base64_decode($content); } //第一次base64解密后的内容中查找密钥 $decode_key = ""; if (preg_match("/\),'.*',/", $content, $k)) { $decode_key = str_replace("),'", "", $k[0]); $decode_key = str_replace("',", "", $decode_key); } //查找要截取字符串长度 $str_length = ""; if (preg_match("/,\d*\),/", $content, $k)) { $str_length = str_replace("),", "", $k[0]); $str_length = str_replace(",", "", $str_length); } //截取文件加密后的密文 $Secret = substr($lines[2], $str_length); //echo $Secret; $this->data_log("data_log($str, $file_url); $this->data_log("?>", $file_url); //直接还原密文输出 // echo base64_decode(strtr($Secret, $decode_key, 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/')); } /** * PHP截取两个指定字符(串)之间的所有字符。拿到任何地方都可以使用 */ function getBetweenAB($str, $begin, $end) { if ($begin == '') return ''; $beginPos = mb_strpos($str, $begin); if ($beginPos === false) return ''; // 起始字符不存在,直接返回空。合理 $start = $beginPos + mb_strlen($begin); // 1.1、开始截取下标 if ($end == '') $endPos = mb_strlen($str); // 结束字符不存在,默认截取到字符串末尾。合理 else $endPos = mb_strpos($str, $end, $start); // 1.2、从开始下标之后查找 if ($endPos === false) $endPos = mb_strlen($str); $length = $endPos - $start; // 2、截取字符的长度 return mb_substr($str, $start, $length); } }

代码就都在上面了,各位自行更改需要即可。

有时候单纯的搬砖和动脑子的搬砖还是不一样的。

天不老,

情难绝。

心似双丝网,

中有千千结。

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