星模php格,extend/base/TencentSms.php · 纵之格/ShopXO - Gitee.com
// +----------------------------------------------------------------------
// | ShopXO 國內(nèi)領(lǐng)先企業(yè)級B2C免費開源電商系統(tǒng)
// +----------------------------------------------------------------------
// | Copyright (c) 2011~2019 http://shopxo.net All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: Devil
// +----------------------------------------------------------------------
namespace base;
/**
* 短信驅(qū)動
* @author liuyi
* @blog http://ourbrnader.com/
* @version 0.0.1
* @datetime 2020-05-18
*/
class TencentSms
{
// 保存錯誤信息
public $error;
// Access Key ID
private $accessKeyId = '';
// Access Access Key Secret
private $accessKeySecret = '';
// 簽名
private $signName = '';
private $apiHost = "sms.tencentcloudapi.com";
//短信平臺返回的原始數(shù)據(jù)
public $rawData;
/**
* [__construct 構(gòu)造方法]
* @param [int] $param['interval_time'] [間隔時間(默認30)單位(秒)]
* @param [int] $param['expire_time'] [到期時間(默認30)單位(秒)]
* @param [string] $param['key_prefix'] [驗證碼種存儲前綴key(默認 空)]
* @version 0.0.1
* @datetime 2017-03-07T14:03:02+0800
* @author Devil
* @blog http://gong.gg/
*/
public function __construct()
{
$this->signName = MyC('common_sms_sign');
$this->accessKeyId = MyC('common_sms_apikey');
$this->accessKeySecret = MyC('common_sms_apisecret');
$this->platform_appid = MyC('common_sms_sdk_appid');
}
/**
* 簽名
*
* @param unknown $parameters
* @param unknown $accessKeySecret
* @return string
*/
private function computeSignature($host, $payload, $timestamp)
{
$secretId = $this->accessKeyId;
$secretKey = $this->accessKeySecret;
$service = 'sms';
$algorithm = "TC3-HMAC-SHA256";
$httpRequestMethod = 'POST';
$canonicalUri = "/";
$canonicalQueryString = "";
$canonicalHeaders = "content-type:application/json\n" . "host:" . $host . "\n";
$signedHeaders = "content-type;host";
// $payload = json_encode($param,JSON_UNESCAPED_UNICODE);
// echo $payload.PHP_EOL;
$hashedRequestPayload = hash("SHA256", $payload);
$canonicalRequest = $httpRequestMethod . "\n"
. $canonicalUri . "\n"
. $canonicalQueryString . "\n"
. $canonicalHeaders . "\n"
. $signedHeaders . "\n"
. $hashedRequestPayload;
// echo $canonicalRequest.PHP_EOL;
// step 2: build string to sign
$date = gmdate("Y-m-d", $timestamp);
$credentialScope = $date . "/" . $service . "/tc3_request";
$hashedCanonicalRequest = hash("SHA256", $canonicalRequest);
$stringToSign = $algorithm . "\n"
. $timestamp . "\n"
. $credentialScope . "\n"
. $hashedCanonicalRequest;
// echo $stringToSign.PHP_EOL;
// step 3: sign string
$secretDate = hash_hmac("SHA256", $date, "TC3" . $secretKey, true);
$secretService = hash_hmac("SHA256", $service, $secretDate, true);
$secretSigning = hash_hmac("SHA256", "tc3_request", $secretService, true);
$signature = hash_hmac("SHA256", $stringToSign, $secretSigning);
// echo $signature.PHP_EOL;
// step 4: build authorization
$authorization = $algorithm
. " Credential=" . $secretId . "/" . $credentialScope
. ", SignedHeaders=content-type;host, Signature=" . $signature;
// echo $authorization.PHP_EOL;
return $authorization;//返回認證簽名
}
/**
* 短信發(fā)送
* @param [string] $mobile [手機號碼,多個以 英文逗號 , 分割]
* @param [string|array] $code [變量code(單個直接傳入 code 即可,多個傳入數(shù)組)]
* @param [string] $template_code [模板 id]
* @param [boolean] $sign_name [自定義簽名,默認使用基礎(chǔ)配置的簽名]
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2020-04-02
* @desc description
*/
public function SendCode($mobile, $code, $template_code, $sign_name = '')
{
// 簽名
$sign_name = empty($sign_name) ? $this->signName : $sign_name;
// 請求參數(shù)
$params = array( //此處作了修改
'PhoneNumberSet' => $mobile,
'TemplateID' => $template_code,
'Sign' => $sign_name,
'TemplateParamSet' => $code,
'SessionContext' => '',
'SmsSdkAppid' => $this->platform_appid
);
// 計算簽名并把簽名結(jié)果加入請求參數(shù)
$timestamp = time();
$url = 'https://' . $this->apiHost;
$version = '2019-07-11';
$action = "SendSms";
$payload = json_encode($params, JSON_UNESCAPED_UNICODE);
$authorization = $this->computeSignature($this->apiHost, $payload, $timestamp);
$headers = array(
"Authorization:$authorization",
"Content-type:application/json",
"Host:$this->apiHost",
"X-TC-Action:$action",
"X-TC-Version:$version",
"X-TC-Timestamp:$timestamp",
// "X-TC-Region:$region"
);
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, false);
curl_setopt($curl, CURLOPT_AUTOREFERER, 1);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $payload);
curl_setopt($curl, CURLOPT_POST, 1);
$result = curl_exec($curl);
curl_close($curl);
if ($result == false) {
$this->error = "訪問騰訊云短信服務(wù)失敗";
} else {
$result = json_decode($result, true);
}
//因為一般業(yè)務(wù)情況是發(fā)給一個人,這里就簡單處理為取第一個短信的狀態(tài)。
//如果是批量的話,需要遍歷獲得所有的情況,這樣的可以另外寫一個接口。
$this->rawData = $result;
if (isset($result["Response"]['Error'])) {
$errorCode = $result["Response"]['Error']['Code'];
} else if (isset($result["Response"]["SendStatusSet"][0])) {
$sendStatusItem = $result["Response"]["SendStatusSet"][0];
$errorCode = $sendStatusItem['Code'];
} else {
$errorCode = '';
}
if (strtolower($errorCode) != 'ok') {
$this->error = $this->getErrorMessage($errorCode);
return false;
}
return true;
}
/**
* 獲取詳細錯誤信息
*
* @param unknown $status
*/
public function getErrorMessage($status)
{
//查詢錯誤碼地址:
//https://cloud.tencent.com/document/product/382/38780
$message = array(
'FailedOperation.ContainSensitiveWord' => '短信內(nèi)容中含有敏感詞',
'FailedOperation.FailResolvePacket' => '請求包解析失敗,通常情況下是由于沒有遵守 API 接口說明規(guī)范導致的',
'FailedOperation.InsufficientBalanceInSmsPackage' => '套餐包余量不足',
'FailedOperation.JsonParseFail' => '解析請求包體時候失敗',
'FailedOperation.MarketingSendTimeConstraint' => '營銷短信發(fā)送時間限制,為避免騷擾用戶,營銷短信只允許在8點到22點發(fā)送。',
'FailedOperation.MissingSignature' => '沒有申請簽名之前,無法申請模板,請根據(jù) 創(chuàng)建簽名 申請完成之后再次申請。',
'FailedOperation.PhoneNumberInBlacklist' => '手機號在黑名單庫中,通常是用戶退訂或者命中運營商黑名單導致的,可聯(lián)系 sms helper 解決。',
'FailedOperation.PhoneNumberOnBlacklist' => '手機號在黑名單庫中,通常是用戶退訂或者命中運營商黑名單導致的,可聯(lián)系 sms helper 解決。',
'InternalError.RequestTimeException' => '請求發(fā)起時間不正常,通常是由于您的服務(wù)器時間與騰訊云服務(wù)器時間差異超過10分鐘導致的,請核對服務(wù)器時間及 API 接口中的時間字段是否正常。',
'InternalError.Timeout' => '請求下發(fā)短信超時,請參考 60008錯誤詳解。',
'InvalidParameterValue.IncorrectPhoneNumber' => '手機號格式錯誤,請參考 1016錯誤詳解',
'InvalidParameterValue.ProhibitedUseUrlInTemplateParameter' => '禁止在模板變量中使用 URL。',
'InvalidParameterValue.TemplateParameterFormatError' => '驗證碼模板參數(shù)格式錯誤,驗證碼類模版,模版變量只能傳入0 - 6位(包括6位)純數(shù)字',
'LimitExceeded.AppDailyLimit' => '業(yè)務(wù)短信日下發(fā)條數(shù)超過設(shè)定的上限 ,可自行到控制臺調(diào)整短信頻率限制策略。',
'LimitExceeded.DailyLimit' => '短信日下發(fā)條數(shù)超過設(shè)定的上限 (國際/港澳臺),如需調(diào)整限制,可聯(lián)系 sms helper。',
'LimitExceeded.DeliveryFrequencyLimit' => '下發(fā)短信命中了頻率限制策略,可自行到控制臺調(diào)整短信頻率限制策略,如有其他需求請聯(lián)系 sms helper。',
'LimitExceeded.PhoneNumberCountLimit' => '調(diào)用短信發(fā)送 API 接口單次提交的手機號個數(shù)超過200個',
'LimitExceeded.PhoneNumberDailyLimit' => '單個手機號日下發(fā)短信條數(shù)超過設(shè)定的上限,可自行到控制臺調(diào)整短信頻率限制策略。',
'LimitExceeded.PhoneNumberOneHourLimit' => '單個手機號1小時內(nèi)下發(fā)短信條數(shù)超過設(shè)定的上限,可自行到控制臺調(diào)整短信頻率限制策略。',
'LimitExceeded.PhoneNumberSameContentDailyLimit' => '單個手機號下發(fā)相同內(nèi)容超過設(shè)定的上限,可自行到控制臺調(diào)整短信頻率限制策略。',
'LimitExceeded.PhoneNumberThirtySecondLimit' => '單個手機號30秒內(nèi)下發(fā)短信條數(shù)超過設(shè)定的上限,可自行到控制臺調(diào)整短信頻率限制策略。',
'MissingParameter.EmptyPhoneNumberSet' => '傳入的號碼列表為空,請確認您的參數(shù)中是否傳入號碼。',
'UnauthorizedOperation.IndividualUserMarketingSmsPermissionDeny' => '個人用戶沒有發(fā)營銷短信的權(quán)限',
'UnauthorizedOperation.RequestIpNotInWhitelist' => '請求 IP 不在白名單中,您配置了校驗請求來源 IP,但是檢測到當前請求 IP 不在配置列表中,',
'UnauthorizedOperation.SerivceSuspendDueToArrears' => '欠費被停止服務(wù),可自行登錄騰訊云充值來繳清欠款。',
'ContainDomesticAndInternationalPhoneNumber' => '群發(fā)請求里既有國內(nèi)手機號也有國際手機號。',
'UnsupportedOperation.UnsuportedRegion' => '不支持該地區(qū)短信下發(fā)。',
);
if (isset ($message [$status])) {
return $message [$status];
}
return '錯誤狀態(tài)碼:' . $status . ',詳細錯查詢:https://cloud.tencent.com/document/product/382/38780';
}
}
?>
一鍵復(fù)制
編輯
原始數(shù)據(jù)
按行查看
歷史
總結(jié)
以上是生活随笔為你收集整理的星模php格,extend/base/TencentSms.php · 纵之格/ShopXO - Gitee.com的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux文件目录作用,linux 文件
- 下一篇: php hbase thrift,PHP