1. 程式人生 > >最新阿里雲簡訊服務介面類【親測成功】

最新阿里雲簡訊服務介面類【親測成功】

阿里大於

最新的阿里雲簡訊介面,適用於阿里大於搬家以後的情況。
之前一直用阿里大於的簡訊介面,最近上專案時發現阿里大於悄悄地搬家到了阿里雲!阿里雲的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

function __construct($cofig = array()){

$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;

    }