Код, представленный в этой статье, не основан на официальном SDK. Для облегчения понимания читателям фрагменты кода, представленные в статье, включают подробные комментарии. Полный код функции можно найти в конце статьи. После удаления лишних комментариев и пустых строк он составляет менее 180 строк.
При разработке приложения для трансграничной электронной коммерции продукт требовал использования SMS для проверки подлинности номера мобильного телефона. Команда разработчиков выбрала Tencent Cloud в качестве поставщика услуг. В соответствии с требованиями соответствия были применены внутренние и международные подписи и шаблоны SMS соответственно; это приводит к необходимости выбора соответствующей подписи и шаблона в соответствии с внутренними и международными номерами при отправке SMS, чтобы гарантировать правильность отправки проверочной информации.
После проверки командой разработчиков PHP было единогласно решено, что Tencent Cloud SDK необходимо импортировать слишком много файлов кода, что влияет на читаемость и удобство обслуживания проекта. Поэтому я решил сам упаковать простой SDK, чтобы участники проекта могли быстро приступить к работе.
Tencent Cloud SMS (служба коротких сообщений, SMS) аккумулировала более чем десятилетний опыт и технологии Tencent в сфере SMS-сервисов, обеспечивая быстрый и гибкий доступ к высококачественным внутренним SMS и международным платформам/платформам Гонконга, Макао и Тайваня, таким как QQ и WeChat. и более 100 000 клиентов.
Этот базовый алгоритм подписи соответствует спецификациям Tencent Cloud APIv3.,Применимо не только к классу отправки SMS, описанному в этой статье.,Также применимо к другим TencentИнтерфейс облачного продукта。может значительно упростить отделение от чиновникаSDKСложность разработки единого интерфейса продукта。
secretId
иsecretKey
Видеть Политика Tencent Cloud по умолчанию для SMS/**
* Базовый класс Tencent Cloud
* @author rehiy
* @url https://www.rehiy.com/post/527/
*/
class QCloudBasic
{
/**
* @var string Доменное имя интерфейса
*/
protected $domain = 'tencentcloudapi.com';
/**
* @var string Сервис интерфейса
*/
protected $service = '';
/**
* @var string Версия интерфейса
*/
protected $version = '';
/**
* @var string SecretId
*/
protected $secretId = '';
/**
* @var string SecretKey
*/
protected $secretKey = '';
/**
* Запросить интерфейс
* @param string $region область
* @param string $action Название операции
* @param array $data Параметры запроса
*/
protected function post($region, $action, $data)
{
$timestamp = time();
$payload = json_encode($data, 320);
$authorization = $this->signature($action, $payload, $timestamp);
$headers = [
"Authorization: {$authorization}",
"Content-Type: application/json; charset=utf-8",
"Host: {$this->domain}",
"X-TC-Action: {$action}",
"X-TC-Timestamp: {$timestamp}",
"X-TC-Version: {$this->version}",
"X-TC-Region: {$region}"
];
return $this->httpRequest('POST', "https://{$this->domain}", $payload, $headers);
}
/**
* Создать подпись
* @param string $action Название операции
* @param string $payload Параметры запроса
* @param number $timestamp Временная метка
*/
protected function signature($action, $payload = '{}', $timestamp = 0)
{
$algorithm = 'TC3-HMAC-SHA256';
$date = gmdate('Y-m-d', $timestamp);
$canonicalUri = '/';
$canonicalQuery = '';
$canonicalHeaders = implode("\n", [
'content-type:application/json; charset=utf-8',
'host:' . $this->domain,
'x-tc-action:' . strtolower($action),
''
]);
$signedHeaders = 'content-type;host;x-tc-action';
$canonicalRequest = implode("\n", [
'POST',
$canonicalUri,
$canonicalQuery,
$canonicalHeaders,
$signedHeaders,
hash('SHA256', $payload)
]);
$credentialScope = "{$date}/{$this->service}/tc3_request";
$stringToSign = implode("\n", [
$algorithm,
$timestamp,
$credentialScope,
hash('SHA256', $canonicalRequest),
]);
$secretDate = hash_hmac('SHA256', $date, 'TC3' . $this->secretKey, true);
$secretService = hash_hmac('SHA256', $this->service, $secretDate, true);
$secretSigning = hash_hmac('SHA256', 'tc3_request', $secretService, true);
$signature = hash_hmac('SHA256', $stringToSign, $secretSigning);
return implode(', ', [
"{$algorithm} Credential={$this->secretId}/{$credentialScope}",
"SignedHeaders={$signedHeaders}",
"Signature={$signature}"
]);
}
/**
* Отправить HTTP-запрос
* @param string $method Метод запроса
* @param string $url Адрес сервера
* @param array|string $data данные
* @param array $header Заголовок запроса
*/
protected function httpRequest($method, $url, $data = null, $header = null)
{
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_TIMEOUT, 25);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header ?? []);
if ($data && $method == 'POST') {
if (is_array($data)) {
if (in_array('Content-Type: application/json', $header)) {
$data = json_encode($data, 320);
} else {
$data = http_build_query($data);
}
}
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
}
list($body, $errno, $error) = [
curl_exec($ch), curl_errno($ch), curl_error($ch), curl_close($ch)
];
if ($errno != 0) {
throw new \Exception('CURL - ' . $error, $errno);
}
try {
$res = json_decode($body, true);
return $res['Response'] ?? '';
} catch (\Exception $e) {
return false;
}
}
}
на основеless is more
в принципе,Этот класс инкапсулирует толькоотправка текстового сообщенияинтерфейс,Его следует передать как массив во время инициализации.secretId
、secretKey
、sdkAppId
、signName
、templateCode
и другие параметры.
sdkAppId
Видеть Приложение Tencent Cloud SMS-CreatesignName
иtemplateCode
Видеть Инструкции по использованию SMS-сообщений Tencent Cloud/**
* Облачные SMS-сообщения Tencent
* @author rehiy
* @url https://www.rehiy.com/post/527/
*/
class QCloudSms extends QCloudBasic
{
/**
* @var string
*/
protected $service = 'sms';
/**
* @var string
*/
protected $version = '2021-01-11';
/**
* @var string
*/
protected $sdkAppId = '';
/**
* @var string СМС-подпись
*/
protected $signName = '';
/**
* @var string КОД шаблона СМС
*/
protected $templateCode = '';
/**
* Конструктор
* @param array $config
*/
public function __construct($config)
{
$this->domain = $this->service . '.' . $this->domain;
foreach ($config as $key => $value) {
$this->$key = $value;
}
}
/**
* отправка текстового сообщения
* @param array $phoneNumbers Обязательные поля, список номеров мобильных телефонов
* @param array $templateParam Если в шаблоне есть переменные, которые необходимо заменить, это обязательное поле.
* @param string $extendCode Дополнительный 7-значный добавочный код SMS для восходящей линии связи.
* @param string $sessionContext Необязательно, содержит контекстную информацию, сервер будет возвращен как есть
*/
public function send($phoneNumbers, $templateParam, $extendCode = '', $sessionContext = '')
{
$data = [
'PhoneNumberSet' => $phoneNumbers,
'SmsSdkAppId' => $this->sdkAppId,
'SignName' => $this->signName,
'TemplateId' => $this->templateCode,
'TemplateParamSet' => $templateParam,
];
if ($extendCode) {
$data['ExtendCode'] = $extendCode;
}
if ($sessionContext) {
$data['SessionContext'] = $sessionContext;
}
return $this->post('ap-guangzhou', 'SendSms', $data);
}
}
Код в этом разделе используется только для демонстрации того, как Позвонить. в класс отправки СМСотправка текстового сообщения,Пожалуйста, напишите фактический бизнес-код в соответствии с требованиями проекта.
$c_china
и$c_global
ценить/**
* отправка текстового сообщения
* @param string $phone номер телефона
* @param string $code Проверочный код
*/
function send_sms($phone, $code)
{
// Конфигурация внутренних SMS
$c_china = [
'secretId' => 'AK----------------------',
'secretKey' => 'SK----------------------',
'sdkAppId' => '1400000000',
'signName' => 'знак',
'templateCode' => '123456',
];
// Международная конфигурация SMS
$c_global = [
'secretId' => 'AK----------------------',
'secretKey' => 'SK----------------------',
'sdkAppId' => '1400000000',
'signName' => 'знак',
'templateCode' => '654321',
];
// Удаление внутреннего номера +86
$phone = preg_replace('/^\+86(\d{11})$/', '$1', $phone);
$config = strpos($phone, '+') === 0 ? $c_global : $c_china;
// отправка текстового сообщения и вернуть результаты
return (new QCloudSms($config))->send([$phone], [$code]);
}
// Отправить SMS внутри страны
print_r(
send_sms('+8613800000000', '123456')
);
// Отправляйте международные текстовые сообщения
print_r(
send_sms('+100000000000', '123456')
);