You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
wkcrm/extend/alimsg/msg_demo/lib/TokenGetterForAlicom.php

144 lines
4.8 KiB

4 years ago
<?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)
{
$request = new QueryTokenForMnsQueueRequest();
$request->setMessageType($messageType);
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);
$client = new Client(
$this->mnsAccountEndpoint,
$tokenForAlicom->getTempAccessKey(),
$tokenForAlicom->getTempSecret(),
$tokenForAlicom->getToken()
);
$tokenForAlicom->setClient($client);
$tokenForAlicom->setQueue($queueName);
$this->tokenMap[$messageType] = $tokenForAlicom;
}
return $tokenForAlicom;
}
}