| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 | <?phpnamespace App\Service\Weixin;use App\Model\Settings;use App\Service\Service;use Illuminate\Support\Facades\Redis;class WeixinService extends Service{    public function getToken(){        $config = config('qingyaoWx');        $token_key = $config['redis_key'];        $token = Redis::get($token_key);        if(empty($token)){            $url = sprintf($config['get_token'], $config['appid'], $config['appsecret']);            $res = $this->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' => 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 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 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);    }}
 |