腾讯云短信发送【java】

发布时间 2023-08-24 10:51:53作者: 小侯学编程

先去官网申请secretId, secretKey,然后创建对应的模板

maven引入包

<dependency>
<groupId>com.tencentcloudapi</groupId>
<artifactId>tencentcloud-sdk-java</artifactId>
<!-- go to https://search.maven.org/search?q=tencentcloud-sdk-java and get the latest version. -->
<!-- 请到https://search.maven.org/search?q=tencentcloud-sdk-java查询所有版本,最新版本如下 -->
<version>3.1.836</version>
</dependency>

工具类

package com.hwd.campus.security.biz.utils;


import com.alibaba.fastjson.JSON;
import com.hwd.campus.common.common.api.ResultCode;
import com.hwd.campus.common.common.exception.BusinessException;
import com.tencentcloudapi.common.AbstractModel;
import com.tencentcloudapi.common.Credential;
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
import com.tencentcloudapi.common.profile.ClientProfile;
import com.tencentcloudapi.common.profile.HttpProfile;
import com.tencentcloudapi.sms.v20190711.SmsClient;
import com.tencentcloudapi.sms.v20190711.models.SendSmsRequest;
import com.tencentcloudapi.sms.v20190711.models.SendSmsResponse;
import lombok.extern.slf4j.Slf4j;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

@Slf4j
public class SmsUtil {


    private static final String SMS_SDK_APP_ID = "";


    /**
     * 发送手机短信验证码
     * <p>
     * 您的动态验证码为:{1},此验证码{2}秒内有效,如非本人操作,请忽略本短信!
     *
     * @param phone      手机号
     * @param verifyCode 验证码
     * @param validTime  有效时间
     */
    public static void sendPhoneVerifyCodeSecond(String phone, String verifyCode, long validTime) {
        List<String> templateParamSet = new ArrayList<>();
        templateParamSet.add(verifyCode);
        templateParamSet.add(String.valueOf(validTime));
        sendMsg(smsModel(phone, "", templateParamSet));
    }

    /**
     * 短信发送提醒
     *
     * @param phone         手机号
     * @param templateParam 参数
     * @param templateId    模板Id
     * @date 2023-08-23
     * @author hhs
     */
    public static void sendSmsRemind(String phone, List<String> templateParam, String templateId) {
        sendMsg(smsModel(phone, templateId, templateParam));
    }

    /**
     * 发送手机短信验证码
     * <p>
     * <p>
     * 您的动态验证码为:{1},此验证码{2}分钟内有效,如非本人操作,请忽略本短信!
     *
     * @param phone      手机号
     * @param verifyCode 验证码
     * @param validTime  校验内容
     */
    public static void sendPhoneVerifyCodeMinute(String phone, String verifyCode, long validTime) {
        List<String> templateParamSet = new ArrayList<>();
        templateParamSet.add(verifyCode);
        templateParamSet.add(String.valueOf(validTime));
        sendMsg(smsModel(phone, "", templateParamSet));
    }


    private static SmsModel smsModel(String phone, String templateId, List<String> templateParamSet) {
        return SmsModel.builder().PhoneNumberSet(Collections.singletonList("+86" + phone))
                .TemplateID(templateId).Sign("标头").TemplateParamSet(templateParamSet)
                .SmsSdkAppid(SMS_SDK_APP_ID).build();
    }


    /**
     * 发送短信
     *
     * @param model 模型
     */
    private static void sendMsg(SmsModel model) {
        try {
            log.info("发送短信:" + model);
            Credential cred = new Credential("secretId", "secretKey");
            HttpProfile httpProfile = new HttpProfile();
            httpProfile.setEndpoint("sms.tencentcloudapi.com");
            ClientProfile clientProfile = new ClientProfile();
            clientProfile.setHttpProfile(httpProfile);
            SmsClient client = new SmsClient(cred, "", clientProfile);
            //转换为String
            String params = JSON.toJSONString(model);
            SendSmsRequest req = AbstractModel.fromJsonString(params, SendSmsRequest.class);
            SendSmsResponse resp = client.SendSms(req);
            log.info("短信发送成功:" + AbstractModel.toJsonString(resp));
        } catch (TencentCloudSDKException e) {
            log.error("=========短信发送失败========" + e.getMessage());
            throw new BusinessException(ResultCode.OPERATION_FAILURE, "=========短信发送失败========" + e.getMessage());
        }
    }


    public static void main(String[] args) {
        //13512765559
        sendPhoneVerifyCodeSecond("phone", "验证码", 1);
    }
}

实体参数

package com.hwd.campus.security.biz.utils;

import com.alibaba.fastjson.annotation.JSONField;
import lombok.Builder;
import lombok.Data;

import java.util.List;

@Builder
@Data
public class SmsModel {

    /**
     * 模板 ID,必须填写已审核通过的模板 ID。
     * 模板ID可登录 [短信控制台](<a href="https://console.cloud.tencent.com/smsv2">...</a>) 查看,若向境外手机号发送短信,仅支持使用国际/港澳台短信模板。
     */
    @JSONField(name = "TemplateID")
    private String TemplateID;
    /**
     * 短信签名内容,使用 UTF-8 编码,必须填写已审核通过的签名,
     * 签名信息可登录 [短信控制台](<a href="https://console.cloud.tencent.com/smsv2">...</a>) 查看。注:国内短信为必填参数。
     */
    @JSONField(name = "Sign")
    private String Sign;
    /**
     * 短信SdkAppid在 [短信控制台](<a href="https://console.cloud.tencent.com/smsv2">...</a>) 添加应用后生成的实际SdkAppid,示例如1400006666。
     */
    @JSONField(name = "SmsSdkAppid")
    private String SmsSdkAppid;
    /**
     * 下发手机号码,采用 e.164 标准,格式为+[国家或地区码][手机号],单次请求最多支持200个手机号且要求全为境内手机号或全为境外手机号。
     * 例如:+8613711112222, 其中前面有一个+号 ,86为国家码,13711112222为手机号。
     */
    @JSONField(name = "PhoneNumberSet")
    private List<String> PhoneNumberSet;
    /**
     * 模板参数,若无模板参数,则设置为空。
     */
    @JSONField(name = "TemplateParamSet")
    private List<String> TemplateParamSet;
}