群控系统服务端开发模式-应用开发-短信工厂腾讯云短信开发

一、腾讯云短信工厂开发

1、添加框架对应的SDK

复制代码
composer require tencentcloud/tencentcloud-sdk-php

2、添加腾讯云工厂

在根目录下extend文件夹下Sms文件夹下channel文件夹下,创建腾讯云短信发送工厂并命名为TencentSmsSender。记住,一定要在腾讯云短信发送工厂类名后面去实现短信发送工厂。

复制代码
<?php
/**
 * 腾讯云短信发送
 * User: 龙哥 三年风水
 * Date: 2024/12/1/0001
 * Time: 16:51
 */
namespace Sms\channel;
use Error\BaseError;
use Sms\SmsSenderInterface;
use TencentCloud\Common\Credential;
use TencentCloud\Common\Exception\TencentCloudSDKException;
use TencentCloud\Common\Profile\ClientProfile;
use TencentCloud\Common\Profile\HttpProfile;
use TencentCloud\Sms\V20190711\Models\SendSmsRequest;
use TencentCloud\Sms\V20190711\SmsClient;

class TencentSmsSender implements SmsSenderInterface
{
    protected static $signName = ""; //签名
    protected static $appId = ""; //APPid
    protected static $smsClient = null; //客户端

    public function __construct($param){
        self::$signName = $param['sign_name'];
        self::$appId = $param['app_id'];
        $cred = new Credential($param['access_key_id'],$param['access_key_secret']);
        $httpProfile = new HttpProfile();
        $httpProfile->setEndpoint("sms.tencentcloudapi.com");
        $clientProfile = new ClientProfile();
        $clientProfile->setHttpProfile($httpProfile);
        self::$smsClient = new SmsClient($cred, "ap-nanjing", $clientProfile);
    }

    /**
     * 单条短信发送
     * 内部json处理过
     * User: 龙哥·三年风水
     * Date: 2024/12/1/0001
     * Time: 15:52
     * @ param $mobile 要发送的对象
     * @ param $templateCode 模板编号
     * @ param $templateParam 模板对应参数
     * @ param string $signName 签名(如果需要采用不同的签名才需要传参)
     * @ return mixed
     */
    public static function send($mobile, $templateCode, $templateParam, $signName = '')
    {
        try {
            if(empty($mobile))throw new BaseError('手机号参数必须传',50000,200);
            if(is_array($mobile) && count($mobile) >= 0)throw new BaseError('手机号参数只能是字符串方式',50000,200);
            $req = new SendSmsRequest();
            $req->SmsSdkAppid = self::$appId;
            $req->Sign = empty($signName) ? self::$signName : $signName;
            $req->TemplateID = $templateCode;
            $req->TemplateParamSet = $templateParam;
            $req->PhoneNumberSet = array("+86".$mobile);
            $res = self::$smsClient->SendSms($req);
            if($res->SendStatusSet[0]->Code == "Ok")return true;
        }catch(TencentCloudSDKException $e) {
            throw new BaseError('发送失败',50000,200);
        }
    }

    /**
     * 批量短信发送
     * 内部json处理过,单个模板,单个签名
     * User: 龙哥·三年风水
     * Date: 2024/12/2
     * Time: 13:42
     * @ param $mobiles 要发送的对象,数组形式
     * @ param $templateCode 要发送的模板
     * @ param $templateParam 要发送的参数
     * @ param string $signName 签名(如果需要采用不同的签名才需要传参)
     * @ return mixed
     */
    public static function batchSend($mobiles, $templateCode, $templateParam, $signName = '')
    {
        try {
            if(!is_array($mobiles) || count($mobiles) == 0)throw new BaseError("批量发送,手机号码必须是数组",50000,200);
            $phoneNumbers = [];
            for($i = 0; $i < count($mobiles); $i++) {
                array_push($phoneNumbers, '+86'.$mobiles[$i]);
            }
            $req = new SendSmsRequest();
            $req->SmsSdkAppid = self::$appId;
            $req->Sign = empty($signName) ? self::$signName : $signName;
            $req->TemplateID = $templateCode;
            $req->TemplateParamSet = $templateParam;
            $req->PhoneNumberSet = $phoneNumbers;
            $res = self::$smsClient->SendSms($req);
            if($res->SendStatusSet[0]->Code == "Ok")return true;
        }catch(TencentCloudSDKException $e) {
            throw new BaseError('发送失败',50000,200);
        }
    }
}

二、测试

1、单条短信发送测试

复制代码
<?php
namespace app\controller;
use Encipher\Encrypt;
use Sms\SmsSenderFactory;

class Index extends Emptys
{
    public function index()
    {
        $smsSender = SmsSenderFactory::create();
        $code = random_int(100000, 999999);
        $smsSender::send('15088888888','123456789',[$code.'']);
        return succ('操作成功');
    }
}

2、批量短信发送测试

复制代码
<?php
namespace app\controller;
use Encipher\Encrypt;
use Sms\SmsSenderFactory;

class Index extends Emptys
{
    public function index()
    {
        $smsSender = SmsSenderFactory::create();
        $code = random_int(100000, 999999);
        $smsSender::batchSend(['15088888888','15188888888'],'123456789',[$code.'']);
        return succ('操作成功');
    }
}
相关推荐
半旧夜夏11 小时前
【分布式缓存】Redis持久化和集群部署攻略
java·运维·redis·分布式·缓存
IDOlaoluo11 小时前
PHP-5.2.1.tar.gz 离线安装教程:从源码编译到配置的详细步骤(附安装包)
开发语言·php
还是大剑师兰特13 小时前
Hadoop面试题及详细答案 110题 (106-110)-- Hadoop高级与实战
大数据·hadoop·分布式
壹佰大多17 小时前
【Redisson分布式锁源码分析-3】
数据结构·分布式·mysql·spring·spring cloud·wpf·lua
不会写代码的ys17 小时前
仿RabbitMQ实现消息队列(一)--项目介绍
分布式·rabbitmq
数据库学啊18 小时前
分布式数据库架构设计指南:TDengine如何支持10亿级数据点的水平扩展
数据库·分布式·时序数据库·数据库架构·tdengine
mit6.82421 小时前
[VT-Refine] 强化学习工作流 | 分布式-近端策略优化(DPPO)
分布式·算法
Damon小智21 小时前
HarmonyOS 5 开发实践:分布式任务调度与设备协同架构
分布式·架构·harmonyos
凯子坚持 c1 天前
【星光不负 码向未来 | 万字解析:基于ArkUI声明式UI与分布式数据服务构建生产级跨设备音乐播放器】
分布式·ui
JaguarJack1 天前
PHP 基金会宣布:Streams 现代化 将引入事件循环与异步新能力
后端·php