TP6,TP5.1使用腾讯云发送短信验证码配置详解

作者: 温新

分类: 【ThinkPHP】

阅读: 6283

时间: 2020-05-06 16:40:58

一、序言

**测试环境:**win10+PHP7.4.3

**ThinkPHP框架版本:**ThinkPHP6、ThinkPHP5.1

SDK版本: "tencentcloud/tencentcloud-sdk-php": "^3.0"

**验证码场景:**注册验证码

我使用的是注册验证码,因此只有一个参数,后面讲详细记录。

ThinkPHP6与ThinkPHP5.1使用腾讯云短信验证码的PHP SDK3.0中的配置是一模一样的,因此,两个版本可以直接复制使用。

二、错误解决

安装SDK之后,使用的过程中出现 code: message:cURL error 60: SSL certificate problem: unable to 错误。对于这个错误,官方文档中有给出解决方法,直接按照官方的方法来操作就行了,不过,还是记录一下吧。

解决方法

步骤一:腾讯云官方SDK文档中下载 cacert.pem文件

步骤二:将 cacert.pem文件复制到php安装目录中,如下,我的路经

E:\phpstudy_pro\Extensions\php\php7.4.3nts\extras\ssl\cacert.pem

步骤三:修改php.ini配置文件

1) 打开curl.cainfo配置(删除前面的分号)

2)配置curl.cainfo绝对路经,如下
curl.cainfo =E:\phpstudy_pro\Extensions\php\php7.4.3nts\extras\ssl\cacert.pem

步骤四:开启php中的openssl与php_curl扩展

步骤五:重启web服务器

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

步骤一:使用composer安装sdk

composer require tencentcloud/tencentcloud-sdk-php

步骤二:TP框架代码实现

说明:由于ThinkPHP6与ThinkPHP5.1的实现代码是一模一样的,因此不写出两份代码,我这里以ThinkPHP6为例。

文件位置 app\controller\Index.php

<?php
namespace app\controller;

use app\BaseController;

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 Index extends BaseController
{
    public function sendmsg()
    {

        // 腾讯云账户秘密ID,注意不是短信中的id
        $SecretId = '************************************';
        // 腾讯云账户中的秘钥key
        $SecretKey = '********************************';    

        // 腾讯云短信应用appid。应用管理 > 应用列表中的应用id
        $AppID = '*********';
        // 模板签名内容。一定是要 国内短信 > 签名管理 > 中的签名内容
        $smsSign = '****';
        // 正文模板中的模板id。   国内短信 > 正文模板管理 > 模板ID
        $templateId = ******;

        // 用户手机号码。一定要有 +86 打头
        $phone = '+8613********';
        // 随机验证码
        $TemplateParamSet = rand(100000,999999);

        try {
            // 实例化认证对象
            $cred = new Credential($SecretId, $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":"'.$templateId.'",
            "Sign":"'.$smsSign.'","TemplateParamSet":["'.$TemplateParamSet.'"],"SmsSdkAppid":"'.$AppID.'"}';
            
            $req->fromJsonString($params);

            // 通过 client 对象调用 SendSms 方法发起请求
            $resp = $client->SendSms($req);

            // 输出 JSON 格式的字符串回包
            print_r($resp->toJsonString());
        }
        catch(TencentCloudSDKException $e) {
            echo $e;
        }       
    }
}

至此,发送短信就完成了^_^

总结

1)使用新版的SDK来发送短信,遇到了一个不小的坑。开始并没有使用代码来测试,而是使用了文档中提供的测试工具来发送短信验证码,想来这样容易些,因此粗心大意的将那些可选的参数全部忽略掉了,结果就是没有发送成功咯。测试了很多次,都是发送不成功,无奈。往上找案例吧,可是关于使用新版SDK来发送短信的案例太少了,我一个都没有找到,最后搁浅了。

2)短信没有发送成功,心里一直不爽。过了些,再次尝试,这次将可选参数也配上,一个一个看文档解释,最后成功了。

3)总结了一下原因,导致没有发送成功的原因,就是可选参数被忽略掉了。

我是夕阳何处寻,期待和优秀的你一起同行!

夕阳何处寻

2020年05月07日

请登录后再评论