最近公司切換阿里云短信服務(wù)合陵,只能用新的sdk,官方的api接口說明太簡單了澄阳,sdk太亂了
官方提供的屬實太亂太冗余了
雖然使用composer看似簡單拥知,但是包真的很大,本人不才碎赢,查了很多資料低剔,總結(jié)了一下,簡單明了,100多行代碼襟齿,解決阿里云短信發(fā)送問題姻锁,與大家共勉
使用步驟
1. 開通短信服務(wù)
???????? 這個就不用多說了,自行解決吧
2.?申請短信簽名
? ?
短信服務(wù)發(fā)送的短信中包括短信簽名和短信模板猜欺。短信簽名是短信發(fā)送者的署名屋摔,表示發(fā)送方的身份;短信模板是發(fā)送的短信內(nèi)容替梨。
使用短信簽名和短信模板前必須提交短信服務(wù)審核钓试,審核通過的簽名和模板才能使用在短信中。
申請短信簽名副瀑,請參考以下文檔在控制臺簽名管理頁面操作:
添加簽名
簽名規(guī)范
個人用戶簽名規(guī)范
企業(yè)用戶簽名規(guī)范
簽名審核
3. 申請短信模板
????
短信模板是發(fā)送的短信內(nèi)容弓熏。短信分為國內(nèi)短信和國際港澳臺短信,其中國內(nèi)短信包括驗證碼短信糠睡、短信通知和推廣短信挽鞠,不同類型的短信使用不同的短信模板,遵循不同的模板規(guī)范狈孔。
申請短信模板信认,請參考以下文在控制臺模板管理頁面檔操作:
添加文本短信模板
添加國際/港澳臺短信模板(企業(yè)用戶)
簽名規(guī)范
文本短信模板規(guī)范
國際/港澳臺短信模板規(guī)范
模板審核流程
4. 發(fā)送短信
????最重要的步驟來啦,看完官方文檔后均抽,還是直接copy下面的代碼使用吧
/**
* 阿里云短信發(fā)送類
* @author Arrow
* 參考:https://www.cnblogs.com/zxf100/archive/2019/09/06/11473662.html
*/
class aliyunsms{
// 保存錯誤信息
? ? public $error;
? ? // Access Key ID
? ? private $accessKeyId = '';
? ? // Access Access Key Secret
? ? private $accessKeySecret = '';
? ? // 簽名
? ? private $signName = '';
? ? // 模版ID
? ? private $templateCode = '';
? ? public function __construct($signName) {
$config = array (
'accessKeyId' => '',
? ? ? ? ? ? 'accessKeySecret' => '',
? ? ? ? ? ? 'signName' => $signName,
? ? ? ? );
? ? ? ? // 配置參數(shù)
? ? ? ? $this->accessKeyId= $config['accessKeyId'];
? ? ? ? $this->accessKeySecret= $config['accessKeySecret'];
? ? ? ? $this->signName= $config['signName'];
? ? }
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;
? ? }
/**
* Notes:發(fā)送模板消息
* User: Arrow
* Date: 2019-11-13
* Time: 15:16
*
* @param $templateCode? ? ? ? 短信模板ID
* @param $mobile? ? ? ? ? ? ? 接收短信的手機(jī)號碼
* @param array $templateParam? 短信模板變量對應(yīng)的實際值嫁赏,數(shù)組格式
* @return bool
*/
? ? public function send_message($templateCode,$mobile, $templateParam=array()) {
$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' => $templateCode,
? ? ? ? ? ? 'PhoneNumbers' => $mobile,
? ? ? ? ? ? 'TemplateParam' => json_encode($templateParam)//更換為自己的實際模版
? ? ? ? );
? ? ? ? //var_dump($params);die;
// 計算簽名并把簽名結(jié)果加入請求參數(shù)
? ? ? ? $params ['Signature']= $this->computeSignature ($params, $this->accessKeySecret );
? ? ? ? // 發(fā)送請求(此處作了修改)
? ? ? ? $url = 'https://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 );
? ? ? ? log_message('debug',__METHOD__.' '.__LINE__.'行,發(fā)送短信結(jié)果為=》'.var_export($result,true));
? ? ? ? //var_dump($result);die;
? ? ? ? if (isset ($result ['Code'] )) {
$this->error= $this->getErrorMessage ($result ['Code'] );
? ? ? ? ? ? log_message('debug',__METHOD__.' '.__LINE__.'行油挥,發(fā)送短信結(jié)果error為=》'.var_export($this->error,true));
? ? ? ? ? ? return false;
? ? ? ? }
return true;
? ? }
/**
* 獲取詳細(xì)錯誤信息
*
* @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' => '賬戶短信開通狀態(tài)不正確',
? ? ? ? ? ? 'InvalidSignName.Malformed' => '短信簽名不正確或簽名狀態(tài)不正確',
? ? ? ? ? ? 'InvalidTemplateCode.MalFormed' => '短信模板Code不正確或者模板狀態(tài)不正確',
? ? ? ? ? ? 'InvalidRecNum.Malformed' => '目標(biāo)手機(jī)號不正確潦蝇,單次發(fā)送數(shù)量不能超過100',
? ? ? ? ? ? 'InvalidParamString.MalFormed' => '短信模板中變量不是json格式',
? ? ? ? ? ? 'InvalidParamStringTemplate.Malformed' => '短信模板中變量與模板內(nèi)容不匹配',
? ? ? ? ? ? 'InvalidSendSms' => '觸發(fā)業(yè)務(wù)流控',
? ? ? ? ? ? 'InvalidDayu.Malformed' => '變量不能是url,可以將變量固化在模板中'
? ? ? ? );
? ? ? ? if (isset ($message [$status] )) {
return $message [$status];
? ? ? ? }
return $status;
? ? }
}
遇到的坑之點滴:
你以為按照官方給出的步驟就能成了嗎深寥,too young to simple
反正我這個不行攘乒,一直提示:isp.RAM_PERMISSION_DENY
原因:RAM權(quán)限不足。 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
解決方案:請為當(dāng)前使用的AK對應(yīng)子賬號進(jìn)行授權(quán):AliyunDysmsFullAccess(管理權(quán)限)惋鹅。具體操作請參考:訪問權(quán)限控制则酝。? 鏈接還打不開,醉了
去RAM中把該用戶的權(quán)限添加上短信相關(guān)的權(quán)限? ? ? ? ? ? ? ? ? ??