首頁 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目录下 使用工廠模式實現Thinkphp6.0接入阿里雲短信三、使用Composer安装 Alibaba Cloud SDK for PHP

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

composer require alibabacloud/sdk
登入後複製

使用工廠模式實現Thinkphp6.0接入阿里雲短信四、使用编辑器打开项目 ,并在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测试发送短信验证码

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

使用工廠模式實現Thinkphp6.0接入阿里雲短信

使用工廠模式實現Thinkphp6.0接入阿里雲短信

输入正确的手机号,提示发送短信验证成功使用工廠模式實現Thinkphp6.0接入阿里雲短信这时我们来看看收到的验证码和缓存中的验证码是否一致使用工廠模式實現Thinkphp6.0接入阿里雲短信到这里我们的发送验证码已经完成

十三、这时我们需要校验验证码是否正确,在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校验验证码是否正确

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

使用工廠模式實現Thinkphp6.0接入阿里雲短信

输入正确的验证码,提示验证成功使用工廠模式實現Thinkphp6.0接入阿里雲短信

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

不知道小伙伴们有没有发现文中有两处参数校验的代码相识度很高,在后续的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.能量晶體解釋及其做什麼(黃色晶體)
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它們
1 個月前 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