阿里雲簡訊
阿新 • • 發佈:2019-01-08
阿里雲簡訊服務官方指導教程:https://help.aliyun.com/document_detail/59210.html?spm=a2c4g.11174283.4.1.n6Pa55
步驟:
1、註冊阿里雲賬號通過實名認證
2、開通簡訊服務(開通免費)
開通後可在控制檯簡訊服務欄中檢視
3、建立Access Key,獲取Access Key ID 和 Access Key Secret(具體看阿里雲官方教程)
Access Key用於在程式中呼叫阿里雲的服務API,個人理解相當於賬號密碼,用於認證個人資訊的(程式中會用到)。可以建立多個Access Key,但Access Key具體內容只能在建立初期檢視,之後是無法檢視的,因此需要及時下載到本地。
4、建立簡訊簽名和簡訊模板
簡訊簽名一般用於標記公司名或者是具體的業務,它會以下的形式出現在簡訊中:
[簡訊簽名] 簡訊內容....
簡訊模板描述了簡訊的具體內容,可以提供變數來替代具體的資料,程式中會以JSON的形式向簡訊模板提供變數。
注意:簡訊簽名和簡訊模板建立後都需要通過稽核,稽核一般在幾個小時內就能完成。
簡訊模板中的"模板CODE"在程式中會被使用到,通過模板CODE來明確使用哪一個模板。
5、Maven專案中引入阿里雲簡訊服務依賴
pom.xml
<!--簡訊sdk start--> <dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-core</artifactId> <version>3.7.1</version> </dependency> <dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-dysmsapi</artifactId> <version>1.1.0</version> </dependency> <!--簡訊sdk end-->
smsUtil
/**
* 阿里雲簡訊工具類
*/
public class SmsUtils {
// 產品名稱:雲通訊簡訊API產品,開發者無需替換
static final String product = "Dysmsapi";
// 產品域名,開發者無需替換
static final String domain = "dysmsapi.aliyuncs.com";
// TODO 此處需要替換成開發者自己的AK(在阿里雲訪問控制檯尋找)
static final String accessKeyId = "**********"; // TODO 改這裡
static final String accessKeySecret = "**************"; // TODO 改這裡
public static SendSmsResponse sendSms(String telephone, String code) throws ClientException {
// 可自助調整超時時間
System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
System.setProperty("sun.net.client.defaultReadTimeout", "10000");
// 初始化acsClient,暫不支援region化
IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret);
DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);
IAcsClient acsClient = new DefaultAcsClient(profile);
// 組裝請求物件-具體描述見控制檯-文件部分內容
SendSmsRequest request = new SendSmsRequest();
// 必填:待發送手機號
request.setPhoneNumbers(telephone);
// 必填:簡訊簽名-可在簡訊控制檯中找到
request.setSignName("**"); // TODO 改這裡
// 必填:簡訊模板-可在簡訊控制檯中找到
request.setTemplateCode("*****"); // TODO 改這裡
// 可選:模板中的變數替換JSON串,如模板內容為"親愛的使用者,您的驗證碼為${code}"時,此處的值為
request.setTemplateParam("{\"code\":\"" + code + "\"}");
// 選填-上行簡訊擴充套件碼(無特殊需求使用者請忽略此欄位)
// request.setSmsUpExtendCode("90997");
// 可選:outId為提供給業務方擴充套件欄位,最終在簡訊回執訊息中將此值帶回給呼叫者
//request.setOutId("yourOutId");
// hint 此處可能會丟擲異常,注意catch
SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);
if(sendSmsResponse.getCode()!= null && sendSmsResponse.getCode().equals("OK")){
System.out.println("簡訊傳送成功!");
}else {
System.out.println("簡訊傳送失敗!");
}
return sendSmsResponse;
}
}
sendCode
@Component
public class SendCode {
@Resource(name = "redisDaoImpl")
private RedisDao redisDaoImpl;
private static SendCode sendCode;
@PostConstruct
public void init() {
sendCode = this;
sendCode.redisDaoImpl = this.redisDaoImpl;
}
/**
*傳送驗證碼
*@param keyPre 生成驗證碼存入redis 的key字首 ,PHONE 生成redis 的key字尾 , des 操作的描述資訊(如登入,註冊)
*
*/
public static ResBean sendCode(String keyPre,String PHONE,String des) throws ClientException {
ResBean resultBean = new ResBean();
//3.傳送驗證碼步驟,(1)先判斷是否已經發送過驗證碼,傳送過一分鐘不能重複傳送,過了一分鐘後才傳送(2)如果沒有傳送過驗證碼,則傳送驗證碼
int random = Tools.getRandomNum();//生成6為隨機驗證碼
String code = Integer.toString(random);//將驗證碼轉成字串
long curtime = System.currentTimeMillis(); //獲取當前時間戳,用於下面比較獲取時間是否在一分鐘內
String lastSmsTime_Code = Long.toString(curtime)+"_"+code; //將當前時間和驗證碼拼接成字串,儲存到redis的key中
String curkey = keyPre+PHONE;//生成redis的key:keyPre+PHONE(使用者名稱)
//先判斷redis的key為"keyPre_"+USERNAME(使用者名稱)是否存在
if(sendCode.redisDaoImpl.hasKey(curkey)){
//取出上次傳送驗證碼的時間戳
long lastSmsTime = Long.parseLong(sendCode.redisDaoImpl.get(curkey).substring(0,sendCode.redisDaoImpl.get(curkey).length()-7));
//當前時間與上次傳送驗證碼的時間戳之差
long differSecond = (curtime- lastSmsTime)/1000;
//判斷時間差小於60,則不能傳送
if(differSecond<60){
//一分鐘之內不能重複傳送
resultBean.setCode(1020);
resultBean.setMsg("請於1分鐘後傳送");
resultBean.setData(60-differSecond);//返回倒計時秒數
}else{
//獲取驗證碼成功
resultBean.setCode(1);
resultBean.setMsg("驗證碼已傳送,請注意查收!");
//resultBean.setData(code);
//String content = "【聚盟】您"+des+"的驗證碼是:"+code;
//SMSUtils.sendSms(PHONE,content);
SmsUtils.sendSms(PHONE,code);
sendCode.redisDaoImpl.eidt(curkey,lastSmsTime_Code);
sendCode.redisDaoImpl.setKeyTime(curkey, 1800);
}
}else{
//獲取驗證碼成功
resultBean.setCode(1);
resultBean.setMsg("驗證碼已傳送,請注意查收!");
//resultBean.setData(code);
//String content = "【易生健康】您"+des+"的驗證碼是:"+code;
//SMSUtils.sendSms(PHONE,content);
SmsUtils.sendSms(PHONE,code);
sendCode.redisDaoImpl.addString(curkey,lastSmsTime_Code);
sendCode.redisDaoImpl.setKeyTime(curkey, 1800);
}
return resultBean;
}
public static boolean identifyingCode(String key,String vCode){
//判斷key值存在,進入下一步,比較驗證碼是否存在
if(sendCode.redisDaoImpl.hasKey(key)){
//取出redis存的驗證碼(生成規則,檢視登入傳送驗證碼介面)
String code =sendCode.redisDaoImpl.get(key).substring(sendCode.redisDaoImpl.get(key).length()-6);
//判斷前臺傳來的驗證碼與redis 的是否一致,一致返回資訊,不一致返回請輸入正確的驗證碼
if(code.equals(vCode)){
return true;
}else{
return false;
}
}
else {
return false;
}
}
}