首页 php框架 ThinkPHP 使用工厂模式实现Thinkphp6.0接入阿里云短信

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

Apr 29, 2020 pm 10:39 PM
thinkphp6 短信

如今,短信验证码已成为网站、APP的基础必备应用,应用场景十分丰富,随着移动互联网的发展会越来越多。作为一名码农,对第三方短信接口也是必须掌握的。本文php中文网将介绍使用工厂模式怎么实现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配置文件来管理阿里短信配置信息

<?php

return [
    //阿里云短信API接口地址
    &#39;host&#39;              => &#39;dysmsapi.aliyuncs.com&#39;,

    //AccessKey ID
    &#39;access_key_id&#39;     => &#39;您的AccessKey ID&#39;,

    //Access Key Secret
    &#39;access_key_secret&#39; => &#39;您的Access Key Secret&#39;,

    //地区ID
    &#39;region_id&#39;         => &#39;cn-hangzhou&#39;,

    //模板CODE
    &#39;template_code&#39;     => &#39;您的模板CODE&#39;,

    //签名名称
    &#39;sign_name&#39;         => &#39;您的短信签名名称&#39;,
];
登录后复制

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

<?php

// +----------------------------------------------------------------------
// | 缓存设置
// +----------------------------------------------------------------------

return [
    // 默认缓存驱动
    &#39;default&#39; => env(&#39;cache.driver&#39;, &#39;redis&#39;),

    // 缓存连接方式配置
    &#39;stores&#39;  => [
        &#39;file&#39; => [
            // 驱动方式
            &#39;type&#39;       => &#39;File&#39;,
            // 缓存保存目录
            &#39;path&#39;       => &#39;&#39;,
            // 缓存前缀
            &#39;prefix&#39;     => &#39;&#39;,
            // 缓存有效期 0表示永久缓存
            &#39;expire&#39;     => 0,
            // 缓存标签前缀
            &#39;tag_prefix&#39; => &#39;tag:&#39;,
            // 序列化机制 例如 [&#39;serialize&#39;, &#39;unserialize&#39;]
            &#39;serialize&#39;  => [],
        ],
        // Redis缓存
        &#39;redis&#39; =>  [
            //服务器地址
            &#39;host&#39;      =>  &#39;127.0.0.1&#39;,
            //redis端口
            &#39;port&#39;      =>  6379,
            //驱动方式
            &#39;type&#39;      =>  &#39;redis&#39;,
            //缓存前缀
            &#39;prefix&#39;    => &#39;sms_code_&#39;,
        ]
    ],
];
登录后复制

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

<?php

namespace 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()

<?php

namespace 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(&#39;sms.access_key_id&#39;), config(&#39;sms.access_key_secret&#39;))->regionId(config(&#39;sms.region_id&#39;))->asDefaultClient();

        try {
            $result = AlibabaCloud::rpc()
                ->product(&#39;Dysmsapi&#39;)
                // ->scheme(&#39;https&#39;) // https | http
                ->version(&#39;2017-05-25&#39;)
                ->action(&#39;SendSms&#39;)
                ->method(&#39;POST&#39;)
                ->host(config(&#39;sms.host&#39;))
                ->options([
                    &#39;query&#39; => [
                        &#39;RegionId&#39; =>config(&#39;sms.region_id&#39;),
                        &#39;SignName&#39; => config(&#39;sms.sign_name&#39;),
                        &#39;PhoneNumbers&#39;  =>  $phone,
                        &#39;TemplateCode&#39;  =>  config(&#39;sms.template_code&#39;),
                        &#39;TemplateParam&#39; =>  json_encode([&#39;code&#39;  =>  $code]),
                    ],
                ])->request();
        } catch (ClientException $e) {
            return false;
        } catch (ServerException $e) {
            return false;
        }
        return true;
    }
}
登录后复制

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

<?php

namespace 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

<?php

namespace 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=&#39;AliSms&#39;)
    {
        //生成短信验证码
        $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验证器

<?php

namespace app\common\validate;

use think\Validate;

class SmsValidate extends Validate
{
    //验证规则
    protected $rule = [
        &#39;phone&#39;     =>  &#39;require|mobile&#39;,
        &#39;code&#39;      =>  &#39;require|number&#39;
    ];

    //错误信息
    protected $message = [
        &#39;phone.require&#39;     =>  &#39;请输入手机号&#39;,
        &#39;phone.mobile&#39;      =>  &#39;手机号格式错误&#39;,
        &#39;code.require&#39;      =>  &#39;短信验证码不能为空&#39;,
        &#39;code.number&#39;       =>  &#39;短信验证码必须为纯数字&#39;
    ];

    //验证场景
    protected $scene = [
        &#39;sendCode&#39;  =>  [&#39;phone&#39;]
    ];
}
登录后复制

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

<?php

namespace app\controller;

use app\common\validate\SmsValidate;

class Sms
{
    /**
     * @desc 发送短信验证码
     * @return \think\response\Json
     */
    public function code()
    {
        if (request()->isPost()){
            //获取手机号
            $data =  [
                &#39;phone&#39; =>  request()->param(&#39;phone&#39;,&#39;&#39;,&#39;trim&#39;),
            ];

            //参数校验
            $validate = new SmsValidate();
            if (!$validate->scene(&#39;sendCode&#39;)->check($data)){
                return json([&#39;code&#39;=>0,&#39;msg&#39;=>$validate->getError()]);
            }
            //发送短信验证码
            if (\app\common\Service\Sms::sendCode($data[&#39;phone&#39;],6,&#39;AliSms&#39;)){
                return json([&#39;code&#39;=>1,&#39;msg&#39;=>&#39;发送成功,请注意查收。&#39;]);
            }else{
                return json([&#39;code&#39;=>0,&#39;msg&#39;=>&#39;发送失败,请稍后重试!&#39;]);
            }

        }
    }
}
登录后复制

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

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

sjh格式错误.png

kkkkk.png

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

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

<?php

namespace app\controller;

use app\common\validate\SmsValidate;

class Login
{
    public function index()
    {
        //接收参数
        $data = [
            &#39;phone&#39; =>  request()->param(&#39;phone&#39;,&#39;&#39;,&#39;trim&#39;),
            &#39;code&#39;  =>  request()->param(&#39;code&#39;,&#39;&#39;,&#39;trim&#39;),
        ];
        //参数校验
        $validate = new SmsValidate();
        if (!$validate->check($data)){
            return json([&#39;code&#39;=>0,&#39;msg&#39;=>$validate->getError()]);
        }

        //从Redis中获取验证码
        $redisCode = cache($data[&#39;phone&#39;]);

        //判断验证码是否正确
        if (empty($redisCode)){
            return json([&#39;code&#39;=>0,&#39;msg&#39;=>&#39;验证码已过期,请重新发送!&#39;]);
        }
        if ($redisCode != $data[&#39;code&#39;]){
            return json([&#39;code&#39;=>0,&#39;msg&#39;=>&#39;验证码输入错误,请重新输入!&#39;]);
        }

        return &#39;验证成功&#39;;
    }
}
登录后复制

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

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

yzmcw.png

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

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

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

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

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
4 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

如何在iPhone上设置短信屏蔽功能 如何在iPhone上设置短信屏蔽功能 Feb 24, 2024 pm 01:48 PM

随着智能手机的普及,我们每天都会收到大量的短信,有些是广告推销信息,有些是垃圾短信,这些短信不仅浪费了我们的时间,还占据了手机的空间。然而,幸运的是,iPhone手机提供了一些功能来屏蔽这些烦人的短信。本文将介绍如何使用iPhone来屏蔽短信。要屏蔽短信,首先打开“设置”应用程序,然后滚动屏幕并点击“信息”。在信息设置界面,你可以看到一些选项,包括“已阻止的

短信里的字如何调大小 短信里的字如何调大小 Aug 29, 2023 am 11:38 AM

短信里的字调大小的方法:1、在iOS设备上,打开“设置”应用程序,然后选择“显示与亮度”选项,找到“文字大小”滑块,通过滑动滑块,可以调整整个设备上的文字大小,包括短信中的文字;2、在Android设备上,打开“设置”应用程序并选择“显示”选项,找到“字体大小”选项,通过选择不同的字体大小,可以预览并调整短信中的字体大小。

如何在iPhone上阻止短信 如何在iPhone上阻止短信 Jul 31, 2023 pm 09:49 PM

如何阻止来自iPhone上某人的短信?如果您收到来自要阻止的人的短信,则需要在iPhone上打开该消息。打开消息后,单击顶部的图标,其下方是手机号码或发件人姓名。现在点击信息在屏幕的右侧;现在,您将看到另一个屏幕,其中包含阻止此呼叫者的选项。单击此按钮,然后选择阻止联系人。该电话号码将无法再向您发送短信;它也将被阻止拨打您的iPhone。如何在iPhone上取消阻止被阻止的联系人?如果您决定允许被屏蔽的人向您发送信息,您可以随时在iPhone上取消阻止他们。要在iPhone上取消阻止联系人,您需

苹果手机短信删除了如何恢复回来 苹果手机短信删除了如何恢复回来 Mar 08, 2024 pm 03:19 PM

苹果手机短信删除了一些重要的短信,很多用户就不知道应该怎么恢复了,其实恢复的方法也是很简单的,今天就把详细的恢复方法分享给大家。苹果手机短信删除了如何恢复回来答:有四种方法,分别是iCloud恢复,iTunes恢复,第三方软件恢复和运营商恢复1、如果用户使用了icloud备份了自己手机的短信数据,可以直接使用icloud恢复数据。2、只需要进入【设置】>【通用】>【还原】,然后从iCloud备份中恢复,选择最近的短信备份就可以了。3、如果用户使用了iTunes备份了自己的手机,那么玩家只需要把

怎么找回短信删除内容 必看:已删除的短信恢复教程 怎么找回短信删除内容 必看:已删除的短信恢复教程 Mar 25, 2024 pm 12:26 PM

很多朋友在使用手机时,不小心把一些重要的短信给删除了,想要恢复但又不知道该如何操作,本期文章以“云空间”为例,教大家如何回复被删除的短信消息。首先打开手机,找到手机自带的“云空间”。如下图:现在大多数品牌手机都带有“云服务”功能,这个功能一般都是默认开启的,一旦开启它之后,它会定期的备份手机内的一些重要数据,其中就包括短信信息。打开云服务之后,下拉菜单,查看一下短信备份的时间。如下图:如果备份的时间早于自己删除短信的时间,那么就意味着被删除的短信已经上传到云空间保存了,此时点击“备份与恢复”选项

PHP实现短信验证码的自动防刷功能 PHP实现短信验证码的自动防刷功能 Sep 13, 2023 pm 12:01 PM

PHP实现短信验证码的自动防刷功能,需要具体代码示例在现代互联网应用中,短信验证码是常见的身份验证方式之一。然而,由于恶意用户的存在,短信验证码往往容易受到自动化攻击,即所谓的短信验证码防刷问题。为了保护用户的账户安全和系统的稳定性,我们需要在PHP中实现短信验证码的自动防刷功能。本文将介绍一种基于IP地址和时间间隔的简单方法,并提供具体的PHP代码示例。一

让气象预警信息霸屏!闪信等强制提醒技术落地防灾减灾一线 让气象预警信息霸屏!闪信等强制提醒技术落地防灾减灾一线 Jul 17, 2024 pm 08:28 PM

7月16日消息,据中国气象局官方公众号介绍,进入主汛期,我国多地遭遇持续强降水和强对流天气,防汛救灾形势复杂严峻。今年以来,中国气象局多次召开会议部署防灾减灾工作,要求强化预警和应急响应联动,大力推进“闪信”等信息强制提醒新技术应用,不断提高预警信息公众覆盖率和接收率,让防御提醒更具针对性,形成有预警、有叫应、有反馈的工作闭环,为防汛救灾赢得先机。1.中国气象局公共气象服务中心(国家预警信息发布中心)强化预警指向性,建立基于“闪信”强制提醒的高级别预警发布技

苹果11收不到短信的处理教程 苹果11收不到短信的处理教程 Mar 23, 2024 am 08:41 AM

1、可能是开启了短信过滤联系人,或者是手机iMessages没打开。2、可能是打开了飞行模式和勿扰模式。3、可能所在地区运营商出现服务中断或者手机欠费,建议联系运营商解决。4、可能手机系统故障,建议更新运营商设置和手机系统,并重启手机。5、可能是硬件故障,建议前往苹果服务中心检测。

See all articles