首页 > 编程语言 >java 腾讯云、阿里云SMS短信工具类

java 腾讯云、阿里云SMS短信工具类

时间:2023-05-13 12:23:54浏览次数:45  
标签:return String java SmsSendResult SMS param 腾讯 import com

引入POM依赖

        <!-- 腾讯云SMS SDK -->
        <dependency>
            <groupId>com.tencentcloudapi</groupId>
            <artifactId>tencentcloud-sdk-java-sms</artifactId>
            <version>3.1.754</version>
        </dependency>
        <!-- 阿里云SMS SDK -->
        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>dysmsapi20170525</artifactId>
            <version>2.0.23</version>
        </dependency>

测测类

    /**
     * 测试邮箱机制
     *
     * @return
     */
    @GetMapping("/testSms")
    public Result testSms() {
        //腾讯云
//        Map<String, String> map1 = new HashMap<>();
//        map1.put("1", "1234");
//        SmsSendResult smsSendResult = SmsUtil.sendSms("+8618731055555,+8618754158888", "1794879", map1,"tencent");
        //阿里云
        Map<String, String> map2 = new HashMap<>();
        map2.put("code", "6666");
        SmsSendResult smsSendResult = SmsUtil.sendSms("+8618731055555,+8618754158888", "SMS_460755471", map2,"aliyun");
        return Result.ok(smsSendResult);
    }

工具类

读取redis那块自己改哦

package cn.daenx.myadmin.common.utils;

import cn.daenx.myadmin.common.constant.RedisConstant;
import cn.daenx.myadmin.system.constant.SystemConstant;
import cn.daenx.myadmin.system.po.SysConfig;
import cn.daenx.myadmin.system.vo.system.SmsSendResult;
import cn.daenx.myadmin.system.vo.system.SysSmsConfigVo;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.aliyun.dysmsapi20170525.Client;
import com.aliyun.dysmsapi20170525.models.SendSmsResponse;
import com.aliyun.teaopenapi.models.Config;
import com.tencentcloudapi.common.Credential;
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.SendStatus;

import java.util.Arrays;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;

/**
 * Sms短信工具类
 *
 * @author DaenMax
 */
public class SmsUtil {


    /**
     * 发送短信
     * <p>
     * <h4>关于phones参数</h4><br>
     * 腾讯云:格式为+[国家或地区码][手机号],单次请求最多支持200个手机号且要求全为境内手机号或全为境外手机号,发送国内短信格式还支持0086、86或无任何国家或地区码的11位手机号码,前缀默认为+86。<br><br>
     * 阿里云:国内短信:+/+86/0086/86或无任何前缀的11位手机号码,例如1390000****。国际/港澳台消息:国际区号+号码,例如852000012****。单次上限为1000个手机号码
     * </p>
     * <p>
     * <h4>关于param参数</h4><br>
     * 腾讯云:例如模板为:验证码为:{1},如非本人操作,请忽略本短信。那么key=1,value为1234<br><br>
     * 阿里云:例如模板为:您的验证码为:${code},请勿泄露于他人!那么key=code,value为1234
     * </p>
     *
     * @param phones     多个手机号用,隔开
     * @param templateId
     * @param param
     * @return
     */
    public static SmsSendResult sendSms(String phones, String templateId, Map<String, String> param) {
        if (ObjectUtil.isEmpty(phones)) {
            return SmsSendResult.builder().isSuccess(false).msg("手机号不能为空").build();
        }
        if (ObjectUtil.isEmpty(templateId)) {
            return SmsSendResult.builder().isSuccess(false).msg("模板ID不能为空").build();
        }
        SysSmsConfigVo sysSmsConfigVo = getSysSmsConfigVo();
        if (ObjectUtil.isEmpty(sysSmsConfigVo)) {
            return SmsSendResult.builder().isSuccess(false).msg("系统短信配置不可用").build();
        }
        if ("aliyun".equals(sysSmsConfigVo.getConfig().getType())) {
            return sendSmsAliyun(sysSmsConfigVo.getAliyun(), phones, templateId, param);
        } else if ("tencent".equals(sysSmsConfigVo.getConfig().getType())) {
            return sendSmsTencent(sysSmsConfigVo.getTencent(), phones, templateId, param);
        }
        return SmsSendResult.builder().isSuccess(false).msg("未知的type").build();
    }

    /**
     * 发送短信
     * <p>
     * <h4>关于phones参数</h4><br>
     * 腾讯云:格式为+[国家或地区码][手机号],单次请求最多支持200个手机号且要求全为境内手机号或全为境外手机号,发送国内短信格式还支持0086、86或无任何国家或地区码的11位手机号码,前缀默认为+86。<br><br>
     * 阿里云:国内短信:+/+86/0086/86或无任何前缀的11位手机号码,例如1390000****。国际/港澳台消息:国际区号+号码,例如852000012****。单次上限为1000个手机号码
     * </p>
     * <p>
     * <h4>关于param参数</h4><br>
     * 腾讯云:例如模板为:验证码为:{1},如非本人操作,请忽略本短信。那么key=1,value为1234<br><br>
     * 阿里云:例如模板为:您的验证码为:${code},请勿泄露于他人!那么key=code,value为1234
     * </p>
     *
     * @param phones     多个手机号用,隔开
     * @param templateId
     * @param param
     * @param type       指定平台,aliyun=阿里云,tencent=腾讯云
     * @return
     */
    public static SmsSendResult sendSms(String phones, String templateId, Map<String, String> param, String type) {
        if (ObjectUtil.isEmpty(phones)) {
            return SmsSendResult.builder().isSuccess(false).msg("手机号不能为空").build();
        }
        if (ObjectUtil.isEmpty(templateId)) {
            return SmsSendResult.builder().isSuccess(false).msg("模板ID不能为空").build();
        }
        if (ObjectUtil.isEmpty(type)) {
            return SmsSendResult.builder().isSuccess(false).msg("type不能为空").build();
        }
        SysSmsConfigVo sysSmsConfigVo = getSysSmsConfigVo();
        if (ObjectUtil.isEmpty(sysSmsConfigVo)) {
            return SmsSendResult.builder().isSuccess(false).msg("系统短信配置不可用").build();
        }
        if ("aliyun".equals(type)) {
            return sendSmsAliyun(sysSmsConfigVo.getAliyun(), phones, templateId, param);
        } else if ("tencent".equals(type)) {
            return sendSmsTencent(sysSmsConfigVo.getTencent(), phones, templateId, param);
        }
        return SmsSendResult.builder().isSuccess(false).msg("未知的type").build();
    }

    /**
     * 发送短信协议,阿里云
     *
     * @param smsInfo
     * @param phones     多个手机号用,隔开
     * @param templateId
     * @param param      例如模板为:您的验证码为:${code},请勿泄露于他人!那么key=code,value为1234
     * @return
     */
    private static SmsSendResult sendSmsAliyun(SysSmsConfigVo.SmsInfo smsInfo, String phones, String templateId, Map<String, String> param) {
        try {
            Config config = new Config();
            config.setAccessKeyId(smsInfo.getAccessKeyId());
            config.setAccessKeySecret(smsInfo.getAccessKeySecret());
            config.setEndpoint(smsInfo.getEndpoint());
            Client client = new Client(config);
            com.aliyun.dysmsapi20170525.models.SendSmsRequest req = new com.aliyun.dysmsapi20170525.models.SendSmsRequest()
                    .setPhoneNumbers(phones)
                    .setSignName(smsInfo.getSignName())
                    .setTemplateCode(templateId)
                    .setTemplateParam(JSON.toJSONString(param));
            SendSmsResponse resp = client.sendSms(req);
            System.out.println("OK".equals(resp.getBody().getCode()));
            System.out.println(resp.getBody().getCode());
            SmsSendResult smsSendResult = SmsSendResult.builder().isSuccess("OK".equals(resp.getBody().getCode())).msg(resp.getBody().getMessage()).aliyunRes(resp).build();
            return smsSendResult;
        } catch (Exception e) {
            e.printStackTrace();
            SmsSendResult smsSendResult = SmsSendResult.builder().isSuccess(false).msg(e.getMessage()).build();
            return smsSendResult;
        }
    }

    /**
     * 发送短信协议,腾讯云
     *
     * @param smsInfo
     * @param phones     多个手机号用,隔开,需要加+86等前缀
     * @param templateId
     * @param param      例如模板为:验证码为:{1},如非本人操作,请忽略本短信。那么key=1,value为1234
     * @return
     */
    private static SmsSendResult sendSmsTencent(SysSmsConfigVo.SmsInfo smsInfo, String phones, String templateId, Map<String, String> param) {
        try {
            Credential credential = new Credential(smsInfo.getAccessKeyId(), smsInfo.getAccessKeySecret());
            HttpProfile httpProfile = new HttpProfile();
            httpProfile.setEndpoint(smsInfo.getEndpoint());
            ClientProfile clientProfile = new ClientProfile();
            clientProfile.setHttpProfile(httpProfile);
            SmsClient client = new SmsClient(credential, "", clientProfile);
            com.tencentcloudapi.sms.v20190711.models.SendSmsRequest req = new SendSmsRequest();
            Set<String> set = Arrays.stream(phones.split(",")).collect(Collectors.toSet());
            req.setPhoneNumberSet(ArrayUtil.toArray(set, String.class));
            if (CollUtil.isNotEmpty(param)) {
                req.setTemplateParamSet(ArrayUtil.toArray(param.values(), String.class));
            }
            req.setTemplateID(templateId);
            req.setSign(smsInfo.getSignName());
            req.setSmsSdkAppid(smsInfo.getSdkAppId());
            com.tencentcloudapi.sms.v20190711.models.SendSmsResponse resp = client.SendSms(req);
            SmsSendResult smsSendResult = SmsSendResult.builder().isSuccess(true).msg("ok").tencentRes(resp).build();
            for (SendStatus sendStatus : resp.getSendStatusSet()) {
                if (!"Ok".equals(sendStatus.getCode())) {
                    smsSendResult.setSuccess(false);
                    sendStatus.setMessage(sendStatus.getMessage());
                    break;
                }
            }
            return smsSendResult;
        } catch (Exception e) {
            e.printStackTrace();
            SmsSendResult smsSendResult = SmsSendResult.builder().isSuccess(false).msg(e.getMessage()).build();
            return smsSendResult;
        }
    }

    /**
     * 从redis里获取系统邮箱配置信息
     * 不存在或者被禁用或者数量为0返回null
     *
     * @return
     */
    private static SysSmsConfigVo getSysSmsConfigVo() {
        Object object = RedisUtil.getValue(RedisConstant.CONFIG + "sys.sms.config");
        if (ObjectUtil.isEmpty(object)) {
            return null;
        }
        SysConfig sysConfig = JSON.parseObject(JSON.toJSONString(object), SysConfig.class);
        if (!sysConfig.getStatus().equals(SystemConstant.STATUS_NORMAL)) {
            return null;
        }
        SysSmsConfigVo sysSmsConfigVo = JSONObject.parseObject(sysConfig.getValue(), SysSmsConfigVo.class);
        return sysSmsConfigVo;
    }

}

实体类

SysSmsConfigVo

package cn.daenx.myadmin.system.vo.system;

import lombok.AllArgsConstructor;
import lombok.Data;

import java.io.Serializable;

/**
 * 系统短信配置
 */
@Data
@AllArgsConstructor
public class SysSmsConfigVo implements Serializable {

    private Config config;
    private SmsInfo aliyun;
    private SmsInfo tencent;

    @Data
    public static class Config {
        /**
         * 使用平台
         * aliyun=阿里云,tencent=腾讯云
         */
        private String type;
    }

    @Data
    public static class SmsInfo {
        /**
         * 是否启用该平台,true/false
         */
        private String enable;
        /**
         * 固定为:sms.tencentcloudapi.com
         */
        private String endpoint;
        private String accessKeyId;
        private String accessKeySecret;
        /**
         * 签名
         */
        private String signName;
        /**
         * 应用ID,腾讯云专属
         */
        private String sdkAppId;
    }


}

SmsSendResult

package cn.daenx.myadmin.system.vo.system;

import lombok.Builder;
import lombok.Data;

@Data
@Builder
public class SmsSendResult {
    /**
     * 是否成功
     */
    private boolean isSuccess;
    private String msg;

    /**
     * 阿里云的原始结果
     */
    private com.aliyun.dysmsapi20170525.models.SendSmsResponse aliyunRes;
    /**
     * 腾讯云的原始结果
     */
    private com.tencentcloudapi.sms.v20190711.models.SendSmsResponse tencentRes;
}

标签:return,String,java,SmsSendResult,SMS,param,腾讯,import,com
From: https://www.cnblogs.com/daen/p/17397098.html

相关文章

  • Java | 一分钟掌握定时任务 | 1 - 基本概念
    作者:Mars酱声明:本文章由Mars酱原创,部分内容来源于网络,如有疑问请联系本人。转载:欢迎转载,转载前先请联系我!什么是定时任务定时任务就是在指定时间执行的一个或一串动作的行为。现实世界中,比如我们向自己心爱的女友送上祝福;给自己的好友送上祝福。那么,我们为了准时送祝福,会怎么做?当然......
  • Java基础学习
    Java特性和优势简单性面向对象性(万物皆对象)可移植性(跨平台性)高性能分布式(URL、远程方法调用)动态性(反射机制)多线程(交互性、实时性)安全性健壮性(异常机制)Java版本JVM:虚拟机,实现跨平台JavaSE(标准版):桌面程序、控制台开发......JavaME(嵌入式开发)JavaEE(企业级开......
  • Java--多线程
    Java--多线程进程线程多线程的实现方式方法1:继承Thread类定义一个类继承Thread方法再该类中重写run()方法创建该类的对象启动线程代码示例类publicclassdemoextendsThread{//继承Thread方法@Overridepublicvoidrun(){//重写run方法,把代码片断......
  • java基于springboot+vue的农机电招平台、农机租赁管理系统,附源码+数据库+文档+PPT,适合
    1、项目介绍该系统包括前台操作和后台管理两个部分,一方面,为用户提供首页,农机,系统公告,个人中心,后台管理等功能;另一方面,为管理员提供首页,个人中心,农机机主管理,使用者管理,农机类型管理,农机管理,农机预约管理,系统管理等功能。项目获取,看这里2、技术框架编程语言:java系统架构:B/S......
  • 必知必会的JavaScript前端面试题篇(二),不看后悔!
    必知必会的JavaScript前端面试题篇(二),不看后悔!1.JavaScript有哪些数据类型以及它们的区别?js一共有八种数据类型,分别是:Undefined,Null,Boolean,Number,String,Object,Symbol,BigInt其中Symbol,BigInt是ES6中新增的数据类型:Symbol:代表唯一的数据类型,主要为了解......
  • 10款Flash和Javascript网页音乐播放器
    关联:9FreshjQueryMediaPlayers   10款音乐播放器,有基于javascript的网页音乐播放器,也有基于Flash的音乐播放器。赶快挑一款,分享你喜爱的音乐吧! 1.Dewplayer  Dewplayer是一个微型,免费的Flashmp3播放器,具有简洁的界面。Dewplayer包含三种不同的尺寸界面。  2.......
  • java中this的内存原理以及成员变量和局部变量
    this的内存原理1、this的作用:区分局部变量和成员变量eg:publicclassStudent{ privateintage; publicvoidmethod(){ intage=10; System.out.println(age);//10 System.out.println(this.age);//0使用this.可以直接使用成员变量的age }}2、this的本质:代......
  • Java基础语法
    注意:​ 用记事本打开本文档,格式较差。​ 可安装typora软件后再次打开。​ 安装包位于:day01\资料\其他软件\阅读笔记的软件\typora-setup-x64.exeday01-Java基础语法1.人机交互1.1什么是cmd?就是在windows操作系统中,利用命令行的方式去操作计算机。我们可以利用cmd命令......
  • Spring实现javaConfig配置
    1、新建一个config的java文件设置注解为Configuration:2、然后在test的执行文件里面进行注解形式的运行ApplicaitonContextcontext=newAnnocationConfigAppication(userConfig.class);3、Configuration这个注解代表了之前的xml的配置文件的意思,也算是将配置文件化成了con......
  • Java中的位运算符号详解(&、|、^、~、<<、>>、>>>)(转载)
    位运算符号概览符号描述运算规则&与两个位都为1时,结果才为1|或两个位都为0时,结果才为0^异或两个位相同为0,不同为1~取反所有位置0变1,1变0<<左移各二进位全部左移若干位,高位丢弃,低位补0>>带符号右移各二进位全部右移若干位,低位丢弃,高位补为符......