我們經常會有註冊手機號填驗證碼的需求,現在我們就通過阿里雲短信業務來實現
一 準備
1. 創建用戶組和用戶
- 我們登錄到阿里雲,先預先充值一些錢,測試的話充1塊差不多了,因爲短信不是免費的,計價如下:
- 進入控制檯,hover頭像選擇accesskey管理,進入到如下頁面,選擇右邊的選項
- 點擊用戶組管理,點擊創建用戶組,信息隨便填,我之前已經創建過了
- 創建完後點擊進入用戶組,選擇權限管理,
- 添加sms管理權限
- 點擊用戶管理,創建用戶,創建好後立即保存彈出key和secret
- 創建完後進入,加入到剛創建的用戶組,就自動繼承了權限,要記住權限管理裏accesskey
2. 開通短信服務,配置短信模板和簽名
- 搜索進入短信服務頁,選擇同意開通
- 選擇國內消息的簽名管理
點擊【簽名管理】 ,進入到如下編輯頁,選擇驗證碼,則下面都不需要填,簽名和申請說明要正式
點擊模板管理的【添加模板】 ,進入到如下頁,模板名稱最好正式一點,不要亂填,模板內容使用其示例即可,申請說明要正當,不然無法審覈通過,如網站註冊驗證碼測試使用。
審覈都通過,就成功做好準備,可以進行開發了。
二 官方示例測試SMS
1. 先新建一個springboot項目
2. 導入依賴,sms短信服務所需的sdk,fastjson和redis(因爲短信驗證碼過幾分鐘會刷新)
<!--導入sms依賴-->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.5.1</version>
</dependency>
<!--導入fastjson-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.61</version>
</dependency>
<!--導入redis依賴-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
3. 測試使用,在test里加入如下官方示例:
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");
request.putQueryParameter("RegionId", "cn-hangzhou");
try {
CommonResponse response = client.getCommonResponse(request);
System.out.println(response.getData());
} catch (ServerException e) {
e.printStackTrace();
} catch (ClientException e) {
e.printStackTrace();
}
其中accessKeyId和accessSecret換成自己的。
4. 我們需要添加自定義的一些參數,如發送的手機號、簽名、模板和驗證碼,爲了方便,驗證碼先寫死,在request.setSysAction下添加
//自定義參數
request.putQueryParameter("PhoneNumbers", "填手機號");
request.putQueryParameter("SignName","填剛審覈通過的簽名");
request.putQueryParameter("TemplateCode","填審覈通過的模板code");
//構建短信驗證碼
Map<String,Object> map = new HashMap<>();
map.put("code",1212);
request.putQueryParameter("TemplateParam", JSONObject.toJSONString(map));
5. 運行測試,即可受到短信(第一條)
三 自己寫一個發送驗證碼服務
1. 新建service,有send方法,參數分別爲手機號,簽名,短信模板code和驗證碼
package com.example.demo.service;
import org.springframework.stereotype.Service;
import java.util.Map;
@Service
public interface SendSmsService {
public boolean send(String phoneNumber,String signName, String templateCode, Map<String,Object> code);
}
2. 寫service的實現類,寫法參照官方示例,我們返回值時boolean來表示發送成功還是失敗
package com.example.demo.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.example.demo.service.SendSmsService;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.Map;
@Service
public class SendSmsServiceImpl implements SendSmsService {
@Override
public boolean send(String phoneNumber, String signName, String templateCode, Map<String, Object> code) {
//連接阿里雲
DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "LTAI4GABjAibZprzH3n5hEnw", "u86tmFbCLdfyYTLtesuLAPTkFXBjxT");
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");
//自定義參數
request.putQueryParameter("PhoneNumbers", phoneNumber);
request.putQueryParameter("SignName",signName);
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;
}
}
3. 寫一個controller控制層來控制,將隨機生成的驗證碼緩存到redis中,並設置5分鐘失效
package com.example.demo.controller;
import com.example.demo.service.SendSmsService;
import org.apache.commons.codec.binary.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
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.Map;
import java.util.UUID;
import java.util.concurrent.TimeUnit;
@RestController
@CrossOrigin
public class SmsController {
@Autowired
private SendSmsService sendSmsService;
@Autowired
private RedisTemplate<String,String> redisTemplate;
@GetMapping("/send/{phone}")
public String sendCode(@PathVariable("phone") String phone){
String code = redisTemplate.opsForValue().get(phone);
if(code!=null&&!code.equals("")){
return "驗證碼還可使用";
}
code = UUID.randomUUID().toString().substring(0,4);
//構建短信驗證碼
Map<String,Object> map = new HashMap<>();
map.put("code",code);
boolean isSend = sendSmsService.send("手機號","簽名","模板code",map);
if(isSend){
redisTemplate.opsForValue().set(phone,code,5, TimeUnit.MINUTES);
return "接受到驗證碼:"+code;
}
return "發送失敗";
}
}
4. 訪問這個地址,就能收到驗證碼了。