Example #1
0
 /**
  * OAuth 协议的签名
  *
  * @param string $url
  * @param string $method
  * @param array $params
  * @return string
  */
 protected function sign($url, $method, $params, $multi)
 {
     if ($multi && is_array($multi)) {
         //上传图片专用签名
         //囧 图片内容需要做签名,并且图片上传时 。
         //囧 整个sign_parts不做urlencode 。
         foreach ($multi as $field => $path) {
             $params[$field] = file_get_contents($path);
         }
         uksort($params, 'strcmp');
         $pairs = array();
         foreach ($params as $key => $value) {
             //                $key = self::urlencode_rfc1738($key);
             //                $pairs[] = $key . '=' . self::urlencode_rfc1738($value);
             //囧 qq opensns 竟然不编码
             $pairs[] = $key . '=' . $value;
         }
         $sign_parts = implode('&', $pairs);
         $base_string = implode('&', array(strtoupper($method), $url, $sign_parts));
     } else {
         uksort($params, 'strcmp');
         $pairs = array();
         foreach ($params as $key => $value) {
             //                $key = self::urlencode_rfc1738($key);
             //                $pairs[] = $key . '=' . self::urlencode_rfc1738($value);
             //囧 qq opensns 竟然不编码
             $pairs[] = $key . '=' . $value;
         }
         $sign_parts = self::urlencode_rfc1738(implode('&', $pairs));
         $base_string = implode('&', array(strtoupper($method), self::urlencode_rfc1738($url), $sign_parts));
     }
     //囧 官方不对appkey_secret 和 token_secret编码
     //是否编码都无所谓,因为appkey_secret 和 token_secret 都没有需要编码的字符。
     //但是不编码不合规范。为了符合规范还是编码一下。
     $key_parts = array(self::urlencode_rfc1738($this->_app_secret), self::urlencode_rfc1738($this->_token_secret));
     $key = implode('&', $key_parts);
     $sign = base64_encode(OpenSDK_Util::hash_hmac('sha1', $base_string, $key, true));
     if ($this->_debug) {
         echo 'base_string: ', $base_string, "\n";
         echo 'sign key: ', $key, "\n";
         echo 'sign: ', $sign, "\n";
     }
     return $sign;
 }
Example #2
0
 /**
  * OAuth 协议的签名
  *
  * @param string $url
  * @param string $method
  * @param array $params
  * @return string
  */
 private function sign($url, $method, $params)
 {
     uksort($params, 'strcmp');
     $pairs = array();
     foreach ($params as $key => $value) {
         $key = OpenSDK_Util::urlencode_rfc3986($key);
         if (is_array($value)) {
             // If two or more parameters share the same name, they are sorted by their value
             // Ref: Spec: 9.1.1 (1)
             natsort($value);
             foreach ($value as $duplicate_value) {
                 $pairs[] = $key . '=' . OpenSDK_Util::urlencode_rfc3986($duplicate_value);
             }
         } else {
             $pairs[] = $key . '=' . OpenSDK_Util::urlencode_rfc3986($value);
         }
     }
     $sign_parts = OpenSDK_Util::urlencode_rfc3986(implode('&', $pairs));
     $base_string = implode('&', array(strtoupper($method), OpenSDK_Util::urlencode_rfc3986($url), $sign_parts));
     $key_parts = array(OpenSDK_Util::urlencode_rfc3986($this->_app_secret), OpenSDK_Util::urlencode_rfc3986($this->_token_secret));
     $key = implode('&', $key_parts);
     $sign = base64_encode(OpenSDK_Util::hash_hmac('sha1', $base_string, $key, true));
     if ($this->_debug) {
         echo 'base_string: ', $base_string, "\n";
         echo 'sign key: ', $key, "\n";
         echo 'sign: ', $sign, "\n";
     }
     return $sign;
 }
Example #3
0
 /**
  * 统一调用接口的方法
  * 照着官网的参数往里填就行了
  * 需要调用哪个就填哪个,如果方法调用得频繁,可以封装更方便的方法。
  *
  * 如果上传文件 $method = 'POST';
  * $multi 是一个二维数组
  *
  * array(
  *    '{fieldname}' => array(        //第一个文件
  *        'type' => 'mine 类型',
  *        'name' => 'filename',
  *        'data' => 'filedata 字节流',
  *    ),
  *    ...如果接受多个文件,可以再加
  * )
  *
  * @param string $command 官方说明中去掉 http://api.t.sohu.com/ 后面剩余的部分
  * @param array $params 官方说明中接受的参数列表,一个关联数组
  * @param string $method 官方说明中的 method GET/POST
  * @param false|array $multi 是否上传文件 false:普通post array: array ( '{fieldname}'=>'/path/to/file' ) 文件上传
  * @param bool $decode 是否对返回的字符串解码成数组
  * @param OpenSDK_Sina_Weibo::RETURN_JSON|OpenSDK_Sina_Weibo::RETURN_XML $format 调用格式
  */
 public static function call($command, $params = array(), $method = 'GET', $multi = false, $decode = true, $format = 'json')
 {
     if ($format == self::RETURN_XML) {
     } else {
         $format == self::RETURN_JSON;
     }
     //去掉空数据
     foreach ($params as $key => $val) {
         if (strlen($val) == 0) {
             unset($params[$key]);
         }
     }
     $params['oauth_token'] = self::getParam(self::ACCESS_TOKEN);
     $response = self::request('http://api.t.sohu.com/' . ltrim($command, '/') . '.' . $format, $method, $params, $multi);
     if ($decode) {
         if ($format == self::RETURN_JSON) {
             return OpenSDK_Util::json_decode($response, true);
         } else {
             //todo parse xml2array later
             //其实没必要。用json即可
             return $response;
         }
     } else {
         return $response;
     }
 }
Example #4
0
	/**
	 * 统一调用接口的方法
	 * 照着官网的参数往里填就行了
	 * 需要调用哪个就填哪个,如果方法调用得频繁,可以封装更方便的方法。
	 *
	 * 如果上传文件 $method = 'POST';
	 * $multi 是一个二维数组
	 *
	 * array(
	 *	'{fieldname}' => array(		//第一个文件
	 *		'type' => 'mine 类型',
	 *		'name' => 'filename',
	 *		'data' => 'filedata 字节流',
	 *	),
	 *	...如果接受多个文件,可以再加
	 * )
	 *
	 * @param string $command 官方说明中去掉 http://open.t.qq.com/api/ 后面剩余的部分
	 * @param array $params 官方说明中接受的参数列表,一个关联数组
	 * @param string $method 官方说明中的 method GET/POST
	 * @param false|array $multi 是否上传文件
	 * @param bool $decode 是否对返回的字符串解码成数组
	 * @param OpenSDK_Tencent_Weibo::RETURN_JSON|OpenSDK_Tencent_Weibo::RETURN_XML $format 调用格式
	 */
	public static function call($command , $params=array() , $method = 'GET' , $multi=false ,$decode=true , $format=self::RETURN_JSON)
	{
		if($format == self::RETURN_XML)
			;
		else
			$format == self::RETURN_JSON;
		$params['format'] = $format;
		//去掉空数据
		foreach($params as $key => $val)
		{
			if(strlen($val) == 0)
			{
				unset($params[$key]);
			}
		}
		$params['oauth_token'] = self::getParam(self::ACCESS_TOKEN);
		$response = self::request( 'http://open.t.qq.com/api/'.ltrim($command,'/') , $method, $params, $multi);
		if($decode)
		{
			if($format == self::RETURN_JSON)
			{
				return OpenSDK_Util::json_decode($response, true);
			}
			else
			{
				//parse xml2array later
				return $response;
			}
		}
		else
		{
			return $response;
		}
	}
Example #5
0
 /**
  * 统一调用接口的方法
  * 照着官网的参数往里填就行了
  * 需要调用哪个就填哪个,如果方法调用得频繁,可以封装更方便的方法。
  *
  * 如果上传文件 $method = 'POST';
  * $multi 是一个二维数组
  *
  * array(
  *    '{fieldname}' => array(        //第一个文件
  *        'type' => 'mine 类型',
  *        'name' => 'filename',
  *        'data' => 'filedata 字节流',
  *    ),
  *    ...如果接受多个文件,可以再加
  * )
  *
  * @param string $method 官方说明中的method
  * @param array $params 官方说明中接受的参数列表,一个关联数组
  * @param false|array $multi 是否上传文件 false:普通post array: array ( '{fieldname}'=>'/path/to/file' ) 文件上传
  * @param bool $decode 是否对返回的字符串解码成数组
  * @param OpenSDK_Top_Open::RETURN_JSON|OpenSDK_Top_Open::RETURN_XML $format 调用格式
  */
 public static function call($method, $params = array(), $multi = false, $decode = true, $format = self::RETURN_JSON)
 {
     if ($format == self::RETURN_XML) {
     } else {
         $format == self::RETURN_JSON;
     }
     //去掉空数据
     foreach ($params as $key => $val) {
         if (strlen($val) == 0) {
             unset($params[$key]);
         }
     }
     $params['session'] = self::getParam(self::ACCESS_TOKEN);
     $params['format'] = $format;
     $params['method'] = $method;
     $params['timestamp'] = date('Y-m-d H:i:s');
     $params['app_key'] = self::$client_id;
     $params['v'] = '2.0';
     $params['sign_method'] = 'md5';
     $params['sign'] = self::createSign($params);
     //使用http方式访问,性能更高
     $response = self::request('http://gw.api.taobao.com/router/rest', 'POST', $params, $multi);
     if ($decode) {
         if ($format == self::RETURN_JSON) {
             return OpenSDK_Util::json_decode($response, true);
         } else {
             //todo parse xml2array later
             //没必要。用json即可!
             return $response;
         }
     } else {
         return $response;
     }
 }
Example #6
0
 /**
  * 统一调用接口的方法
  * 照着官网的参数往里填就行了
  * http://wiki.open.qq.com/wiki/API%E5%88%97%E8%A1%A8
  * 需要调用哪个就填哪个,如果方法调用得频繁,可以封装更方便的方法。
  *
  * 如果上传文件 $method = 'POST';
  * $multi 是一个二维数组
  *
  * array(
  *    '{fieldname}' => array(        //第一个文件
  *        'type' => 'mine 类型',
  *        'name' => 'filename',
  *        'data' => 'filedata 字节流',
  *    ),
  *    ...如果接受多个文件,可以再加
  * )
  *
  * @param string $command 官方说明中去掉  http://[域名或IP]/ 后面剩余的部分
  * @param array $params 官方说明中接受的参数列表,一个关联数组
  * @param string $method 官方说明中的 method GET/POST
  * @param false|array $multi 是否上传文件 false:普通post array: array ( '{fieldname}'=>'/path/to/file' ) 文件上传
  * @param bool $decode 是否对返回的字符串解码成数组
  * @param OpenSDK_Tencent_Weibo::RETURN_JSON|OpenSDK_Tencent_Weibo::RETURN_XML $format 调用格式使用默认的json即可
  */
 public static function call($command, $params = array(), $method = 'GET', $multi = false, $decode = true, $format = 'json')
 {
     if ($format == self::RETURN_XML) {
         // DO NOTHING
     } else {
         $format == self::RETURN_JSON;
     }
     //去掉空数据
     foreach ($params as $key => $val) {
         if (strlen($val) == 0) {
             unset($params[$key]);
         }
     }
     $params['appid'] = self::$client_id;
     $params['openid'] = self::getParam(self::OAUTH_OPENID);
     $params['openkey'] = self::getParam(self::OAUTH_OPENKEY);
     !isset($params['pf']) && ($params['pf'] = self::getParam(self::OAUTH_PF));
     $params['userip'] = self::getRemoteIp();
     $params['format'] = $format;
     ksort($params);
     $signarr = array();
     foreach ($params as $key => $val) {
         if (strlen($val) == 0) {
             unset($params[$key]);
             continue;
         }
         $signarr[] = "{$key}={$val}";
     }
     $signstr = strtoupper($method) . '&' . rawurlencode('/' . ltrim($command, '/')) . '&' . rawurlencode(implode('&', $signarr));
     $params['sig'] = base64_encode(OpenSDK_Util::hash_hmac('sha1', $signstr, self::$client_secret . '&', true));
     if (self::$report) {
         $start_time = self::microtime();
     }
     $response = self::request(self::$protocol . '://' . self::$host . '/' . ltrim($command, '/'), $method, $params, $multi);
     if ($decode) {
         if ($format == self::RETURN_JSON) {
             $rt = OpenSDK_Util::json_decode($response, true);
             if (self::$report) {
                 self::statReport($start_time, array('appid' => self::$client_id, 'pf' => $params['pf'], 'rc' => $rt['ret'], 'svr_name' => self::$host, 'interface' => $command, 'protocol' => self::$protocol, 'method' => $method));
             }
             return $rt;
         } else {
             //todo parse xml2array later
             //没必要。用json即可!
             return $response;
         }
     } else {
         return $response;
     }
 }
Example #7
0
 /**
  * 统一调用接口的方法
  * 照着官网的参数往里填就行了
  * 需要调用哪个就填哪个,如果方法调用得频繁,可以封装更方便的方法。
  *
  * 如果上传文件 $method = 'POST';
  * $multi 是一个二维数组
  *
  * array(
  *    '{fieldname}' => array(        //第一个文件
  *        'type' => 'mine 类型',
  *        'name' => 'filename',
  *        'data' => 'filedata 字节流',
  *    ),
  *    ...如果接受多个文件,可以再加
  * )
  *
  * @param string $command 官方说明中去掉 https://graph.qq.com/ 后面剩余的部分
  * @param array $params 官方说明中接受的参数列表,一个关联数组
  * @param string $method 官方说明中的 method GET/POST
  * @param false|array $multi 是否上传文件 false:普通post array: array ( '{fieldname}'=>'/path/to/file' ) 文件上传
  * @param bool $decode 是否对返回的字符串解码成数组
  * @param OpenSDK_Sina_Weibo::RETURN_JSON|OpenSDK_Sina_Weibo::RETURN_XML $format 调用格式
  */
 public static function call($command, $params = array(), $method = 'GET', $multi = false, $decode = true, $format = 'json')
 {
     if ($format == self::RETURN_XML) {
     } else {
         $format == self::RETURN_JSON;
     }
     //去掉空数据
     foreach ($params as $key => $val) {
         if (strlen($val) == 0) {
             unset($params[$key]);
         }
     }
     $params['access_token'] = self::getParam(self::ACCESS_TOKEN);
     //这里没有遵守 OAuth2.0的规范,规范参数应该是source
     $params['oauth_consumer_key'] = self::$client_id;
     $params['openid'] = self::getParam(self::OPENID);
     $params['format'] = $format;
     $response = self::request('https://graph.qq.com/' . ltrim($command, '/'), $method, $params, $multi);
     if ($decode) {
         if ($format == self::RETURN_JSON) {
             return OpenSDK_Util::json_decode($response, true);
         } else {
             //todo parse xml2array later
             //没必要。用json即可!
             return $response;
         }
     } else {
         return $response;
     }
 }
Example #8
0
 /**
  * 统一调用接口的方法
  * 照着官网的参数往里填就行了
  * http://wiki.open.t.qq.com/index.php/API%E6%96%87%E6%A1%A3
  * 需要调用哪个就填哪个,如果方法调用得频繁,可以封装更方便的方法。
  *
  * 如果上传文件 $method = 'POST';
  * $multi 是一个二维数组
  *
  * array(
  *    '{fieldname}' => array(        //第一个文件
  *        'type' => 'mine 类型',
  *        'name' => 'filename',
  *        'data' => 'filedata 字节流',
  *    ),
  *    ...如果接受多个文件,可以再加
  * )
  *
  * @param string $command 官方说明中去掉  http://open.t.qq.com/api/ 后面剩余的部分
  * @param array $params 官方说明中接受的参数列表,一个关联数组
  * @param string $method 官方说明中的 method GET/POST
  * @param false|array $multi 是否上传文件 false:普通post array: array ( '{fieldname}'=>'/path/to/file' ) 文件上传
  * @param bool $decode 是否对返回的字符串解码成数组
  * @param OpenSDK_Tencent_Weibo::RETURN_JSON|OpenSDK_Tencent_Weibo::RETURN_XML $format 调用格式
  */
 public static function call($command, $params = array(), $method = 'GET', $multi = false, $decode = true, $format = 'json')
 {
     if ($format == self::RETURN_XML) {
         // DO NOTHING
     } else {
         $format == self::RETURN_JSON;
     }
     //去掉空数据
     foreach ($params as $key => $val) {
         if (strlen($val) == 0) {
             unset($params[$key]);
         }
     }
     $params['oauth_consumer_key'] = self::$client_id;
     $params['access_token'] = self::getParam(self::ACCESS_TOKEN);
     $params['openid'] = self::getParam(self::OAUTH_OPENID);
     $params['oauth_version'] = self::$version;
     $params['scope'] = 'all';
     $params['appfrom'] = 'OpenSDK2.0beta';
     //
     $params['seqid'] = time();
     $params['serverip'] = $_SERVER['SERVER_ADDR'];
     $params['format'] = $format;
     $response = self::request('https://open.t.qq.com/api/' . ltrim($command, '/'), $method, $params, $multi);
     if ($decode) {
         if ($format == self::RETURN_JSON) {
             return OpenSDK_Util::json_decode($response, true);
         } else {
             //todo parse xml2array later
             //没必要。用json即可!
             return $response;
         }
     } else {
         return $response;
     }
 }
Example #9
0
 /**
  * 统一调用接口的方法
  * 照着官网的参数往里填就行了
  * 需要调用哪个就填哪个,如果方法调用得频繁,可以封装更方便的方法。
  *
  * 如果上传文件 $method = 'POST';
  * $multi 是一个二维数组
  *
  * array(
  *    '{fieldname}' => array(        //第一个文件
  *        'type' => 'mine 类型',
  *        'name' => 'filename',
  *        'data' => 'filedata 字节流',
  *    ),
  *    ...如果接受多个文件,可以再加
  * )
  *
  * @param string $command 官方说明中的方法名
  * @param array $params 官方说明中接受的参数列表,一个关联数组
  * @param string $method 官方说明中的 method GET/POST
  * @param false|array $multi 是否上传文件 false:普通post array: array ( '{fieldname}'=>'/path/to/file' ) 文件上传
  * @param bool $decode 是否对返回的字符串解码成数组
  * @param OpenSDK_Sina_Weibo::RETURN_JSON|OpenSDK_Sina_Weibo::RETURN_XML $format 调用格式
  */
 public static function call($command, $params = array(), $method = 'POST', $multi = false, $decode = true, $format = 'json')
 {
     if ($format == self::RETURN_XML) {
     } else {
         $format == self::RETURN_JSON;
     }
     //去掉空数据
     foreach ($params as $key => $val) {
         if (strlen($val) == 0) {
             unset($params[$key]);
         }
     }
     $params['access_token'] = self::getParam(self::ACCESS_TOKEN);
     //        $params['source'] = self::$client_id;
     $params['method'] = $command;
     $params['format'] = $format;
     $params['v'] = self::API_VERSION;
     $params['call_id'] = microtime(true);
     $params['sig'] = self::sigCreate($params);
     $response = self::request('http://api.renren.com/restserver.do', $method, $params, $multi);
     if ($decode) {
         if ($format == self::RETURN_JSON) {
             return OpenSDK_Util::json_decode($response, true);
         } else {
             //todo parse xml2array later
             //没必要。用json即可!
             return $response;
         }
     } else {
         return $response;
     }
 }
Example #10
0
 /**
  * 统一调用接口的方法
  * 照着官网的参数往里填就行了
  * 需要调用哪个就填哪个,如果方法调用得频繁,可以封装更方便的方法。
  *
  * 使用Session key 通过http 接口调用,这样更快。
  *
  * 如果上传文件 $method = 'POST';
  * $multi 是一个二维数组
  *
  * array(
  *    '{fieldname}' => array(        //第一个文件
  *        'type' => 'mine 类型',
  *        'name' => 'filename',
  *        'data' => 'filedata 字节流',
  *    ),
  *    ...如果接受多个文件,可以再加
  * )
  *
  * @param string $command 官方说明中的方法名
  * @param array $params 官方说明中接受的参数列表,一个关联数组
  * @param string $method 官方说明中的 method GET/POST
  * @param false|array $multi 是否上传文件 false:普通post array: array ( '{fieldname}'=>'/path/to/file' ) 文件上传
  * @param bool $decode 是否对返回的字符串解码成数组
  * @param OpenSDK_Sina_Weibo::RETURN_JSON|OpenSDK_Sina_Weibo::RETURN_XML $format 调用格式
  */
 public static function call($command, $params = array(), $method = 'POST', $multi = false, $decode = true, $format = 'json')
 {
     if ($format == self::RETURN_XML) {
     } else {
         $format == self::RETURN_JSON;
     }
     //去掉空数据
     foreach ($params as $key => $val) {
         if (strlen($val) == 0) {
             unset($params[$key]);
         }
     }
     //        $params['access_token'] = self::getParam(self::ACCESS_TOKEN);
     //        $params['source'] = self::$client_id;
     $params['format'] = $format;
     $params['session_key'] = self::getParam(self::SESSION_KEY);
     //百度为什么不用数字时间戳? 这里可能你有时区问题!
     $params['timestamp'] = date('Y-m-d H:i:s');
     $params['sign'] = self::sigCreate($params);
     $response = self::request('http://openapi.baidu.com/rest/2.0/' . ltrim($command, '/'), $method, $params, $multi);
     if ($decode) {
         if ($format == self::RETURN_JSON) {
             return OpenSDK_Util::json_decode($response, true);
         } else {
             //todo parse xml2array later
             //没必要。用json即可!
             return $response;
         }
     } else {
         return $response;
     }
 }
Example #11
0
 /**
  * 统一调用接口的方法
  * 照着官网的参数往里填就行了
  * 需要调用哪个就填哪个,如果方法调用得频繁,可以封装更方便的方法。
  *
  * 如果上传文件 $method = 'POST';
  * $multi 是一个二维数组
  *
  * array(
  *    '{fieldname}' => array(        //第一个文件
  *        'type' => 'mine 类型',
  *        'name' => 'filename',
  *        'data' => 'filedata 字节流',
  *    ),
  *    ...如果接受多个文件,可以再加
  * )
  *
  * @param string $command 官方说明中去掉 http://open.t.qq.com/api/ 后面剩余的部分
  * @param array $params 官方说明中接受的参数列表,一个关联数组
  * @param string $method 官方说明中的 method GET/POST
  * @param false|array $multi 是否上传文件 false:普通post array: array ( '{fieldname}'=>'/path/to/file' ) 文件上传
  * @param bool $decode 是否对返回的字符串解码成数组,默认true
  * @param OpenSDK_Tencent_Weibo::RETURN_JSON|OpenSDK_Tencent_Weibo::RETURN_XML $format 调用格式
  */
 public static function call($command, $params = array(), $method = 'GET', $multi = false, $decode = true, $format = self::RETURN_JSON)
 {
     if ($format == self::RETURN_XML) {
     } else {
         $format == self::RETURN_JSON;
     }
     $params['format'] = $format;
     $oauth_token = self::getParam(self::ACCESS_TOKEN);
     //使用OAuth鉴权
     if ($oauth_token) {
         //去掉空数据
         foreach ($params as $key => $val) {
             if (strlen($val) == 0) {
                 unset($params[$key]);
             }
         }
         $params['oauth_token'] = $oauth_token;
         $response = self::request('http://open.t.qq.com/api/' . ltrim($command, '/'), $method, $params, $multi);
     } else {
         $params['appid'] = self::$_appkey;
         $params['openid'] = self::getParam(self::OAUTH_OPENID);
         $params['openkey'] = self::getParam(self::OAUTH_OPENKEY);
         $params['reqtime'] = self::getTimestamp();
         $params['wbversion'] = 1;
         $params['pf'] = 'tapp';
         ksort($params);
         $signarr = array();
         foreach ($params as $key => $val) {
             if (strlen($val) == 0) {
                 unset($params[$key]);
                 continue;
             }
             $signarr[] = "{$key}={$val}";
         }
         $signstr = strtoupper($method) . '&' . rawurlencode('/api/' . ltrim($command, '/')) . '&' . rawurlencode(implode('&', $signarr));
         $params['sig'] = base64_encode(OpenSDK_Util::hash_hmac('sha1', $signstr, self::$_appsecret . '&', true));
         $response = self::getOAuth()->http('http://open.t.qq.com/api/' . ltrim($command, '/'), $params, $method, $multi);
     }
     if ($decode) {
         if ($format == self::RETURN_JSON) {
             return OpenSDK_Util::json_decode($response, true);
         } else {
             //todo parse xml2array later
             //其实没必要。用json即可
             return $response;
         }
     } else {
         return $response;
     }
 }