當前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
SpringCloud集成发送短信--容联云通讯--Redis
生活随笔
收集整理的這篇文章主要介紹了
SpringCloud集成发送短信--容联云通讯--Redis
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
SpringCloud集成–容聯云通訊–Redis
發送短信微服務
項目結構
配置文件
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>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啟動類
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
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
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
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"));}}}測試
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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用freemarker生成word模板
- 下一篇: gradle idea java ssm