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

短信验证

阿里云帮助文档:
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
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值