PageRenderTime 75ms CodeModel.GetById 3ms app.highlight 63ms RepoModel.GetById 1ms app.codeStats 1ms

/ThinkPHP/Extend/Library/COM/BAIDU/BCMS/Bcms.class.php

https://github.com/xiaozhujun/houseRent
PHP | 1525 lines | 828 code | 52 blank | 645 comment | 87 complexity | 9439e7c9c44dbad4ca6394fef108010a MD5 | raw file
   1<?php
   2/**
   3 * 百度云消息服务 PHP SDK
   4 * 
   5 * 本文件提供百度云消息服务的PHP版本SDK
   6 * 
   7 * @author 百度移动.云事业部
   8 * @copyright Copyright (c) 2012-2020 百度在线网络技术(北京)有限公司
   9 * @version 1.2.0
  10 * @package
  11 */
  12if ( ! defined ( 'API_ROOT_PATH' ) ) 
  13{
  14	define ( 'API_ROOT_PATH', dirname( __FILE__));
  15}
  16//require_once ( API_ROOT_PATH . '/lib/RequestCore.class.php' );
  17//require_once ( API_ROOT_PATH . '/lib/BcmsException.class.php' );
  18//require_once ( API_ROOT_PATH . '/lib/BaeBase.class.php' );
  19
  20import ( "COM.BAIDU.BCMS.RequestCore" );
  21import ( "COM.BAIDU.BCMS.BcmsException" );
  22import ( "COM.BAIDU.BCMS.BaeBase" );
  23
  24/**
  25 * 
  26 * Bcms
  27 * 
  28 * Bcms类提供百度云消息服务的PHP版本SDK,用户首先实例化这个类,设置自己的accessKey、secretKey,即可使用百度云消息服务
  29 * 
  30 * @author 百度消息服务@百度云架构部
  31 * 
  32 * @version 1.2.0
  33 */
  34class Bcms extends BaeBase
  35{
  36	/**
  37	 * 可选参数的KEY
  38	 * 
  39	 * 用户关注:是
  40	 * 在调用Bcms类的SDK方法时,根据用户的个性化需要,可能需要传入可选参数,而可选参数需要放在关联数组$optional中传入,
  41	 * 这里定义了$optional数组可用的KEY
  42	 * 如,在调用dropQueue方法时,指定过期时间为5分钟,则这样使用SDK:
  43	 *   $bcms = new Bcms ( $accessKey, $secretKey, $host );
  44	 *   $optional [ Bcms::EXPIRES ] = 5 * 60;
  45	 *   $bcms->dropQueue ( $queueName, $optional );
  46	 */
  47
  48	/**
  49	 * 队列类型
  50	 * 
  51	 * createQueue创建队列时,用户可以指定要创建的队列类型,如果不指定,BCMS默认创建单模式队列, 0: 多模式,1: 单模式
  52	 * @var string QUEUE_ALIAS_NAME
  53	 */
  54	const QUEUE_TYPE = 'queue_type';
  55	/**
  56	 * 队列别名
  57	 * 
  58	 * createQueue创建队列时,用户可以为队列指定一个别名
  59	 * @var string QUEUE_ALIAS_NAME
  60	 */
  61	const QUEUE_ALIAS_NAME = 'queue_alias_name';
  62	/**
  63	 * 邮件发件人
  64	 * 
  65	 * 在调用mail方法发送邮件时,用户可能需要指定发件人邮箱
  66	 * @var string FROM
  67	 */
  68	const FROM = 'from';
  69	/**
  70	 * 生效起始时间
  71	 * 
  72	 * 调用Grant赋予其它用户权限时,用户可能希望指定权限生效的时间
  73	 * @var string EFFECT_START
  74	 */
  75	const EFFECT_START = 'effect_start';
  76	/**
  77	 * 生效结束时间
  78	 * 
  79	 * 调用Grant赋予其它用户权限时,用户可能希望指定权限生效的时间
  80	 * @var string EFFECT_END
  81	 */
  82	const EFFECT_END = 'effect_end';
  83	/**
  84	 * 消息ID号
  85	 * 
  86	 * fetchMessage等,用户可能需要指定消息ID号
  87	 * @var int MSG_ID
  88	 */
  89	const MSG_ID = 'msg_id';
  90	/**
  91	 * 要获取的消息个数
  92	 * 
  93	 * fetch消息时,用户可能需要指定要获取多少个消息
  94	 * @var int FETCH_NUM
  95	 */
  96	const FETCH_NUM = 'fetch_num';
  97	/**
  98	 * 邮件标题
  99	 * 
 100	 * mail发送邮件时,用户可能需要指定邮件的标题
 101	 * @var unknown_type
 102	 */
 103	const MAIL_SUBJECT = 'mail_subject';
 104	/**
 105	 * 请求发起时的时间戳
 106	 * 
 107	 * 用户一般不需要设置,SDK会自动设置为当前时间
 108	 * @var int TIMESTAMP
 109	 */
 110	const TIMESTAMP = 'timestamp';
 111	/**
 112	 * 请求过期时间
 113	 * 
 114	 * 如果用户不设置,则默认10分钟后该请求过期
 115	 * @var int EXPIRES
 116	 */
 117	const EXPIRES = 'expires';
 118	/**
 119	 * API版本号
 120	 * 
 121	 * 用户一般不需要设置
 122	 * @var string VERSION
 123	 */
 124	const VERSION = 'v';
 125
 126	/**
 127	 * Bcms常量
 128	 * 
 129	 * 用户关注:否
 130	 */
 131	const QUEUE_NAME = 'queue_name';
 132	const MSG_TIMEOUT = 'msg_timeout';
 133	const DESTINATION = 'destination';
 134	const METHOD = 'method';
 135	const HOST = 'host';
 136	const PRODUCT = 'bcms';
 137	const SIGN = 'sign';
 138	const ACCESS_TOKEN = 'access_token';
 139	const SECRET_KEY = 'client_secret';
 140	const ACCESS_KEY = 'client_id';
 141	const ADDRESS = 'address';
 142	const MESSAGE = 'message';
 143	const LABEL = 'label';
 144	const USER = 'user';
 145	const USERTYPE = 'usertype';
 146	const ACTIONS = 'actions';
 147	const TOKEN = 'token';	
 148	const DEFAULT_HOST = 'bcms.api.duapp.com';
 149	
 150	/**
 151	 * Bcms私有变量
 152	 * 
 153	 * 用户关注:否
 154	 */
 155	private $_clientId = NULL;
 156	private $_clientSecret = NULL;
 157	private $_host = NULL;
 158	private $_requestId = 0;
 159	private $_curlOpts = array ( CURLOPT_TIMEOUT => 30, CURLOPT_CONNECTTIMEOUT => 5 );
 160	/**
 161	 * Bcms 错误常量
 162	 * 
 163	 * 用户关注:否
 164	 */
 165	const BCMS_SDK_SYS = 1;
 166	const BCMS_SDK_INIT_FAIL = 2;
 167	const BCMS_SDK_PARAM = 3;
 168	const BCMS_SDK_HTTP_STATUS_ERROR_AND_RESULT_ERROR = 4;
 169	const BCMS_SDK_HTTP_STATUS_OK_BUT_RESULT_ERROR = 5;
 170
 171	/**
 172	 * 错误常量与错误字符串的映射
 173	 * 
 174	 * 用户关注:否
 175	 */
 176	private $_arrayErrorMap = array
 177		( 
 178		 '0' => 'php sdk error',
 179		 self::BCMS_SDK_SYS => 'php sdk error',
 180		 self::BCMS_SDK_INIT_FAIL => 'php sdk init error',
 181		 self::BCMS_SDK_PARAM => 'lack param',
 182		 self::BCMS_SDK_HTTP_STATUS_ERROR_AND_RESULT_ERROR => 'http status is error, and the body returned is not a json string',
 183		 self::BCMS_SDK_HTTP_STATUS_OK_BUT_RESULT_ERROR => 'http status is ok, but the body returned is not a json string',
 184		);
 185
 186	/**
 187	 * setAccessKey
 188	 * 
 189	 * 用户关注:是
 190	 * 服务类方法, 设置Bcms对象的accessKey属性,如果用户在创建Bcms对象时已经通过参数设置了accessKey,这里的设置将会覆盖以前的设置
 191	 * 
 192	 * @access public
 193	 * @param string $accessKey
 194	 * @return 成功:true,失败:false
 195	 * @throws BcmsException
 196	 * 
 197	 * @version 1.2.0
 198	 */
 199	public function setAccessKey ( $accessKey )
 200	{
 201		$this->_resetErrorStatus (  );
 202		try
 203		{
 204			if( $this->_checkString ( $accessKey, 1, 64 ) )
 205			{
 206				$this->_clientId = $accessKey;
 207			}
 208			else
 209			{
 210				throw new BcmsException ( "invaid access_key ( ${accessKey} ), which must be a 1-64 length string", self::BCMS_SDK_INIT_FAIL );
 211			}
 212		}
 213		catch ( Exception $ex )
 214		{
 215			$this->_bcmsExceptionHandler ( $ex );
 216			return false; 
 217		}
 218		return true;
 219	}
 220
 221	/**
 222	 * setSecretKey
 223	 * 
 224	 * 用户关注:是
 225	 * 服务类方法, 设置Bcms对象的secretKey属性,如果用户在创建Bcms对象时已经通过参数设置了secretKey,这里的设置将会覆盖以前的设置
 226	 * 
 227	 * @access public
 228	 * @param string $secretKey
 229	 * @return 成功:true,失败:false
 230	 * @throws BcmsException
 231	 * 
 232	 * @version 1.2.0
 233	 */
 234	public function setSecretKey ( $secretKey )
 235	{
 236		$this->_resetErrorStatus (  );
 237		try
 238		{
 239			if( $this->_checkString ( $secretKey, 1, 64 ) )
 240			{
 241				$this->_clientSecret = $secretKey;
 242			}
 243			else 
 244			{
 245				throw new BcmsException ( "invaid secret_key ( ${secretKey} ), which must be a 1-64 length string", self::BCMS_SDK_INIT_FAIL );
 246			}
 247		}
 248		catch ( Exception $ex )
 249		{
 250			$this->_bcmsExceptionHandler ( $ex );
 251			return false; 
 252		}
 253		return true;
 254	}
 255	
 256	/**
 257	 * setAccessAndSecretKey
 258	 * 
 259	 * 用户关注:是
 260	 * 服务类方法, 同时设置Bcms对象的AcessKey、secretKey属性,如果用户在创建Bcms对象时已经通过参数设置了
 261	 * AccessKey、secretKey,这里的设置将会覆盖以前的设置
 262	 * 
 263	 * @access public
 264	 * @param string $accessKey
 265	 * @param string $secretKey
 266	 * @return 成功:true,失败:false
 267	 * @throws BcmsException
 268	 * 
 269	 * @version 1.2.0
 270	 */
 271	public function setAccessAndSecretKey ( $accessKey, $secretKey )
 272	{
 273		$this->_resetErrorStatus (  );
 274		try
 275		{
 276			if( ! $this->_checkString ( $accessKey, 1, 64 ) )
 277			{
 278				throw new BcmsException ( "invaid access_key ( ${accessKey} ), which must be a 1-64 length string", self::BCMS_SDK_INIT_FAIL );
 279			}
 280			if( ! $this->_checkString ( $secretKey, 1, 64 ) )
 281			{
 282				throw new BcmsException ( "invaid secret_key ( ${secretKey} ), which must be a 1-64 length string", self::BCMS_SDK_INIT_FAIL );
 283			}
 284			$this->_clientId = $accessKey;
 285			$this->_clientSecret = $secretKey;
 286		}
 287		catch ( Exception $ex )
 288		{
 289			$this->_bcmsExceptionHandler ( $ex );
 290			return false; 
 291		}
 292		return true;
 293	}
 294
 295	/**
 296	 * setHost
 297	 * 
 298	 * 用户关注:是
 299	 * 服务类方法, 设置Bcms对象的host属性,如果用户在创建Bcms对象时已经通过参数设置了host,这里的设置将会覆盖以前的设置
 300	 * 
 301	 * @access public
 302	 * @param string $host
 303	 * @return 成功:true,失败:false
 304	 * @throws BcmsException
 305	 * 
 306	 * @version 1.2.0
 307	 */
 308	public function setHost ( $host )
 309	{
 310		$this->_resetErrorStatus (  );
 311		try
 312		{
 313			if ( $this->_checkString ( $host, 1, 1024 ) )
 314			{
 315				$this->_host = $host;
 316			}
 317			else 
 318			{
 319				throw new BcmsException ( "invaid host ( ${host} ), which must be a 1 - 1024 length string", self::BCMS_SDK_INIT_FAIL );
 320			}
 321		}
 322		catch ( Exception $ex )
 323		{
 324			$this->_bcmsExceptionHandler ( $ex );
 325			return false; 
 326		}
 327		return true;
 328	}
 329	
 330	/**
 331	 * setCurlOpts
 332	 * 
 333	 * 用户关注:是
 334	 * 服务类方法, 设置HTTP交互的OPTION,同PHP curl库的所有opt参数
 335	 * 
 336	 * @access public
 337	 * @param array $arr_curlopt
 338	 * @return 成功:true,失败:false
 339	 * @throws BcmsException
 340	 * 
 341	 * @version 1.2.0
 342	 */
 343	public function setCurlOpts ( $arr_curlOpts )
 344	{
 345		$this->_resetErrorStatus (  );
 346		try
 347		{
 348			if ( is_array ( $arr_curlOpts ) )
 349			{
 350				foreach ( $arr_curlOpts as $k => $v )
 351        		{   
 352            		$this->_curlOpts [ $k ] = $v;
 353        		}	
 354			}
 355			else 
 356			{
 357				throw new BcmsException( 'invalid param - arr_curlOpts is not an array [' . print_r( $arr_curlOpts, true ) . ']', self::BCMS_SDK_INIT_FAIL);
 358			}
 359		}
 360		catch ( Exception $ex )
 361		{
 362			$this->_bcmsExceptionHandler ( $ex );
 363			return false; 
 364		}
 365		return true;
 366	}
 367
 368	/**
 369	 * getRequestId
 370	 * 
 371	 * 用户关注:是
 372	 * 服务类方法,获取上次调用的request_id,如果SDK本身错误,则直接返回0
 373	 * 
 374	 * @access public
 375	 * @return 上次调用服务器返回的request_id
 376	 * 
 377	 * @version 1.2.0
 378	 */
 379	public function getRequestId (  )
 380	{
 381		return $this->_requestId;
 382	}
 383	
 384	/**
 385	 * createQueue
 386	 *  
 387	 * 用户关注:是
 388	 * 服务类方法,创建一个队列
 389	 * 
 390	 * @access public
 391	 * @param array $optional 可选参数数组,可以设置的非必须参数的key包括:Bcms::VERSION、Bcms::QUEUE_TYPE、Bcms::QUEUE_ALIAS_NAME
 392	 * @return 成功:包含执行结果的php数组;失败:false
 393	 * 
 394	 * @version 1.2.0
 395	 */
 396	public function createQueue ( $optional = NULL ) 
 397	{
 398		$this->_resetErrorStatus (  );
 399		try 
 400		{
 401			$tmpArgs = func_get_args (  );
 402			$arrArgs = $this->_mergeArgs ( array (  ), $tmpArgs );
 403			$arrArgs [ self::METHOD ] = 'create';
 404			$arrArgs [ self::QUEUE_NAME ] = 'queue';
 405			return $this->_commonProcess ( $arrArgs, array ( self::QUEUE_NAME ) );
 406		} 
 407		catch ( Exception $ex ) 
 408		{
 409			$this->_bcmsExceptionHandler ( $ex );
 410			return false; 
 411		}
 412	}
 413
 414	/**
 415	 * dropQueue
 416	 *  
 417	 * 用户关注:是
 418	 * 服务类方法,删除一个队列
 419	 * 
 420	 * @access public
 421	 * @param string $queueName 要删除的队列名
 422	 * @param array $optional 可选参数数组,可以设置的非必须参数的key包括:Bcms::VERSION
 423	 * @return 成功:包含执行结果的php数组;失败:false
 424	 * 
 425	 * @version 1.2.0
 426	 */
 427	public function dropQueue ( $queueName, $optional = NULL ) 
 428	{
 429		$this->_resetErrorStatus (  );
 430		try 
 431		{
 432			$tmpArgs = func_get_args (  );
 433			$arrArgs = $this->_mergeArgs ( array ( self::QUEUE_NAME ), $tmpArgs );
 434			$arrArgs [ self::METHOD ] = 'drop';
 435			return $this->_commonProcess ( $arrArgs, array ( self::QUEUE_NAME ) );
 436		} 
 437		catch ( Exception $ex ) 
 438		{
 439			$this->_bcmsExceptionHandler ( $ex );
 440			return false; 
 441		}
 442	}
 443
 444	/**
 445	 * subscribeQueue
 446	 *  
 447	 * 用户关注:是
 448	 * 服务类方法,订阅一个队列,BCMS会向目标地址destination发送一个确认请求,确认请求中会带上 $queueName、$destination、
 449	 * $token三个信息;被订阅者需要明确回复一个json包 '{"result":0}',BCMS才会认为订阅成功,否则,BCMS会将此订阅视为pending
 450	 * 状态,返回失败;如果在订阅时,被订阅的目标地址尚未准备好,那么后续被订阅者可以调用confirmQueue,带上 $queueName、
 451	 * $destination、$token信息来确认这个订阅,
 452	 * 确认订阅成功后,BCMS将该订阅的状态从pending改为normal,以后有消息到达时,会向目标地址推送消息
 453	 * @see confirmQueue
 454	 * 
 455	 * @access public
 456	 * @param string $queueName 要订阅的队列名
 457	 * @param string $destination 订阅的目的地址
 458	 * @param array $optional 可选参数数组,可以设置的非必须参数的key包括:Bcms::VERSION
 459	 * @return 成功:包含执行结果的php数组;失败:false
 460	 * 
 461	 * @version 1.2.0
 462	 */
 463	public function subscribeQueue ( $queueName, $destination, $optional = array (  ) ) 
 464	{
 465		$this->_resetErrorStatus (  );
 466		try 
 467		{
 468			$tmpArgs = func_get_args (  );
 469			$arrArgs = $this->_mergeArgs ( array ( self::QUEUE_NAME, self::DESTINATION ), $tmpArgs );
 470			$arrArgs [ self::METHOD ] = 'subscribe';
 471			return $this->_commonProcess ( $arrArgs, array ( self::QUEUE_NAME, self::DESTINATION ) );
 472		} 
 473		catch ( Exception $ex ) 
 474		{
 475			$this->_bcmsExceptionHandler ( $ex );
 476			return false; 
 477		}
 478	}
 479
 480	/**
 481	 * unsubscribeQueue
 482	 *  
 483	 * 用户关注:是
 484	 * 服务类方法,取消某个队列的某个订阅
 485	 * 
 486	 * @access public
 487	 * @param string $queueName 取消订阅的队列名
 488	 * @param string $destination 取消订阅的目标地址
 489	 * @param array $optional 可选参数数组,可以设置的非必须参数的key包括:Bcms::VERSION
 490	 * @return 成功:包含执行结果的php数组;失败:false
 491	 * 
 492	 * @version 1.2.0
 493	 */
 494	public function unsubscribeQueue ( $queueName, $destination, $optional = array (  ) ) 
 495	{
 496		$this->_resetErrorStatus (  );
 497		try 
 498		{
 499			$tmpArgs = func_get_args (  );
 500			$arrArgs = $this->_mergeArgs ( array ( self::QUEUE_NAME, self::DESTINATION ), $tmpArgs );
 501			$arrArgs [ self::METHOD ] = 'unsubscribe';
 502			return $this->_commonProcess ( $arrArgs, array ( self::QUEUE_NAME, self::DESTINATION ) );
 503		} 
 504		catch ( Exception $ex ) 
 505		{
 506			$this->_bcmsExceptionHandler ( $ex );
 507			return false; 
 508		}
 509	}
 510
 511	/**
 512	 * unsubscribeAllQueue
 513	 *  
 514	 * 用户关注:是
 515	 * 服务类方法,取消某个队列所有的订阅
 516	 * 
 517	 * @access public
 518	 * @param string $queueName 要取消哪个队列的所有订阅
 519	 * @param array $optional 可选参数数组,可以设置的非必须参数的key包括:Bcms::VERSION
 520	 * @return 成功:包含执行结果的php数组;失败:false
 521	 * 
 522	 * @version 1.2.0
 523	 */
 524	public function unsubscribeAllQueue ( $queueName, $optional = array (  ) ) 
 525	{
 526		$this->_resetErrorStatus (  );
 527		try 
 528		{
 529			$tmpArgs = func_get_args (  );
 530			$arrArgs = $this->_mergeArgs ( array ( self::QUEUE_NAME ), $tmpArgs );
 531			$arrArgs [ self::METHOD ] = 'unsubscribeall';
 532			return $this->_commonProcess ( $arrArgs, array ( self::QUEUE_NAME ) );
 533		} 
 534		catch ( Exception $ex ) 
 535		{
 536			$this->_bcmsExceptionHandler ( $ex );
 537			return false; 
 538		}
 539	}
 540
 541	/**
 542	 * grantQueue
 543	 *  
 544	 * 用户关注:是
 545	 * 服务类方法,将一个队列的某些权限授予(分享)给其他(她)用户
 546	 * 
 547	 * @access public
 548	 * @param string $queueName 要将那个队列的权限授予(分享)给其他(她)用户
 549	 * @param string $label 授权时,为这次授权赋予一个标签,以后收回权限时,凭借此标签
 550	 * @param string $user 给哪个用户授权
 551	 * @param int $userType $user的类型,1: 百度passport用户名;2:百度passport邮箱名;3:百度passport手机号
 552	 * @param string $actions 要授予哪些权限,以json的格式给出, 必须utf-8编码,否则服务器会报参数错误,可以一次授予多个权限
 553	 * @see SDK wiki文档
 554	 * @param array $optional 可选参数数组,可以设置的非必须参数的key包括:Bcms::VERSION、Bcms::EFFECT_START、Bcms::EFFECT_END
 555	 * @return 成功:包含执行结果的php数组;失败:false
 556	 * 
 557	 * @version 1.2.0
 558	 */
 559	public function grantQueue ( $queueName, $label, $user, $userType, $actions, $optional = array (  ) ) 
 560	{
 561		$this->_resetErrorStatus (  );
 562		try 
 563		{
 564			$tmpArgs = func_get_args (  );
 565			$arrArgs = $this->_mergeArgs ( array ( self::QUEUE_NAME, self::LABEL, self::USER, self::USERTYPE, self::ACTIONS ), $tmpArgs );
 566			$arrArgs [ self::METHOD ] = 'grant';
 567			return $this->_commonProcess ( $arrArgs, array ( self::QUEUE_NAME, self::LABEL, self::USER, self::USERTYPE, self::ACTIONS ) );
 568		} 
 569		catch ( Exception $ex ) 
 570		{
 571			$this->_bcmsExceptionHandler ( $ex );
 572			return false; 
 573		}
 574	}
 575
 576	/**
 577	 * revokeQueue
 578	 *  
 579	 * 用户关注:是
 580	 * 服务类方法,回收权限
 581	 * 
 582	 * @param string $queueName 要回收哪个队列的权限
 583	 * @param string $label 在授权时,指定的label,这里表示要回收这个权限
 584	 * @param array $optional 可选参数数组,可以设置的非必须参数的key包括:Bcms::VERSION
 585	 * @return 成功:包含执行结果的php数组;失败:false
 586	 * 
 587	 * @version 1.2.0
 588	 */
 589	public function revokeQueue ( $queueName, $label, $optional = array (  ) ) 
 590	{
 591		$this->_resetErrorStatus (  );
 592		try 
 593		{
 594			$tmpArgs = func_get_args (  );
 595			$arrArgs = $this->_mergeArgs ( array ( self::QUEUE_NAME, self::LABEL ), $tmpArgs );
 596			$arrArgs [ self::METHOD ] = 'revoke';
 597			return $this->_commonProcess ( $arrArgs, array ( self::QUEUE_NAME, self::LABEL ) );
 598		} 
 599		catch ( Exception $ex ) 
 600		{
 601			$this->_bcmsExceptionHandler ( $ex );
 602			return false; 
 603		}
 604	}
 605
 606	/**
 607	 * suspendQueue
 608	 *  
 609	 * 用户关注:是
 610	 * 服务类方法,将一个队列暂停
 611	 * 
 612	 * @access public
 613	 * @param string $queueName 要暂停的队列名
 614	 * @param array $optional 可选参数数组,可以设置的非必须参数的key包括:Bcms::VERSION
 615	 * @return 成功:包含执行结果的php数组;失败:false
 616	 * 
 617	 * @version 1.2.0
 618	 */
 619	public function suspendQueue ( $queueName, $optional = array (  ) ) 
 620	{
 621		$this->_resetErrorStatus (  );
 622		try 
 623		{
 624			$tmpArgs = func_get_args (  );
 625			$arrArgs = $this->_mergeArgs ( array ( self::QUEUE_NAME ), $tmpArgs );
 626			$arrArgs [ self::METHOD ] = 'suspend';
 627			return $this->_commonProcess ( $arrArgs, array ( self::QUEUE_NAME ) );
 628		} 
 629		catch ( Exception $ex ) 
 630		{
 631			$this->_bcmsExceptionHandler ( $ex );
 632			return false; 
 633		}
 634	}
 635
 636	/**
 637	 * resumeQueue
 638	 *  
 639	 * 用户关注:是
 640	 * 服务类方法,将一个队列从暂停状态恢复成正常状态
 641	 * 
 642	 * @access public
 643	 * @param string $queueName 要恢复的队列名
 644	 * @param array $optional 可选参数数组,可以设置的非必须参数的key包括:Bcms::VERSION
 645	 * @return 成功:包含执行结果的php数组;失败:false
 646	 * 
 647	 * @version 1.2.0
 648	 */
 649	public function resumeQueue ( $queueName, $optional = array (  ) ) 
 650	{
 651		$this->_resetErrorStatus (  );
 652		try 
 653		{
 654			$tmpArgs = func_get_args (  );
 655			$arrArgs = $this->_mergeArgs ( array ( self::QUEUE_NAME ), $tmpArgs );
 656			$arrArgs [ self::METHOD ] = 'resume';
 657			return $this->_commonProcess ( $arrArgs, array ( self::QUEUE_NAME ) );
 658		} 
 659		catch ( Exception $ex ) 
 660		{
 661			$this->_bcmsExceptionHandler ( $ex );
 662			return false; 
 663		}
 664	}
 665
 666	/**
 667	 * confirmQueue
 668	 *  
 669	 * 用户关注:是
 670	 * 服务类方法,被订阅者调用该方法,确认订阅,告诉BCMS,目标地址同意订阅,可以往我这里推送消息
 671	 * 
 672	 * @access public
 673	 * @param string $queueName 要确认订阅的队列名
 674	 * @param string $token 本次队列确认需要的token
 675	 * @param string $destination 确认订阅的目标地址
 676	 * @param array $optional 可选参数数组,可以设置的非必须参数的key包括:Bcms::VERSION
 677	 * @return 成功:包含执行结果的php数组;失败:false
 678	 * 
 679	 * @version 1.2.0
 680	 */
 681	public function confirmQueue ( $queueName, $token, $destination, $optional = array (  ) ) 
 682	{
 683		$this->_resetErrorStatus (  );
 684		try 
 685		{
 686			$tmpArgs = func_get_args (  );
 687			$arrArgs = $this->_mergeArgs ( array ( self::QUEUE_NAME, self::TOKEN, self::DESTINATION ), $tmpArgs );
 688			$arrArgs [ self::METHOD ] = 'confirm';
 689			return $this->_commonProcess ( $arrArgs, array ( self::QUEUE_NAME, self::TOKEN, self::DESTINATION ) );
 690		} 
 691		catch ( Exception $ex ) 
 692		{
 693			$this->_bcmsExceptionHandler ( $ex );
 694			return false; 
 695		}
 696	}
 697
 698	/**
 699	 * cancelQueue
 700	 *  
 701	 * 用户关注:是
 702	 * 服务类方法,被订阅者调用该方法,取消订阅,告诉BCMS,不要再往我这个地址推送消息了
 703	 * 
 704	 * @access public
 705	 * @param string $queueName 要取消订阅的队列名
 706	 * @param string $token 本次队列取消需要的token
 707	 * @param string $destination 取消订阅的目标地址
 708	 * @param array $optional 可选参数数组,可以设置的非必须参数的key包括:Bcms::VERSION
 709	 * @return 成功:包含执行结果的php数组;失败:false
 710	 * 
 711	 * @version 1.2.0
 712	 */
 713	public function cancelQueue ( $queueName, $token, $destination, $optional = array (  ) ) 
 714	{
 715		$this->_resetErrorStatus (  );
 716		try 
 717		{
 718			$tmpArgs = func_get_args (  );
 719			$arrArgs = $this->_mergeArgs ( array ( self::QUEUE_NAME, self::TOKEN, self::DESTINATION ), $tmpArgs );
 720			$arrArgs [ self::METHOD ] = 'cancel';
 721			return $this->_commonProcess ( $arrArgs, array ( self::QUEUE_NAME, self::TOKEN, self::DESTINATION ) );
 722		} 
 723		catch ( Exception $ex ) 
 724		{
 725			$this->_bcmsExceptionHandler ( $ex );
 726			return false; 
 727		}
 728	}
 729
 730	/**
 731	 * publishMessage
 732	 *  
 733	 * 用户关注:是
 734	 * 服务类方法,向一个队列中发送一条消息
 735	 * 
 736	 * @access public
 737	 * @param string $queueName 要发送消息的队列名
 738	 * @param binary $message 要发送的消息,支持任何类型的消息
 739	 * @param array $optional 可选参数数组,可以设置的非必须参数的key包括:Bcms::VERSION
 740	 * @return 成功:包含执行结果的php数组;失败:false
 741	 * 
 742	 * @version 1.2.0
 743	 */
 744	public function publishMessage ( $queueName, $message, $optional = array (  ) ) 
 745	{
 746		$this->_resetErrorStatus (  );
 747		try 
 748		{
 749			$tmpArgs = func_get_args (  );
 750			$arrArgs = $this->_mergeArgs ( array ( self::QUEUE_NAME, self::MESSAGE ), $tmpArgs );
 751			$arrArgs [ self::METHOD ] = 'publish';
 752			return $this->_commonProcess ( $arrArgs, array ( self::QUEUE_NAME, self::MESSAGE ) );
 753		} 
 754		catch ( Exception $ex ) 
 755		{
 756			$this->_bcmsExceptionHandler ( $ex );
 757			return false; 
 758		}
 759	}
 760
 761	/**
 762	 * publishMessages
 763	 *  
 764	 * 用户关注:是
 765	 * 服务类方法,向一个队列中批量发送消息
 766	 * 
 767	 * @access public
 768	 * @param string $queueName 要发送消息的队列名
 769	 * @param binary $message 要发送的消息,以json格式给出,必须utf-8编码,否则服务器会报错,参数错误
 770	 * @param array $optional 可选参数数组,可以设置的非必须参数的key包括:Bcms::VERSION
 771	 * @return 成功:包含执行结果的php数组;失败:false
 772	 * 
 773	 * @version 1.2.0
 774	 */
 775	public function publishMessages ( $queueName, $message, $optional = array (  ) ) 
 776	{
 777		$this->_resetErrorStatus (  );
 778		try 
 779		{
 780			$tmpArgs = func_get_args (  );
 781			$arrArgs = $this->_mergeArgs ( array ( self::QUEUE_NAME, self::MESSAGE ), $tmpArgs );
 782			$arrArgs [ self::METHOD ] = 'publishes';
 783			$arrArgs [ self::MESSAGE ] = $this->_arrayToString ( $arrArgs [ self::MESSAGE ] );
 784			return $this->_commonProcess ( $arrArgs, array ( self::QUEUE_NAME, self::MESSAGE ) );
 785		} 
 786		catch ( Exception $ex ) 
 787		{
 788			$this->_bcmsExceptionHandler ( $ex );
 789			return false; 
 790		}
 791	}
 792
 793	/**
 794	 * fetchMessage
 795	 *  
 796	 * 用户关注:是
 797	 * 服务类方法,从一个队列中批量获取消息
 798	 * 
 799	 * @access public
 800	 * @param string $queueName 要获取哪个队列的消息
 801	 * @param array $optional 可选参数数组,可以设置的非必须参数的key包括:Bcms::VERSION,Bcms::MSG_ID、Bcms::FETCH_NUM
 802	 * 需要说明的是:对于多模式队列,必须指定Bcms::MSG_ID,对于单模式队列,不能指定MSG_ID
 803	 * @return 成功:包含执行结果的php数组;失败:false
 804	 * 
 805	 * @version 1.2.0
 806	 */
 807	public function fetchMessage ( $queueName, $optional = array (  ) ) 
 808	{
 809		$this->_resetErrorStatus (  );
 810		try 
 811		{
 812			$tmpArgs = func_get_args (  );
 813			$arrArgs = $this->_mergeArgs ( array ( self::QUEUE_NAME ), $tmpArgs );	
 814			$arrArgs [ self::METHOD ] = 'fetch';
 815			return $this->_commonProcess ( $arrArgs, array ( self::QUEUE_NAME ) );
 816		} 
 817		catch ( Exception $ex ) 
 818		{
 819			$this->_bcmsExceptionHandler ( $ex );
 820			return false; 
 821		}
 822	}
 823
 824	/**
 825	 * mail
 826	 *  
 827	 * 用户关注:是
 828	 * 服务类方法,向一个队列中发送邮件
 829	 * 
 830	 * @access public
 831	 * @param string $queueName 要发送邮件的队列名
 832	 * @param string $message 要发送的邮件正文
 833	 * @param string $address 要发往哪些地址,以json格式给出,必须utf-8编码,否则服务器会报参数错误
 834	 * @param array $optional 可选参数数组,可以设置的非必须参数的key包括:Bcms::VERSION、Bcms::FROM、Bcms::MAIL_SUBJECT
 835	 * @return 成功:包含执行结果的php数组;失败:false
 836	 * 
 837	 * @version 1.2.0
 838	 */
 839	public function mail ( $queueName, $message, $address, $optional = array (  ) ) 
 840	{
 841		$this->_resetErrorStatus (  );
 842		try 
 843		{
 844			$tmpArgs = func_get_args (  );
 845			$arrArgs = $this->_mergeArgs ( array ( self::QUEUE_NAME, self::MESSAGE, self::ADDRESS ), $tmpArgs );
 846			$arrArgs [ self::METHOD ] = 'mail';
 847			$arrArgs [ self::ADDRESS ] = $this->_arrayToString ( $arrArgs [ self::ADDRESS ] );
 848			return $this->_commonProcess ( $arrArgs, array ( self::QUEUE_NAME, self::MESSAGE, self::ADDRESS ) );
 849		} 
 850		catch ( Exception $ex ) 
 851		{
 852			$this->_bcmsExceptionHandler ( $ex );
 853			return false; 
 854		}
 855	}
 856
 857	/**
 858	 * sms
 859	 *  
 860	 * 用户关注:是
 861	 * 服务类方法,向一个队列中发送短信
 862	 * 
 863	 * @access public
 864	 * @param string $queueName 要发送邮件的队列名字
 865	 * @param string $message 要发送的短信内容
 866	 * @param string $address 要发往哪些手机号,以json格式给出,必须utf-8编码,否则服务器会报参数错误
 867	 * @param array $optional 可选参数数组,可以设置的非必须参数的key包括:Bcms::VERSION
 868	 * @return 成功:包含执行结果的php数组;失败:false
 869	 * 
 870	 * @version 1.2.0
 871	 */
 872	public function sms ( $queueName, $message, $address, $optional = array (  ) ) 
 873	{
 874		$this->_resetErrorStatus (  );
 875		try 
 876		{
 877			$tmpArgs = func_get_args (  );
 878			$arrArgs = $this->_mergeArgs ( array ( self::QUEUE_NAME, self::MESSAGE, self::ADDRESS ), $tmpArgs );
 879			$arrArgs [ self::METHOD ] = 'sms';
 880			$arrArgs [ self::ADDRESS ] = $this->_arrayToString ( $arrArgs [ self::ADDRESS ] );
 881			return $this->_commonProcess ( $arrArgs, array ( self::QUEUE_NAME, self::MESSAGE, self::ADDRESS ) );
 882		} 
 883		catch ( Exception $ex ) 
 884		{
 885			$this->_bcmsExceptionHandler ( $ex );
 886			return false; 
 887		}
 888	}
 889
 890	/**
 891	 * deleteMessageById
 892	 *  
 893	 * 用户关注:是
 894	 * 服务类方法,删除一个队列中的一条消息
 895	 * 
 896	 * @access public
 897	 * @param string $queueName 要删除消息的队列名
 898	 * @param int $msgId 要删除的消息ID号
 899	 * @param array $optional 可选参数数组,可以设置的非必须参数的key包括:Bcms::VERSION
 900	 * @return 成功:包含执行结果的php数组;失败:false
 901	 * 
 902	 * @version 1.2.0
 903	 */
 904	public function deleteMessageById ( $queueName, $msgId, $optional = array (  ) ) 
 905	{
 906		$this->_resetErrorStatus (  );
 907		try 
 908		{
 909			$tmpArgs = func_get_args (  );
 910			$arrArgs = $this->_mergeArgs ( array ( self::QUEUE_NAME, self::MSG_ID ), $tmpArgs );
 911			$arrArgs [ self::METHOD ] = 'deletemessagebyid';
 912			return $this->_commonProcess ( $arrArgs, array ( self::QUEUE_NAME, self::MSG_ID ) );
 913		} 
 914		catch ( Exception $ex ) 
 915		{
 916			$this->_bcmsExceptionHandler ( $ex );
 917			return false; 
 918		}
 919	}
 920
 921	/**
 922	 * deleteMessagesByIds
 923	 *  
 924	 * 用户关注:是
 925	 * 服务类方法,批量从一个队列中删除消息,最多支持一次删除10个消息
 926	 * 
 927	 * @access public
 928	 * @param string $queueName 要删除消息的队列名
 929	 * @param string $msgId 要删除消息的ID号,以json格式给出,必须utf-8编码,否则服务器会报参数错误
 930	 * @param array $optional 可选参数数组,可以设置的非必须参数的key包括:Bcms::VERSION
 931	 * @return 成功:包含执行结果的php数组;失败:false
 932	 * 
 933	 * @version 1.2.0
 934	 */
 935	public function deleteMessagesByIds ( $queueName, $msgId, $optional = array (  ) ) 
 936	{
 937		$this->_resetErrorStatus (  );
 938		try 
 939		{
 940			$tmpArgs = func_get_args (  );
 941			$arrArgs = $this->_mergeArgs ( array ( self::QUEUE_NAME, self::MSG_ID ), $tmpArgs );
 942			$arrArgs [ self::METHOD ] = 'deletemessagesbyids';
 943			return $this->_commonProcess ( $arrArgs, array ( self::QUEUE_NAME, self::MSG_ID ) );
 944		} 
 945		catch ( Exception $ex ) 
 946		{
 947			$this->_bcmsExceptionHandler ( $ex );
 948			return false; 
 949		}
 950	}
 951
 952	/**
 953     * confirmMessage
 954     *  
 955     * 用户关注:否
 956     * 服务类方法,确认一个消息已经被使用(内部方法,外部用户无需关注)
 957     * 
 958     * @access public
 959     * @param string $queueName 要确认哪个消息的队列
 960     * @param string $msgId 要确认消息的ID号
 961	 * @param string $msgTimeout 要确认消息的超时时间戳
 962     * @param array $optional 可选参数数组,可以设置的非必须参数的key包括:Bcms::VERSION
 963     * @return 成功:包含执行结果的php数组;失败:false
 964     * 
 965     * @version 1.2.0
 966     */
 967    public function confirmMessage ( $queueName, $msgId, $msgTimeout, $optional = array (  ) )
 968    {   
 969        $this->_resetErrorStatus (  );
 970        try
 971        {   
 972            $tmpArgs = func_get_args (  );
 973            $arrArgs = $this->_mergeArgs ( array ( self::QUEUE_NAME, self::MSG_ID, self::MSG_TIMEOUT ), $tmpArgs );
 974            $arrArgs [ self::METHOD ] = 'confirmmsg';
 975            return $this->_commonProcess ( $arrArgs, array ( self::QUEUE_NAME, self::MSG_ID, self::MSG_TIMEOUT ) );
 976        }
 977        catch ( Exception $ex )
 978        {   
 979            $this->_bcmsExceptionHandler ( $ex );
 980            return false;
 981        }
 982    }
 983
 984	/**
 985     * getMaxMsgId
 986     *  
 987     * 用户关注:是
 988     * 服务类方法,获取一个队列中最大的消息ID号
 989     * 
 990     * @access public
 991     * @param string $queueName 要获取哪个队列的最大消息ID号
 992     * @param array $optional 可选参数数组,可以设置的非必须参数的key包括:Bcms::VERSION
 993     * @return 成功:包含执行结果的php数组;失败:false
 994     * 
 995     * @version 1.2.0
 996     */
 997    public function getMaxMsgId ( $queueName, $optional = array (  ) )
 998    {   
 999        $this->_resetErrorStatus (  );
1000        try
1001        {   
1002            $tmpArgs = func_get_args (  );
1003            $arrArgs = $this->_mergeArgs ( array ( self::QUEUE_NAME ), $tmpArgs );
1004            $arrArgs [ self::METHOD ] = 'getmaxmsgid';
1005            return $this->_commonProcess ( $arrArgs, array ( self::QUEUE_NAME ) );
1006        }
1007        catch ( Exception $ex )
1008        {   
1009            $this->_bcmsExceptionHandler ( $ex );
1010            return false;
1011        }
1012    }	
1013
1014	/**
1015	 * __construct
1016	 *  
1017	 * 用户关注:是
1018	 * 
1019	 * 对象构造方法,用户可以传入$accessKey、$secretKey、$host进行初始化
1020	 * 如果用户没有传入$accessKey、$secretKey、$host,这三个参数可以其他几个地方予以设置,如下:
1021	 * 1. 在调用SDK时,在$optional参数中设置,如$optional[Cron::SECRET_KEY] = 'my_secret_key',影响范围:本次SDK调用
1022	 * 2. 调用SDK对象的setXXX系列函数进行设置,如$bcms->setSecretKey('my_secret_key'),影响范围:自设置之后起的每次SDK调用
1023	 * 3. 全局变量,如g_secretKey = 'my_secret_key',影响范围:当1、2均无法获取到$accessKey、$secretKey、$host时,会从全局变量中获取
1024	 * 说明:SDK获取$accessKey、$secretKey、$host的优先级是:
1025	 * 1. SDK的$optional参数
1026	 * 2. Bcms对象的属性(通过初始化参数或setXXX系列函数指定)
1027	 * 3. 全局变量
1028	 * 
1029	 * @access public
1030	 * @param string $accessKey 用户在管理平台上申请到的accessKey
1031	 * @param string $secretKey 用户在管理平台上申请到的SecretKey
1032	 * @param string $host 百度定时服务API的域名,不包括http://
1033	 * @throws BcmsException 如果出错,则抛出异常,异常号是self::BCMS_SDK_INIT_FAIL
1034	 * 
1035	 * @version 1.2.0
1036	 */
1037	public function __construct ( $accessKey = NULL, $secretKey = NULL, $host = NULL, $arr_curlOpts = array() ) 
1038	{	
1039		if( is_null ( $accessKey ) || $this->_checkString ( $accessKey, 1, 64 ) )
1040		{
1041			$this->_clientId = $accessKey;
1042		}
1043		else 
1044		{
1045			throw new BcmsException ( "invalid param - access key [ ${accessKey} ] , which must be a 1 - 64 length string", self::BCMS_SDK_INIT_FAIL );
1046		}
1047
1048		if( is_null ( $secretKey ) || $this->_checkString ( $secretKey, 1, 64 ) )
1049		{
1050			$this->_clientSecret = $secretKey;
1051		}
1052		else 
1053		{
1054			throw new BcmsException ( "invalid param - secret key [ ${secretKey} ] , which must be a 1 - 64 length string", self::BCMS_SDK_INIT_FAIL );
1055		}
1056
1057		if( is_null ( $host ) || $this->_checkString ( $host, 1, 1024 ) )
1058		{
1059			if ( !is_null ( $host ) )
1060			{
1061				$this->_host = $host;
1062			}
1063		}
1064		else 
1065		{
1066			throw new BcmsException ( "invalid param - host [ ${host} ] , which must be a 1 - 1024 length string", self::BCMS_SDK_INIT_FAIL );
1067		}
1068		
1069		if ( !is_array($arr_curlOpts) )
1070		{
1071			throw new BcmsException( 'invalid param - arr_curlopt is not an array [' . print_r( $arr_curlOpts, true ) . ']', self::BCMS_SDK_INIT_FAIL);
1072		}
1073		foreach ( $arr_curlOpts as $k => $v )
1074		{
1075			$this->_curlOpts [ $k ] = $v;
1076		}
1077		$this->_resetErrorStatus();
1078	}
1079
1080	/**
1081	 * _checkString
1082	 *  
1083	 * 用户关注:否
1084	 * 
1085	 * 检查参数是否是一个大于等于$min且小于等于$max的字符串
1086	 * 
1087	 * @access private
1088	 * @param string $str 要检查的字符串
1089	 * @param int $min 字符串最小长度
1090	 * @param int $max 字符串最大长度
1091	 * @return 成功:true;失败:false
1092	 * 
1093	 * @version 1.2.0
1094	 */
1095	private function _checkString ( $str, $min, $max )
1096	{
1097		if ( is_string ( $str ) && strlen ( $str ) >= $min && strlen ( $str ) <= $max )
1098		{
1099			return true;
1100		}
1101		return false;
1102	}
1103
1104	/**
1105	 * _get_ak_sk_host
1106	 * 
1107	 * 用户关注:否
1108	 * 获取AK/SK/HOST的统一过程函数
1109	 * 
1110	 * @access private
1111	 * @param array $opt 参数数组
1112	 * @param string $opt_key 参数数组的key
1113	 * @param string $member 对象成员
1114	 * @param string $g_key 全局变量的名字
1115	 * @param string $env_key 环境变量的名字
1116	 * @param int $min 字符串最短值
1117	 * @param int $max 字符串最长值
1118	 * @throws BcmsException 如果出错,则抛出BcmsException异常,异常类型为self::BCMS_SDK_PARAM
1119	 * 
1120	 * @version 1.2.0
1121	 */
1122	private function _get_ak_sk_host ( &$opt, $opt_key, $member, $g_key, $env_key, $min, $max )
1123	{
1124		$dis = array ( 'client_id' => 'access_key' , 'client_secret' => 'secret_key', 'host' => 'host' );
1125		global $$g_key;
1126		if ( isset ( $opt [ $opt_key ] ) )
1127		{
1128			if ( ! $this->_checkString ( $opt [ $opt_key ], $min, $max ) )
1129			{
1130				throw new BcmsException ( 'invalid ' . $dis [ $opt_key ] . ' in $optinal ( ' . $opt [ $opt_key ] . ' ) , which must be a ' . $min . ' - ' . $max . ' length string', self::BCMS_SDK_PARAM );
1131			}
1132			return ;
1133		}
1134		if ( $this->_checkString ( $member, $min, $max ) )
1135		{
1136			$opt [ $opt_key ] = $member;
1137			return ;
1138		}
1139		if ( isset ( $$g_key ) )
1140		{
1141			if ( ! $this->_checkString ( $$g_key, $min, $max ) )
1142			{
1143				throw new BcmsException ( 'invalid ' . $g_key . ' in global area ( ' . $$g_key . ' ) , which must be a ' . $min . ' - ' . $max . ' length string', self::BCMS_SDK_PARAM );
1144			}
1145			$opt [ $opt_key ] = $$g_key;	
1146			return ;
1147		}
1148		
1149		if ( false !== getenv ( $env_key ) )
1150		{
1151			if ( ! $this->_checkString ( getenv ( $env_key ) , $min, $max ) )
1152			{
1153				throw new BcmsException ( 'invalid ' . $env_key . ' in environment variable ( ' . getenv ( $env_key ) . ' ) , which must be a ' . $min . ' - ' . $max . ' length string', self::BCMS_SDK_PARAM );
1154			}
1155			$opt [ $opt_key ] = getenv ( $env_key ) ;
1156			return ;
1157		}
1158	
1159		if ( $opt_key === self::HOST )
1160		{
1161			$opt [ $opt_key ] = self::DEFAULT_HOST;
1162			return ;
1163		}
1164		throw new BcmsException ( 'no param ( ' . $dis [ $opt_key ] . ' ) was found', self::BCMS_SDK_PARAM );
1165	}
1166
1167	/**
1168	 * _adjustOpt
1169	 *   
1170	 * 用户关注:否
1171	 * 
1172	 * 参数调整方法
1173	 * 
1174	 * @access private
1175	 * @param array $opt 参数数组
1176	 * @throws BcmsException 如果出错,则抛出异常,异常号为 self::BCMS_SDK_PARAM
1177	 * 
1178	 * @version 1.2.0
1179	 */
1180	private function _adjustOpt ( &$opt ) {
1181		if ( ! isset ( $opt ) || empty ( $opt ) || ! is_array ( $opt ) ) 
1182		{
1183			throw new BcmsException ( 'no params are set', self::BCMS_SDK_PARAM );
1184		}
1185		if ( ! isset ( $opt [ self::TIMESTAMP ] ) ) 
1186		{
1187			$opt [ self::TIMESTAMP ] = time (  );
1188		}
1189
1190		$this->_get_ak_sk_host ( $opt, self::ACCESS_KEY, $this->_clientId, 'g_accessKey', 'HTTP_BAE_ENV_AK', 1, 64 );
1191		$this->_get_ak_sk_host ( $opt, self::SECRET_KEY, $this->_clientSecret, 'g_secretKey', 'HTTP_BAE_ENV_SK', 1, 64 );
1192		$this->_get_ak_sk_host ( $opt, self::HOST, $this->_host, 'g_host', 'HTTP_BAE_ENV_ADDR_BCMS', 1, 1024 );
1193	}
1194
1195	/**
1196	 * _bcmsGetSign
1197	 *   
1198	 * 用户关注:否
1199	 * 
1200	 * 签名方法
1201	 * 
1202	 * @access private
1203	 * @param array $opt 参数数组
1204	 * @param array $arrContent 可以加入签名的参数数组,返回值
1205	 * @param array $arrNeed 必须的参数
1206	 * @throws BcmsException 如果出错,则抛出异常,异常号为self::BCMS_SDK_PARAM
1207	 * 
1208	 * @version 1.2.0
1209	 */
1210	private function _bcmsGetSign ( &$opt, &$arrContent, $arrNeed = array (  ) ) {
1211		$arrData = array (  );
1212		$arrContent = array (  );
1213		$arrNeed [ ] = self::TIMESTAMP;
1214		$arrNeed [ ] = self::METHOD;
1215		$arrNeed [ ] = self::ACCESS_KEY;
1216		if ( isset ( $opt [ self::EXPIRES ] ) ) 
1217		{
1218			$arrNeed [ ] = self::EXPIRES;
1219		}
1220		if ( isset ( $opt [ self::VERSION ] ) ) 
1221		{
1222			$arrNeed [ ] = self::VERSION;
1223		}
1224		$arrExclude = array ( self::QUEUE_NAME, self::HOST, self::SECRET_KEY );
1225		foreach ( $arrNeed as $key ) 
1226		{
1227			if ( ! isset ( $opt [ $key ] ) || ( ! is_integer( $opt [ $key ] ) && empty ( $opt [ $key ] ) ) ) 
1228			{
1229				throw new BcmsException ( "lack param (${key})", self::BCMS_SDK_PARAM );
1230			}
1231			if ( in_array ( $key, $arrExclude ) ) 
1232			{
1233				continue;
1234			}
1235			$arrData [ $key ] = $opt [ $key ] ;
1236			$arrContent [ $key ] = $opt [ $key ] ;
1237		}
1238		foreach ( $opt as $key => $value ) 
1239		{
1240			if ( ! in_array ( $key, $arrNeed ) && ! in_array ( $key, $arrExclude ) ) 
1241			{
1242				$arrData [ $key ] = $value;
1243				$arrContent [ $key ] = $value;
1244			}
1245		}
1246		ksort ( $arrData );
1247		$url = 'http://' . $opt [ self::HOST ] . '/rest/2.0/' . self::PRODUCT . '/';
1248		if ( isset($opt [ self::QUEUE_NAME ] ) && !is_null ( $opt [ self::QUEUE_NAME ] ) )
1249		{
1250			$url .= $opt [ self::QUEUE_NAME ] ;
1251			$arrContent [ self::QUEUE_NAME ] = $opt [ self::QUEUE_NAME ] ;
1252		}
1253		else if ( isset($opt [ self::UID ] ) && !is_null ( $opt [ self::UID ] ) )
1254		{
1255			$url .= $opt [ self::UID ] ;
1256		}
1257		else 
1258		{
1259			$url .= 'queue';
1260		}
1261		$basicString = 'POST' . $url;
1262		foreach ( $arrData as $key => $value ) 
1263		{
1264			$basicString .= $key . '=' . $value;
1265		}
1266		$basicString .= $opt [ self::SECRET_KEY ] ;
1267		$sign = md5 ( urlencode ( $basicString ) );
1268		$arrContent [ self::SIGN ] = $sign;
1269		$arrContent [ self::HOST ] = $opt [ self::HOST ];
1270	}
1271
1272	/**
1273	 * _baseControl
1274	 *   
1275	 * 用户关注:否
1276	 * 
1277	 * 网络交互方法
1278	 * 
1279	 * @access private
1280	 * @param array $opt 参数数组
1281	 * @throws BcmsException 如果出错,则抛出异常,错误号为self::BCMS_SDK_SYS
1282	 * 
1283	 * @version 1.2.0
1284	 */
1285	private function _baseControl ( $opt ) 
1286	{
1287		$content = '';
1288		$resource = 'queue';
1289		if ( isset($opt [ self::QUEUE_NAME ] ) && !is_null ( $opt [ self::QUEUE_NAME ] ) )
1290		{
1291			$resource = $opt [ self::QUEUE_NAME ] ;
1292			unset( $opt [ self::QUEUE_NAME ] );
1293		}
1294		else if ( isset($opt [ self::UID ] ) && !is_null ( $opt [ self::UID ] ) )
1295		{
1296			$resource = $opt [ self::UID ] ;
1297		}
1298		$host = $opt [ self::HOST ];
1299		unset ( $opt [ self::HOST ] );
1300		foreach ( $opt as $k => $v ) 
1301		{
1302			if ( is_string ( $v ) )
1303			{
1304				$v = urlencode ( $v );
1305			}
1306			$content .= $k . '=' . $v . '&';
1307		}
1308		$content = substr ( $content, 0, strlen ( $content ) - 1 );
1309		$url = 'http://' . $host . '/rest/2.0/' . self::PRODUCT . '/';
1310		$url .= $resource;
1311		$request = new RequestCore ( $url );
1312		$headers [ 'Content-Type' ] = 'application/x-www-form-urlencoded';
1313		$headers [ 'User-Agent' ] = 'Baidu Message Service Phpsdk Client';
1314		foreach ( $headers as $headerKey => $headerValue ) 
1315		{
1316			$headerValue = str_replace ( array ( "\r", "\n" ), '', $headerValue );
1317			if ( $headerValue !== '' ) 
1318			{
1319				$request->add_header ( $headerKey, $headerValue );
1320			}
1321		}
1322		$request->set_method ( 'POST' );
1323		$request->set_body ( $content );
1324		if ( is_array( $this->_curlOpts ) )
1325		{
1326			$request->set_curlOpts($this->_curlOpts);
1327		}
1328		$request->send_request (  );
1329		return new ResponseCore ( $request->get_response_header (  ), $request->get_response_body (  ), $request->get_response_code (  ) );
1330	}
1331
1332	/**
1333	 * _bcmsExceptionHandler
1334	 *   
1335	 * 用户关注:否
1336	 * 
1337	 * 异常处理方法
1338	 * 
1339	 * @access private
1340	 * @param Excetpion $ex 异常处理函数,主要是填充Bcms对象的错误状态信息
1341	 * 
1342	 * @version 1.2.0
1343	 */
1344	private function _bcmsExceptionHandler ( $ex )
1345	{
1346		$tmpCode = $ex->getCode( );
1347		if( 0 === $tmpCode )
1348		{
1349			$tmpCode = self::BCMS_SDK_SYS;
1350		}
1351
1352		$this->errcode = $tmpCode;
1353		if( $this->errcode >= 30000 )
1354		{
1355			$this->errmsg = $ex->getMessage (  );
1356		}
1357		else 
1358		{	
1359			$this->errmsg = $this->_arrayErrorMap [ $this->errcode ] . ', detail info [ ' . $ex->getMessage (  ) . ', break point: ' . $ex->getFile (  ) . ': ' . $ex->getLine (  ) . ' ] .';
1360		}
1361	}
1362
1363	/**
1364	 * _commonProcess
1365	 *   
1366	 * 用户关注:否
1367	 * 
1368	 * 所有服务类SDK方法的通用过程
1369	 * 
1370	 * @access private
1371	 * @param array $paramOpt 参数数组
1372	 * @param array $arrNeed 必须的参数KEY
1373	 * @throws BcmsException 如果出错,则抛出异常
1374	 * 
1375	 * @version 1.2.0
1376	 */
1377	private function _commonProcess ( $paramOpt = NULL, $arrNeed = array (  ) )
1378	{
1379		$this->_adjustOpt ( $paramOpt );
1380		$arrContent = array (  );
1381		$this->_bcmsGetSign ( $paramOpt, $arrContent, $arrNeed );
1382		$ret = $this->_baseControl ( $arrContent );
1383		if ( empty ( $ret ) )
1384		{
1385			throw new BcmsException ( 'base control returned empty object', self::BCMS_SDK_SYS );
1386		}
1387		if ( $ret->isOK (  ) )
1388		{
1389			$result = json_decode ( $ret->body, true );
1390			if ( is_null ( $result ) )
1391			{
1392				throw new BcmsException ( $ret->body, self::BCMS_SDK_HTTP_STATUS_OK_BUT_RESULT_ERROR );
1393			}
1394			$this->_requestId = $result [ 'request_id' ];
1395			return $result;
1396		}
1397		$result = json_decode ( $ret->body, true );
1398		if ( is_null ( $result ) )
1399		{
1400			throw new BcmsException ( 'ret body: ' . $ret->body, self::BCMS_SDK_HTTP_STATUS_ERROR_AND_RESULT_ERROR );
1401		}
1402		$this->_requestId = $result [ 'request_id' ];
1403		throw new BcmsException ( $result [ 'error_msg' ], $result [ 'error_code' ] );
1404	}
1405
1406	/**
1407	 * _mergeArgs
1408	 *   
1409	 * 用户关注:否
1410	 * 
1411	 * 合并传入的参数到一个数组中,便于后续处理
1412	 * 
1413	 * @access private
1414	 * @param array $arrNeed 必须的参数KEY
1415	 * @param array $tmpArgs 参数数组
1416	 * @throws BcmsException 如果出错,则抛出异常,异常号为self::Bcms_SDK_PARAM 
1417	 * 
1418	 * @version 1.2.0
1419	 */
1420	private function _mergeArgs ( $arrNeed, $tmpArgs )
1421	{
1422		$arrArgs = array (  );
1423		if ( 0 == count ( $arrNeed ) && 0 == count ( $tmpArgs ) )
1424		{
1425			return $arrArgs;
1426		}
1427		if ( count ( $tmpArgs ) - 1 != count ( $arrNeed ) && count ( $tmpArgs ) != count ( $arrNeed ) )
1428		{ 
1429			$keys = ' ( ';
1430					foreach ( $arrNeed as $key )
1431					{
1432					$keys .= $key .= ', ';
1433					}
1434					if( $keys [ strlen($keys) - 1 ] === ' ' && ',' === $keys [ strlen($keys) - 2 ] )
1435					{
1436					$keys = substr($keys, 0, strlen($keys) - 2);
1437					}
1438					$keys .= ' ) ';
1439			throw new Exception ( 'invalid sdk params, params' . $keys . 'are needed', self::BCMS_SDK_PARAM );
1440		}
1441		if ( count ( $tmpArgs ) - 1 == count ( $arrNeed )  && ! is_array ( $tmpArgs [ count ( $tmpArgs ) - 1 ] ) )
1442		{
1443			throw new Exception ( 'invalid sdk params, optional param must be an array', self::BCMS_SDK_PARAM );
1444		}
1445
1446		$idx = 0;
1447		foreach ( $arrNeed as $key )
1448		{   
1449			if ( ! is_integer( $tmpArgs [ $idx ] ) && empty ( $tmpArgs [ $idx ] ) )
1450			{   
1451				throw new Exception ( "lack param (${key})", self::BCMS_SDK_PARAM );
1452			}
1453			$arrArgs [ $key ] = $tmpArgs [ $idx ] ;
1454			$idx += 1;
1455		}
1456		if ( isset($tmpArgs [ $idx ] ) )
1457		{
1458			foreach ( $tmpArgs [ $idx ] as $key => $value )
1459			{   
1460				if ( ! array_key_exists ( $key, $arrArgs ) && ( is_integer($value) || ! empty ( $value ) ) )
1461				{   
1462					$arrArgs [ $key ] = $value;
1463				}
1464			}
1465		}
1466		if ( isset ( $arrArgs [ self::QUEUE_NAME ] ) )
1467		{
1468			$arrArgs [ self::QUEUE_NAME ] = urlencode ( $arrArgs [ self::QUEUE_NAME ] );
1469		}
1470		return $arrArgs;
1471	}
1472
1473	/**
1474	 * _resetErrorStatus
1475	 *   
1476	 * 用户关注:否
1477	 * 
1478	 * 恢复对象的错误状态,每次调用服务类方法时,由服务类方法自动调用该方法
1479	 * 
1480	 * @access private
1481	 * 
1482	 * @version 1.2.0
1483	 */
1484	private function _resetErrorStatus (  )
1485	{
1486		$this->errcode = 0;
1487		$this->errmsg = $this->_arrayErrorMap [ $this->errcode ] ;
1488		$this->_requestId = 0;
1489	}
1490
1491	/**
1492	 * _arrayToString
1493	 * 
1494	 * 用户关注: 否
1495	 *
1496	 * 将array类型的对象转换成字符串
1497	 * 
1498	 * @access private
1499	 * @param $arr 要转换array
1500     * @throws BcmsException 如果出错,则抛出异常,异常号为self::Bcms_SDK_PARAM 
1501     * 
1502     * @version 1.2.0
1503	*/
1504	function _arrayToString ( $arr )
1505	{
1506    	if ( ! is_array ( $arr ) )
1507    	{
1508        	return $arr;
1509    	}
1510    	if( 0 === count ( $arr ) )
1511    	{
1512        	return '[]';
1513    	}
1514    	$ret = '[';
1515    	foreach ( $arr as $v )
1516    	{
1517        	$ret .= '"' . $v . '", ';
1518    	}
1519    	$ret = substr ( $ret, 0, strlen($ret) - 2 );
1520    	$ret .= ']';
1521
1522    	return $ret;
1523	}
1524};
1525?>