curlOpen($url); $res = json_decode($res,true); if(isset($res['errmsg'])) return [false, $res['errmsg']]; if(! isset($res['access_token'])) return [false, 'request error']; $token = $res['access_token']; $expire_time = $res['expires_in']-300; Redis::set($token_key,$token); Redis::expire($token_key, $expire_time); return [true,$token]; } return [true, $token]; } public function getPublicWxArticle($data){ list($status, $msg) = $this->rule($data); if(! $status) { file_put_contents('record_ip.txt',date("Y-m-d H:i:s",time()).json_encode($data) . PHP_EOL."来源IP".$msg.PHP_EOL,8); return [false, 'IP未入白名单']; } list($status, $msg) = $this->getToken(); if(! $status) return [false, $msg]; $config = config('qingyaoWx'); $url = sprintf($config['get_article'], $msg); $offset = empty($data['page_index']) ? 1 : $data['page_index'] - 1; $count = empty($data['page_size']) || $data['page_size'] > 10 ? 10 : $data['page_size']; $post = [ 'offset' => $offset, 'count' => $count, 'no_content' => 1, ]; $result = $this->curlOpen($url, ['post' => json_encode($post)]); $result = json_decode($result,true); if(isset($result['errmsg'])) return [false, $result['errmsg']]; return [true, ['data' => $result['item'] ?? [], 'total' => $result['total_count'], 'data_count' => $result['item_count']]]; } public function getPublicWxArticleDetail($data){ list($status, $msg) = $this->rule($data); if(! $status) { file_put_contents('record_ip.txt',date("Y-m-d H:i:s",time()).json_encode($data) . PHP_EOL."来源IP".$msg.PHP_EOL,8); return [false, 'IP未入白名单']; } if(empty($data['article_id'])) return [false, '文章ID不能为空']; list($status, $msg) = $this->getToken(); if(! $status) return [false, $msg]; $config = config('qingyaoWx'); $url = sprintf($config['get_article_detail'], $msg); $post = [ 'article_id' => $data['article_id'], ]; $result = $this->curlOpen($url, ['post' => json_encode($post)]); $result = json_decode($result,true); if(isset($result['errmsg'])) return [false, $result['errmsg']]; return [true, ['data' => $result['news_item'] ?? [] ]]; } public function getPublicWxMaterial($data){ list($status, $msg) = $this->rule($data); if(! $status) { file_put_contents('record_ip.txt',date("Y-m-d H:i:s",time()).json_encode($data) . PHP_EOL."来源IP".$msg.PHP_EOL,8); return [false, 'IP未入白名单']; } list($status, $msg) = $this->getToken(); if(! $status) return [false, $msg]; $config = config('qingyaoWx'); $url = sprintf($config['get_material'], $msg); $offset = empty($data['page_index']) ? 1 : $data['page_index'] - 1; $count = empty($data['page_size']) || $data['page_size'] > 10 ? 10 : $data['page_size']; $post = [ 'offset' => $offset, 'count' => $count, 'type' => 'news', ]; $result = $this->curlOpen($url, ['post' => json_encode($post)]); $result = json_decode($result,true); if(isset($result['errmsg'])) return [false, $result['errmsg']]; return [true, ['data' => $result['item'] ?? [], 'total' => $result['total_count'], 'data_count' => $result['item_count']]]; } public function getPublicWxDraft($data){ list($status, $msg) = $this->rule($data); if(! $status) { file_put_contents('record_ip.txt',date("Y-m-d H:i:s",time()).json_encode($data) . PHP_EOL."来源IP".$msg.PHP_EOL,8); return [false, 'IP未入白名单']; } list($status, $msg) = $this->getToken(); if(! $status) return [false, $msg]; $config = config('qingyaoWx'); $url = sprintf($config['get_draft'], $msg); $offset = empty($data['page_index']) ? 1 : $data['page_index'] - 1; $count = empty($data['page_size']) || $data['page_size'] > 10 ? 10 : $data['page_size']; $post = [ 'offset' => $offset, 'count' => $count, 'no_content' => 0, ]; $result = $this->curlOpen($url, ['post' => json_encode($post)]); $result = json_decode($result,true); if(isset($result['errmsg'])) return [false, $result['errmsg']]; return [true, ['data' => $result['item'] ?? [], 'total' => $result['total_count'], 'data_count' => $result['item_count']]]; } public function getWxFile($data){ // list($status, $msg) = $this->rule($data); // if(! $status) { // file_put_contents('record_ip.txt',date("Y-m-d H:i:s",time()).json_encode($data) . PHP_EOL."来源IP".$msg.PHP_EOL,8); // return [false, 'IP未入白名单']; // } if(empty($data['wx_url'])) return [false, "URL不存在"]; $header = ['Content-Type:application/json']; list($status,$msg) = $this->get_helper_for_img($data['wx_url'],$header); if(! $status) return [false, $msg]; dd($msg); } public function rule($data){ // 获取用户的IP地址 $userIP = $_SERVER['REMOTE_ADDR']; // 获取设置的IP地址 $allowedIPs = $this->allowedIPs(); if(empty($allowedIPs)) return [false, $userIP]; // 校验用户IP是否在允许的范围内 $isValidIP = false; foreach ($allowedIPs as $allowedIP) { if (strpos($allowedIP, '/') !== false) { // IP段表示法校验 list($subnet, $mask) = explode('/', $allowedIP); if ((ip2long($userIP) & ~((1 << (32 - $mask)) - 1)) == ip2long($subnet)) { $isValidIP = true; break; } } else { // 单个IP地址校验 if ($allowedIP === $userIP) { $isValidIP = true; break; } } } return [$isValidIP, $userIP]; } public function allowedIPs(){ $allowedIPs = Settings::where('setting_name','allowedIPs')->first(); if(empty($allowedIPs) || empty($allowedIPs->setting_value)) return []; return explode(',',$allowedIPs->setting_value); } public function get_helper_for_img($url,$header=[],$timeout = 20){ $ch = curl_init(); curl_setopt_array($ch, array( CURLOPT_URL => $url, CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => '', CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => $timeout, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => 'GET', CURLOPT_SSL_VERIFYPEER => false, CURLOPT_HTTPHEADER => $header, )); $r = curl_exec($ch); if ($r === false) { // 获取错误号 $errorNumber = curl_errno($ch); // 获取错误信息 $errorMessage = curl_error($ch); $message = "cURL Error #{$errorNumber}: {$errorMessage}"; Log::channel('apiLog')->info('wx', ["message" => $message]); return [false, $message]; } $headerSize = curl_getinfo($ch, CURLINFO_HEADER_SIZE); $header = substr($r, 0, $headerSize); $body = substr($r, $headerSize); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); $img = ""; if ($httpCode == 200) { // 检查是否为图片 list($status, $msg) = $this->getTemporaryUrl($body, $url); if(! $status) return [false, $msg]; $img = $msg; } else { return [false, '']; } return [true, $img]; } function isImage($data) { $imageInfo = getimagesizefromstring($data); return $imageInfo !== false; } //生成临时文件 public function getTemporaryUrl($body,$url) { // 定义本地文件路径 $name = md5($url) . '.jpeg'; $localFilePath = storage_path(self::wx_img . $name); if(! file_exists($localFilePath)){ $directoryPath = dirname($localFilePath); // 检查目录是否存在,如果不存在则创建 if (! is_dir($directoryPath)) { // 设置目录权限,可以根据需要更改 $mode = 0777; // 使用递归选项创建目录 if (! mkdir($directoryPath, $mode, true)) return [false, '目录创建失败']; } file_put_contents($localFilePath, $body); } if(! file_exists($localFilePath)) file_put_contents($localFilePath, $body); return [true, $name]; } }