* @copyright open.weibo.com */ !defined('IN_DISCUZ') && exit('Access Denied'); class HaoDaiOAuth { public $client_id; public $client_secret; public $access_token; public $refresh_token; public $http_code; public $url; public $host = HD_API_HOST; public $source = "open.haodai"; public $auth = "oauth2"; public $union_ref = HD_REF; public $timeout = 30; public $connecttimeout = 30; public $ssl_verifypeer = FALSE; public $format = 'json'; public $decode_json = TRUE; public $http_info; public $useragent = 'HAODAI OAuth2 v0.1'; public $debug = FALSE; public static $boundary = ''; function accessTokenURL() { return HD_API_HOST.'oauth2/access_token/'; } function authorizeURL() { return HD_API_HOST.'oauth2/authorize/'; } function __construct($client_id, $client_secret, $access_token = NULL, $refresh_token = NULL, $union_ref = NULL) { $this->client_id = $client_id; $this->client_secret = $client_secret; $this->access_token = $access_token; $this->refresh_token = $refresh_token; $this->union_ref = empty($union_ref) ? HD_REF : $union_ref; } function getAuthorizeURL( $url, $response_type = 'code', $state = NULL, $display = NULL ) { $params = array(); $params['client_id'] = $this->client_id; $params['redirect_uri'] = $url; $params['response_type'] = $response_type; $params['state'] = $state; $params['display'] = $display; return $this->authorizeURL() . "?" . http_build_query($params); } function getAccessToken( $type = 'code', $keys ) { $params = array(); $params['client_id'] = $this->client_id; $params['client_secret'] = $this->client_secret; $params['response_type'] = 'token'; if ( $type === 'token' ) { $params['grant_type'] = 'refresh_token'; $params['refresh_token'] = $keys['refresh_token']; } elseif ( $type === 'code' ) { $params['grant_type'] = 'authorization_code'; $params['code'] = $keys['code']; $params['redirect_uri'] = $keys['redirect_uri']; } elseif ( $type === 'password' ) { $params['grant_type'] = 'password'; $params['username'] = $keys['username']; $params['password'] = $keys['password']; } else { exit("wrong auth type"); } $response = $this->oAuthRequest($this->accessTokenURL(), 'POST', $params); $token = json_decode($response, true); if ( is_array($token) && !isset($token['error']) ) { $this->access_token = $token['access_token']; $this->refresh_token = $token['refresh_token']; } else { exit("get access token failed." . $token['error']); } return $token; } function parseSignedRequest($signed_request) { list($encoded_sig, $payload) = explode('.', $signed_request, 2); $sig = self::base64decode($encoded_sig) ; $data = json_decode(self::base64decode($payload), true); if (strtoupper($data['algorithm']) !== 'HMAC-SHA256') return '-1'; $expected_sig = hash_hmac('sha256', $payload, $this->client_secret, true); return ($sig !== $expected_sig)? '-2':$data; } function base64decode($str) { return base64_decode(strtr($str.str_repeat('=', (4 - strlen($str) % 4)), '-_', '+/')); } function getTokenFromJSSDK() { $key = "haodaijs_" . $this->client_id; if ( isset($_COOKIE[$key]) && $cookie = $_COOKIE[$key] ) { parse_str($cookie, $token); if ( isset($token['access_token']) && isset($token['refresh_token']) ) { $this->access_token = $token['access_token']; $this->refresh_token = $token['refresh_token']; return $token; } else { return false; } } else { return false; } } function getTokenFromArray( $arr ) { if (isset($arr['access_token']) && $arr['access_token']) { $token = array(); $this->access_token = $token['access_token'] = $arr['access_token']; if (isset($arr['refresh_token']) && $arr['refresh_token']) { $this->refresh_token = $token['refresh_token'] = $arr['refresh_token']; } return $token; } else { return false; } } function get($url, $parameters = array()) { $response = $this->oAuthRequest($url, 'GET', $parameters); if ($this->format === 'json' && $this->decode_json) { return json_decode($response, true); } return $response; } function post($url, $parameters = array(), $multi = false) { $response = $this->oAuthRequest($url, 'POST', $parameters, $multi ); if ($this->format === 'json' && $this->decode_json) { return json_decode($response, true); } return $response; } function delete($url, $parameters = array()) { $response = $this->oAuthRequest($url, 'DELETE', $parameters); if ($this->format === 'json' && $this->decode_json) { return json_decode($response, true); } return $response; } function oAuthRequest($url, $method, $parameters, $multi = false) { if (strrpos($url, 'http://') !== 0 && strrpos($url, 'https://') !== 0) { $url = "{$this->host}{$url}"; } switch ($method) { case 'GET': $url = $url . '?source='.$this->source.'&auth='.$this->auth.'&ref='.$this->union_ref.'&'. http_build_query($parameters); return $this->http($url, 'GET'); default: $headers = array(); if (!$multi && (is_array($parameters) || is_object($parameters)) ) { $body = http_build_query($parameters); } else { $body = self::build_http_query_multi($parameters); $headers[] = "Content-Type: multipart/form-data; boundary=" . self::$boundary; } $url = $url . '?source='.$this->source.'&auth='.$this->auth.'&ref='.$this->union_ref; return $this->http($url, $method, $body, $headers); } } function http($url, $method, $postfields = NULL, $headers = array()) { $this->http_info = array(); $ci = curl_init(); curl_setopt($ci, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0); curl_setopt($ci, CURLOPT_USERAGENT, $this->useragent); curl_setopt($ci, CURLOPT_CONNECTTIMEOUT, $this->connecttimeout); curl_setopt($ci, CURLOPT_TIMEOUT, $this->timeout); curl_setopt($ci, CURLOPT_RETURNTRANSFER, TRUE); curl_setopt($ci, CURLOPT_ENCODING, ""); curl_setopt($ci, CURLOPT_SSL_VERIFYPEER, $this->ssl_verifypeer); curl_setopt($ci, CURLOPT_SSL_VERIFYHOST, 1); curl_setopt($ci, CURLOPT_HEADERFUNCTION, array($this, 'getHeader')); curl_setopt($ci, CURLOPT_HEADER, FALSE); switch ($method) { case 'POST': curl_setopt($ci, CURLOPT_POST, TRUE); if (!empty($postfields)) { curl_setopt($ci, CURLOPT_POSTFIELDS, $postfields); $this->postdata = $postfields; } break; case 'DELETE': curl_setopt($ci, CURLOPT_CUSTOMREQUEST, 'DELETE'); if (!empty($postfields)) { $url = "{$url}?{$postfields}"; } } if ( isset($this->access_token) && $this->access_token ) $headers[] = "Authorization: oauth2 ".$this->access_token; if ( !empty($this->remote_ip) ) { if ( defined('SAE_ACCESSKEY') ) { $headers[] = "SaeRemoteIP: " . $this->remote_ip; } else { $headers[] = "API-RemoteIP: " . $this->remote_ip; } } else { if ( !defined('SAE_ACCESSKEY') ) { $headers[] = "API-RemoteIP: " . $_SERVER['REMOTE_ADDR']; } } curl_setopt($ci, CURLOPT_URL, $url ); curl_setopt($ci, CURLOPT_HTTPHEADER, $headers ); curl_setopt($ci, CURLINFO_HEADER_OUT, TRUE ); $response = curl_exec($ci); $this->http_code = curl_getinfo($ci, CURLINFO_HTTP_CODE); $this->http_info = array_merge($this->http_info, curl_getinfo($ci)); $this->url = $url; if ($this->debug) { echo "=====post data======\r\n"; var_dump($postfields); echo "=====headers======\r\n"; print_r($headers); echo '=====request info====='."\r\n"; print_r( curl_getinfo($ci) ); echo '=====response====='."\r\n"; print_r( $response ); } curl_close ($ci); return $response; } function getHeader($ch, $header) { $i = strpos($header, ':'); if (!empty($i)) { $key = str_replace('-', '_', strtolower(substr($header, 0, $i))); $value = trim(substr($header, $i + 2)); $this->http_header[$key] = $value; } return strlen($header); } public static function build_http_query_multi($params) { if (!$params) return ''; uksort($params, 'strcmp'); $pairs = array(); self::$boundary = $boundary = uniqid('------------------'); $MPboundary = '--'.$boundary; $endMPboundary = $MPboundary. '--'; $multipartbody = ''; foreach ($params as $parameter => $value) { if( in_array($parameter, array('pic', 'image')) && $value{0} == '@' ) { $url = ltrim( $value, '@' ); $content = file_get_contents( $url ); $array = explode( '?', basename( $url ) ); $filename = $array[0]; $multipartbody .= $MPboundary . "\r\n"; $multipartbody .= 'Content-Disposition: form-data; name="' . $parameter . '"; filename="' . $filename . '"'. "\r\n"; $multipartbody .= "Content-Type: image/unknown\r\n\r\n"; $multipartbody .= $content. "\r\n"; } else { $multipartbody .= $MPboundary . "\r\n"; $multipartbody .= 'content-disposition: form-data; name="' . $parameter . "\"\r\n\r\n"; $multipartbody .= $value."\r\n"; } } $multipartbody .= $endMPboundary; return $multipartbody; } } class HaoDaiClient { function __construct( $akey, $skey, $access_token, $refresh_token = NULL, $union_ref='') { $this->oauth = new HaoDaiOAuth( $akey, $skey, $access_token, $refresh_token, $union_ref); } function set_debug( $enable ) { $this->oauth->debug = $enable; } function set_remote_ip( $ip ) { if ( ip2long($ip) !== false ) { $this->oauth->remote_ip = $ip; return true; } else { return false; } } function get_xindai_list($city='beijing' , $xd_type='xiaofei', $money=1, $month=12, $data=array(), $page=1, $page_size=10 ) { $params = array(); $params['xd_type'] = $xd_type; $params['city'] = $city; $params['page'] = $page; $params['page_size'] = $page_size; $params['money'] = $money; $params['month']= $month; $params = array_merge($params,$data); return $this->oauth->get('xindai/get_xindai_list', $params); } function get_xindai_detail($city, $item_id, $money=1, $month=12) { $params = array(); $params['item_id'] = $item_id; $params['city'] = $city; $params['money'] = $money; $params['month']= $month; return $this->oauth->get('xindai/get_xindai_detail', $params); } function send_xindai_apply($city, $nickname, $money, $mobile, $data=array()) { if(empty($city)||empty($nickname)||empty($mobile)||empty($money)) { return false; } $params = array(); $params['city'] = $city; $params['nickname'] = $nickname; $params['mobile'] = $mobile; $params['money'] = $money; $params = array_merge($data,$params); return $this->oauth->post( 'xindai/send_xindai_apply', $params, true ); } function get_xindai_filter($xd_type) { $params = array(); $params['xd_type'] = $xd_type; return $this->oauth->get( 'xindai/get_xindai_filter', $params ); } function get_xindai_zones() { $params = array(); return $this->oauth->get( 'xindai/get_xindai_zones', $params ); } function send_xindai_apply_details($id, $details, $xd_type=FALSE) { $params = array(); $params['id'] = intval($id); $params['details'] = $details; $params['xd_type'] = $xd_type; return $this->oauth->post('xindai/send_xindai_apply_details', $params); } function send_xindai_apply_fast( $city, $nickname, $money, $mobile, $data=array()) { $params = array(); $params['city'] = $city; $params['nickname'] = $nickname; $params['mobile'] = $mobile; $params['money'] = $money; $params = array_merge($data,$params); return $this->oauth->post('xindai/send_xindai_apply_fast', $params); } function get_hot_recommend( $city ) { $params = array(); $params['city'] = $city; return $this->oauth->get('common/get_hot_recommend', $params); } function get_xindai_ad( $city ) { $params = array(); $params['city'] = $city; return $this->oauth->get('xindai/get_xindai_ad', $params); } function get_article_dkgl_list( $city, $is_top, $pg_num = 1, $pg_size = 10) { $params = array(); $params['is_top'] = $is_top; $params['city'] = $city; return $this->request_with_pager( 'article/get_article_dkgl_list', $pg_num, $pg_size, $params ); } function get_article_dkzx_list( $city, $is_top, $pg_num = 1, $pg_size = 10) { $params = array(); $params['is_top'] = $is_top; $params['city'] = $city; return $this->request_with_pager( 'article/get_article_dkzx_list', $pg_num, $pg_size, $params ); } function get_article_cjwt_list( $city, $is_top, $pg_num = 1, $pg_size = 10) { $params = array(); $params['is_top'] = $is_top; $params['city'] = $city; return $this->request_with_pager( 'article/get_article_cjwt_list', $pg_num, $pg_size, $params ); } function get_article_jyfx_list( $city, $is_top, $pg_num = 1, $pg_size = 10) { $params = array(); $params['is_top'] = $is_top; $params['city'] = $city; return $this->request_with_pager( 'article/get_article_jyfx_list', $pg_num, $pg_size, $params ); } function get_article_detail( $id) { $params = array(); $params['id'] = $id; return $this->oauth->get( 'article/get_article_detail',$params ); } function register_union_account($data=array()) { $params = array(); $params['email'] = $data['email']; $params['tel'] = $data['tel']; $params['nickname'] = $data['nickname']; $params['passwd'] = $data['passwd']; $params['realname'] = $data['realname']; $params['qq'] = $data['qq']; $params['domain'] = $data['domain']; $params['sitename'] = $data['sitename']; $res = $this->oauth->post('user/register_union_account', $params); $this->oauth->union_ref = $res['hd_ref']; return $res; } function haodai_app_register($data=array()) { $params = array(); $params['app_name'] = $data['app_name']; $params['site_url'] = $data['site_url']; $params['desc'] = $data['desc']; $params['callback_url'] = $data['callback_url']; return $this->oauth->post('user/haodai_app_register', $params); } function haodai_check_AccessToken() { $params = array(); return $this->oauth->get('common/check_AccessToken', $params); } protected function request_with_pager( $url, $pg_num = false, $pg_size = false, $params = array() ) { if( $pg_num ) $params['pg_num'] = $pg_num; if( $pg_size ) $params['pg_size'] = $pg_size; return $this->oauth->get($url, $params ); } protected function id_format(&$id) { if ( is_float($id) ) { $id = number_format($id, 0, '', ''); } elseif ( is_string($id) ) { $id = trim($id); } } }