php实现短信验证(阿里云通信)和邮箱验证(phpmailer)

来源:互联网 发布:下载淘宝2016新版本 编辑:程序博客网 时间:2024/06/10 18:10

短信验证

阿里云帮助文档:
https://help.aliyun.com/document_detail/55451.html?spm=5176.doc53652.6.555.n5nlev
教程:
http://www.thinkphp.cn/code/3347.html

  1. 首先在阿里云上获取到三个数据:(帮助文档中有介绍)
    (1)阿里云访问密钥(AccessKeyId 与 AccessKeySecret)
    (2)短信签名(签名名称)
    短信签名
    (3)短信模板(模板code)
    短信模板

2.下面是短信验证码发送类,copy的上面的教程里面的

<?php/** * 阿里云短信验证码发送类 * @author Administrator * */class Sms {    // 保存错误信息    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'];    }    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;    }    /**     * @param unknown $mobile                 * @param unknown $verify_code                 *     */    public function 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'] );            return false;        }        return true;    }    /**     * 获取详细错误信息     *     * @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' => '账户短信开通状态不正确',                '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;    }}

3.发送代码

 //生成验证码    $mobile = 'xxxxxxx';//手机号    $code = rand ( 1000, 9999 );//验证码    //实例化短信发送类    $sms = new Sms();    //发送短信    $status = $sms->send_verify($mobile, $code);    if (!$status) {        echo $sms->error;    }

使用说明:
上面的代码需要修改的有:
(1)短信验证码类:
构造函数__construct里面的$cofig

 $cofig = array (                'accessKeyId' => '你自己的accessKeyId',                'accessKeySecret' => '你自己的accessKeySecret',                'signName' => '短信签名名称',                'templateCode' => '短信模板code'         );

除此之外还有send_verify函数中的

'TemplateParam' => '{"变量1":"1","变量2":"2"...}'   //更换为自己的实际模版

比如你的模板是
模板内容
那么就是变量就是number,值就是你的验证码

(2)发送代码中的:$mobile, $code

运行代码,就可以发送手机验证码了(亲测成功)

邮箱验证

教程:http://blog.csdn.net/baidu_30000217/article/details/51550259
教程中说的已经很清楚了,我是在tp5框架中使用的,在这补充几点:

  1. 如果你有composer,直接使用命令
composer require phpmailer/phpmailer

完成之后phpmailer就安装在vendor文件夹中了

  1. 使用phpmailer,直接在控制器中加上
use \PHPMailer;use \SMTP;

这样就可以使用phpmailer相关类了

发送邮件的方法教程中已经讲的很详细了,我这里也copy了一份:

/*发送邮件方法 *@param $to:接收者 $title:标题 $content:邮件内容 *@return bool true:发送成功 false:发送失败 */function sendMail($to,$title,$content){    //引入PHPMailer的核心文件 使用require_once包含避免出现PHPMailer类重复定义的警告    require_once("phpmailer/class.phpmailer.php");     require_once("phpmailer/class.smtp.php");    //实例化PHPMailer核心类    $mail = new PHPMailer();    //是否启用smtp的debug进行调试 开发环境建议开启 生产环境注释掉即可 默认关闭debug调试模式    $mail->SMTPDebug = 1;    //使用smtp鉴权方式发送邮件    $mail->isSMTP();    //smtp需要鉴权 这个必须是true    $mail->SMTPAuth=true;    //链接qq域名邮箱的服务器地址    $mail->Host = 'smtp.qq.com';    //设置使用ssl加密方式登录鉴权    $mail->SMTPSecure = 'ssl';    //设置ssl连接smtp服务器的远程服务器端口号,以前的默认是25,但是现在新的好像已经不可用了 可选465或587    $mail->Port = 465;    //设置smtp的helo消息头 这个可有可无 内容任意    // $mail->Helo = 'Hello smtp.qq.com Server';    //设置发件人的主机域 可有可无 默认为localhost 内容任意,建议使用你的域名    $mail->Hostname = 'http://www.lsgogroup.com';    //设置发送的邮件的编码 可选GB2312 我喜欢utf-8 据说utf8在某些客户端收信下会乱码    $mail->CharSet = 'UTF-8';    //设置发件人姓名(昵称) 任意内容,显示在收件人邮件的发件人邮箱地址前的发件人姓名    $mail->FromName = 'LSGO实验室';    //smtp登录的账号 这里填入字符串格式的qq号即可    $mail->Username ='12345678@qq.com';    //smtp登录的密码 使用生成的授权码(就刚才叫你保存的最新的授权码)    $mail->Password = 'sqyofzbqlfkntbncl';    //设置发件人邮箱地址 这里填入上述提到的“发件人邮箱”    $mail->From = '12345678@qq.com';    //邮件正文是否为html编码 注意此处是一个方法 不再是属性 true或false    $mail->isHTML(true);     //设置收件人邮箱地址 该方法有两个参数 第一个参数为收件人邮箱地址 第二参数为给该地址设置的昵称 不同的邮箱系统会自动进行处理变动 这里第二个参数的意义不大    $mail->addAddress($to,'lsgo在线通知');    //添加多个收件人 则多次调用方法即可    // $mail->addAddress('xxx@163.com','lsgo在线通知');    //添加该邮件的主题    $mail->Subject = $title;    //添加邮件正文 上方将isHTML设置成了true,则可以是完整的html字符串 如:使用file_get_contents函数读取本地的html文件    $mail->Body = $content;    //为该邮件添加附件 该方法也有两个参数 第一个参数为附件存放的目录(相对目录、或绝对目录均可) 第二参数为在邮件附件中该附件的名称    // $mail->addAttachment('./d.jpg','mm.jpg');    //同样该方法可以多次调用 上传多个附件    // $mail->addAttachment('./Jlib-1.1.0.js','Jlib.js');    $status = $mail->send();    //简单的判断与提示信息    if($status) {        return true;    }else{        return false;    }}

按照方法中的注释进行相关配置,然后调用此方法,就可以给邮箱发送信息了(亲测成功)

阅读全文
0 0
原创粉丝点击