阿里云短信验证码发送类

<?php
class Sms { 

// 保存错误信息
public $error;
// AccessKeyID
private $accessKeyId = '';
// AccessAccessKeySecret
private $accessKeySecret = '';
// 短信签名中的签名名称
private $signName = '';
// 模版(阿里云提供)
private $templateCode = '';

public function __construct($cofig = array()) {
    $cofig = array (
        'accessKeyId'       =>  '',     //填写自己的
        'accessKeySecret'   =>  '',     //填写自己的
        'signName'          =>  '',     //填写自己设置的
        'templateCode'      =>  ''      //填写自己所需要的
    );
    // 配置参数
    $this->accessKeyId = $cofig['accessKeyId'];
    $this->accessKeySecret = $cofig['accessKeySecret'];
    $this->signName = $cofig['signName'];
    $this->templateCode = $cofig['templateCode'];
}
/**
 * 编码
 * @param $string   要编码的字符串
 * @return string
 */
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 $params   要计算签名的参数
* @param $accesss_key_secret  秘钥
* @return string
*/
private function calculatedSignature($params, $accessKeySecret) {
    // 将参数排序(ksort()对数组按照键名排序)
    ksort($params);
    // 构造规范化的请求字符串 
    $canonicalizedQueryString = '';
    foreach ($params as $key => $value ) {
        // 对每个请求参数的名称和值进行编码
        $canonicalizedQueryString .=
        '&'.$this->percentEncode($key).'='.$this->percentEncode($value);
    }       
           // 构造用于计算签名的字符串
           // $stringToSign =
            'GET&%2F&'.$this->percentEncode(substr($canonicalizedQueryString,1));
           $stringToSign = 
           'POST&%2F&'.$this->percentEncode(substr($canonicalizedQueryString,
           // 计算签名 HMAC 值,
           // 按照 Base64 编码规则把 HMAC 值编码成字符串,
           // 即得到签名值(Signature)
           $this->percentEncode
           (base64_encode(hash_hmac('sha1', $stringToSign,$accessKeySecret.'&', true)));
           return $signature;
       }
/**
* 发送验证码 
* https://help.aliyun.com/document_detail/44364.html?spm=5176.doc44368.6.126.gSngXV
*
* @param unknown $mobile
* @param unknown $verify_code
*/
public function send_verify($mobile, $verify_code) {        
    $aliSendSmsUrl = "http://sms.aliyuncs.com/";
    //模板中的参数,自己起名字(模版不同,对应模版参数不同)
    $prodect = '';
    $params = array(
        //Access Key Id
        'AccessKeyId'       =>  $this->accessKeyId,    
        //操作接口名,系统规定参数,取值:SingleSendSms   
        'Action'            =>  'SingleSendSms',
        //返回值类型
        'Format'            =>  'JSON',
        //短信模板中的变量
        'ParamString'       =>  '{"code":"'.$verify_code.'","product":"'.$prodect.'"}', 
        //目标手机号,多个手机号可以逗号分隔
        'RecNum'            =>  $mobile,
        //签名方式
        'SignatureMethod'   =>  'HMAC-SHA1',
        //随机字符串
        'SignatureNonce'    =>  $this->genPasswd(16),
        //签名算法版本
        'SignatureVersion'  =>  '1.0',
        //管理控制台中配置的短信签名(状态必须是验证通过)
        'SignName'          =>  $this->signName,
        //管理控制台中配置的审核通过的短信模板的模板CODE(状态必须是验证通过)
        'TemplateCode'      =>  $this->templateCode,
        //请求时间戳,UTC时间
        'Timestamp'         =>  gmdate('Y-m-d\TH:i:s\Z'),
        //版本号,本版本对应日期
        'Version'           =>  "2016-09-27"
    );
    // 计算签名并把签名结果加入请求参数
    $params ['Signature'] = $this->calculatedSignature($params, $this->accessKeySecret);
    // 发送请求$res = $this->postCUrl("http://sms.aliyuncs.com/?", http_build_query ($params));这个也可以
    foreach($params as $key => $val) {
        $post_data .= '&'.$key.'='.$val;
    }
    $res = $this->postCUrl($aliSendSmsUrl, $post_data);
    return json_decode($res, true);
}

/**
 * CUrl封装的post方式请求API的方法
 * @param string $url
 * @param array $data post数据
 * @param int $timeout 超时时间
 */
public function postCUrl($url, $data, $timeout=3) {
    $ch = curl_init();

    $urlinfo = parse_url($url);
    $domain = $urlinfo['host'];
    $headers = array("Host:".$domain);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

    //分析是否开启SSL加密
    $ssl = substr($url, 0, 8) == 'https://' ? true : false;
    if ($ssl) {
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); // 对认证证书来源的检查
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 1); // 从证书中检查SSL加密算法是否存在
    }

    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0);
    curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);

    $res = curl_exec($ch);
    if(curl_error($ch)=='') {
        curl_close($ch);
        return $res;
    }
    curl_close($ch);
    return false;
}
/**
 * 生成随机字符串
 * @param $length  生成随机字符串长度
 */
public function genPasswd($length = 8) {
    // 密码字符集,可任意添加你需要的字符
    $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
    $password = '';
    for ( $i = 0; $i < $length; $i++ ) {
        $password .= $chars[ mt_rand(0, strlen($chars) - 1) ];
    }
    return $password;
}
/**
 * 获取详细错误信息
 * @param $code        如果有错误,就会有返回Code
 */
public function getErrorMessage($code) {
    // https://help.aliyun.com/document_detail/44364.html?spm=5176.doc44365.6.572.8bxdsL页面下的错误码
    $message = array( 
        'InvalidDayuStatus.Malformed'=> '账户短信开通状态不正确', 
        'InvalidSignName.Malformed'=>'短信签名不正确或签名状态不正确',
        'InvalidTemplateCode.MalFormed'=>'短信模板Code不正确或者模板状态不正确', 
        'InvalidRecNum.Malformed'=>'目标手机号不正确,单次发送数量不能超过100',
        'InvalidParamString.MalFormed'=>'短信模板中变量不是json格式', 
        'InvalidParamStringTemplate.Malformed' =>'短信模板中变量与模板内容不匹配',
        'InvalidSendSms'=>  '触发业务流控',//发送频率太快
        'InvalidDayu.Malformed'=>'变量不能是url,可以将变量固化在模板中',
        'SignatureDoesNotMatch'=>'签名不匹配'
    );
    if (isset($message[$code])) {
        return $message[$code];
    }
    return true;
}

}

$mobile = "";                //手机号
$code = rand(100000, 999999);//生成验证码
//发送短信
$sms = new Sms();
$res = $sms->send_verify($mobile, $code);
if(isset($res['Code'])){
    $sms->error = $sms->getErrorMessage($res['Code']);
    echo "短信发送失败,失败原因:".$sms->error;
    return false;
}
echo "短信发送成功";
return true;
?>

/**
* 阿里云短信验证码发送类
* @author GavinLau
* @email gavinliuyu@gmail.com
* @blog CSDN: http://blog.csdn.net/iamlauy
* CSDN: http://blog.csdn.net/gavinlauy
* 新浪博客: http://blog.sina.com.cn/iamlauy
* @PHP交流群 440479799(QQ)
*/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值