腾讯云短信验证码 PHP最新版(Tencent cloud SMS)
super
2021-02-26 11:34
3615
前提条件
已准备依赖环境:PHP 5.6.33 及以上版本
已在访问管理控制台 >【API密钥管理】页面获取 SecretID 和 SecretKey。
- SecretID 用于标识 API 调用者的身份。
- SecretKey 用于加密签名字符串和服务器端验证签名字符串的密钥,SecretKey 需妥善保管,避免泄露。
- 短信的调用地址为
sms.tencentcloudapi.com
。
安装 SDK
composer require tencentcloud/tencentcloud-sdk-php
代码
$phone 为字符串 +861xxxxxxxxxx
$phone 为数组 array('+861xxxxxxxxxx', '+861xxxxxxxxxx')
TencentSMS 需提前引入
$phone = "+86130";
$code = rand(100000, 999999);
$sms = new TencentSMS();
$result = $sms->send(array('+861xxxxxxxxxx', '+861xxxxxxxxxx'), $code);
echo json_encode($result);
TencentSMS
<?php
/**
* Author: super
* Date: 2021/2/25
*/
namespace app\index\logic;
use TencentCloud\Sms\V20190711\Models\SendSmsRequest;
use TencentCloud\Sms\V20190711\SmsClient;
// 导入要请求接口对应的 Request 类
use TencentCloud\Sms\V20190711\Models\AddSmsTemplateRequest;
use TencentCloud\Common\Exception\TencentCloudSDKException;
use TencentCloud\Common\Credential;
// 导入可选配置类
use TencentCloud\Common\Profile\ClientProfile;
use TencentCloud\Common\Profile\HttpProfile;
class TencentSMS
{
protected $secretID = 'IDXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'; /* CAM 密钥查询:https://console.cloud.tencent.com/cam/capi */
protected $secretKey = 'KeyXXXXXXXXXXXXXXXXXXXX'; /* CAM 密钥查询:https://console.cloud.tencent.com/cam/capi */
protected $sdkAppID = '1400XXXXXX'; /* 短信应用 ID: 在 [短信控制台] 添加应用后生成的实际 SDKAppID,例如1400006666 */
protected $sign = 'XXXXXX'; /* 短信签名内容: 使用 UTF-8 编码,必须填写已审核通过的签名,可登录 [短信控制台] 查看签名信息 */
protected $templateID = 'XXXXXX'; /* 模板 ID: 必须填写已审核通过的模板 ID。可登录 [短信控制台] 查看模板 ID */
//$config = [
// 'secret_id' => '',
// 'secret_key' => '',
// 'sdk_app_ID' => '',
// 'sign' => '',
// 'template_ID' => ''
//];
function __construct($config = [])
{
if (isset($config['secret_id'])) {
$this->secretID = $config['secret_id'];
}
if (isset($config['secret_key'])) {
$this->secretKey = $config['secret_key'];
}
if (isset($config['sdk_app_ID'])) {
$this->sdkAppID = $config['sdk_app_ID'];
}
if (isset($config['sign'])) {
$this->sign = $config['sign'];
}
if (isset($config['template_ID'])) {
$this->templateID = $config['template_ID'];
}
}
/**
* send
* @param string|array $phone
* @param int $code
* @return array
*/
function send($phone, int $code)
{
if (!is_array($phone)) {
$phone = array($phone);
}
try {
/* 必要步骤:
* 实例化一个认证对象,入参需要传入腾讯云账户密钥对 secretId 和 secretKey
* 本示例采用从环境变量读取的方式,需要预先在环境变量中设置这两个值
* 您也可以直接在代码中写入密钥对,但需谨防泄露,不要将代码复制、上传或者分享给他人
* CAM 密钥查询:https://console.cloud.tencent.com/cam/capi
*/
$cred = new Credential($this->secretID, $this->secretKey);
// 实例化一个 http 选项,可选,无特殊需求时可以跳过
$httpProfile = new HttpProfile();
$httpProfile->setReqMethod("GET"); // POST 请求(默认为 POST 请求)
$httpProfile->setReqTimeout(30); // 请求超时时间,单位为秒(默认60秒)
$httpProfile->setEndpoint("sms.tencentcloudapi.com"); // 指定接入地域域名(默认就近接入)
// 实例化一个 client 选项,可选,无特殊需求时可以跳过
$clientProfile = new ClientProfile();
$clientProfile->setSignMethod("TC3-HMAC-SHA256"); // 指定签名算法(默认为 HmacSHA256)
$clientProfile->setHttpProfile($httpProfile);
// 实例化 SMS 的 client 对象,clientProfile 是可选的
$client = new SmsClient($cred, "ap-shanghai", $clientProfile);
// 实例化一个 sms 发送短信请求对象,每个接口都会对应一个 request 对象。
$req = new SendSmsRequest();
/* 填充请求参数,这里 request 对象的成员变量即对应接口的入参
* 您可以通过官网接口文档或跳转到 request 对象的定义处查看请求参数的定义
* 基本类型的设置:
* 帮助链接:
* 短信控制台:https://console.cloud.tencent.com/smsv2
* sms helper:https://cloud.tencent.com/document/product/382/3773 */
$req->SmsSdkAppid = $this->sdkAppID;
$req->Sign = $this->sign;
/* 短信码号扩展号: 默认未开通,如需开通请联系 [sms helper] */
$req->ExtendCode = "0";
/* 下发手机号码,采用 e.164 标准,+[国家或地区码][手机号]
* 例如+8613711112222, 其中前面有一个+号 ,86为国家码,13711112222为手机号,最多不要超过200个手机号*/
$req->PhoneNumberSet = $phone;
/* 国际/港澳台短信 senderid: 国内短信填空,默认未开通,如需开通请联系 [sms helper] */
$req->SenderId = "";
/* 用户的 session 内容: 可以携带用户侧 ID 等上下文信息,server 会原样返回 */
$req->SessionContext = "";
$req->TemplateID = $this->templateID;
/* 模板参数: 若无模板参数,则设置为空 array("0"); */
$req->TemplateParamSet = array($code);
// 如果有多个参数 array('param1', 'param2' ...)
// 通过 client 对象调用 SendSms 方法发起请求。注意请求方法名与请求对象是对应的
$resp = $client->SendSms($req);
$result = json_decode($resp->toJsonString(), true);
if (count($phone) > 1) {
$success_num = $error_num = 0;
foreach ($result['SendStatusSet'] as $k => $v) {
if ($v['Code'] == 'Ok') {
$success_num += 1;
// 在这里把$code存到session或者cache中
cache('LOGIN_' . $v['PhoneNumber'], md5($code), 1800);
} else {
$error_num += 1;
}
}
return array('code' => 200, 'msg' => "发送成功{$success_num}条,发送失败{$error_num}条");
} else {
if ($result['SendStatusSet'][0]['Code'] == 'Ok') {
// 在这里把$code存到session或者cache中
cache('LOGIN_' . $phone, md5($code), 1800);
return array('code' => 200, 'msg' => '发送成功');
} else {
return array('code' => 500, 'msg' => '发送失败,网络繁忙');
}
}
} catch(TencentCloudSDKException $e) {
return array('code' => 500, 'msg' => $e);
}
}
}
0 条讨论