最新阿里雲簡訊服務介面類【親測成功】
最新的阿里雲簡訊介面,適用於阿里大於搬家以後的情況。
之前一直用阿里大於的簡訊介面,最近上專案時發現阿里大於悄悄地搬家到了阿里雲!阿里雲的SDK檔案繁多,看得一頭霧水!下面程式碼是最新的可適用於阿里雲簡訊服務的類,親測成功!
之前有大神放出過程式碼,連結:http://www.thinkphp.cn/code/2543.html,但是經過測試會返回“ 簡訊介面返回錯誤碼:InvalidDayuStatus.Malformed ,賬戶簡訊開通狀態不正確”!(經過測試,該大神程式碼適用於阿里大於介面,不適用於最新的阿里雲控制檯內的簡訊服務)
經過詳細查閱SDK介紹,連結地址:https://help.aliyun.com/document_detail/55359.html?spm=5176.doc54229.6.564.5cPOVA中的一段
——————————————————————————
“您好,暫時沒有其他語言的SDK,我們正在努力更新中,敬請期待!sdk只是幫助拼接了http請求和解析返回報文,如若sdk版本問題無法編譯通過,可以 自行拼接下http請求來使用。介面本身只是一個http請求呼叫,沒有語言的限制。拼接http請求請參照上面的連結,也可以參照sdk中的 原始碼:https://help.aliyun.com/document_detail/56189.html?spm=5176.product44282.6.562.3wM8lS”
對上面大神程式碼進行改裝(主要修改傳入引數及閘道器)如下,成功!
<?php
/**
* 阿里雲簡訊驗證碼傳送類
* @author Administrator
*
*/
classSms{
// 儲存錯誤資訊
public $error;
// Access Key ID
private $accessKeyId ='';
// Access Access Key Secret
private $accessKeySecret ='';
// 簽名
private $signName ='';
// 模版ID
private $templateCode ='';
public
$cofig = array (
'accessKeyId'=>'xxxxxxxxxxx',
'accessKeySecret'=>'xxxxxxxxxx',
'signName'=>'你的簽名',
'templateCode'=>'SMS_76510109'
);
// 配置引數
$this->accessKeyId = $cofig ['accessKeyId'];
$this->accessKeySecret = $cofig ['accessKeySecret'
$this->signName = $cofig ['signName'];
$this->templateCode = $cofig ['templateCode'];
}
privatefunction 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
*/
privatefunction 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;
}
/**
* @param unknown $mobile
* @param unknown $verify_code
*
*/
publicfunction send_verify($mobile, $verify_code){
$params = array (//此處作了修改
'SignName'=> $this->signName,
'Format'=>'JSON',
'Version'=>'2017-05-25',
'AccessKeyId'=> $this->accessKeyId,
'SignatureVersion'=>'1.0',
'SignatureMethod'=>'HMAC-SHA1',
'SignatureNonce'=> uniqid (),
'Timestamp'=> gmdate ('Y-m-d\TH:i:s\Z'),
'Action'=>'SendSms',
'TemplateCode'=> $this->templateCode,
'PhoneNumbers'=> $mobile,
//'TemplateParam' => '{"code":"' . $verify_code . '"}'
'TemplateParam'=>'{"time":"1234"}'//更換為自己的實際模版
);
//var_dump($params);die;
// 計算簽名並把簽名結果加入請求引數
$params ['Signature']= $this->computeSignature ( $params, $this->accessKeySecret );
// 傳送請求(此處作了修改)
//$url = 'https://sms.aliyuncs.com/?' . http_build_query ( $params );
$url ='http://dysmsapi.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);
//var_dump($result);die;
if(isset ( $result ['Code'])){
$this->error = $this->getErrorMessage ( $result ['Code']);
returnfalse;
}
returntrue;
}
/**
* 獲取詳細錯誤資訊
*
* @param unknown $status
*/
publicfunction 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;
}
}
呼叫程式碼如下:
//生成驗證碼
$mobile = 'xxxxxxx';
$code = rand ( 1000, 9999 );
//傳送簡訊
$sms = new Sms();
//測試模式
$status = $sms->send_verify($mobile, $code);
if (!$status) {
echo $sms->error;
}