IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> TP6 腾讯云发送短信验证码配置详解 -> 正文阅读

[PHP知识库]TP6 腾讯云发送短信验证码配置详解

作者:token keyword

一、发送注册验证码代码实现

参考腾讯云文档
https://cloud.tencent.com/document/product/382/56058

1.通过composer安装

	composer require tencentcloud/tencentcloud-sdk-php

2.TP6框架相关代码
2.1添加相关接口方法

use app\common\controller\SmsController; // todo 这个引用千万别忘记

public function sendCode(){

        $phone = request()->post('phone');
        if (!isMobile($phone)){	//检测手机号方法 自己去写吧
            return SendError("手机号码不正常");
        }
        $sms = new SmsController($this->app);
        $sms->sendcode($phone);
        if ($sms->getError()){
            return SendError($sms->getError());
        }
        return SendSuccess("发送成功");
    }

2.2 在app/common文件夹下新建smscontroler类

/**
 * 发送验证码类
 */
namespace app\common\controller;

use TencentCloud\Sms\V20190711\SmsClient;
// 导入要请求接口对应的 Request 类
use TencentCloud\Sms\V20190711\Models\SendSmsRequest;
use TencentCloud\Common\Exception\TencentCloudSDKException;
use TencentCloud\Common\Credential;
// 导入可选配置类
use TencentCloud\Common\Profile\ClientProfile;
use TencentCloud\Common\Profile\HttpProfile;

class SmsController extends BaseController{

    protected $SecretId;  // 腾讯云账户秘密ID,注意不是短信中的id
    protected $SecretKey; // 腾讯云账户中的秘钥key
    protected $AppID;     // 腾讯云短信应用appid。应用管理 > 应用列表中的应用id
    protected $smsSign;   // 模板签名内容。一定是要 国内短信 > 签名管理 > 中的签名内容
    protected $templateId;// 正文模板中的模板id。   国内短信 > 正文模板管理 > 模板ID
    public $error ='';
    private $expire_time = 600;      //失效时间
    private $wait_time = 120;      //发送间隔秒数

    public function initialize()
    {
        parent::initialize(); // TODO: 相关配置放到了.env文件内
        $this->SecretId = env('SMS.sid', '');
        $this->SecretKey = env('SMS.skey', '');
        $this->AppID = env('SMS.appid', '');
        $this->smsSign = env('SMS.sign', '');
        $this->templateId = "493349";
    }

    /**
     * 发送验证码
     * @param string $phone 手机号码
     * @param int $t_type 模板类型 1 注册 2登录 3 忘记密码
     */
    public function sendcode($phone='',$t_type=1){
        $phone ="+86".$phone;

        //设置请求模板
        switch ($t_type){
            case 2:
                $this->templateId = "493349";	// 这个可随意改
                break;
            default:
                $this->templateId = "493349";	//默认注册模板id
        }
        // 随机验证码
        $TemplateParamSet = $this->setVcode($phone);
        if ($this->error){
            return  false;
        }

        try {
            // 实例化认证对象
            $cred = new Credential($this->SecretId, $this->SecretKey);
            $httpProfile = new HttpProfile();
            $httpProfile->setEndpoint("sms.tencentcloudapi.com");

            // 实例化一个 http 选项
            $clientProfile = new ClientProfile();
            $clientProfile->setHttpProfile($httpProfile);

            // 实例化一个 client 选项
            $client = new SmsClient($cred, "", $clientProfile);

            // 实例化一个 sms 发送短信请求对象,每个接口都会对应一个 request 对象。
            $req = new SendSmsRequest();
            // 发送短信验证码配置参数
            $params = '{"PhoneNumberSet":["'.$phone.'"],"TemplateID":"'.$this->templateId.'",
            "Sign":"'.$this->smsSign.'","TemplateParamSet":["'.$TemplateParamSet.'"],"SmsSdkAppid":"'.$this->AppID.'"}';

            $req->fromJsonString($params);

            // 通过 client 对象调用 SendSms 方法发起请求
            $resp = $client->SendSms($req);
            if ($resp->SendStatusSet[0]->Code !='Ok'){
                $this->error ='发送失败';
                return false;
            }
            return true;
        }
        catch(TencentCloudSDKException $e) {
            echo $e;
        }
    }

    /**
     * 生成验证码
     * @param $account
     */
    public function setVcode($account){

        $key = get_vcode_key($account);
        $vcodeData = cache($key);
        if (is_array($vcodeData) && !empty($vcodeData['when_send'])){
            if( time() - $vcodeData['when_send'] < $this->wait_time ){
                $this->error = '操作过于频繁,请稍后重试';
                return false;
            }
        }else{
            $vcodeData = array();
            $vcode = rand(100000,999999);
            $vcodeData['mobile'] = $account;
            $vcodeData['vcode'] = $vcode;
            $vcodeData['when_send'] = time();
            cache($key,$vcodeData,$this->expire_time);
            return $vcode;
        }
    }

    /**
     * 校验验证码
     * @param $account
     * @param $vcode
     * @author: liuhui
     * @Date: 2021/7/13 14:59
     */
    public function checkVcode($account, $vcode){
        $key = get_vcode_key($account);
        $vcodeData = cache($key);
        if ($vcodeData) {
            if($vcodeData['mobile']==$account && $vcodeData['vcode']==$vcode){
                if(time()-$vcodeData['when_send'] > $this->expire_time){
                    $this->error = '验证码已过期';
                    //删除过期缓存
                    cache($key,NULL);
                    return false;
                }else{
                    return true;
                }
            }else{
                $this->error = '验证码不正确';
                return false;
            }
        }else{
            $this->error = '验证失败';
            return false;
        }
    }

    public function getError(){
        return $this->error;
    }
}

二、错误解决

安装SDK之后,如果您的 PHP 环境证书有问题,可能会遇到报错,类似于
cURL error 60: See http://curl.haxx.se/libcurl/c/libcurl-errors.html,
请尝试按以下步骤解决:

1.到 https://curl.haxx.se/ca/cacert.pem 下载证书文件cacert.pem。
 将 cacert.pem文件复制到php安装目录中,如下,我的路经
E:\phpstudy_pro\Extensions\php\php7.4.3nts\extras\ssl\cacert.pem
2.编辑php.ini文件。
删除curl.cainfo配置项前的分号注释符(;)

配置curl.cainfo绝对路经,如下

curl.cainfo =E:\phpstudy_pro\Extensions\php\php7.4.3nts\extras\ssl\cacert.pem
3.重启依赖 PHP 的服务。
  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2021-07-14 10:41:11  更:2021-07-14 10:41:29 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年4日历 -2024/4/28 15:39:21-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码