ホームページ PHPフレームワーク ThinkPHP ファクトリーモードを使用して Alibaba Cloud SMS への Thinkphp6.0 アクセスを実装する

ファクトリーモードを使用して Alibaba Cloud SMS への 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目录下 ファクトリーモードを使用して Alibaba Cloud SMS への Thinkphp6.0 アクセスを実装する三、使用Composer安装 Alibaba Cloud SDK for PHP

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

composer require alibabacloud/sdk
ログイン後にコピー

ファクトリーモードを使用して Alibaba Cloud SMS への 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测试发送短信验证码

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

ファクトリーモードを使用して Alibaba Cloud SMS への Thinkphp6.0 アクセスを実装する

ファクトリーモードを使用して Alibaba Cloud SMS への Thinkphp6.0 アクセスを実装する

输入正确的手机号,提示发送短信验证成功ファクトリーモードを使用して Alibaba Cloud SMS への Thinkphp6.0 アクセスを実装する这时我们来看看收到的验证码和缓存中的验证码是否一致ファクトリーモードを使用して Alibaba Cloud SMS への 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校验验证码是否正确

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

ファクトリーモードを使用して Alibaba Cloud SMS への Thinkphp6.0 アクセスを実装する

输入正确的验证码,提示验证成功ファクトリーモードを使用して Alibaba Cloud SMS への Thinkphp6.0 アクセスを実装する

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

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

以上がファクトリーモードを使用して Alibaba Cloud SMS への Thinkphp6.0 アクセスを実装するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

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 で連絡先のブロックを解除するには、次のことを行う必要があります。

Apple携帯電話で削除されたテキストメッセージを復元する方法 Apple携帯電話で削除されたテキストメッセージを復元する方法 Mar 08, 2024 pm 03:19 PM

Apple 携帯電話のテキスト メッセージからいくつかの重要なテキスト メッセージが削除され、多くのユーザーはそれらを復元する方法を知りませんが、実際、復元方法も非常に簡単ですので、今日は詳細な復元方法を紹介します。 Apple 携帯電話で削除されたテキスト メッセージを復元するにはどうすればよいですか? 回答: iCloud の復元、iTunes の復元、サードパーティ ソフトウェアの復元、オペレーターの復元の 4 つの方法があります。電話では、icloud データ復元を直接使用できます。 2. [設定] > [一般] > [復元] に移動し、iCloud バックアップから復元し、最新のテキスト メッセージのバックアップを選択します。 3. ユーザーが iTunes を使用して携帯電話をバックアップする場合、プレーヤーは次の操作を行うだけで済みます。

PHPでSMS認証コードの自動スワイプ防止機能を実現 PHPでSMS認証コードの自動スワイプ防止機能を実現 Sep 13, 2023 pm 12:01 PM

PHP は SMS 検証コードの自動アンチスワイプ機能を実装していますが、これには特定のコード サンプルが必要です。最新のインターネット アプリケーションでは、SMS 検証コードは一般的な ID 検証方法の 1 つです。ただし、悪意のあるユーザーが存在するため、SMS 検証コードは自動攻撃に対して脆弱であることがよくあります。これは、いわゆる SMS 検証コードのアンチスワイプ問題です。ユーザーのアカウントのセキュリティとシステムの安定性を保護するには、PHP で SMS 検証コードの自動アンチスワイプ機能を実装する必要があります。この記事では、IP アドレスと時間間隔に基づく簡単な方法を紹介し、具体的な PHP コード例を示します。 1つ

削除されたテキスト メッセージを回復する方法必読: 削除されたテキスト メッセージの回復チュートリアル 削除されたテキスト メッセージを回復する方法必読: 削除されたテキスト メッセージの回復チュートリアル Mar 25, 2024 pm 12:26 PM

多くの友人は、携帯電話を使用しているときに重要なテキスト メッセージを誤って削除してしまいます。復元したいのですが、その方法がわかりません。この記事では、「クラウド スペース」を例として、削除されたテキスト メッセージに返信する方法を説明します。まず、携帯電話を開いて、携帯電話に付属している「クラウドスペース」を見つけます。以下に示すように: 現在、ほとんどのブランド携帯電話には「クラウド サービス」機能が搭載されています。この機能は通常、デフォルトでオンになっています。オンにすると、テキスト メッセージなどの重要なデータが電話機内に定期的にバックアップされます。クラウドサービスをオンにした後、メニューをプルダウンしてSMSバックアップ時間を確認してください。以下に示すように、バックアップ時刻がテキストメッセージを削除した時刻よりも前の場合は、削除されたテキストメッセージがクラウドスペースにアップロードされて保存されていることを意味し、この時点で「バックアップと復元」オプションをクリックします

気象警報情報を画面の大半に表示させましょう。フラッシュメッセージなどの強制リマインド技術が防災・減災の現場で導入されています 気象警報情報を画面の大半に表示させましょう。フラッシュメッセージなどの強制リマインド技術が防災・減災の現場で導入されています Jul 17, 2024 pm 08:28 PM

7月16日のニュースによると、中国気象局の公式発表によると、本格的な洪水期に入り、我が国の多くの場所で継続的な豪雨と強い対流気象に見舞われ、洪水防止と救援の状況は複雑かつ厳しいものとなっている。 。今年初め以来、中国気象局は防災・減災活動を展開するための会議を複数回開催し、早期警報と緊急対応の連携強化を求め、「フラッシュメッセージ」などの新たな情報必須リマインダーの適用を精力的に推進している。 、および早期警報情報の一般公開率と受信率を継続的に改善し、予防リマインダーがより的を絞ったものとなり、早期警報、対応、フィードバックの閉ループを形成して、洪水防止と災害救援の機会を獲得します。 1. 中国気象局公共気象サービスセンター(国家早期警報情報発表センター)は、早期警報の方向性を強化し、「フラッシュメッセージ」必須リマインダーに基づく高レベルの早期警報発表技術を確立する。

iPhone 11でテキストメッセージが受信できない問題を解決する方法のチュートリアル iPhone 11でテキストメッセージが受信できない問題を解決する方法のチュートリアル Mar 23, 2024 am 08:41 AM

1. 連絡先の SMS フィルタリングがオンになっているか、電話機の iMessage がオンになっていない可能性があります。 2. 機内モードとマナーモードがオンになっている可能性があります。 3. お住まいの地域の通信事業者がサービスの中断や携帯電話料金の滞納をしている可能性がありますので、問題を解決するために通信事業者に連絡することをお勧めします。 4. 携帯電話システムに障害が発生している可能性がありますので、オペレーター設定および携帯電話システムを更新し、携帯電話を再起動することをお勧めします。 5. ハードウェア障害の可能性がありますので、Apple サービスセンターに行ってテストを受けることをお勧めします。

See all articles