全网最详细SpringBoot、SpringCloud整合阿里云短信服务

这篇具有很好参考价值的文章主要介绍了全网最详细SpringBoot、SpringCloud整合阿里云短信服务。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、进入阿里云官网

https://www.aliyun.com/

2、搜索短信服务 

springboot整合阿里云短信,阿里云,云计算,SpringBoot,SpringCloud

3、进入短信控制台

springboot整合阿里云短信,阿里云,云计算,SpringBoot,SpringCloud

4、选择国内消息

springboot整合阿里云短信,阿里云,云计算,SpringBoot,SpringCloud

5、点击添加签名

springboot整合阿里云短信,阿里云,云计算,SpringBoot,SpringCloud

6、输入相关信息,点击提交

springboot整合阿里云短信,阿里云,云计算,SpringBoot,SpringCloudspringboot整合阿里云短信,阿里云,云计算,SpringBoot,SpringCloud

7、点击模块管理,选择添加模块

springboot整合阿里云短信,阿里云,云计算,SpringBoot,SpringCloud

8、输入相关信息,点击提交

springboot整合阿里云短信,阿里云,云计算,SpringBoot,SpringCloud

 

9、鼠标放在头像上,点击下拉框中的AccessKey管理

springboot整合阿里云短信,阿里云,云计算,SpringBoot,SpringCloud

10、点击创建AccessKey

springboot整合阿里云短信,阿里云,云计算,SpringBoot,SpringCloud

11、输入验证码

springboot整合阿里云短信,阿里云,云计算,SpringBoot,SpringCloud

12、创建成功,两串字符串复制一下

springboot整合阿里云短信,阿里云,云计算,SpringBoot,SpringCloud

13、pom.xml中引入阿里云相关依赖,还有redis的依赖

<dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>aliyun-java-sdk-core</artifactId>
    <version>4.5.16</version>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

14、配置application.properties(不是微服务项目就不要加nacos了)

# 服务端口
server.port=8204
# 服务名
spring.application.name=service-msm

#返回json的全局时间格式
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
spring.jackson.time-zone=GMT+8

# redis配置
spring.redis.host=192.168.44.165
spring.redis.port=6379
spring.redis.database= 0
spring.redis.timeout=1800000
spring.redis.lettuce.pool.max-active=20
spring.redis.lettuce.pool.max-wait=-1
# 最大阻塞等待时间(负数表示没限制)
spring.redis.lettuce.pool.max-idle=5
spring.redis.lettuce.pool.min-idle=0

# nacos服务地址
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848

aliyun.sms.regionId=default
# 第12步复制的两串字符串
aliyun.sms.accessKeyId=LT6I0Y5633pX89qC
aliyun.sms.secret=jX8D04Dm12I3gGKj345FYSzu0fq8mT

springboot整合阿里云短信,阿里云,云计算,SpringBoot,SpringCloud

15、添加启动类

//取消数据源自动配置,因为application.properties配置文件中没有配置数据库
//如果application.properties配置文件中配置了数据库,“(exclude = DataSourceAutoConfiguration.class)”就不用加了
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
@EnableDiscoveryClient
public class ServiceMsmApplication {
   public static void main(String[] args) {
      SpringApplication.run(ServiceMsmApplication.class, args);
   }
}

16、配置网关(不是微服务项目就不用写这一步)

spring.cloud.gateway.routes[3].id=service-msm
#设置路由的uri
spring.cloud.gateway.routes[3].uri=lb://service-msm
#设置路由断言,代理servicerId为auth-service的/auth/路径
spring.cloud.gateway.routes[3].predicates= Path=/*/msm/**

17、添加阿里云短信服务配置类

import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class ConstantPropertiesUtils implements InitializingBean {

    //对应application.properties配置文件中的aliyun.sms.regionId=default
    @Value("${aliyun.sms.regionId}")
    private String regionId;

    //对应application.properties配置文件中的aliyun.sms.accessKeyId=LT6I0Y5633pX89qC
    @Value("${aliyun.sms.accessKeyId}")
    private String accessKeyId;

    //对应application.properties配置文件中的aliyun.sms.secret=jX8D04Dm12I3gGKj345FYSzu0fq8mT
    @Value("${aliyun.sms.secret}")
    private String secret;

    public static String REGION_Id;
    public static String ACCESS_KEY_ID;
    public static String SECRECT;

    @Override
    public void afterPropertiesSet() throws Exception {
        REGION_Id=regionId;
        ACCESS_KEY_ID=accessKeyId;
        SECRECT=secret;
    }
}

18、添加redis配置类(如果项目中redis已经有配置类了,就不用再添加了)

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.interceptor.KeyGenerator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

import java.lang.reflect.Method;
import java.time.Duration;

@Configuration
@EnableCaching
public class RedisConfig {

    /**
     * 自定义key规则
     * @return
     */
    @Bean
    public KeyGenerator keyGenerator() {
        return new KeyGenerator() {
            @Override
            public Object generate(Object target, Method method, Object... params) {
                StringBuilder sb = new StringBuilder();
                sb.append(target.getClass().getName());
                sb.append(method.getName());
                for (Object obj : params) {
                    sb.append(obj.toString());
                }
                return sb.toString();
            }
        };
    }

    /**
     * 设置RedisTemplate规则
     * @param redisConnectionFactory
     * @return
     */
    @Bean
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);

        //解决查询缓存转换异常的问题
        ObjectMapper om = new ObjectMapper();
        // 指定要序列化的域,field,get和set,以及修饰符范围,ANY是都有包括private和public
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        // 指定序列化输入的类型,类必须是非final修饰的,final修饰的类,比如String,Integer等会跑出异常
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(om);

        //序列号key value
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);

        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }

    /**
     * 设置CacheManager缓存规则
     * @param factory
     * @return
     */
    @Bean
    public CacheManager cacheManager(RedisConnectionFactory factory) {
        RedisSerializer<String> redisSerializer = new StringRedisSerializer();
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);

        //解决查询缓存转换异常的问题
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(om);

        // 配置序列化(解决乱码的问题),过期时间600秒
        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
                .entryTtl(Duration.ofSeconds(600))
                .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))
                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer))
                .disableCachingNullValues();

        RedisCacheManager cacheManager = RedisCacheManager.builder(factory)
                .cacheDefaults(config)
                .build();
        return cacheManager;
    }
}

19、添加验证码自动生成工具类

import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Random;

public class RandomUtil {

    private static final Random random = new Random();

    private static final DecimalFormat fourdf = new DecimalFormat("0000");

    private static final DecimalFormat sixdf = new DecimalFormat("000000");

    public static String getFourBitRandom() {
        return fourdf.format(random.nextInt(10000));
    }

    public static String getSixBitRandom() {
        return sixdf.format(random.nextInt(1000000));
    }

    /**
     * 给定数组,抽取n个数据
     * @param list
     * @param n
     * @return
     */
    public static ArrayList getRandom(List list, int n) {

        Random random = new Random();

        HashMap<Object, Object> hashMap = new HashMap<Object, Object>();

        // 生成随机数字并存入HashMap
        for (int i = 0; i < list.size(); i++) {

            int number = random.nextInt(100) + 1;

            hashMap.put(number, i);
        }

        // 从HashMap导入数组
        Object[] robjs = hashMap.values().toArray();

        ArrayList r = new ArrayList();

        // 遍历数组并打印数据
        for (int i = 0; i < n; i++) {
            r.add(list.get((int) robjs[i]));
            System.out.print(list.get((int) robjs[i]) + "\t");
        }
        System.out.print("\n");
        return r;
    }
}

20、开发阿里云发送短信接口

20.1、Controller层:

import com.hospital.common.result.Result;
import com.hospital.msm.service.MsmService;
import com.hospital.msm.utils.RandomUtil;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.concurrent.TimeUnit;

@RestController
@RequestMapping("/api/msm")
public class MsmApiController {

    @Autowired
    private MsmService msmService;

    @Autowired
    private RedisTemplate<String,String> redisTemplate;

    /**
     * 发送手机验证码
     * @param phone
     * @return
     */
    @GetMapping("/send/{phone}")
    public Result sendCode(@PathVariable String phone){
        //从redis中获取验证码,如果获取到,返回ok
        //key:手机号,value:验证码
        String code = redisTemplate.opsForValue().get(phone);
        if (!StringUtils.isEmpty(code)){
            return Result.ok();
        }

        //如果从redis中获取不到,就自己生成验证码
        code = RandomUtil.getSixBitRandom();

        //通过调用service方法,整合阿里云短信服务进行发送
        boolean isSend = msmService.send(phone,code);

        //如果阿里云短信服务发送成功就给isSend返回为true
        //然后把生成的验证码放到redis里面,并设置过期时间
        if(isSend){
            //超过两分钟,验证码就失效了
            redisTemplate.opsForValue().set(phone,code,2, TimeUnit.MINUTES);
            return Result.ok();
        }else {
            return Result.fail().message("发送短信失败!!!");
        }
    }
}

20.2、Service层:

public interface MsmService {
    //阿里云短信服务发送手机验证码
    boolean send(String phone, String code);
}

20.3、Service实现层:

import com.alibaba.fastjson.JSONObject;
import com.aliyuncs.CommonRequest;
import com.aliyuncs.CommonResponse;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
import com.hospital.msm.service.MsmService;
import com.hospital.msm.utils.ConstantPropertiesUtils;
import org.apache.commons.lang.StringUtils;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.Map;

@Service
public class MsmServiceImpl implements MsmService {

    /**
     * 阿里云短信服务发送手机验证码
     * @param phone
     * @param code
     * @return
     */
    @Override
    public boolean send(String phone, String code) {
        //判断手机号是否为空
        if (StringUtils.isEmpty(phone)){
            return false;
        }

        //传入ConstantPropertiesUtils配置类中从application.properties配置文件中获取的三个值
        DefaultProfile profile = DefaultProfile.
                getProfile(ConstantPropertiesUtils.REGION_Id,
                        ConstantPropertiesUtils.ACCESS_KEY_ID,
                        ConstantPropertiesUtils.SECRECT);
        IAcsClient client = new DefaultAcsClient(profile);
        CommonRequest request = new CommonRequest();
        //request.setProtocol(ProtocolType.HTTPS);  //发送的协议如果是https就不注释
        request.setMethod(MethodType.POST); //这一行是固定的
        request.setDomain("dysmsapi.aliyuncs.com"); //这一行是固定的
        request.setVersion("2017-05-25");   //这一行是固定的
        request.setAction("SendSms");   //这一行是固定的

        //手机号
        request.putQueryParameter("PhoneNumbers", phone);
        //签名名称
        request.putQueryParameter("SignName", "我的谷粒在线教育网站");
        //模板code
        request.putQueryParameter("TemplateCode", "SMS_257677932");
        //验证码  使用json格式   {"code":"123456"}
        Map<String,Object> param = new HashMap();
        param.put("code",code);
        request.putQueryParameter("TemplateParam", JSONObject.toJSONString(param));

        //调用方法进行短信发送
        try {
            CommonResponse response = client.getCommonResponse(request);
            System.out.println(response.getData());
            return response.getHttpResponse().isSuccess();
        } catch (ServerException e) {
            e.printStackTrace();
        } catch (ClientException e) {
            e.printStackTrace();
        }

        //失败就返回false
        return false;
    }
}

21、登录接口判断用户输入的验证码和阿里云服务发送的验证码是否相同

springboot整合阿里云短信,阿里云,云计算,SpringBoot,SpringCloud文章来源地址https://www.toymoban.com/news/detail-784840.html

到了这里,关于全网最详细SpringBoot、SpringCloud整合阿里云短信服务的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 阿里云短信服务详细说明与实战开发后端代码

    目前在很多项目中都出现使用短信验证码来实现注册、登录、购买、支付、转账等功能,发短信功能几乎已经成为项目中不可或缺的技术之一。 短信平台与运营商之间协同合作,利益分成。 短信发送流程通常涉及以下步骤: Java程序调用短信平台提供的API接口,将短信内容、

    2023年04月18日
    浏览(35)
  • SpringBoot项目整合阿里云短信业务(非常详细)

    详细介绍SpringBoot整合阿里云短信服务的每一步过程,同时会将验证码存放到Redis中并设置过期时间,尽量保证实战的同时也让没做过的好兄弟也能实现发短信的功能~ 首先,你需要注册一个阿里云账号(如果还没有),然后在控制台中创建Access Key。这个Access Key将用于通过AP

    2024年04月27日
    浏览(33)
  • 【SpringBoot+MP】阿里云短信测试服务操作流程、用户手机验证码登录实现

    前面是站在后台员工的角度,现在站在消费者的角度,当客户从移动端选择通过验证码登录APP,需要调用云服务器的短信功能(厂商短信服务API) ,后端要做的就是生成验证码并发送,并针对请求中客户收到的验证码与后端发送的进行比对,确保一致后成功登录。 首先针对

    2024年02月02日
    浏览(42)
  • SpringCloud整合阿里云OSS实现文件上传

    阿里云OSS官网:OSS管理控制台 (aliyun.com) 什么是对象存储OSS 阿里云对象存储OSS(Object Storage Service)是一款海量、安全、低成本、高可靠的云存储服务,可提供99.9999999999%(12个9)的数据持久性,99.995%的数据可用性。多种存储类型供选择,全面优化存储成本。 OSS具有与平台无

    2023年04月13日
    浏览(46)
  • SpringCloud - OpenFeign 参数传递和响应处理(全网最详细)

    目录 一、OpenFeign 参数传递和响应处理 1.1、feign 客户端参数传递 1.1.1、零散类型参数传递 1. 例如 querystring 方式传参 2. 例如路径方式传参 1.1.2、对象参数传递 1. 对象参数传递案例 1.1.3、数组参数传递 1. 数组传参案例 1.1.4、集合类型的参数传递(了解) 1.2、feign 客户端响应处

    2024年02月02日
    浏览(41)
  • 认证服务:整合短信验证码

    前提提示 视频对应的阿里云短信服务需要企业验证,下面换一种阿里云的产品也是大同小异的 【三网106短信】短信接口-短信验证码-短信通知-会员短信群发-短信平台API接口-行业短信_支持携号转网_自定义签名和模板【最新版】_实名认证接口/API_身份证接口/API_银行卡认证-云

    2023年04月09日
    浏览(36)
  • 开通阿里云短信服务

    1.1、找到后台放在个人头像上面 选择 AccessKey 管理 1.2、选择 子用户 1.3、创建用户组 1.4、给用户组添加权限 然后就可以看到你的权限里面多了一个sms的短信权限 1.5、创建用户 注意!注意!注意点击确认后只可以看到一次密码返回就看不到了 注意!注意!注意点击确认后只

    2023年04月08日
    浏览(54)
  • 阿里云短信服务开通

    https://dysms.console.aliyun.com/overview 登录访问阿里云短信服务,可以看到大致的操作步骤: 1.申请签名,如:【阿里云短信】 2.申请模板,如:【阿里云通信】您正在使用阿里云短信测试服务,体验验证码是:8888,如非本人操作,请忽略本短信! 3.系统设置,状态报告,审核通知

    2024年02月02日
    浏览(53)
  • 阿里云短信服务实战教程

      短信服务有很多的使用场景,比如注册获取验证码,购票成功发送购票通知。目前很多头部运营商已经提供了相关服务,比如阿里云,腾讯云等,这里以阿里云短信服务为例。   阿里云的短信服务是需要购买的,并且每条短信是计费的这个可以在阿里云看到,都有详细

    2024年02月11日
    浏览(47)
  • 阿里云开通短信服务流程

    友情提示 : 本人不是专业的技术人员,很多步骤都是我参考了很多博客,文档,自己摸索出来的,不保证各位的操作都能百分百正确,以及出现的各种问题。 我写这篇博客只是为兄弟们提供一种解决方法,以及一些思路… 操作流程会有一些麻烦,如果嫌麻烦的建议 右上角

    2024年02月02日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包