123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145 |
- <?php
- use Aliyun\Api\Msg\Request\V20170525\QueryTokenForMnsQueueRequest;
- use Aliyun\Core\Config;
- use AliyunMNS\Client;
- use Aliyun\Core\Profile\DefaultProfile;
- use Aliyun\Core\DefaultAcsClient;
- use Aliyun\Core\Exception\ClientException;
- use Aliyun\Core\Exception\ServerException;
- // 加载区域结点配置
- Config::load();
- /**
- * 接收云通信消息的临时token
- *
- * @property array tokenMap
- * @property int bufferTime 过期时间小于2分钟则重新获取,防止服务器时间误差
- * @property string mnsAccountEndpoint
- * @property \Aliyun\Core\DefaultAcsClient acsClient
- */
- class TokenGetterForAlicom
- {
- /**
- * TokenGetterForAlicom constructor.
- *
- * @param string $accountId AccountId
- * @param string $accessKeyId AccessKeyId
- * @param string $accessKeySecret AccessKeySecret
- */
- public function __construct($accountId, $accessKeyId, $accessKeySecret)
- {
- $endpointName = "cn-hangzhou";
- $regionId = "cn-hangzhou";
- $productName = "Dybaseapi";
- $domain = "dybaseapi.aliyuncs.com";
- $this->tokenMap = [];
- $this->bufferTime = 2 * 60;
- DefaultProfile::addEndpoint($endpointName, $regionId, $productName, $domain);
- $profile = DefaultProfile::getProfile($regionId, $accessKeyId, $accessKeySecret);
- $this->acsClient = new DefaultAcsClient($profile);
- $this->mnsAccountEndpoint = $this->getAccountEndpoint($accountId, $regionId);
- }
- /**
- * 配置获取AccountEndPoint
- *
- * @param string $accountId AccountId
- * @param string $region Region
- * @param bool $secure 是否启用https
- * @param bool $internal
- * @param bool $vpc
- * @return string <ul>
- * <li>http(s)://{AccountId}.mns.cn-beijing.aliyuncs.com</li>
- * <li>http(s)://{AccountId}.mns.cn-beijing-internal.aliyuncs.com</li>
- * <li>http(s)://{AccountId}.mns.cn-beijing-internal-vpc.aliyuncs.com</li>
- * </ul>
- */
- private function getAccountEndpoint($accountId, $region, $secure=false, $internal=false, $vpc=false)
- {
- $protocol = $secure ? 'https' : 'http';
- $realRegion = $region;
- if ($internal) {
- $realRegion .= '-internal';
- }
- if ($vpc) {
- $realRegion .= '-vpc';
- }
- return "$protocol://$accountId.mns.$realRegion.aliyuncs.com";
- }
- /**
- * 远程取Token
- *
- * @param string $messageType 消息订阅类型 SmsReport | SmsUp
- * @return TokenForAlicom|bool
- */
- public function getTokenFromRemote($messageType, $queueName)
- {
- $request = new QueryTokenForMnsQueueRequest();
- $request->setMessageType($messageType);
- $request->setQueueName($queueName);
- try {
- $response = $this->acsClient->getAcsResponse($request);
- // print_r($response);
- $tokenForAlicom = new TokenForAlicom();
- $tokenForAlicom->setMessageType($messageType);
- $tokenForAlicom->setToken($response->MessageTokenDTO->SecurityToken);
- $tokenForAlicom->setTempAccessKey($response->MessageTokenDTO->AccessKeyId);
- $tokenForAlicom->setTempSecret($response->MessageTokenDTO->AccessKeySecret);
- $tokenForAlicom->setExpireTime($response->MessageTokenDTO->ExpireTime);
- // print_r($tokenForAlicom);
- return $tokenForAlicom;
- }
- catch (ServerException $e) {
- print_r($e->getErrorCode());
- print_r($e->getErrorMessage());
- }
- catch (ClientException $e) {
- print_r($e->getErrorCode());
- print_r($e->getErrorMessage());
- }
- return false;
- }
- /**
- * 先从tokenMap中取,如果不存在则远程取Token并存入tokenMap
- *
- * @param string $messageType 消息订阅类型 SmsReport | SmsUp
- * @param string $queueName 在云通信页面开通相应业务消息后,就能在页面上获得对应的queueName<br/>(e.g. Alicom-Queue-xxxxxx-SmsReport)
- * @return TokenForAlicom|bool
- */
- public function getTokenByMessageType($messageType, $queueName)
- {
- $tokenForAlicom = null;
- if(isset($this->tokenMap[$messageType])) {
- $tokenForAlicom = $this->tokenMap[$messageType];
- }
- if(null == $tokenForAlicom || strtotime($tokenForAlicom->getExpireTime()) - time() > $this->bufferTime)
- {
- $tokenForAlicom =$this->getTokenFromRemote($messageType, $queueName);
- $client = new Client(
- $this->mnsAccountEndpoint,
- $tokenForAlicom->getTempAccessKey(),
- $tokenForAlicom->getTempSecret(),
- $tokenForAlicom->getToken()
- );
- $tokenForAlicom->setClient($client);
- $tokenForAlicom->setQueue($queueName);
- $this->tokenMap[$messageType] = $tokenForAlicom;
- }
- return $tokenForAlicom;
- }
- }
|