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

作者: 温新

分类: 【ThinkPHP】

阅读: 6800

时间: 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 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)总结了一下原因,导致没有发送成功的原因,就是可选参数被忽略掉了。

请登录后再评论