短信类
<?php
/**
*
* Enter description here ...
* @author Lance
*
*/
class ZSms
{
/**
* 阿里云短信验证码发送类
*/
// 保存错误信息
public $error;
// Access Key ID
private $accessKeyId = '';
// Access Access Key Secret
private $accessKeySecret = '';
// 签名
private $signName = '';
// 模版ID
private $templateCode = '';
//短信模板中参数
private $templatePara = '';
public function __construct($config = array())
{
$this->accessKeyId =$config['accessKeyId '];
$this->accessKeySecret =$config['accessKeySecret '];
$this->signName = $config ['signName'];
$this->templateCode = $config ['templateCode'];
}
function percentEncode($str)
{
// 使用urlencode编码后,将"+","*","%7E"做替换即满足ECS API规定的编码规范
$res = urlencode($str);
$res = preg_replace('/\+/', '%20', $res);
$res = preg_replace('/\*/', '%2A', $res);
$res = preg_replace('/%7E/', '~', $res);
return $res;
}
function https_request($url)
{
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$data = curl_exec($curl);
if (curl_errno($curl)) {return 'ERROR '.curl_error($curl);}
curl_close($curl);
return $data;
}
function xml_to_array($xml){
$reg = "/<(\w+)[^>]*>([\\x00-\\xFF]*)<\\/\\1>/";
if(preg_match_all($reg, $xml, $matches)){
$count = count($matches[0]);
for($i = 0; $i < $count; $i++){
$subxml= $matches[2][$i];
$key = $matches[1][$i];
if(preg_match( $reg, $subxml )){
$arr[$key] = $this -> xml_to_array( $subxml );
}else{
$arr[$key] = $subxml;
}
}
}
return @$arr;
}
/**
* 签名
*
* @param $parameters
* @param $accessKeySecret
* @return string
*/
function computeSignature($parameters, $accessKeySecret)
{
// 将参数Key按字典顺序排序
ksort($parameters);
// 生成规范化请求字符串
$canonicalizedQueryString = '';
foreach($parameters as $key => $value)
{
$canonicalizedQueryString .= '&' . $this -> percentEncode($key)
. '=' . $this -> percentEncode($value);
}
// 生成用于计算签名的字符串 stringToSign
$stringToSign = 'GET&%2F&' . $this -> percentencode(substr($canonicalizedQueryString, 1));
//echo "<br>".$stringToSign."<br>";
// 计算签名,注意accessKeySecret后面要加上字符'&'
$signature = base64_encode(hash_hmac('sha1', $stringToSign, $accessKeySecret . '&', true));
return $signature;
}
/**
* 发送验证码
*
* @param unknown $mobile
* @param unknown $verify_code
*
*/
public function send_verify($mobile,$verify_code)
{
$target = "https://dysmsapi.aliyuncs.com/?";
$data = array(
'AccessKeyId' => $this->accessKeyId,
'Action' => 'SendSms',
'Format' => 'XML',
'OutId' => '123',
'PhoneNumbers' =>$mobile,
'RegionId' => 'cn-hangzhou',
'SignName'=>'暖心致品',
'SignatureMethod' => 'HMAC-SHA1',
'SignatureNonce'=> uniqid(),
'SignatureVersion' => '1.0',
'TemplateCode' => $this->templateCode,
'TemplateParam' => "{code:$verify_code}",
'Timestamp' => gmdate('Y-m-d\TH:i:s\Z'),
'Version' => '2017-05-25'
);
// 计算签名并把签名结果加入请求参数
$data['Signature'] = $this -> computeSignature($data, $this->accessKeySecret);
$result = $this -> xml_to_array($this -> https_request($target.http_build_query($data)));
dd($result);
echo $result['Error']['Code']."--->".$result['Error']['Message'];
echo "<br><br>".$target . http_build_query($data);
}
/**
* 获取详细错误信息
*
* @param unknown $status
*/
public function getErrorMessage($status)
{
$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;
}
}
控制器调用
$config = config('aliyun_sms');
$data = [
'accessKeyId' => $config ['accessKeyId'], //your appid
'accessKeySecret' => $config ['accessKeySecret'], //your app_secret
'signName' => $config ['signName'], //your 签名
'templateCode' => $config ['templateCode'.$type], //your 模板编号
'templatePara' => $config ['templatePara'.$type] //your 模板中的变量
];
$sms = new \api\AliyunSms($data);
$status = $sms->send_verify($mobile, $veryify_code);
if(!$status)
//短信发送失败
return false;
return true;