TP6,TP5.1使用腾讯云发送短信验证码配置详解
一、序言
**测试环境:**win10+PHP7.4.3
**ThinkPHP框架版本:**ThinkPHP6、ThinkPHP5.1
SDK版本: "tencentcloud/tencentcloud-sdk-php": "^3.0"
**验证码场景:**注册验证码
我使用的是注册验证码,因此只有一个参数,后面讲详细记录。
ThinkPHP6与ThinkPHP5.1使用腾讯云短信验证码的PHP SDK中的配置是一模一样的,因此,两个版本可以直接复制使用。
二、错误解决
安装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
// 腾讯云账户秘密ID,注意不是短信中的id
$SecretId = '************************************';
// 腾讯云账户中的秘钥key
$SecretKey = '********************************';
// 腾讯云短信应用appid。应用管理 > 应用列表中的应用id
$AppID = '*********';
// 模板签名内容。一定是要 国内短信 > 签名管理 > 中的签名内容
$smsSign = '****';
// 正文模板中的模板id。 国内短信 > 正文模板管理 > 模板ID
$templateId = ******;
// 用户手机号码。一定要有 +86 打头
$phone = '+86**********';
// 随机验证码
$TemplateParamSet = rand(100000,999999);
<?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 = 'AKIDGRPDQNIZnsxsZ0odnlS4QWRDPL2UfmZ5';
// 腾讯云账户中的秘钥key
$SecretKey = 'S2PXRuJUORGq9Cyf6PPBicIoTs15tS0J';
// 腾讯云短信应用appid。应用管理 > 应用列表中的应用id
$AppID = '1400331540';
// 模板签名内容。一定是要 国内短信 > 签名管理 > 中的签名内容
$smsSign = '自如初';
// 正文模板中的模板id。 国内短信 > 正文模板管理 > 模板ID
$templateId = 567666;
// 用户手机号码。一定要有 +86 打头
$phone = '+8613818472103';
// 随机验证码
$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)总结了一下原因,导致没有发送成功的原因,就是可选参数被忽略掉了。