簡訊驗證筆記(狂神說)
阿新 • • 發佈:2021-10-16
1. 瞭解阿里雲使用者許可權操作
狂神說視訊 :https://space.bilibili.com/95256449/channel/detail?cid=146244
筆記來源:https://blog.csdn.net/weixin_44449838/article/details/109325198
需要通過個人賬戶獲得 授權碼(id、密碼),再通過這些資訊獲得服務
阿里雲網址 : https://www.aliyun.com/
- 登入 / 註冊 阿里雲
- 點選 AccessKey 管理
- 建立一個使用者
- 為新建的使用者新增許可權
2. 開通阿里雲簡訊服務
- 進入簡訊服務後臺
- 瞭解計費規則
3. 新增簡訊模板
- 看到每條簡訊是需要簡訊費用的,所以如果需要使用該功能,需要充點錢備用。
4. 添加簽名
這可太煩了啊
5. 編寫測試程式碼
- 可以檢視 API Demo ,修改即可
- 新建一個 Spring-boot 專案 sms-verification
- 引入依賴
<!--aliyun--> <dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-core</artifactId> <version>4.5.3</version> </dependency> <!--fastjson--> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.73</version> </dependency> <!--redis--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
- 編寫一個測試類,就把剛剛的 API Demo 複製過來進行修改
// 注意這裡所有的包都是 aliyuncs 包下的 @Test void contextLoads() { // 這裡的 AccessKey ID 、 Secret就是 阿里雲使用者對於的值,複製過來即可 DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "<accessKeyId>", "<accessSecret>"); IAcsClient client = new DefaultAcsClient(profile); // 構建請求 CommonRequest request = new CommonRequest(); request.setSysMethod(MethodType.POST); request.setSysDomain("dysmsapi.aliyuncs.com"); request.setSysVersion("2017-05-25"); request.setSysAction("SendSms"); // 上面不需要改 // 自定義引數 : // 手機號,這裡 Value 就填使用者的手機號,實際應用須要從表單獲取 request.putQueryParameter("PhoneNumbers", "138XXXXXXXX"); // 簽名,這裡的 Value 就是在阿里雲上申請的 簽名 request.putQueryParameter("SignName", "XXXX"); // 模板,這裡的 Value 就是在阿里雲上申請的模板的 模版CODE 值 request.putQueryParameter("TemplateCode", "XXXX"); // 驗證碼,真實應用需要自動構建驗證碼 HashMap<String, Object> map = new HashMap<>(); map.put("code", 112233); request.putQueryParameter("TemplateParam", JSONObject.toJSONString(map)); try { CommonResponse response = client.getCommonResponse(request); System.out.println(response.getData()); } catch (ServerException e) { e.printStackTrace(); } catch (ClientException e) { e.printStackTrace(); } }
- 最後就可以得到簡訊了
-
注意:
如果上面自定義的引數名寫錯,不會成功
如果 模板、簽名 沒有通過稽核會報錯
6. 模板
-
新建幾個資料夾
-
編寫介面 SendSmsService
public interface SendSmsService {
/**
* 用於傳送簡訊
* @param phoneNumber :手機號
* @param templateCode :模板編號
* @param code :驗證碼
* @return 是否傳送成功
*/
public boolean send(String phoneNumber, String templateCode, Map<String, Object> code);
}
- 編寫實現類 SendSmsServiceImpl
public class SendSmsServiceImpl implements SendSmsService {
@Override
public boolean send(String phoneNumber, String templateCode, Map<String, Object> code) {
DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "<accessKeyId>", "<accessSecret>");
IAcsClient client = new DefaultAcsClient(profile);
// 構建請求
CommonRequest request = new CommonRequest();
request.setSysMethod(MethodType.POST);
request.setSysDomain("dysmsapi.aliyuncs.com");
request.setSysVersion("2017-05-25");
request.setSysAction("SendSms");
// 上面不需要改
// 自定義引數 :
// 手機號,這裡 Value 就填使用者的手機號,實際應用須要從表單獲取
request.putQueryParameter("PhoneNumbers", phoneNumber);
// 簽名,這裡的 Value 就是在阿里雲上申請的 簽名
request.putQueryParameter("SignName", "XXXX");
// 模板,這裡的 Value 就是在阿里雲上申請的模板的 模版CODE 值
request.putQueryParameter("TemplateCode", templateCode);
// 驗證碼,真實應用需要自動構建驗證碼
request.putQueryParameter("TemplateParam", JSONObject.toJSONString(code));
try {
CommonResponse response = client.getCommonResponse(request);
System.out.println(response.getData());
// 自帶的判斷是否成功的方法
return response.getHttpResponse().isSuccess();
} catch (ServerException e) {
e.printStackTrace();
} catch (ClientException e) {
e.printStackTrace();
}
return false;
}
}
- 編寫配置檔案,連線 Redis :application.yml
server:
port: 8088
# 配置 Redis
spring:
redis:
host: 192.168.142.120
port: 6379
password: 123456
- 編寫呼叫介面
@RestController
@CrossOrigin // 跨域的支援
public class SmsApiController {
@Autowired
private SendSmsService sendSmsService;
@Autowired
private RedisTemplate redisTemplate;
@GetMapping("send/{phone}")
public String sendSms(@PathVariable("phone") String phoneNumber){
// 呼叫傳送發放(模擬真實業務,整合 Redis)
// 判斷當前手機號是否儲存在 Redis 中
// 如果沒有則傳送簡訊
// 如果有表示上一個驗證碼還未過期,不用傳送
String code = (String) redisTemplate.opsForValue().get(phoneNumber);
if (!StringUtils.isEmpty(code)){
return "[手機號: "+phoneNumber + "],[驗證碼: " + code +"],還未過期";
}
// 生成驗證碼
code = UUID.randomUUID().toString().substring(0,6);
HashMap<String, Object> map = new HashMap<>();
map.put("code",code);
sendSmsService.send(phoneNumber,"XXXX",map);
// 如果傳送成功,就放入 Redis
if (isSend){
redisTemplate.opsForValue().set(phoneNumber,code,5, TimeUnit.MINUTES);
return "[手機號: "+phoneNumber + "],[驗證碼: " + code +"],傳送成功";
}else {
return "[手機號: "+phoneNumber + "],[驗證碼: " + code +"],傳送失敗";
}
}
}