2025-03-12 10:47:34 +08:00

212 lines
5.9 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2023 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// +----------------------------------------------------------------------
namespace crmeb\services\sms\storage;
use crmeb\services\sms\BaseSms;
use crmeb\services\HttpService;
/**
* 腾讯云短信
* Class Tencent
* @package crmeb\services\sms\storage
*/
class Tencent extends BaseSms
{
//接口请求地址
const API_URL = 'https://sms.tencentcloudapi.com';
/**
* 发送模板id
* @var array
*/
protected $templates = [];
/**
* @var string[]
*/
protected $header = ['Content-Type:application/json'];
/**
* @var string
*/
protected $secretId = '';
/**
* @var string
*/
protected $secretKey = '';
/**
* 短信SDKid
* @var string
*/
protected $smsSdkAppId = '';
/**
* 短信签名
* @var string
*/
protected $signName = '';
/**
* @var string
*/
protected $region = "ap-guangzhou";
/**
* 版本号
* @var string
*/
protected $version = "2021-01-11";
/**
* 加密方式
* @var string
*/
protected $algorithm = 'TC3-HMAC-SHA256';
/**
* 产品名称
* @var string
*/
protected $service = 'sms';
/**
* @param array $config
* @return mixed|void
*/
protected function initialize(array $config = [])
{
parent::initialize($config);
$this->smsSdkAppId = $config['tencent_sms_app_id'] ?? '';
$this->secretId = $config['tencent_sms_secret_id'] ?? '';
$this->secretKey = $config['tencent_sms_secret_key'] ?? '';
$this->signName = $config['tencent_sms_sign_name'] ?? '';
$this->region = $config['tencent_sms_region'] ?? '';
}
/**
* @param string $phone
* @param string $templateId
* @param array $data
* @return mixed|void
*/
public function send(string $phone, string $templateId, array $data)
{
$body = json_encode([
'PhoneNumberSet' => [$phone],
'SmsSdkAppId' => $this->smsSdkAppId,
'SignName' => $this->signName,
'TemplateId' => $templateId,
'TemplateParamSet' => $data,
]);
$res = HttpService::request(self::API_URL, 'post', $body, $this->getHeader($body));
$res = json_decode($res, true);
if (!empty($res['Response']['Error'])) {
return $this->setError($res['Response']['Message']);
}
if ($res['Response']['SendStatusSet'][0]['Code'] != 'Ok') {
return $this->setError($res['Response']['SendStatusSet'][0]['Message']);
}
return $res;
}
/**
* 获取请求header
* @param string $boby
* @return string[]
*/
protected function getHeader(string $boby)
{
$host = str_replace(['https://', 'http://'], '', self::API_URL);
$header = [
'Content-Type:application/json; charset=utf-8',
'Host:' . $host,
'X-TC-Action:SendSms'
];
$httpRequestMethod = 'POST';
$canonicalUri = '/';
$canonicalQueryString = '';
$canonicalHeaders = "content-type:application/json; charset=utf-8\n" . "host:" . $host . "\n";
$signedHeaders = 'content-type;host';
$hashedRequestPayload = hash("SHA256", $boby);
$canonicalRequest = $httpRequestMethod . "\n"
. $canonicalUri . "\n"
. $canonicalQueryString . "\n"
. $canonicalHeaders . "\n"
. $signedHeaders . "\n"
. $hashedRequestPayload;
$service = $this->service;
$timestamp = time();
$date = gmdate("Y-m-d", $timestamp);
$credentialScope = $date . "/" . $service . "/tc3_request";
$hashedCanonicalRequest = hash("SHA256", $canonicalRequest);
$stringToSign = $this->algorithm . "\n"
. $timestamp . "\n"
. $credentialScope . "\n"
. $hashedCanonicalRequest;
$secretDate = hash_hmac("SHA256", $date, "TC3" . $this->secretKey, true);
$secretService = hash_hmac("SHA256", $service, $secretDate, true);
$secretSigning = hash_hmac("SHA256", "tc3_request", $secretService, true);
$signature = hash_hmac("SHA256", $stringToSign, $secretSigning);
$authorization = $this->algorithm
. " Credential=" . $this->secretId . "/" . $credentialScope
. ", SignedHeaders=content-type;host, Signature=" . $signature;
array_push($header, 'Authorization:' . $authorization, 'X-TC-Timestamp:' . $timestamp, 'X-TC-Version:' . $this->version,
'X-TC-Region:' . $this->region);
return $header;
}
public function open()
{
// TODO: Implement open() method.
}
public function modify(string $sign = null, string $phone = '', string $code = '')
{
// TODO: Implement modify() method.
}
public function info()
{
// TODO: Implement info() method.
}
public function temps(int $page, int $limit, int $type)
{
// TODO: Implement temps() method.
}
public function apply(string $title, string $content, int $type)
{
// TODO: Implement apply() method.
}
public function applys(int $tempType, int $page, int $limit)
{
// TODO: Implement applys() method.
}
public function record($record_id)
{
// TODO: Implement record() method.
}
}