DiscuzX/upload/source/plugin/dzapp_haodai/haodai.api.class.php

1034 lines
16 KiB
PHP

<?php
/**
* PHP SDK for haodai.com (using OAuth2)
*
* @author duyumi <duyumi.net@gmail.com>
* @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);
}
}
}