阿裡雲短信驗证碼發送類源代碼, 分享如下
/** * 阿裡雲短信驗证碼發送類 */ class Sms { // 保存錯誤信息 public $error; // Access Key ID private $accessKeyId = ''; // Access Access Key Secret private $accessKeySecret = ''; // 簽名 private $signName = ''; // 模版ID private $templateCode = ''; public function __construct($cofig = array()) { $cofig = array( 'accessKeyId' => '***************', 'accessKeySecret' => '******************', 'signName' => '七零', 'templateCode' => 'SMS_25300059', ); // 配置參數 $this->accessKeyId = $cofig['accessKeyId']; $this->accessKeySecret = $cofig['accessKeySecret']; $this->signName = $cofig['signName']; $this->templateCode = $cofig['templateCode']; } private function percentEncode($string) { $string = urlencode($string); $string = preg_replace('/\+/', '%20', $string); $string = preg_replace('/\*/', '%2A', $string); $string = preg_replace('/%7E/', '~', $string); return $string; } /** * 簽名 * * @param unknown $parameters * @param unknown $accessKeySecret * @return string */ private function computeSignature($parameters, $accessKeySecret) { ksort($parameters); $canonicalizedQueryString = ''; foreach ($parameters as $key => $value) { $canonicalizedQueryString .= '&' . $this->percentEncode($key) . '=' . $this->percentEncode($value); } $stringToSign = 'GET&%2F&' . $this->percentencode(substr($canonicalizedQueryString, 1)); $signature = base64_encode(hash_hmac('sha1', $stringToSign, $accessKeySecret . '&', true)); return $signature; } /** * 發送驗证碼 https://help.aliyun.com/document_detail/44364.html?spm=5176.doc44368.6.126.gSngXV * * @param unknown $mobile * @param unknown $verify_code * */ public function send_verify($mobile, $verify_code) { $params = [ // 公共參數 'SignName' => $this->signName, 'Format' => 'JSON', 'Version' => '2016-09-27', 'AccessKeyId' => $this->accessKeyId, 'SignatureVersion' => '1.0', 'SignatureMethod' => 'HMAC-SHA1', 'SignatureNonce' => uniqid(), 'Timestamp' => gmdate('Y-m-d\TH:i:s\Z'), // 接口參數 'Action' => 'SingleSendSms', 'TemplateCode' => $this->templateCode, 'RecNum' => $mobile, 'ParamString' => '{"no":"' . $verify_code . '"}', ]; // 計算簽名並把簽名結果加入請求參數 $params['Signature'] = $this->computeSignature($params, $this->accessKeySecret); // 發送請求 $url = 'https://sms.aliyuncs.com/?' . http_build_query($params); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_TIMEOUT, 10); $result = curl_exec($ch); curl_close($ch); $result = json_decode($result, true); if (isset($result['Code'])) { $this->error = $this->getErrorMessage($result['Code']); return false; } return true; } /** * 獲取詳細錯誤信息 * * @param unknown $status */ public function getErrorMessage($status) { // 阿裡雲的短信 (其實是用的阿裡大於) // https://api.alidayu.com/doc2/apiDetail?spm=a3142.7629140.1.19.SmdYoA&apiId=25450 $message = array( 'InvalidDayuStatus.Malformed' => '賬戶短信開通狀態不正確', 'InvalidSignName.Malformed' => '短信簽名不正確或簽名狀態不正確', 'InvalidTemplateCode.MalFormed' => '短信模板Code不正確或者模板狀態不正確', 'InvalidRecNum.Malformed' => '目標手機號不正確,單次發送數量不能超過100', 'InvalidParamString.MalFormed' => '短信模板中變量不是json格式', 'InvalidParamStringTemplate.Malformed' => '短信模板中變量與模板内容不匹配', 'InvalidSendSms' => '觸發業務流控', 'InvalidDayu.Malformed' => '變量不能是url,可以將變量固化在模板中', ); if (isset($message[$status])) { return $message[$status]; } return $status; } } //生成驗证碼 $code = rand(1000, 9999); //發送短信 $sms = new Sms(); //測試模式 $status = $sms->send_verify($mobile, $code); if (!$status) { echo $sms->error; } echo 'success';