1.1 SpringCloudAlibaba短信服務(wù)簡介
短信服務(wù)(Short Message Service)是阿里云為用戶提供的一種通信服務(wù)的能力。
-
產(chǎn)品優(yōu)勢:覆蓋全面、高并發(fā)處理、消息堆積處理、開發(fā)管理簡單、智能監(jiān)控調(diào)度
-
產(chǎn)品功能:短信通知、短信驗證碼、推廣短信、異步通知、數(shù)據(jù)統(tǒng)計
-
應(yīng)用場景:短信驗證碼、系統(tǒng)信息推送、推廣短信等
SpringCloudAlibaba提供的短信服務(wù),集成更加方便,代碼更加簡潔。
1.2 代碼解析
1.2.1 基本配置與工具類封裝
(1)我們這里使用了SpringCloudAlibaba中提供的短信服務(wù)
工程引入依賴
<dependency>
? ?<groupId>com.alibaba.cloud</groupId>
? ?<artifactId>spring-cloud-alicloud-sms</artifactId>
? ?<version>2.2.0.RELEASE</version>
</dependency>
(2)配置文件添加短信相關(guān)的配置,密鑰的配置
spring: cloud: ? alicloud: ? ? access-key: XXX ? ? secret-key: XXX
以及簽名和模板號的配置(自定義)
sms: operator: ? signName: xxx ? templateCode: xxx
(3)SmsConfig用于讀取配置文件中的簽名和模板編號
package com.lkd.sms;
?
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
?
@Configuration
public class SmsConfig {
? ?@Value("${sms.operator.signName}")
? ?private String signName;
? ?@Value("${sms.operator.templateCode}")
? ?private String templateCode;
?
? ?public String getSignName() {
? ? ? ?return signName;
? }
?
? ?public String getTemplateCode() {
? ? ? ?return templateCode;
? }
}
(4)SmsSender用于封裝發(fā)送短信的方法
package com.lkd.sms;
?
import com.alibaba.alicloud.sms.ISmsService;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
?
@Component
@Slf4j
public class SmsSender {
? ?@Autowired
? ?private SmsConfig smsConfig;
? ?@Autowired
? ?private ISmsService smsService;
?
? ?/**
? ? * 發(fā)送驗證碼短信
? ? * @param telphone 手機號
? ? * @param code 手機驗證碼
? ? */
? ?public void sendMsg(String telphone,String code){
? ? ? ?// 組裝請求對象-具體描述見控制臺-文檔部分內(nèi)容
? ? ? ?SendSmsRequest request = new SendSmsRequest();
?
? ? ? ?// 必填:待發(fā)送手機號
? ? ? ?request.setPhoneNumbers(telphone);
? ? ? ?// 必填:短信簽名-可在短信控制臺中找到
? ? ? ?request.setSignName(smsConfig.getSignName());
? ? ? ?// 必填:短信模板-可在短信控制臺中找到
? ? ? ?request.setTemplateCode(smsConfig.getTemplateCode());
? ? ? ?// 可選:模板中的變量替換JSON串,如模板內(nèi)容為"【企業(yè)級分布式應(yīng)用服務(wù)】,您的驗證碼為${code}"時,此處的值為
? ? ? ?ObjectMapper mapper = new ObjectMapper();
? ? ? ?JsonNode rootNode = mapper.createObjectNode();
? ? ? ((ObjectNode)rootNode).put("code",code);
? ? ? ?try {
request.setTemplateParam(mapper.writeValueAsString(rootNode));//{"code":code}
? ? ? ? ? ?smsService.sendSmsRequest(request);
? ? ? }
? ? ? ?catch (Exception e) {
? ? ? ? ? ?log.error("send sms error.",e);
? ? ? }
? }
}
在需要發(fā)送短信的地方,直接引入SmsSender即可
1.2.2 發(fā)送短信驗證碼
(1)發(fā)送短信驗證碼, UserService定義方法
/**
* 發(fā)送驗證碼
* @param mobile
*/
void sendCode(String mobile);
UserServiceImpl實現(xiàn)方法文章來源:http://www.zghlxwxcb.cn/news/detail-797805.html
@Autowired
private SmsSender smsSender;
?
@Override
public void sendCode(String mobile){
? ?if(Strings.isNullOrEmpty(mobile)) return;
? ?LambdaQueryWrapper<UserEntity> wrapper = new LambdaQueryWrapper<>();
? ?wrapper
? ? ? ? ? .eq(UserEntity::getMobile,mobile);
? ?if(this.count(wrapper)<=0) return;
? ?
? ?if(redisTemplate.opsForValue().get(mobile) != null) return;
? ?//生成5位驗證碼
? ?StringBuilder sbCode = new StringBuilder();
? ?Stream
? ? ? ? ? .generate( ()-> new Random().nextInt(10))
? ? ? ? ? .limit(5)
? ? ? ? ? .forEach(x-> sbCode.append(x));
? ?redisTemplate.opsForValue().set(mobile,sbCode.toString(), Duration.ofMinutes(5));
? ?smsSender.sendMsg(mobile,sbCode.toString());
}
(2)UserController新增方法文章來源地址http://www.zghlxwxcb.cn/news/detail-797805.html
/**
* 生成登錄手機驗證碼
* @param mobile
*/
@GetMapping("/code/{mobile}")
public void generateCode(@PathVariable String mobile){
? ?userService.sendCode(mobile);
}
到了這里,關(guān)于集成SpringCloudAlibaba短信服務(wù) 短信驗證碼的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!