JAVA 发送短信信息工具类(腾讯云)

发送短信信息工具类

css 复制代码
import cn.hutool.core.collection.CollUtil;
import com.tencentcloudapi.common.Credential;
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
import com.tencentcloudapi.sms.v20210111.SmsClient;
import com.tencentcloudapi.sms.v20210111.models.SendSmsRequest;
import com.tencentcloudapi.sms.v20210111.models.SendSmsResponse;
import com.tencentcloudapi.sms.v20210111.models.SendStatus;
import com.w.common.dto.MessageDTO;
import com.w.common.exception.WangyaoException;
import com.w.common.util.Json;
import jakarta.validation.constraints.NotNull;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import java.util.List;
import java.util.Locale;


@SuppressWarnings("ALL")
@Component
public class SendMessage2TencentUtil {

    private static final Logger log = LoggerFactory.getLogger(SendMessage2TencentUtil.class);

    @Value("${tencent.secretId}")
    private String secretId;

    @Value("${tencent.secretKey}")
    private String secretKey;

    @Value("${tencent.sms.sdkAppId}")
    private String sdkAppId;

    @Value("${tencent.sms.signName}")
    private String signName;

    /**
     * 根据模板Id发送短信
     *
     * @param templateId    模板ID
     * @param templateParam 模板参数
     * @param phoneNumber   电话
     */
    public boolean sendMsg(String templateId, String[] templateParam, String[] phoneNumber) {
        return sendMsg(signName, templateId, templateParam, phoneNumber);
    }

    /**
     * 根据签名内容、模板Id发送短信
     *
     * @param signName      签署名称
     * @param templateId    模板ID
     * @param templateParam 模板参数
     * @param phoneNumber   电话
     */
    public boolean sendMsg(String signName, String templateId, String[] templateParam, String[] phoneNumber) {
        return sendMsg(sdkAppId, signName, templateId, templateParam, phoneNumber);
    }

    /**
     * 根据应用Id、签名内容、模板Id发送短信
     *
     * @param sdkAppId      appID
     * @param signName      签署名称
     * @param templateId    模板ID
     * @param templateParam 模板参数
     * @param phoneNumber   电话
     * @return boolean
     */
    public boolean sendMsg(String sdkAppId, String signName, String templateId, String[] templateParam, @NotNull String[] phoneNumber) {

        if (StringUtils.isEmpty(sdkAppId)) {
            throw new WangyaoException("应用ID不能为空");
        }

        if (StringUtils.isEmpty(signName)) {
            throw new WangyaoException("签名内容不能为空");
        }

        if (StringUtils.isEmpty(templateId)) {
            throw new WangyaoException("模板ID不能为空");
        }

        if (phoneNumber == null || phoneNumber.length == 0) {
            throw new WangyaoException("电话号不能为空");
        }

        // 实例化一个认证对象
        Credential cred = new Credential(secretId, secretKey);

        // 实例化client对象
        SmsClient client = new SmsClient(cred, "ap-beijing");

        // 实例化一个请求对象
        SendSmsRequest req = new SendSmsRequest();

        // 短信应用ID
        req.setSmsSdkAppId(sdkAppId);

        // 短信签名内容
        req.setSignName(signName);

        // 模板 ID
        req.setTemplateId(templateId);

        // 模板参数
        req.setTemplateParamSet(templateParam);

        // 下发手机号码
        req.setPhoneNumberSet(phoneNumber);

        try {
            // 通过 client 对象调用 SendSms 方法发起请求
            SendSmsResponse res = client.SendSms(req);

            SendStatus[] sendStatusSet = res.getSendStatusSet();
            StringBuilder sb = new StringBuilder();

            for (SendStatus sendStatus : sendStatusSet) {
                if (!"OK".equals(sendStatus.getCode().toUpperCase(Locale.ROOT))) {
                    sb.append(Json.toJsonString(sendStatus));
                }
            }

            if (sb.length() > 0) {
                throw new WangyaoException(sb.toString());
            }

        } catch (TencentCloudSDKException e) {
            log.error("SendMessage2TencentUtil.sendMsg Failed. ", e);
            return false;
        }

        return true;

    }

    public void sendMsg(List<MessageDTO> list) {

        if (CollUtil.isNotEmpty(list)) {
            list.forEach(dto -> {
                try {
                    sendMsg(StringUtils.isEmpty(dto.getSdkAppId()) ? sdkAppId : dto.getSdkAppId(), StringUtils.isEmpty(dto.getSignName()) ? signName : dto.getSignName(), dto.getTemplateId(), dto.getTemplateParam(), dto.getPhoneNumber());
                } catch (Exception e) {
                    log.error("sendMsg: ", e);
                }
            });
        }

    }
相关推荐
文丑颜不良啊17 小时前
LeetCode2481~2500题目解析
java·leetcode
Flynn Liang18 小时前
同一需求三套写法:用 Spring AI、LangChain4j、AgentScope Java 各实现一个带工具调用的 RAG 助手(实战对比)
java·人工智能·大模型·架构设计·spring ai·langchain4j·agentscope
聪明的笨猪猪19 小时前
实际工程问题:AI 生成 Spring Cache(@Cacheable / @CachePut / @CacheEvict)缓存注解踩坑
java·经验分享·面试·ai编程
愿有所息19 小时前
记一次 ARM64 + JDK8 上 fastjson2 的诡异数据错乱
java
秋饼19 小时前
MCP 2026-07-28 无状态协议大改版:Spring AI 2.1 多轮往返请求与网关路由落地
java·ai·技术分享·后端开发
flyingonpine20 小时前
PowerShell脚本数字签名实战:自签名证书、代码签名与信任链验证
windows·信任链
SL_staff20 小时前
JVS-BI 实战:业务人员如何用零代码 ELT + 可视化配置构建实时经营分析闭环
java·spring·全栈
SL_staff21 小时前
企业AI落地难?JVS-AI渐进式实践:安全可控、小切口验证、标准化沉淀与规模化复制
java·开源·aigc
SL_staff1 天前
JVS数字底座实践:构建企业级统一内容管理平台的技术路径
java·产品
nice_lcj5201 天前
【从零理解 Spring AI · 12】MCP 的两种角色:做客户端还是做服务端
java·后端·spring·spring ai·ai应用开发