SpringCloud集成–容联云通讯–Redis

发送短信微服务

项目结构

配置文件

  1. pom.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>leyou</artifactId><groupId>com.leyou.parent</groupId><version>1.0.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><groupId>com.leyou.service</groupId><artifactId>ly-sms</artifactId><dependencies><!-- 容联云通讯, 发送短信的依赖 自带的是gson2.8.5但是会报错--><dependency><groupId>com.cloopen</groupId><artifactId>java-sms-sdk</artifactId><version>1.0.1</version></dependency><!-- 必须添加2.8.6, 要不然发送短信就会报错 --><dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId><version>2.8.6</version></dependency><!-- spring操作rabbitmq依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency><!-- 测试依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId></dependency><!-- spring操作redis依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency></dependencies></project>
    
  2. application.yml

    server:port: 8086spring:application:name: sms-servicerabbitmq:host: 192.168.79.128  # 安装rabbitmq的ipusername: leyou # rabbitmq的账号password: 123456 # rabbitmq的密码virtual-host: /leyou # 虚拟主机redis:host: 192.168.79.128 # 端口默认6379, 所以这里没配置ly:sms:# 主账号,登陆云通讯网站后,可在控制台首页看到开发者主账号ACCOUNT SID和主账号令牌AUTH TOKENaccountSId: ***********************accountToken: ***********************# 请使用管理控制台中已创建应用的APPIDappId: ***********************# 短信模板templateId: 1
    

启动类

  1. LySmsApplication

    package com.leyou.sms;import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;/*** @program: leyou* @description:* @author: Mr.Xiao* @create: 2020-07-01 11:12**/
    @SpringBootApplication
    public class LySmsApplication {public static void main(String[] args) {SpringApplication.run(LySmsApplication.class);}}

config

  1. SmsProperties

    package com.leyou.sms.config;import lombok.Data;
    import org.springframework.boot.context.properties.ConfigurationProperties;/*** @program: leyou* @description: java配置类* @author: Mr.Xiao* @create: 2020-07-01 11:24**/
    @ConfigurationProperties(prefix = "ly.sms")
    @Data
    public class SmsProperties {private String accountSId;private String accountToken;private String appId;private String templateId;}
    

mq

  1. SmsListener

    package com.leyou.sms.mq;import com.leyou.sms.config.SmsProperties;
    import com.leyou.sms.utils.SmsUtils;
    import org.apache.commons.lang3.StringUtils;
    import org.springframework.amqp.core.ExchangeTypes;
    import org.springframework.amqp.rabbit.annotation.Exchange;
    import org.springframework.amqp.rabbit.annotation.Queue;
    import org.springframework.amqp.rabbit.annotation.QueueBinding;
    import org.springframework.amqp.rabbit.annotation.RabbitListener;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.context.properties.EnableConfigurationProperties;
    import org.springframework.stereotype.Component;
    import org.springframework.util.CollectionUtils;import java.util.Map;/*** @program: leyou* @description: 消息接收处理* @author: Mr.Xiao* @create: 2020-06-29 18:21**/
    @Component
    @EnableConfigurationProperties(SmsProperties.class)
    public class SmsListener {@Autowiredprivate SmsUtils smsUtils;@Autowiredprivate SmsProperties prop;@RabbitListener(bindings = @QueueBinding(/*** name = "sms.verify.code.queue" 队列名称* durable = "true" 持久化**/value = @Queue(name = "sms.verify.code.queue", durable = "true"),/*** name = "ly.sms.exchange" 交换机名称* type = ExchangeTypes.TOPIC 交换机类型**/exchange = @Exchange(name = "ly.sms.exchange", type = ExchangeTypes.TOPIC),/*** key = "sms.verify.code"  routing key**/key = "sms.verify.code"))public void listenerSendSms(Map<String, String> msg) {if (CollectionUtils.isEmpty(msg)) {return;}String to = msg.get("phone");if (StringUtils.isBlank(to)) {return;}String[] datas = msg.get("datas").split(",");// 发送短信验证码smsUtils.sendSms(to, prop.getTemplateId(), datas);}}
    

utils

  1. SmsUtils

    package com.leyou.sms.utils;import com.cloopen.rest.sdk.BodyType;
    import com.cloopen.rest.sdk.CCPRestSmsSDK;
    import com.leyou.sms.config.SmsProperties;
    import lombok.extern.slf4j.Slf4j;
    import org.apache.commons.lang3.StringUtils;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.context.properties.EnableConfigurationProperties;
    import org.springframework.data.redis.core.StringRedisTemplate;
    import org.springframework.stereotype.Component;import java.util.HashMap;
    import java.util.Set;
    import java.util.concurrent.TimeUnit;/*** @program: leyou* @description: 发送短息* @author: Mr.Xiao* @create: 2020-07-01 11:27**/
    @Slf4j
    @Component
    @EnableConfigurationProperties(SmsProperties.class)
    public class SmsUtils {@Autowiredprivate SmsProperties prop; // java配置类, 把发送短信需要的配置, 都配置在配置文件了@Autowiredprivate StringRedisTemplate redisTemplate; // 注入redisTemplate// 生产环境请求地址:app.cloopen.comprivate static final String serverIp = "app.cloopen.com";// 请求端口private static final String serverPort = "8883";// 存入redis的前缀private static final String KEY_PREFIX = "sms:phone:";// 存活时间 1分钟private static final long SMS_MIN_INTERVAL_IN_MILLIS = 60000;public void sendSms(String to, String templateId, String[] datas) {String redisKey = KEY_PREFIX + to;// TODO 按照手机号限流// 先从redis中取出该值String redisValue = redisTemplate.opsForValue().get(redisKey);if (StringUtils.isNotBlank(redisValue)) {// redis中有值long lastTime = Long.valueOf(redisValue);if (System.currentTimeMillis() - lastTime < SMS_MIN_INTERVAL_IN_MILLIS) {log.info("[短信服务], 发送频率过高, 被拦截, 请稍后再试, 手机号码: {}", to);return;}}CCPRestSmsSDK sdk = new CCPRestSmsSDK();sdk.init(serverIp, serverPort);sdk.setAccount(prop.getAccountSId(), prop.getAccountToken());sdk.setAppId(prop.getAppId());sdk.setBodyType(BodyType.Type_JSON);/*** to: 发送短信至手机号** templateId: 短信模板** datas: 这里模拟一下验证码123456,10分钟内到期 {"123456", "10"}*/HashMap<String, Object> result = sdk.sendTemplateSMS(to,templateId,datas);if("000000".equals(result.get("statusCode"))){//正常返回输出data包体信息(map)HashMap<String,Object> data = (HashMap<String, Object>) result.get("data");Set<String> keySet = data.keySet();for(String key:keySet){Object object = data.get(key);System.out.println(key +" = "+object);}// 发送短信成功后, 写入redis, 指定生存时间1分钟redisTemplate.opsForValue().set(redisKey, String.valueOf(System.currentTimeMillis()), 1, TimeUnit.MINUTES);log.info("[短信服务], 发送短信验证码, 手机号: {}", to);}else{log.error("[短信服务] 发送短信失败 ", result.get("statusMsg"));//异常返回输出错误码和错误信息System.out.println("错误码=" + result.get("statusCode") +" 错误信息= "+result.get("statusMsg"));}}}
    

测试

  1. test

    package com.leyou.test;import com.leyou.sms.LySmsApplication;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.amqp.core.AmqpTemplate;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.test.context.junit4.SpringRunner;import java.util.HashMap;/*** @program: leyou* @description:* @author: Mr.Xiao* @create: 2020-07-01 14:03**/
    @RunWith(SpringRunner.class)
    @SpringBootTest(classes = LySmsApplication.class)
    public class test {@Autowiredprivate AmqpTemplate amqpTemplate;@Testpublic void sendSms() {HashMap<String, String> map = new HashMap<>();map.put("phone", "*********");map.put("datas", "123456,1");this.amqpTemplate.convertAndSend("ly.sms.exchange", "sms.verify.code", map);}}
    

SpringCloud集成发送短信--容联云通讯--Redis相关推荐

  1. Django验证码*短信验证码之2-容联云通讯短信平台(联云通讯短信平台介绍、容联云通讯Python SDK、封装发送短信单例类)

    容联云通讯短信平台介绍 容联云通讯网址:https://www.yuntongxun.com/ 容联云管理控制台 容联云创建应用 容联云通讯Python SDK https://doc.yuntong ...

  2. python控制手机发短信_python-在python3中使用容联云通讯发送短信验证码

    2020-08-15更新 今天进容联云官网发现其已经更新了最新版的Python SDK,可以直接 pip install ronglian_sms_sdk 即可安装使用,具体新的使用方法可以查看官网案 ...

  3. java通过容联云通讯实现发送短信验证码

    1.在容联云通讯上根据 -接入流程 完成以下的步骤 创建应用 申请短信签名 配置测试号码等等 最终可以拿到SID和TOKEN.之后把官网上的Demo下载下来,把里面的jar包加到你的项目里面 Cont ...

  4. laravel+容联.云通讯 实现手机短信验证用户注册

    Laravel框架简介: Laravel是一套简洁.优雅的PHP Web开发框架(PHP Web Framework).它可以让你从面条一样杂乱的代码中解脱出来:它可以帮你构建一个完美的网络APP,而 ...

  5. 容联云通讯短信平台JS调用

    容联云通讯官网 1.注册 注册成功之后,会赠送8元进行测试 记录账号信息用于代码中配置 添加测试号码用于测试 2.接口配置(js) var md5 = require('blueimp-md5') v ...

  6. 容联云通讯短信接口 Python3 文档

    容联云通讯官方还未发布python3以上的版本,此文档是向云通讯的工作人员获取的,下载后解压可以直接使用

  7. 容联云通讯完成发送验证码

    容联云通讯完成发送验证码 不是广告,真人编写,学习记录分享而已 容联云通讯官方网站 https://www.yuntongxun.com/ 进入网站后,找到测试号码 绑定测试的手机号,最多绑定是三个 ...

  8. android 极光 环信,环信、容联云通讯、极光推送和网易云信IM即时通讯功能接入方式_部署方式_企业服务汇...

    编者按:企业在挑选IM即时通讯功能服务商时,对于企业应当如何接入其IM功能.接入方式和部署方式有哪些等问题不太清楚.今天企业服务汇通过评测环信.容联云通讯.极光推送和网易云信这四家服务商来为你详细说明 ...

  9. 开发者福利丨容联云通讯、LeanCloud 官方集成云账户红包SDK

    聊天场景下匹配账户体系以及收发红包的功能,对于IM产品来说如虎添翼,也为开发者节省了大量的开发成本. 近日,两大即时通讯云服务提供商容联云通讯.LeanCloud先后在其官网发布了完美集成云账户红包S ...

最新文章

  1. OpenGL函数库详解
  2. 机器学习系列 5:特征缩放
  3. CSS 相对|绝对(relative/absolute)定位系列(一)
  4. 表单令牌阻止数据重复提交
  5. JSP动态网站环境搭建应用中的详细步骤(Tomcat和Apache/IIS的整合)
  6. java web高级编程 百度网盘_[有书共享]JavaWeb高级编程
  7. fatal error C1083: Cannot open include file: 'qttreepropertybrowser.moc': No such file or directory
  8. 函数使用了堆栈的字节超过_Go语言复习笔记——基本语法三之堆栈与字符串应用...
  9. java 输入流可以合并吗_Java 使用IO流实现大文件的分割与合并实例详解
  10. 创建数据库以及该数据库下的表单
  11. 想考阿里云ACE需要做什么准备?考下来难不难?
  12. 攻防世界 WEB Web_python_flask_sql_injection
  13. CUDA安装出现图形驱动程序安装失败
  14. 学生成绩表c语言,学生成绩信息表(c语言程序)
  15. m苹果放n篮子_【求这个编程】 有m个橘子,n个篮子,把橘子全部放进篮子里的...
  16. 计算机应用基础张宇答案,计算机应用基础电子教案教学课件作者张宇单选课件.doc...
  17. 洛谷:P1033 [NOIP2002 提高组] 自由落体 C++详解
  18. CreateEvent使用
  19. 『每周译Go』Go 语言的 goroutine 性能分析
  20. 现代控制理论第一章学习笔记

热门文章

  1. 调用FileSystemObject CopyFile发生没有权限的错误
  2. UVM sequence机制(4)(response 特性)
  3. Explicit Intent Implicit Intent
  4. 聚类分析在用户行为中的实例_网站用户行为分析案例
  5. Codeforces Kitchen Plates
  6. 用猿大师VLC播放程序在Chrome播放海康威视RTSP监控视频卡顿怎么办?
  7. jsp21125农贸市场食品检测业务系统
  8. out.print() 和 out.write()详细用法
  9. 快手Java后台三面,意向已拿,面试官都问了些啥?
  10. 家居企业怎么做微信营销?