侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

使用工厂模式实现Thinkphp6.0接入阿里云短信

ThinkPHP  /  管理员 发布于 8年前   493

如今,短信验证码已成为网站、APP的基础必备应用,应用场景十分丰富,随着移动互联网的发展会越来越多。作为一名码农,对第三方短信接口也是必须掌握的。本文将介绍使用工厂模式怎么实现ThinkPHP6.0接入阿里云短信。

一、环境要求

PHP版本 >= 7.1.0

开发环境必须安装有Composer

已开通阿里云短信服务,并且已获取AccessKey,创建模板和签名

最重要的,阿里云账户余额一定要有钱。

这里我就不演示开通短信服务和创建签名模板了,小伙伴们可以查看官方文档:https://help.aliyun.com/document_detail/108072.html?spm=a2c4g.11186623.6.565.1b4825903BoqGV

二、使用Composer安装Thinkphp6.0

如果您是第一次安装,请在命令行中切换到您的web目录执行下面的命令

composer create-project topthink/think sms

本教程将安装在C盘www目录下 aztp60.png三、使用Composer安装 Alibaba Cloud SDK for PHP

进到刚刚创建的sms项目下执行下面的命令

composer require alibabacloud/sdk

sdk.png四、使用编辑器打开项目 ,并在config文件夹下创建sms.php配置文件来管理阿里短信配置信息

<?phpreturn [    //阿里云短信API接口地址    'host'              => 'dysmsapi.aliyuncs.com',    //AccessKey ID    'access_key_id'     => '您的AccessKey ID',    //Access Key Secret    'access_key_secret' => '您的Access Key Secret',    //地区ID    'region_id'         => 'cn-hangzhou',    //模板CODE    'template_code'     => '您的模板CODE',    //签名名称    'sign_name'         => '您的短信签名名称',];

五、顺便在config文件夹下打开cache.php添加Redis缓存配置,后面发送短信验证码会用到

<?php// +----------------------------------------------------------------------// | 缓存设置// +----------------------------------------------------------------------return [    // 默认缓存驱动    'default' => env('cache.driver', 'redis'),    // 缓存连接方式配置    'stores'  => [        'file' => [            // 驱动方式            'type'       => 'File',            // 缓存保存目录            'path'       => '',            // 缓存前缀            'prefix'     => '',            // 缓存有效期 0表示永久缓存            'expire'     => 0,            // 缓存标签前缀            'tag_prefix' => 'tag:',            // 序列化机制 例如 ['serialize', 'unserialize']            'serialize'  => [],        ],        // Redis缓存        'redis' =>  [            //服务器地址            'host'      =>  '127.0.0.1',            //redis端口            'port'      =>  6379,            //驱动方式            'type'      =>  'redis',            //缓存前缀            'prefix'    => 'sms_code_',        ]    ],];

六、在app目录下创建common/lib/sms/Sms.php接口类,用来约束发送短信验证码的方法

<?phpnamespace app\common\lib\sms;//定义实现发送短信验证码的接口类,用来约束发送验证码的方法interface Sms{    /**     * @desc 发送短信验证码的方法     * @param string $phone 手机号     * @param int $code     验证码     * @return mixed     */    public static function sendCode(string $phone, int $code);}

七、在common/lib/sms目录下创建AliSms类来实现Sms接口的smsSend()

<?phpnamespace app\common\lib\sms;use AlibabaCloud\Client\AlibabaCloud;use AlibabaCloud\Client\Exception\ClientException;use AlibabaCloud\Client\Exception\ServerException;class AliSms implements Sms{    /**     * @desc 阿里云发送短信验证码     * @param string $phone 手机号     * @param int $code 验证码     * @return mixed|void     * @throws ClientException     */    public static function sendCode(string $phone, int $code)    {        //判断手机号和验证码是否为空        if (empty($phone) || empty($code)){            return false;        }        AlibabaCloud::accessKeyClient(config('sms.access_key_id'), config('sms.access_key_secret'))->regionId(config('sms.region_id'))->asDefaultClient();        try {            $result = AlibabaCloud::rpc()                ->product('Dysmsapi')                // ->scheme('https') // https | http                ->version('2017-05-25')                ->action('SendSms')                ->method('POST')                ->host(config('sms.host'))                ->options([                    'query' => [                        'RegionId' =>config('sms.region_id'),                        'SignName' => config('sms.sign_name'),                        'PhoneNumbers'  =>  $phone,                        'TemplateCode'  =>  config('sms.template_code'),                        'TemplateParam' =>  json_encode(['code'  =>  $code]),                    ],                ])->request();        } catch (ClientException $e) {            return false;        } catch (ServerException $e) {            return false;        }        return true;    }}

八、在common\lib目录下创建生成短信验证码的类 Code.php

<?phpnamespace app\common\lib;class Code{    /**     * @desc 生成4位或6位短信验证码,默认为4位     * @param int $length 验证码长度     * @return int     */    public static function getCode(int $length = 4)    {        $code = rand(1000,9999);        if ($length == 6){            $code = rand(100000,999999);        }        return $code;    }}

九、在common目录下创建service/Sms.php

<?phpnamespace app\common\Service;use app\common\lib\Code;class Sms{    /**     * @param string $phone 手机号     * @param int $lengthCode 验证码长度     * @param string $type 短信厂家,默认选用AliSms     * @return mixed     */    public static function sendCode(string $phone,int $lengthCode,string $type='AliSms')    {        //生成短信验证码        $code = Code::getCode(4);        //使用工厂模式 调用Lib层发送短信        $class = "app\common\lib\sms\\".$type;        $sms = $class::sendCode($phone,$code);        if ($sms){            //发送成功,把短信验证码存储Redis缓存中,并给失效时间            cache($phone,$code,300);        }        return $sms;    }}

十、在common目录下创建validate/SmsValidate验证器

<?phpnamespace app\common\validate;use think\Validate;class SmsValidate extends Validate{    //验证规则    protected $rule = [        'phone'     =>  'require|mobile',        'code'      =>  'require|number'    ];    //错误信息    protected $message = [        'phone.require'     =>  '请输入手机号',        'phone.mobile'      =>  '手机号格式错误',        'code.require'      =>  '短信验证码不能为空',        'code.number'       =>  '短信验证码必须为纯数字'    ];    //验证场景    protected $scene = [        'sendCode'  =>  ['phone']    ];}

十一、在controller目录下创建Sms.php

<?phpnamespace app\controller;use app\common\validate\SmsValidate;class Sms{    /**     * @desc 发送短信验证码     * @return \think\response\Json     */    public function code()    {        if (request()->isPost()){            //获取手机号            $data =  [                'phone' =>  request()->param('phone','','trim'),            ];            //参数校验            $validate = new SmsValidate();            if (!$validate->scene('sendCode')->check($data)){                return json(['code'=>0,'msg'=>$validate->getError()]);            }            //发送短信验证码            if (\app\common\Service\Sms::sendCode($data['phone'],6,'AliSms')){                return json(['code'=>1,'msg'=>'发送成功,请注意查收。']);            }else{                return json(['code'=>0,'msg'=>'发送失败,请稍后重试!']);            }        }    }}

十二、使用PostMan测试发送短信验证码

不输入手机号或输入错误手机号会给相应的提示。

sjh格式错误.png

kkkkk.png

输入正确的手机号,提示发送短信验证成功sjhyzm.png这时我们来看看收到的验证码和缓存中的验证码是否一致yzmyz.png到这里我们的发送验证码已经完成

十三、这时我们需要校验验证码是否正确,在app\controller目录下创建Login.php

<?phpnamespace app\controller;use app\common\validate\SmsValidate;class Login{    public function index()    {        //接收参数        $data = [            'phone' =>  request()->param('phone','','trim'),            'code'  =>  request()->param('code','','trim'),        ];        //参数校验        $validate = new SmsValidate();        if (!$validate->check($data)){            return json(['code'=>0,'msg'=>$validate->getError()]);        }        //从Redis中获取验证码        $redisCode = cache($data['phone']);        //判断验证码是否正确        if (empty($redisCode)){            return json(['code'=>0,'msg'=>'验证码已过期,请重新发送!']);        }        if ($redisCode != $data['code']){            return json(['code'=>0,'msg'=>'验证码输入错误,请重新输入!']);        }        return '验证成功';    }}

十四、使用PostMan校验验证码是否正确

输入错误的验证码,会给出响应的提示

yzmcw.png

输入正确的验证码,提示验证成功yzmyzcg.png

看到这里我相信很多小伙伴的验证码都已发送成功了。

不知道小伙伴们有没有发现文中有两处参数校验的代码相识度很高,在后续的thinkphp技术文章中我会对这个问题进行优化,感兴趣的小伙伴请关注。

以上就是使用工厂模式实现Thinkphp6.0接入阿里云短信的详细内容,更多请关注其它相关文章!


  • 上一条:
    Thinkphp5模板继承和替换的问题案例
    下一条:
    新手入门:手把手从PHP环境到ThinkPHP6框架下载
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • thinkphp + mongodb项目中数据加载慢问题分析及解决(0个评论)
    • thinkphp6框架中封装redis操作类(0个评论)
    • thinkphp6框架中实现定时任务功能流程步骤(0个评论)
    • Thinkphp5.1框架中实现Session+Redis会话共享流程步骤(0个评论)
    • TP5框架版本5.0.10安全漏洞根据官方补丁修复,也是本站安全漏洞修复(0个评论)
    • 近期文章
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2017-07
    • 2017-08
    • 2017-09
    • 2017-10
    • 2017-12
    • 2018-01
    • 2018-02
    • 2020-03
    • 2021-07
    • 2021-12
    • 2022-05
    • 2022-06
    • 2022-09
    • 2023-01
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客