php与阿里云短信接口接入操作案例分析
本文实例讲述了php与阿里云短信接口接入操作。分享给大家供大家参考,具体如下:
使用阿里云短信API,需要在控制台获取以下必要参数,其中需要自己手机验证+官方审核多次,尤其审核需要保持耐心。
1.accessKeyId 相当于你的个人账户密钥;
2.accessKeySecret与上是成对的;
3.SignName 个人签名,在发出去的短信中,这个签名会显示在开头,类似【签名】亲爱的用户......这种格式,SignName需要通过提交审核;
4.TemplateCode 模板代码,阿里云短信是无法完全自定义短信的,需要通过审核的模板,然后自己再替换掉模板中的变量,如模板:“您的验证码是$[code]”,code就是变量,使用时需设置变量值{"code":"12345"}(设置变量值的过程在demo中实现),短信发出去后变成:“您的验证码是12345”,每个通过审核的模板会提供一个模板代码;
最新的阿里云短信接口,适用于阿里大于搬家以后的情况。
之前一直用阿里大于的短信接口,最近上项目时发现阿里大于悄悄地搬家到了阿里云!阿里云的SDK文件繁多,看得一头雾水!下面代码是最新的可适用于阿里云短信服务的类,亲测成功!
'xxxxxxxxxxx',
'accessKeySecret'=>'xxxxxxxxxx',
'signName'=>'你的签名',
'templateCode'=>'SMS_76510109'
);
//配置参数
$this->accessKeyId=$cofig['accessKeyId'];
$this->accessKeySecret=$cofig['accessKeySecret'];
$this->signName=$cofig['signName'];
$this->templateCode=$cofig['templateCode'];
}
privatefunctionpercentEncode($string){
$string=urlencode($string);
$string=preg_replace('/\+/','%20',$string);
$string=preg_replace('/\*/','%2A',$string);
$string=preg_replace('/%7E/','~',$string);
return$string;
}
/**
*签名
*
*@paramunknown$parameters
*@paramunknown$accessKeySecret
*@returnstring
*/
privatefunctioncomputeSignature($parameters,$accessKeySecret){
ksort($parameters);
$canonicalizedQueryString='';
foreach($parametersas$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;
}
/**
*@paramunknown$mobile
*@paramunknown$verify_code
*
*/
publicfunctionsend_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;
}
/**
*获取详细错误信息
*
*@paramunknown$status
*/
publicfunctiongetErrorMessage($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=newSms();
//测试模式
$status=$sms->send_verify($mobile,$code);
if(!$status){
echo$sms->error;
}
更多关于PHP相关内容感兴趣的读者可查看本站专题:《PHP进程与线程操作技巧总结》、《PHP网络编程技巧总结》、《PHP基本语法入门教程》、《PHP数组(Array)操作技巧大全》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》
希望本文所述对大家PHP程序设计有所帮助。