|
@@ -0,0 +1,245 @@
|
|
|
+<?php
|
|
|
+
|
|
|
+namespace Oauth\Lib;
|
|
|
+
|
|
|
+use Dever;
|
|
|
+use Dever\Session\Oper as Save;
|
|
|
+
|
|
|
+class Client
|
|
|
+{
|
|
|
+
|
|
|
+ * @desc account
|
|
|
+ * @var int
|
|
|
+ */
|
|
|
+ private $account = 1;
|
|
|
+
|
|
|
+
|
|
|
+ * @desc save
|
|
|
+ * @var object
|
|
|
+ */
|
|
|
+ private $save = null;
|
|
|
+
|
|
|
+
|
|
|
+ * @desc request
|
|
|
+ * @var array
|
|
|
+ */
|
|
|
+ private $request = null;
|
|
|
+
|
|
|
+
|
|
|
+ * @desc config
|
|
|
+ * @var array
|
|
|
+ */
|
|
|
+ private $config = null;
|
|
|
+
|
|
|
+ public function __construct()
|
|
|
+ {
|
|
|
+ $this->initSave();
|
|
|
+ $this->initRequest();
|
|
|
+ $this->initAccount();
|
|
|
+ $this->initRefer();
|
|
|
+ $this->initConfig();
|
|
|
+ }
|
|
|
+
|
|
|
+ private function initSave()
|
|
|
+ {
|
|
|
+ $this->save = new Save(DEVER_PROJECT, 'session');
|
|
|
+ }
|
|
|
+
|
|
|
+ private function initRequest()
|
|
|
+ {
|
|
|
+ $this->request = Dever::input();
|
|
|
+ }
|
|
|
+
|
|
|
+ private function initAccount()
|
|
|
+ {
|
|
|
+ $this->account = (isset($this->request['account']) && $this->request['account']) ? $this->request['account'] : $this->save->get('oauth_account');
|
|
|
+ $this->save->add('oauth_account', $this->account);
|
|
|
+ }
|
|
|
+
|
|
|
+ private function initRefer()
|
|
|
+ {
|
|
|
+ $this->refer = (isset($this->request['refer']) && $this->request['refer']) ? $this->request['refer'] : $this->save->get('oauth_refer');
|
|
|
+ $this->save->add('oauth_refer', $this->refer);
|
|
|
+ }
|
|
|
+
|
|
|
+ private function initConfig()
|
|
|
+ {
|
|
|
+ $this->config = Dever::db('oauth/account')->one($this->account);
|
|
|
+ if (!$this->config) {
|
|
|
+ Dever::alert('账户错误');
|
|
|
+ }
|
|
|
+ $this->config += Dever::config($this->config['type'])->cAll;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ * @desc oauth请求
|
|
|
+ */
|
|
|
+ public function auth()
|
|
|
+ {
|
|
|
+ $id = Dever::id();
|
|
|
+ $this->save->add('oauth_id', $id);
|
|
|
+ $this->param('auth', 'appid', $this->config['appid']);
|
|
|
+ $this->param('auth', 'redirect_uri', Dever::url('request/callback?account=' . $this->account, 'oauth'));
|
|
|
+ $this->param('auth', 'state', $id);
|
|
|
+ $this->param('auth', 'response_type');
|
|
|
+ $this->param('auth', 'scope');
|
|
|
+
|
|
|
+ print_r($this->config['auth']);die;
|
|
|
+
|
|
|
+ $url = $this->config['auth']['url'] . '?' . http_build_query($this->config['auth']['param']);
|
|
|
+
|
|
|
+ Dever::location($url);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ * @desc oauth请求 callback
|
|
|
+ */
|
|
|
+ public function callback($url = '')
|
|
|
+ {
|
|
|
+ if ((isset($this->request['js']) && $this->request['js'])) {
|
|
|
+ $this->_js = false;
|
|
|
+ }
|
|
|
+ if ($this->_js == true && $url) {
|
|
|
+ return $this->output($url);
|
|
|
+ } else {
|
|
|
+ $id = $this->save->get('oauth_id');
|
|
|
+ if (isset($this->config['token']['param'])) {
|
|
|
+ if (!$this->save->get('oauth_refresh')) {
|
|
|
+ $this->param('token', 'code');
|
|
|
+ $this->param('token', 'appid', $this->config['appid']);
|
|
|
+ $this->param('token', 'secret', $this->config['appsecret']);
|
|
|
+ $this->param('token', 'grant_type');
|
|
|
+
|
|
|
+ $result = Dever::curl($this->config['token']['url'], $this->config['token']['param']);
|
|
|
+
|
|
|
+ $result = Dever::json_decode($result);
|
|
|
+
|
|
|
+ parse_str(http_build_query($result), $this->request);
|
|
|
+
|
|
|
+ $this->response('token', 'access_token');
|
|
|
+ $this->response('token', 'expires_in');
|
|
|
+ $this->response('token', 'refresh_token');
|
|
|
+ $this->response('token', 'openid');
|
|
|
+ $this->response('token', 'unionid');
|
|
|
+ $this->response('token', 'scope');
|
|
|
+ $this->response('token', 'errcode');
|
|
|
+ $this->response('token', 'errmsg');
|
|
|
+ } else {
|
|
|
+
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ $this->bind($data);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ * @desc 重新获取token
|
|
|
+ * @author leo(suwi.bin)
|
|
|
+ * @date 2012-08-27
|
|
|
+ */
|
|
|
+ protected function refresh()
|
|
|
+ {
|
|
|
+ $data = $this->request();
|
|
|
+ $state = false;
|
|
|
+ if(isset($data['token_refresh']) && $data['token_refresh'])
|
|
|
+ {
|
|
|
+ $this->param('refresh', 'refresh_token', $data['token_refresh']);
|
|
|
+ $this->param('refresh', 'client_id', $this->_config['id']);
|
|
|
+ $this->param('refresh', 'client_secret', $this->_config['key']);
|
|
|
+ $return = json_decode($this->_curl('post', $this->param['refresh']), true);
|
|
|
+ if(isset($return['error']))
|
|
|
+ {
|
|
|
+ Dever::alert('参数错误');
|
|
|
+ }
|
|
|
+ if(isset($return['access_token']) && $return['access_token'])
|
|
|
+ {
|
|
|
+ $update['token_code'] = $return['access_token'];
|
|
|
+ $update['token_type'] = $return['token_type'];
|
|
|
+ $update['token_time'] = $return['expires_in'];
|
|
|
+ $state = $this->_update($update, $data['id']);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return $state;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ * @desc 绑定数据
|
|
|
+ */
|
|
|
+ private function bind()
|
|
|
+ {
|
|
|
+ $data = $this->config['token']['response'];
|
|
|
+
|
|
|
+ $get = $this->request();
|
|
|
+
|
|
|
+ $id = false;
|
|
|
+
|
|
|
+ if(isset($get['id']) && $get['id'] > 0)
|
|
|
+ {
|
|
|
+ $id = $get['id'];
|
|
|
+ }
|
|
|
+
|
|
|
+ $this->_update($data, $id);
|
|
|
+
|
|
|
+
|
|
|
+ if($this->refer)
|
|
|
+ {
|
|
|
+ $refer = base64_decode($this->refer);
|
|
|
+ Dever::location($refer);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ * @desc 输出js内容
|
|
|
+ */
|
|
|
+ private function output($url)
|
|
|
+ {
|
|
|
+ $html =
|
|
|
+ '<script>
|
|
|
+ var params = {}, queryString = location.hash.substring(1),
|
|
|
+ regex = /([^&=]+)=([^&]*)/g, m;
|
|
|
+ while (m = regex.exec(queryString))
|
|
|
+ {
|
|
|
+ params[decodeURIComponent(m[1])] = decodeURIComponent(m[2]);
|
|
|
+ }
|
|
|
+
|
|
|
+ location.href="'.$url.'&js=false&" + queryString;
|
|
|
+ </script>';
|
|
|
+ echo $html;die;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ * @desc 请求参数
|
|
|
+ */
|
|
|
+ private function param($type, $key, $value = false)
|
|
|
+ {
|
|
|
+ $this->compatible($this->config[$type]['param'], $key, $value);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ * @desc 响应参数
|
|
|
+ */
|
|
|
+ private function response($type, $key, $value = false)
|
|
|
+ {
|
|
|
+ $this->compatible($this->config[$type]['response'], $key, $value);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ * @desc 兼容处理
|
|
|
+ */
|
|
|
+ private function compatible(&$param, $key, $value = false)
|
|
|
+ {
|
|
|
+ $default = false;
|
|
|
+ if (isset($param[$key]) && is_array($param[$key])) {
|
|
|
+ $nkey = $param[$key][0];
|
|
|
+ $default = $param[$key][1];
|
|
|
+ unset($param[$key]);
|
|
|
+ $key = $nkey;
|
|
|
+ } else {
|
|
|
+ $default = $param[$key];
|
|
|
+ }
|
|
|
+ return $param[$key] = ($value ? $value : (isset($this->request[$key]) ? $this->request[$key] : $default));
|
|
|
+ }
|
|
|
+}
|