SpringBoot 發(fā)送短信驗(yàn)證碼
阿里云賬戶要有一點(diǎn)錢
1.創(chuàng)建用戶信息
1.申請(qǐng)一個(gè)阿里云的賬號(hào)
2. 打開(kāi)控制臺(tái) ,點(diǎn)擊個(gè)人頭像,找到AccessKey 管理,點(diǎn)擊打開(kāi)
3.點(diǎn)擊進(jìn)入之后會(huì)看到這個(gè),一定要保管好這個(gè)accesskey 不要泄露,選擇使用子用戶的

4.新建一個(gè)用戶組

點(diǎn)擊創(chuàng)建用戶組,然后根據(jù)提示填寫(xiě)即可

創(chuàng)建完成之后點(diǎn)擊新建的用戶組進(jìn)去

5. 給用戶組添加權(quán)限
找到權(quán)限管理,添加權(quán)限

輸入SMS點(diǎn)擊管理短信服務(wù),跳到有邊,點(diǎn)擊確定即可
6.創(chuàng)建用戶


根據(jù)提示填寫(xiě)就可以
編程訪問(wèn)一定要勾選上,因?yàn)槲覀兪峭ㄟ^(guò)代碼操作的
點(diǎn)擊確定即可
創(chuàng)建用戶之后點(diǎn)擊進(jìn)入會(huì)看到這個(gè)用戶的所有信息

這里的accesskeyid accessSecret 一定要妥善保管,因?yàn)橐坏﹦?chuàng)建了用戶之后就看不到密碼了,如果泄露,要即使禁用或者刪除
然后點(diǎn)擊加入的組,將剛才創(chuàng)建好的用戶組添加進(jìn)去即可
該子用戶會(huì)繼承用戶組的權(quán)限
2. 開(kāi)通短信服務(wù)
1. 在控制臺(tái)首頁(yè)直接搜索短信服務(wù) 即可 ,點(diǎn)擊進(jìn)入
2.第一次進(jìn)入他會(huì)讓開(kāi)通短信服務(wù),直接同意開(kāi)通即可,可以自己查看計(jì)費(fèi)規(guī)則及其他的信息
3.添加短信的模板


根據(jù)提示填寫(xiě)就可以,一定不要亂寫(xiě),填寫(xiě)正當(dāng)理由,審核未通過(guò)接著審核就行
${code}這個(gè)一定要有,不要修改他,要通過(guò)這個(gè)將驗(yàn)證碼的變量傳進(jìn)去
4. 添加簽名

第一次進(jìn)去的時(shí)候驗(yàn)證碼是可以選用的,選用驗(yàn)證碼就行,因?yàn)槲疑暾?qǐng)過(guò)了,所以不能在選擇了
一定要等審核通過(guò)了才可以使用
5. 找到幫助文檔 打開(kāi)找到SDK參考選擇java的,正常公司的開(kāi)發(fā)都是使用SDK方式的,這里也是使用這個(gè)方式
這個(gè)幫助文檔有api參考,可以自行了解

進(jìn)入官方的demo中
3.代碼階段
pom.xml 在pom.xml中導(dǎo)入以下依賴
<!--導(dǎo)入依賴sms 發(fā)送短信的核心依賴-->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.5.3</version>
</dependency>
<!--FastJson 對(duì)于數(shù)據(jù)的處理的依賴-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.73</version>
</dependency>
<!--redis 因?yàn)槎绦膨?yàn)證碼都是幾分鐘后無(wú)法使用,所以放在redis中-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<version>2.3.2.RELEASE</version>
</dependency>
先測(cè)試一下能不能使用,直接將官方的demo代碼復(fù)制放到測(cè)試類中測(cè)試一下
/**
* <accessKeyId> 你自己的 accessKeyId 相當(dāng)于賬號(hào)
* accessSecret 在創(chuàng)建用戶時(shí)的 accessSecret 相當(dāng)于密碼
*/
@Test
void contextLoads() {
DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "<accessKeyId>", "<accessSecret>");
IAcsClient client = new DefaultAcsClient(profile);
//構(gòu)建請(qǐng)求
CommonRequest request = new CommonRequest();
request.setSysMethod(MethodType.POST);
request.setSysDomain("dysmsapi.aliyuncs.com");//不能改 改了就會(huì)報(bào)錯(cuò)
request.setSysVersion("2017-05-25");//不能改 改了就會(huì)報(bào)錯(cuò)
request.setSysAction("SendSms");//一般也不會(huì)該改
//自定義的參數(shù)(手機(jī)號(hào),驗(yàn)證碼,模板,簽名)
//參數(shù)名稱不要亂寫(xiě)
//手機(jī)號(hào)
request.putQueryParameter("PhoneNumbers", "接受短信的手機(jī)號(hào)");
//簽名名稱
request.putQueryParameter("SignName", "剛才定義好的簽名名稱");
//模板code
request.putQueryParameter("TemplateCode", "自定義短信模板的模板CODE編碼");
//構(gòu)建一個(gè)短信驗(yàn)證碼
Map<String,Object> map = new HashMap<>();
map.put("code","1234");
//將定義好的驗(yàn)證碼放入進(jìn)去
//短信驗(yàn)證碼
request.putQueryParameter("TemplateParam", JSONObject.toJSONString(map));
try {
CommonResponse response = client.getCommonResponse(request);
//控制臺(tái)打印返回的信息
System.out.println(response.getData());
} catch (ServerException e) {
e.printStackTrace();
} catch (ClientException e) {
e.printStackTrace();
}
}
在導(dǎo)包的時(shí)候一定不要導(dǎo)錯(cuò)了,導(dǎo)阿里云的,有些包是重名的
測(cè)試發(fā)送短信
{"Message":"OK","RequestId":"D12E6D53-3A2B-4342-87CE-8B78C9A5A8FC","BizId":"174403396982142436^0","Code":"OK"}
在控制臺(tái)看到這句話就證明短信發(fā)送成功了
是不是已經(jīng)收到短信了!
發(fā)送短信的正式代碼
controller
package com.mango.controller;
import com.mango.Service.SendSmsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.UUID;
import java.util.concurrent.TimeUnit;
/**
* @Author:
* @Date: 2020/8/9 22:11
* @CrossOrigin//跨域支持
*/
@RestController
@CrossOrigin
public class SendSmsApiController {
@Autowired
private SendSmsService sendSmsService;
/**
* 使用redis的模板
*/
@Autowired
private RedisTemplate<String,String> redisTemplate;
@GetMapping("/send/{phone}")
public String sendSms(@PathVariable("phone")String phone){
//調(diào)用發(fā)送短信的方法(使用redis)
//獲取redis中的手機(jī)號(hào)
String code = redisTemplate.opsForValue().get(phone);
//判斷當(dāng)前的code的不為空
if(!StringUtils.isEmpty(code)){
return phone+":"+code +"已存在,還沒(méi)有過(guò)期";
}
//否則就是沒(méi)有驗(yàn)證碼,生成驗(yàn)證碼并且存儲(chǔ)到redis中,設(shè)置他的過(guò)期時(shí)間
//生成隨機(jī)驗(yàn)證碼
code = UUID.randomUUID().toString().substring(0, 4);
HashMap<String, Object> map = new HashMap<>();
map.put("code",code);
//發(fā)送短信
boolean isSend = sendSmsService.sendSms(phone, "自定義短信模板的模板CODE編碼", map);
if(isSend){
//如果短信發(fā)送成功就放入到redis中,設(shè)置5分鐘之后過(guò)期
redisTemplate.opsForValue().set(phone,code,5, TimeUnit.MINUTES);
return phone+":"+code +"發(fā)送成功";
}else {
return "發(fā)送成功";
}
}
}
service
package com.mango.Service;
import java.util.Map;
/**
* @Author:
* @Date: 2020/8/9 22:12
*/
public interface SendSmsService {
/**
* @param phoneNum 發(fā)送的手機(jī)號(hào)
* @param TemplateCode 短信模板的code
* @param code 驗(yàn)證碼
* @return
*/
public boolean sendSms(String phoneNum, String TemplateCode , Map<String,Object> code);
}
servcieImpl
package com.mango.Service.impl;
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.mango.Service.SendSmsService;
import org.springframework.stereotype.Service;
import java.util.Map;
/**
* @Author:
* @Date: 2020/8/9 22:12
*/
@Service
public class SendSmsImpl implements SendSmsService {
/**
* @param phoneNum 發(fā)送的手機(jī)號(hào)
* @param TemplateCode 短信模板的code
* @param code 驗(yàn)證碼
* @return
*/
@Override
public boolean sendSms(String phoneNum, String TemplateCode, Map<String, Object> code) {
DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "<accessKeyId>", "<accessSecret>");
IAcsClient client = new DefaultAcsClient(profile);
//構(gòu)建請(qǐng)求
CommonRequest request = new CommonRequest();
//不要改
request.setSysMethod(MethodType.POST);
//不能改 改了就會(huì)報(bào)錯(cuò)
request.setSysDomain("dysmsapi.aliyuncs.com");
//不能改 改了就會(huì)報(bào)錯(cuò)
request.setSysVersion("2017-05-25");
//一般也不會(huì)該改
request.setSysAction("SendSms");
//自定義的參數(shù)(手機(jī)號(hào),驗(yàn)證碼,模板,簽名)
//參數(shù)名稱不要亂寫(xiě)
//手機(jī)號(hào)
request.putQueryParameter("PhoneNumbers", phoneNum);
//簽名名稱
request.putQueryParameter("SignName", "剛才定義好的簽名名稱");
//模板code
request.putQueryParameter("TemplateCode", TemplateCode);
//短信驗(yàn)證碼
request.putQueryParameter("TemplateParam", JSONObject.toJSONString(code));
try {
CommonResponse response = client.getCommonResponse(request);
//這個(gè)是他自帶的判斷他發(fā)送的是否成功,成功就直接返回
return response.getHttpResponse().isSuccess();
} catch (ServerException e) {
e.printStackTrace();
} catch (ClientException e) {
e.printStackTrace();
}
return false;
}
}
application.yml
server:
port: 8090
# redis 我這里使用的是本地的redis
spring:
redis:
host: 127.0.0.1
port: 6379
現(xiàn)在看下是不是已經(jīng)發(fā)送成功了!