阿里雲短信驗證碼發送類
/**
* 阿里雲短信驗證碼發送類
* @author GavinLau
* @email [email protected]
* @blog 開源中國: https://my.oschina.net/u/3022696/blog
* CSDN: http://blog.csdn.net/gavinlauy
* 新浪博客: http://blog.sina.com.cn/u/3835413802
* @PHP交流羣 440479799(QQ)
*/
class Sms {
public $error; // 保存錯誤信息
private $accessKeyId = ''; // Access Key ID
private $accessKeySecret = ''; // Access Access Key Secret
private $signName = ''; // 簽名名稱 https://sms.console.aliyun.com/#/sms/Sign短信簽名中的簽名名稱
private $templateCode = ''; // 模版(阿里雲提供)
public function __construct($cofig = array()) {
$cofig = array (
'accessKeyId' => '', //填寫自己的
'accessKeySecret' => '', //填寫自己的
'signName' => '', //填寫自己設置的
'templateCode' => '' //填寫自己所需要的
);
// 配置參數
$this->accessKeyId = $cofig['accessKeyId'];
$this->accessKeySecret = $cofig['accessKeySecret'];
$this->signName = $cofig['signName'];
$this->templateCode = $cofig['templateCode'];
}
/**
* 編碼
* @param $string 要編碼的字符串
* @return string
*/
private function percentEncode($string) {
$string = urlencode($string);
$string = preg_replace('/\+/', '%20', $string);
$string = preg_replace('/\*/', '%2A', $string);
$string = preg_replace('/%7E/', '~', $string);
return $string;
}
/**
* 計算簽名
* (詳細步驟在下面鏈接中)
* https://help.aliyun.com/document_detail/44363.html?spm=5176.doc50118.2.4.ZOeshY
*
* @param $params 要計算簽名的參數
* @param $accesss_key_secret 祕鑰
* @return string
*/
private function calculatedSignature($params, $accessKeySecret) {
// 將參數排序(ksort()對數組按照鍵名排序)
ksort($params);
// 構造規範化的請求字符串
$canonicalizedQueryString = '';
foreach ($params as $key => $value ) {
// 對每個請求參數的名稱和值進行編碼
$canonicalizedQueryString .= '&'.$this->percentEncode($key).'='.$this->percentEncode($value);
}
// 構造用於計算簽名的字符串
// $stringToSign = 'GET&%2F&'.$this->percentEncode(substr($canonicalizedQueryString, 1));
$stringToSign = 'POST&%2F&'.$this->percentEncode(substr($canonicalizedQueryString, 1));
// 計算簽名 HMAC 值,按照 Base64 編碼規則把 HMAC 值編碼成字符串,即得到簽名值(Signature)
$signature = $this->percentEncode(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) {
$aliSendSmsUrl = "http://sms.aliyuncs.com/";
$prodect = ''; //模板中的參數,自己起個名字(模版不同,對應模版參數不同)
$params = array(
'AccessKeyId' => $this->accessKeyId, //Access Key Id
'Action' => 'SingleSendSms', //操作接口名,系統規定參數,取值:SingleSendSms
'Format' => 'JSON', //返回值類型
'ParamString' => '{"code":"'.$verify_code.'","product":"'.$prodect.'"}', //短信模板中的變量
'RecNum' => $mobile, //目標手機號,多個手機號可以逗號分隔
'SignatureMethod' => 'HMAC-SHA1', //簽名方式
'SignatureNonce' => $this->genPasswd(16), //隨機字符串
'SignatureVersion' => '1.0', //簽名算法版本
'SignName' => $this->signName, //管理控制檯中配置的短信簽名(狀態必須是驗證通過)
'TemplateCode' => $this->templateCode, //管理控制檯中配置的審覈通過的短信模板的模板CODE(狀態必須是驗證通過)
'Timestamp' => gmdate('Y-m-d\TH:i:s\Z'), //請求時間戳,UTC時間
'Version' => "2016-09-27" //版本號,本版本對應日期
);
// 計算簽名並把簽名結果加入請求參數
$params ['Signature'] = $this->calculatedSignature($params, $this->accessKeySecret);
// 發送請求
//$res = $this->postCUrl("http://sms.aliyuncs.com/?", http_build_query ($params));這個也可以
foreach($params as $key => $val) {
$post_data .= '&'.$key.'='.$val;
}
$res = $this->postCUrl($aliSendSmsUrl, $post_data);
return json_decode($res, true);
}
/**
* CUrl封裝的post方式請求API的方法
* @param string $url
* @param array $data post數據
* @param int $timeout 超時時間
*/
public function postCUrl($url, $data, $timeout=3) {
$ch = curl_init();
$urlinfo = parse_url($url);
$domain = $urlinfo['host'];
$headers = array("Host:".$domain);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
//分析是否開啓SSL加密
$ssl = substr($url, 0, 8) == 'https://' ? true : false;
if ($ssl) {
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); // 對認證證書來源的檢查
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 1); // 從證書中檢查SSL加密算法是否存在
}
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0);
curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
$res = curl_exec($ch);
if(curl_error($ch)=='') {
curl_close($ch);
return $res;
}
curl_close($ch);
return false;
}
/**
* 生成隨機字符串
* @param $length 生成隨機字符串長度
*/
public function genPasswd($length = 8) {
// 密碼字符集,可任意添加你需要的字符
$chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
$password = '';
for ( $i = 0; $i < $length; $i++ ) {
$password .= $chars[ mt_rand(0, strlen($chars) - 1) ];
}
return $password;
}
/**
* 獲取詳細錯誤信息
* @param $code 如果有錯誤,就會有返回Code
*/
public function getErrorMessage($code) {
// https://help.aliyun.com/document_detail/44364.html?spm=5176.doc44365.6.572.8bxdsL頁面下的錯誤碼
$message = array(
'InvalidDayuStatus.Malformed' => '賬戶短信開通狀態不正確',
'InvalidSignName.Malformed' => '短信簽名不正確或簽名狀態不正確',
'InvalidTemplateCode.MalFormed' => '短信模板Code不正確或者模板狀態不正確',
'InvalidRecNum.Malformed' => '目標手機號不正確,單次發送數量不能超過100',
'InvalidParamString.MalFormed' => '短信模板中變量不是json格式',
'InvalidParamStringTemplate.Malformed' => '短信模板中變量與模板內容不匹配',
'InvalidSendSms' => '觸發業務流控',//發送頻率太快
'InvalidDayu.Malformed' => '變量不能是url,可以將變量固化在模板中',
'SignatureDoesNotMatch' => '簽名不匹配'
);
if (isset($message[$code])) {
return $message[$code];
}
return true;
}
}
$mobile = ""; //手機號
//生成驗證碼
$code = rand (100000, 999999);
//發送短信
$sms = new Sms();
//測試模式
$res = $sms->send_verify($mobile, $code);
if(isset($res['Code'])){
$sms->error = $sms->getErrorMessage($res['Code']);
echo "短信發送失敗,失敗原因:".$sms->error;
return false;
}
echo "短信發送成功";
return true;
?>
* 阿里雲短信驗證碼發送類
* @author GavinLau
* @email [email protected]
* @blog 開源中國: https://my.oschina.net/u/3022696/blog
* CSDN: http://blog.csdn.net/gavinlauy
* 新浪博客: http://blog.sina.com.cn/u/3835413802
* @PHP交流羣 440479799(QQ)
*/
class Sms {
public $error; // 保存錯誤信息
private $accessKeyId = ''; // Access Key ID
private $accessKeySecret = ''; // Access Access Key Secret
private $signName = ''; // 簽名名稱 https://sms.console.aliyun.com/#/sms/Sign短信簽名中的簽名名稱
private $templateCode = ''; // 模版(阿里雲提供)
public function __construct($cofig = array()) {
$cofig = array (
'accessKeyId' => '', //填寫自己的
'accessKeySecret' => '', //填寫自己的
'signName' => '', //填寫自己設置的
'templateCode' => '' //填寫自己所需要的
);
// 配置參數
$this->accessKeyId = $cofig['accessKeyId'];
$this->accessKeySecret = $cofig['accessKeySecret'];
$this->signName = $cofig['signName'];
$this->templateCode = $cofig['templateCode'];
}
/**
* 編碼
* @param $string 要編碼的字符串
* @return string
*/
private function percentEncode($string) {
$string = urlencode($string);
$string = preg_replace('/\+/', '%20', $string);
$string = preg_replace('/\*/', '%2A', $string);
$string = preg_replace('/%7E/', '~', $string);
return $string;
}
/**
* 計算簽名
* (詳細步驟在下面鏈接中)
* https://help.aliyun.com/document_detail/44363.html?spm=5176.doc50118.2.4.ZOeshY
*
* @param $params 要計算簽名的參數
* @param $accesss_key_secret 祕鑰
* @return string
*/
private function calculatedSignature($params, $accessKeySecret) {
// 將參數排序(ksort()對數組按照鍵名排序)
ksort($params);
// 構造規範化的請求字符串
$canonicalizedQueryString = '';
foreach ($params as $key => $value ) {
// 對每個請求參數的名稱和值進行編碼
$canonicalizedQueryString .= '&'.$this->percentEncode($key).'='.$this->percentEncode($value);
}
// 構造用於計算簽名的字符串
// $stringToSign = 'GET&%2F&'.$this->percentEncode(substr($canonicalizedQueryString, 1));
$stringToSign = 'POST&%2F&'.$this->percentEncode(substr($canonicalizedQueryString, 1));
// 計算簽名 HMAC 值,按照 Base64 編碼規則把 HMAC 值編碼成字符串,即得到簽名值(Signature)
$signature = $this->percentEncode(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) {
$aliSendSmsUrl = "http://sms.aliyuncs.com/";
$prodect = ''; //模板中的參數,自己起個名字(模版不同,對應模版參數不同)
$params = array(
'AccessKeyId' => $this->accessKeyId, //Access Key Id
'Action' => 'SingleSendSms', //操作接口名,系統規定參數,取值:SingleSendSms
'Format' => 'JSON', //返回值類型
'ParamString' => '{"code":"'.$verify_code.'","product":"'.$prodect.'"}', //短信模板中的變量
'RecNum' => $mobile, //目標手機號,多個手機號可以逗號分隔
'SignatureMethod' => 'HMAC-SHA1', //簽名方式
'SignatureNonce' => $this->genPasswd(16), //隨機字符串
'SignatureVersion' => '1.0', //簽名算法版本
'SignName' => $this->signName, //管理控制檯中配置的短信簽名(狀態必須是驗證通過)
'TemplateCode' => $this->templateCode, //管理控制檯中配置的審覈通過的短信模板的模板CODE(狀態必須是驗證通過)
'Timestamp' => gmdate('Y-m-d\TH:i:s\Z'), //請求時間戳,UTC時間
'Version' => "2016-09-27" //版本號,本版本對應日期
);
// 計算簽名並把簽名結果加入請求參數
$params ['Signature'] = $this->calculatedSignature($params, $this->accessKeySecret);
// 發送請求
//$res = $this->postCUrl("http://sms.aliyuncs.com/?", http_build_query ($params));這個也可以
foreach($params as $key => $val) {
$post_data .= '&'.$key.'='.$val;
}
$res = $this->postCUrl($aliSendSmsUrl, $post_data);
return json_decode($res, true);
}
/**
* CUrl封裝的post方式請求API的方法
* @param string $url
* @param array $data post數據
* @param int $timeout 超時時間
*/
public function postCUrl($url, $data, $timeout=3) {
$ch = curl_init();
$urlinfo = parse_url($url);
$domain = $urlinfo['host'];
$headers = array("Host:".$domain);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
//分析是否開啓SSL加密
$ssl = substr($url, 0, 8) == 'https://' ? true : false;
if ($ssl) {
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); // 對認證證書來源的檢查
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 1); // 從證書中檢查SSL加密算法是否存在
}
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0);
curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
$res = curl_exec($ch);
if(curl_error($ch)=='') {
curl_close($ch);
return $res;
}
curl_close($ch);
return false;
}
/**
* 生成隨機字符串
* @param $length 生成隨機字符串長度
*/
public function genPasswd($length = 8) {
// 密碼字符集,可任意添加你需要的字符
$chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
$password = '';
for ( $i = 0; $i < $length; $i++ ) {
$password .= $chars[ mt_rand(0, strlen($chars) - 1) ];
}
return $password;
}
/**
* 獲取詳細錯誤信息
* @param $code 如果有錯誤,就會有返回Code
*/
public function getErrorMessage($code) {
// https://help.aliyun.com/document_detail/44364.html?spm=5176.doc44365.6.572.8bxdsL頁面下的錯誤碼
$message = array(
'InvalidDayuStatus.Malformed' => '賬戶短信開通狀態不正確',
'InvalidSignName.Malformed' => '短信簽名不正確或簽名狀態不正確',
'InvalidTemplateCode.MalFormed' => '短信模板Code不正確或者模板狀態不正確',
'InvalidRecNum.Malformed' => '目標手機號不正確,單次發送數量不能超過100',
'InvalidParamString.MalFormed' => '短信模板中變量不是json格式',
'InvalidParamStringTemplate.Malformed' => '短信模板中變量與模板內容不匹配',
'InvalidSendSms' => '觸發業務流控',//發送頻率太快
'InvalidDayu.Malformed' => '變量不能是url,可以將變量固化在模板中',
'SignatureDoesNotMatch' => '簽名不匹配'
);
if (isset($message[$code])) {
return $message[$code];
}
return true;
}
}
$mobile = ""; //手機號
//生成驗證碼
$code = rand (100000, 999999);
//發送短信
$sms = new Sms();
//測試模式
$res = $sms->send_verify($mobile, $code);
if(isset($res['Code'])){
$sms->error = $sms->getErrorMessage($res['Code']);
echo "短信發送失敗,失敗原因:".$sms->error;
return false;
}
echo "短信發送成功";
return true;
?>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.