config = Dever::config('sign')->cAll; if (!$project) { $project = Dever::input('project', 1); } if (!$project) { Dever::alert('project is not exits!'); } $this->project = $project; } /** * 获取当前站点的配置 * * @return mixed */ public function project() { return $this->project; } /** * 获取当前站点的配置 * * @return mixed */ public function config() { return $this->config['accessToken'][$this->project]; } /** * 获取签名信息 * * @return mixed */ public function get($url) { $ticket = $this->ticket($this->token()); if (!$ticket) { $return['status'] = 0; $return['msg'] = 'error'; } else { $timestamp = time(); $nonce = $this->nonce(); $signature = $this->signature($ticket, $url, $timestamp, $nonce); $return = array ( 'appId' => $this->config['accessToken'][$this->project]['appid'], 'timestamp' => $timestamp, 'nonceStr' => $nonce, 'signature' => $signature, 'status' => 1, 'msg' => '成功', ); } Dever::out($return); } /** * 获取nonce * * @return mixed */ private function nonce() { return substr(md5(microtime()), rand(10, 15)); } /** * 获取accessToken * * @return mixed */ public function token($state = 1) { $url = $this->config['accessToken']['url'] . '&' . http_build_query($this->config['accessToken'][$this->project]); $where['where_project'] = $this->project; $info = Dever::load('main/token-info', $where); $request = $update = false; if ($info && ((time() - $info['mdate'] >= $info['expires_in']) || $state == 2)) { $request = $update = true; } elseif ($info) { return $info['token']; } if (!$info) { $request = true; $update = false; } if ($request == true) { $data = json_decode(Dever::curl($url), true); if ($data && isset($data['access_token'])) { $data['expires_in'] = $data['expires_in'] - 2000; if ($update == true) { $set['set_project'] = $this->project; $set['set_token'] = $data['access_token']; $set['set_expires_in'] = $data['expires_in']; $set['where_id'] = $info['id']; Dever::load('main/token-update', $set); } else { $insert['add_project'] = $this->project; $insert['add_token'] = $data['access_token']; $insert['add_expires_in'] = $data['expires_in']; Dever::load('main/token-insert', $insert); } return $data['access_token']; } } } /** * 获取ticket * * @return mixed */ private function ticket($token) { $url = $this->config['ticket'] . $token; $where['where_project'] = $this->project; $info = Dever::load('main/ticket-info', $where); $request = $update = false; if ($info && time() - $info['mdate'] >= $info['expires_in']) { $request = $update = true; } elseif($info) { return $info['ticket']; } if (!$info) { $request = true; $update = false; } if ($request == true) { $data = json_decode(Dever::curl($url), true); if ($data && isset($data['ticket'])) { $data['expires_in'] = $data['expires_in'] - 2000; if ($update == true) { $set['set_project'] = $this->project; $set['set_ticket'] = $data['ticket']; $set['set_expires_in'] = $data['expires_in']; $set['where_name'] = $this->project; Dever::load('main/ticket-update', $set); } else { $insert['add_project'] = $this->project; $insert['add_ticket'] = $data['ticket']; $insert['add_expires_in'] = $data['expires_in']; Dever::load('main/ticket-insert', $insert); } return $data['ticket']; } } } /** * 获取signature * * @return mixed */ private function signature($ticket, $url, $timestamp, $noncestr) { $info = array(); $info['jsapi_ticket'] = $ticket; $info['url'] = $url; $info['timestamp'] = $timestamp; $info['noncestr'] = $noncestr; ksort($info); $signature_string = substr(http_build_query($info), 0, -1); /* foreach($info as $k => $v) { $signature_string .= $k . '=' . $v . '&'; } $signature_string = substr($signature_string, 0, -1); */ return sha1($signature_string); } }