腾讯云短信验证码 PHP最新版(Tencent cloud SMS)


“腾讯云短信验证码 PHP最新版(Tencent cloud SMS)” 的解决办法:

前提条件

 已准备依赖环境: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);
        }
    }
}