编写一个属于自己的短信邮件验证码发送集合

少说多做

这里是验证类

<?php
/**
 * Created by 小羊.
 * Author: 勇敢的小笨羊
 * 微博: http://weibo.com/xuzuxing
 * Date: 2018/3/18
 * Time: 11:17
 */

namespace app\common\service;

use think\Cache;
use think\Exception;
use think\Log;

/**
 * 验证码处理类库
 * VerificationCode
 * @package app\common\service
 */
class VerificationCode
{
    /**
     * 静态变量保存全局的实例
     * @var null
     */
    private static $_instance = null;

    /**
     * 发送驱动
     * @var string
     */
    private static $drive = 'Mail';
    /**
     * 私有的构造方法
     */
    private function __construct() {

    }

    /**
     * 静态方法 单例模式统一入口
     * @param string $drive  驱动
     * @return VerificationCode|null
     */
    public static function getInstance($drive = null) {
        if(is_null(self::$_instance)) {
            self::$_instance = new self();
        }
        if(!is_null($drive)) {
            self::$drive = $drive;
        }
        return self::$_instance;
    }

    /**
     * 发送验证码
     * @param $towhom
     * @return bool
     */
    public function send($towhom){
        $code = getRandChar('6','NUMBER');
        try{
            if (self::$drive == 'SMS'){
                $result = AliSms::getInstance(config('alisms'))->send($towhom, $code);
            }else{
                $result = Mail::getInstance(config('mail'))->send($towhom, $towhom, $subject = '您本次操作验证码', self::getMailCentent($towhom,$code), $attachment = null);
            }
            //储存验证码 300秒
            if($result){
                Cache::set($towhom , $code ,300);
            }
            return true;
        }catch (Exception $ex){
            Log::record('VeriCode:' . json_encode($ex->getMessage()));
            return false;
        }
    }

    /**
     * 验证码验证
     * @param $Towhom
     * @param $code
     * @return bool
     */
    public function valid($Towhom, $code){
        if (is_null($Towhom)){
            return false;
        }
        return Cache::get($Towhom) == $code?true:false;
    }

    /**
     * 获取发送邮件内容
     * @param $Towhom
     * @param $code
     * @return string
     */
    private function getMailCentent($Towhom,$code){
        $centent = "自行处理吧";
        return $centent;

    }


}

 

这里是邮箱发送类

<?php
namespace app\common\service;

use phpmailer\PHPMailer;
use think\Exception;
use think\Log;

class Mail
{

    const LOG_TPL   = "Mail:";

    /**
     * 静态变量保存全局的实例
     * @var null
     */
    private static $_instance = null;

    /**
     * 配置参数
     * @var null
     */
    private static $config = null;

    /**
     * 私有的构造方法
     */
    private function __construct() {

    }

    /**
     * 静态方法 单例模式统一入口
     */
    public static function getInstance($config) {
        if(is_null(self::$_instance)) {
            self::$_instance = new self();
        }
        self::$config = $config;
        return self::$_instance;
    }

    /**
     * 系统邮件发送函数
     * @param $tomail
     * @param $name
     * @param string $subject
     * @param string $body
     * @param null $attachment
     * @return bool|string
     * @throws
     */
    public function send($tomail, $name, $subject = '', $body = '', $attachment = null) {

        try{
            $mail = new PHPMailer();           //实例化PHPMailer对象
            $replyEmail         = '';          //留空则为发件人EMAIL
            $replyName          = '';          //回复名称(留空则为发件人名称)
            $mail->CharSet      = 'UTF-8';     //设定邮件编码,默认ISO-8859-1,如果发中文此项必须设置,否则乱码
            $mail->IsSMTP();                   // 设定使用SMTP服务
            $mail->SMTPAuth     = true;        // 启用 SMTP 验证功能
            $mail->SMTPSecure   = 'ssl';       // 使用安全协议
            $mail->SMTPDebug    = self::$config['debug'];// SMTP调试功能 0=关闭 1 = 错误和消息 2 = 消息
            $mail->Host         = self::$config['host']; // SMTP 服务器
            $mail->Port         = self::$config['port']; // SMTP服务器的端口号
            $mail->Username     = self::$config['username'];    // SMTP服务器用户名
            $mail->Password     = self::$config['password'];     // SMTP服务器密码
            $mail->SetFrom(self::$config['address'], self::$config['name']);
            $mail->AddReplyTo($replyEmail, $replyName);
            $mail->Subject = $subject;
            $mail->MsgHTML($body);
            $mail->AddAddress($tomail, $name);
            if (is_array($attachment)) { // 添加附件
                foreach ($attachment as $file) {
                    is_file($file) && $mail->AddAttachment($file);
                }
            }
        }catch (Exception $e){
            Log::record(self::LOG_TPL . $mail->ErrorInfo);
            return false;
        }

        return $mail->Send() ? true : $mail->ErrorInfo;

    }
}

然后是短信发送类(阿里SMS)

<?php
/**
 * Created by 小羊.
 * Author: 勇敢的小笨羊
 * 微博: http://weibo.com/xuzuxing
 * Date: 2017/11/25
 * Time: 22:03
 */

namespace app\common\service;

use Aliyun\Sms\Api\SendSmsRequest;
use Aliyun\Sms\Core\Config;
use Aliyun\Sms\Core\DefaultAcsClient;
use Aliyun\Sms\Core\Profile\DefaultProfile;

// 加载区域结点配置
Config::load();

class AliSms
{

    /**
     * 静态变量保存全局的实例
     * @var null
     */
    private static $_instance = null;

    /**
     * Aliacs全局的实例
     * @var null
     */
    static $acsClient = null;

    /**
     * 参数配置
     * @var null
     */
    static $config = null;

    /**
     * 私有的构造方法
     */
    private function __construct() {

    }

    /**
     * 静态方法 单例模式统一入口
     */
    public static function getInstance($config) {
        if(is_null(self::$_instance)) {
            self::$_instance = new self();
        }
        self::$config = $config;
        return self::$_instance;
    }

    /**
     * 取得AcsClient
     *
     * @return DefaultAcsClient
     */
    private static function getAcsClient() {
        //产品名称:云通信流量服务API产品,开发者无需替换
        $product = "Dysmsapi";
        //产品域名,开发者无需替换
        $domain = "dysmsapi.aliyuncs.com";
        // TODO 此处需要替换成开发者自己的AK (https://ak-console.aliyun.com/)
        $accessKeyId = self::$config['AccessKeyId']; // AccessKeyId
        $accessKeySecret = self::$config['AccessKeySecret']; // AccessKeySecret
        // 暂时不支持多Region
        $region = "cn-hangzhou";
        // 服务结点
        $endPointName = "cn-hangzhou";
        if(static::$acsClient == null) {
            //初始化acsClient,暂不支持region化
            $profile = DefaultProfile::getProfile($region, $accessKeyId, $accessKeySecret);
            // 增加服务结点
            DefaultProfile::addEndpoint($endPointName, $region, $product, $domain);
            // 初始化AcsClient用于发起请求
            static::$acsClient = new DefaultAcsClient($profile);
        }
        return static::$acsClient;
    }

    /**
     * 发送短信
     * @param $phoneNumbers
     * @param string $templateParam
     * @param null $outId
     * @param null $smsUpExtendCode
     * @return mixed|\SimpleXMLElement
     */
    public function send($phoneNumbers, $templateParam = '0000', $outId = null, $smsUpExtendCode = null) {

        // 初始化SendSmsRequest实例用于设置发送短信的参数
        $request = new SendSmsRequest();
        // 必填,设置雉短信接收号码
        $request->setPhoneNumbers($phoneNumbers);
        // 必填,设置签名名称
        $request->setSignName(self::$config['signName']);
        // 必填,设置模板CODE
        $request->setTemplateCode(self::$config['templateCode']);
        // 可选,设置模板参数
        if($templateParam) {
            //参数格式  按照Alisms后台
            $SmsParam = ['code'  => $templateParam];

            $request->setTemplateParam(json_encode($SmsParam));
        }
        // 可选,设置流水号
        if($outId) {
            $request->setOutId($outId);
        }
        // 选填,上行短信扩展码
        if($smsUpExtendCode) {
            $request->setSmsUpExtendCode($smsUpExtendCode);
        }
        // 发起访问请求
        $acsResponse = static::getAcsClient()->getAcsResponse($request);

        return $acsResponse;

    }

}

以下是使用方法

 

 

Github:https://github.com/SingleSheep/VerificationCode#verificationcode