目錄
一、前言
二、測試短信發(fā)送
1、查找使用示例
2、測試短信發(fā)送??編輯
三、使用RAM子用戶
1、進(jìn)入子用戶管理頁面
2、添加用戶?
3、獲取子用戶key
4、設(shè)置用戶權(quán)限
四、短信使用場景和流程
五、創(chuàng)建短信微服務(wù)
1、創(chuàng)建項(xiàng)目
2、自定義配置
3、發(fā)送短信
一、前言
在阿里云的短信服務(wù)上面申請簽名和模板(這里簽名我之前做瑞吉外賣申請過了,所以直接使用瑞吉外賣,類型都是選擇驗(yàn)證碼)之后,如果我們直接測試短信發(fā)送會提示余額不足阿里云-為了無法計(jì)算的價值 (aliyun.com)https://www.aliyun.com/
所以我們可以到試用版阿里云上開通一下免費(fèi)使用三個月的短信服務(wù),可用數(shù)量為1000
阿里云免費(fèi)試用 (aliyun.com)https://free.aliyun.com/
二、測試短信發(fā)送
1、查找使用示例
2、測試短信發(fā)送?
?然后你填的手機(jī)號就會接收到驗(yàn)證碼消息了
?三、使用RAM子用戶
1、進(jìn)入子用戶管理頁面
?
2、添加用戶?
我們需要使用用戶的密鑰來連接阿里云平臺,所以新建一個子用戶
?
3、獲取子用戶key
創(chuàng)建完成后要記下AccessKeyId, AccessKeySecret,因?yàn)樗⑿马撁婧筮@些密鑰就會消失不再顯示
4、設(shè)置用戶權(quán)限
授權(quán):AliyunDysmsFullAccess
四、短信使用場景和流程
用戶注冊賬號需要向手機(jī)發(fā)送驗(yàn)證碼
短信發(fā)送驗(yàn)證碼流程?
?
五、創(chuàng)建短信微服務(wù)
1、創(chuàng)建項(xiàng)目
service-sms
pom.xml導(dǎo)入依賴
<dependencies>
<dependency>
<groupId>com.atguigu</groupId>
<artifactId>service-base</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--lombok用來簡化實(shí)體類:需要安裝lombok插件-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!--阿里云短信-->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
</dependency>
</dependencies>
resources目錄下創(chuàng)建文件application.yaml
server:
port: 8120 # 服務(wù)端口
spring:
profiles:
active: dev # 環(huán)境設(shè)置
application:
name: service-sms # 服務(wù)名
#spring:
redis:
host: 192.168.100.100
port: 6379
database: 0
password: 123456 #默認(rèn)為空
timeout: 3000ms #最大等待時間,超時則拋出異常,否則請求一直等待
lettuce:
pool:
max-active: 20 #最大連接數(shù),負(fù)值表示沒有限制,默認(rèn)8
max-wait: -1 #最大阻塞等待時間,負(fù)值表示沒限制,默認(rèn)-1
max-idle: 8 #最大空閑連接,默認(rèn)8
min-idle: 0 #最小空閑連接,默認(rèn)0
#阿里云短信
aliyun:
sms:
region-id: cn-hangzhou
key-id: 你的keyid
key-secret: 你的keysecret
template-code: 你的短信模板code
sign-name: 你的短信模板簽名
logback-spring.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<contextName>atguiguSrb</contextName>
<!-- 日志的輸出目錄 -->
<property name="log.path" value="D:/idealworkspace/shangrb/srb_log/sms" />
<!--控制臺日志格式:彩色日志-->
<!-- magenta:洋紅 -->
<!-- boldMagenta:粗紅-->
<!-- cyan:青色 -->
<!-- white:白色 -->
<!-- magenta:洋紅 -->
<property name="CONSOLE_LOG_PATTERN"
value="%yellow(%date{yyyy-MM-dd HH:mm:ss}) %highlight([%-5level]) %green(%logger) %msg%n"/>
<!--文件日志格式-->
<property name="FILE_LOG_PATTERN"
value="%date{yyyy-MM-dd HH:mm:ss} [%-5level] %thread %file:%line %logger %msg%n" />
<!--編碼-->
<property name="ENCODING"
value="UTF-8" />
<!-- 控制臺日志 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
<charset>${ENCODING}</charset>
</encoder>
</appender>
<!-- 文件日志 -->
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>${log.path}/log.log</file>
<append>true</append>
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
<charset>${ENCODING}</charset>
</encoder>
</appender>
<appender name="ROLLING_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 要區(qū)別于其他的appender中的文件名字 -->
<file>${log.path}/log-rolling.log</file>
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
<charset>${ENCODING}</charset>
</encoder>
<!-- 設(shè)置滾動日志記錄的滾動策略 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志歸檔路徑以及格式 -->
<fileNamePattern>${log.path}/info/log-rolling-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<!--歸檔日志文件保留的最大數(shù)量-->
<maxHistory>15</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>1KB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
</appender>
<!-- <logger name="com.atguigu" level="INFO">-->
<!-- <appender-ref ref="CONSOLE" />-->
<!-- <appender-ref ref="FILE" />-->
<!-- </logger>-->
<!-- 開發(fā)環(huán)境和測試環(huán)境 -->
<springProfile name="dev,test">
<logger name="com.atguigu" level="INFO">
<appender-ref ref="CONSOLE" />
<appender-ref ref="ROLLING_FILE" />
</logger>
</springProfile>
<!-- 生產(chǎn)環(huán)境 -->
<springProfile name="prod">
<logger name="com.atguigu" level="ERROR">
<appender-ref ref="CONSOLE" />
<appender-ref ref="ROLLING_FILE" />
</logger>
</springProfile>
</configuration>
創(chuàng)建啟動類
@SpringBootApplication
@ComponentScan({"com.atguigu.srb", "com.atguigu.common"})
public class ServiceSmsApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceSmsApplication.class, args);
}
}
2、自定義配置
創(chuàng)建常量讀取工具類:SmsProperties.java
@Setter
@Getter //idea2020.2.3版配置文件自動提示需要這個
@Component
//注意prefix要寫到最后一個 "." 符號之前
//調(diào)用setter為成員賦值
@ConfigurationProperties(prefix = "aliyun.sms")
public class SmsProperties implements InitializingBean {
private String regionId;
private String keyId;
private String keySecret;
private String templateCode;
private String signName;
public static String REGION_Id;
public static String KEY_ID;
public static String KEY_SECRET;
public static String TEMPLATE_CODE;
public static String SIGN_NAME;
//當(dāng)私有成員被賦值后,此方法自動被調(diào)用,從而初始化常量
@Override
public void afterPropertiesSet() throws Exception {
REGION_Id = regionId;
KEY_ID = keyId;
KEY_SECRET = keySecret;
TEMPLATE_CODE = templateCode;
SIGN_NAME = signName;
}
}
創(chuàng)建測試類 UtilsTests,測試配置信息是否能正常獲取
@SpringBootTest
@RunWith(SpringRunner.class)
public class UtilsTests {
@Test
public void testProperties(){
System.out.println(SmsProperties.KEY_ID);
System.out.println(SmsProperties.KEY_SECRET);
System.out.println(SmsProperties.REGION_Id);
}
}
3、發(fā)送短信
接口:創(chuàng)建 SmsService
public interface SmsService {
void send(String mobile, String templateCode, Map<String,Object> param);
}
實(shí)現(xiàn):創(chuàng)建?SmsServiceImpl
@Service
@Slf4j
public class SmsServiceImpl implements SmsService {
@Override
public void send(String mobile, String templateCode, Map<String,Object> param) {
//創(chuàng)建遠(yuǎn)程連接客戶端對象
DefaultProfile profile = DefaultProfile.getProfile(
SmsProperties.REGION_Id,
SmsProperties.KEY_ID,
SmsProperties.KEY_SECRET);
IAcsClient client = new DefaultAcsClient(profile);
//創(chuàng)建遠(yuǎn)程連接的請求參數(shù)
CommonRequest request = new CommonRequest();
request.setSysMethod(MethodType.POST);
request.setSysDomain("dysmsapi.aliyuncs.com");
request.setSysVersion("2017-05-25");
request.setSysAction("SendSms");
request.putQueryParameter("RegionId", SmsProperties.REGION_Id);
request.putQueryParameter("PhoneNumbers", mobile);
request.putQueryParameter("SignName", SmsProperties.SIGN_NAME);
request.putQueryParameter("TemplateCode", templateCode);
Gson gson = new Gson();
String json = gson.toJson(param);
request.putQueryParameter("TemplateParam", json);
try {
//使用客戶端對象攜帶請求對象發(fā)送請求并得到響應(yīng)結(jié)果
CommonResponse response = client.getCommonResponse(request);
boolean success = response.getHttpResponse().isSuccess();
//ALIYUN_RESPONSE_FAIL(-501, "阿里云響應(yīng)失敗"),
Assert.isTrue(success, ResponseEnum.ALIYUN_RESPONSE_FAIL);
String data = response.getData();
HashMap<String, String> resultMap = gson.fromJson(data, HashMap.class);
String code = resultMap.get("Code");
String message = resultMap.get("Message");
log.info("阿里云短信發(fā)送響應(yīng)結(jié)果:");
log.info("code:" + code);
log.info("message:" + message);
//ALIYUN_SMS_LIMIT_CONTROL_ERROR(-502, "短信發(fā)送過于頻繁"),//業(yè)務(wù)限流
Assert.notEquals("isv.BUSINESS_LIMIT_CONTROL", code, ResponseEnum.ALIYUN_SMS_LIMIT_CONTROL_ERROR);
//ALIYUN_SMS_ERROR(-503, "短信發(fā)送失敗"),//其他失敗
Assert.equals("OK", code, ResponseEnum.ALIYUN_SMS_ERROR);
} catch (ServerException e) {
log.error("阿里云短信發(fā)送SDK調(diào)用失敗:");
log.error("ErrorCode=" + e.getErrCode());
log.error("ErrorMessage=" + e.getErrMsg());
throw new BusinessException(ResponseEnum.ALIYUN_SMS_ERROR , e);
} catch (ClientException e) {
log.error("阿里云短信發(fā)送SDK調(diào)用失?。?);
log.error("ErrorCode=" + e.getErrCode());
log.error("ErrorMessage=" + e.getErrMsg());
throw new BusinessException(ResponseEnum.ALIYUN_SMS_ERROR , e);
}
}
}
guigu-common中創(chuàng)建util包,引入工具類:
RandomUtils.java:生成四位或六位的驗(yàn)證碼
RegexValidateUtils.java:常用正則表達(dá)式驗(yàn)證,這里提供了手機(jī)號碼驗(yàn)證文章來源:http://www.zghlxwxcb.cn/news/detail-413913.html
創(chuàng)建controller.api包,創(chuàng)建類ApiSmsController文章來源地址http://www.zghlxwxcb.cn/news/detail-413913.html
@RestController
@RequestMapping("/api/sms")
@Api(tags = "短信管理")
@CrossOrigin //跨域
@Slf4j
public class ApiSmsController {
@Resource
private SmsService smsService;
@Resource
private RedisTemplate redisTemplate;
@ApiOperation("獲取驗(yàn)證碼")
@GetMapping("/send/{mobile}")
public R send(
@ApiParam(value = "手機(jī)號", required = true)
@PathVariable String mobile){
//MOBILE_NULL_ERROR(-202, "手機(jī)號不能為空"),
Assert.notEmpty(mobile, ResponseEnum.MOBILE_NULL_ERROR);
//MOBILE_ERROR(-203, "手機(jī)號不正確"),
Assert.isTrue(RegexValidateUtils.checkCellphone(mobile), ResponseEnum.MOBILE_ERROR);
//生成驗(yàn)證碼
String code = RandomUtils.getFourBitRandom();
//組裝短信模板參數(shù)
Map<String,Object> param = new HashMap<>();
param.put("code", code);
//發(fā)送短信
smsService.send(mobile, SmsProperties.TEMPLATE_CODE, param);
//將驗(yàn)證碼存入redis
redisTemplate.opsForValue().set("srb:sms:code:" + mobile, code, 5, TimeUnit.MINUTES);
return R.ok().message("短信發(fā)送成功");
}
}
到了這里,關(guān)于尚融寶15-集成阿里云短信服務(wù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!