//下面代碼是在Thinkphp6寫的,短信目前還能發送,根據自己情況改就行(發送短信需要用到后面的兩個類文件)
//注:這個只能用來測試用
<?php declare(strict_types=1); namespace app\common\lib\sms; use app\common\lib\sms\SmsSingleSender; use think\facade\Log; use app\common\lib\sms\SmsBase; class Tengxunsms implements SmsBase { // 短信應用 SDK AppID protected static $appid = 1400223129; // SDK AppID 以1400開頭 // 短信應用 SDK AppKey protected static $appkey = "c7b1bfadb589afe939f3a90f3dac0259"; // 需要發送短信的手機號碼 // 短信模板 ID,需要在短信控制台中申請 protected static $templateId = 357003; // 短信簽名 (填寫短信簽名中的內容) protected static $smsSign = "青衫晚風公眾號"; /** * 騰訊雲短信 * [SendPhone description] * @param [type] $phone [description] * @param [type] $code [description] */ public static function sendCode(string $phone,int $code) { if(empty($phone) || empty($code)){ return false; } try { $ssender = new SmsSingleSender(self::$appid, self::$appkey); $params = [$code]; $result = $ssender->sendWithParam("86", $phone, self::$templateId, $params, self::$smsSign, "", ""); $rsp = json_decode($result); // Log 記錄日志 Log這個可以直接注釋 if($rsp->result == 0){ Log::info("Tengxunsms-SendCode-{$phone}-result-".$result); return true; }else{ Log::error("Tengxunsms-SendCode-{$phone}-exception".$rsp->errmsg); return false; } } catch(\Exception $e) { Log::error("Tengxunsms-SendCode-{$phone}-exception".$e->getErrorMessage()); return false; } } }
//需要用到的類文件
//SmsSingleSender.php
<?php namespace app\common\lib\sms; use app\common\lib\sms\SmsSenderUtil; /** * 單發短信類 * */ class SmsSingleSender { private $url; private $appid; private $appkey; private $util; /** * 構造函數 * * @param string $appid sdkappid * @param string $appkey sdkappid對應的appkey */ public function __construct($appid, $appkey) { $this->url = "https://yun.tim.qq.com/v5/tlssmssvr/sendsms"; $this->appid = $appid; $this->appkey = $appkey; $this->util = new SmsSenderUtil(); } /** * 普通單發 * * 普通單發需明確指定內容,如果有多個簽名,請在內容中以【】的方式添加到信息內容中,否則系統將使用默認簽名。 * * @param int $type 短信類型,0 為普通短信,1 營銷短信 * @param string $nationCode 國家碼,如 86 為中國 * @param string $phoneNumber 不帶國家碼的手機號 * @param string $msg 信息內容,必須與申請的模板格式一致,否則將返回錯誤 * @param string $extend 擴展碼,可填空串 * @param string $ext 服務端原樣返回的參數,可填空串 * @return string 應答json字符串,詳細內容參見騰訊雲協議文檔 */ public function send($type, $nationCode, $phoneNumber, $msg, $extend = "", $ext = "") { $random = $this->util->getRandom(); $curTime = time(); $wholeUrl = $this->url . "?sdkappid=" . $this->appid . "&random=" . $random; // 按照協議組織 post 包體 $data = new \stdClass(); $tel = new \stdClass(); $tel->nationcode = "".$nationCode; $tel->mobile = "".$phoneNumber; $data->tel = $tel; $data->type = (int)$type; $data->msg = $msg; $data->sig = hash("sha256", "appkey=".$this->appkey."&random=".$random."&time=" .$curTime."&mobile=".$phoneNumber, FALSE); $data->time = $curTime; $data->extend = $extend; $data->ext = $ext; return $this->util->sendCurlPost($wholeUrl, $data); } /** * 指定模板單發 * * @param string $nationCode 國家碼,如 86 為中國 * @param string $phoneNumber 不帶國家碼的手機號 * @param int $templId 模板 id * @param array $params 模板參數列表,如模板 {1}...{2}...{3},那么需要帶三個參數 * @param string $sign 簽名,如果填空串,系統會使用默認簽名 * @param string $extend 擴展碼,可填空串 * @param string $ext 服務端原樣返回的參數,可填空串 * @return string 應答json字符串,詳細內容參見騰訊雲協議文檔 */ public function sendWithParam($nationCode, $phoneNumber, $templId = 0, $params, $sign = "", $extend = "", $ext = "") { $random = $this->util->getRandom(); $curTime = time(); $wholeUrl = $this->url . "?sdkappid=" . $this->appid . "&random=" . $random; // 按照協議組織 post 包體 $data = new \stdClass(); $tel = new \stdClass(); $tel->nationcode = "".$nationCode; $tel->mobile = "".$phoneNumber; $data->tel = $tel; $data->sig = $this->util->calculateSigForTempl($this->appkey, $random, $curTime, $phoneNumber); $data->tpl_id = $templId; $data->params = $params; $data->sign = $sign; $data->time = $curTime; $data->extend = $extend; $data->ext = $ext; return $this->util->sendCurlPost($wholeUrl, $data); } }
//SmsSenderUtil.php
<?php namespace app\common\lib\sms; /** * 發送Util類 * */ class SmsSenderUtil { /** * 生成隨機數 * * @return int 隨機數結果 */ public function getRandom() { return rand(100000, 999999); } /** * 生成簽名 * * @param string $appkey sdkappid對應的appkey * @param string $random 隨機正整數 * @param string $curTime 當前時間 * @param array $phoneNumbers 手機號碼 * @return string 簽名結果 */ public function calculateSig($appkey, $random, $curTime, $phoneNumbers) { $phoneNumbersString = $phoneNumbers[0]; for ($i = 1; $i < count($phoneNumbers); $i++) { $phoneNumbersString .= ("," . $phoneNumbers[$i]); } return hash("sha256", "appkey=".$appkey."&random=".$random ."&time=".$curTime."&mobile=".$phoneNumbersString); } /** * 生成簽名 * * @param string $appkey sdkappid對應的appkey * @param string $random 隨機正整數 * @param string $curTime 當前時間 * @param array $phoneNumbers 手機號碼 * @return string 簽名結果 */ public function calculateSigForTemplAndPhoneNumbers($appkey, $random, $curTime, $phoneNumbers) { $phoneNumbersString = $phoneNumbers[0]; for ($i = 1; $i < count($phoneNumbers); $i++) { $phoneNumbersString .= ("," . $phoneNumbers[$i]); } return hash("sha256", "appkey=".$appkey."&random=".$random ."&time=".$curTime."&mobile=".$phoneNumbersString); } public function phoneNumbersToArray($nationCode, $phoneNumbers) { $i = 0; $tel = array(); do { $telElement = new \stdClass(); $telElement->nationcode = $nationCode; $telElement->mobile = $phoneNumbers[$i]; array_push($tel, $telElement); } while (++$i < count($phoneNumbers)); return $tel; } /** * 生成簽名 * * @param string $appkey sdkappid對應的appkey * @param string $random 隨機正整數 * @param string $curTime 當前時間 * @param array $phoneNumber 手機號碼 * @return string 簽名結果 */ public function calculateSigForTempl($appkey, $random, $curTime, $phoneNumber) { $phoneNumbers = array($phoneNumber); return $this->calculateSigForTemplAndPhoneNumbers($appkey, $random, $curTime, $phoneNumbers); } /** * 生成簽名 * * @param string $appkey sdkappid對應的appkey * @param string $random 隨機正整數 * @param string $curTime 當前時間 * @return string 簽名結果 */ public function calculateSigForPuller($appkey, $random, $curTime) { return hash("sha256", "appkey=".$appkey."&random=".$random ."&time=".$curTime); } /** * 生成上傳文件授權 * * @param string $appkey sdkappid對應的appkey * @param string $random 隨機正整數 * @param string $curTime 當前時間 * @param array $fileSha1Sum 文件sha1sum * @return string 授權結果 */ public function calculateAuth($appkey, $random, $curTime, $fileSha1Sum) { return hash("sha256", "appkey=".$appkey."&random=".$random ."&time=".$curTime."&content-sha1=".$fileSha1Sum); } /** * 生成sha1sum * * @param string $content 內容 * @return string 內容sha1散列值 */ public function sha1sum($content) { return hash("sha1", $content); } /** * 發送請求 * * @param string $url 請求地址 * @param array $dataObj 請求內容 * @return string 應答json字符串 */ public function sendCurlPost($url, $dataObj) { $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_HEADER, 0); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_POST, 1); curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 60); curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($dataObj)); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); $ret = curl_exec($curl); if (false == $ret) { // curl_exec failed $result = "{ \"result\":" . -2 . ",\"errmsg\":\"" . curl_error($curl) . "\"}"; } else { $rsp = curl_getinfo($curl, CURLINFO_HTTP_CODE); if (200 != $rsp) { $result = "{ \"result\":" . -1 . ",\"errmsg\":\"". $rsp . " " . curl_error($curl) ."\"}"; } else { $result = $ret; } } curl_close($curl); return $result; } /** * 發送請求 * * @param string $req 請求對象 * @return string 應答json字符串 */ public function fetch($req) { $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $req->url); curl_setopt($curl, CURLOPT_HTTPHEADER, $req->headers); curl_setopt($curl, CURLOPT_POSTFIELDS, $req->body); curl_setopt($curl, CURLOPT_HEADER, 0); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_POST, 1); curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 60); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); $result = curl_exec($curl); if (false == $result) { // curl_exec failed $result = "{ \"result\":" . -2 . ",\"errmsg\":\"" . curl_error($curl) . "\"}"; } else { $code = curl_getinfo($curl, CURLINFO_HTTP_CODE); if (200 != $code) { $result = "{ \"result\":" . -1 . ",\"errmsg\":\"". $code . " " . curl_error($curl) ."\"}"; } } curl_close($curl); return $result; } }
