簡訊驗證碼登入流程思路及詳細步驟
Part1業務流程
1. 構造手機驗證碼:使用random物件生成要求的隨機數作為驗證碼,例如4位驗證碼:1000~9999之間隨機數;2. 使用介面向簡訊平臺傳送手機號和驗證碼資料,然後簡訊平臺再把驗證碼傳送到制定手機號上,介面引數一般包括:目標手機號,隨機驗證碼(或包含失效時間),平臺介面地址,平臺口令;3. 儲存介面返回的資訊(一般為json文字資料,然後需轉換為json物件格式);4. 將手機號--驗證碼、操作時間存入Session中,作為後面驗證使用;5. 接收使用者填寫的驗證碼及其他資料;6. 對比提交的驗證碼與Session中的驗證碼是否一致,同時判斷提交動作是否在有效期內;7. 驗證碼正確且在有效期內,請求通過,處理相應的業務。
Part2首先新增一個jar包
工具類會用到
<!--秒滴雲的jar包-->
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.11</version>
</dependency>
Part3編寫簡單的簡訊驗證功能
我這裡只是編寫一個簡單的簡訊驗證功能,要是用其他的語音驗證。。。。等等需要去秒滴雲官方下載文件,下面是編寫的一個config文件,專門存放一些引數
Part4編寫http請求工具類
publicclassHttpUtil
{
/**
* 構造通用引數timestamp、sig和respDataType
*
* @return
*/
publicstaticStringcreateCommonParam()
{
// 時間戳
SimpleDateFormat sdf =newSimpleDateFormat("yyyyMMddHHmmss");
Stringtimestamp = sdf.format(newDate());
// 簽名
Stringsig = DigestUtils.md5Hex(Config.ACCOUNT_SID + Config.AUTH_TOKEN + timestamp);
return"×tamp="+ timestamp +"&sig="+ sig +"&respDataType="+ Config.RESP_DATA_TYPE;
}
/**
* post請求
*
* @param url
* 功能和操作
* @param body
* 要post的資料
* @return
* @throws IOException
*/
publicstaticStringpost(Stringurl,Stringbody)
{
System.out.println("url:"+ System.lineSeparator() + url);
System.out.println("body:"+ System.lineSeparator() + body);
Stringresult ="";
try
{
OutputStreamWriter out =null;
BufferedReaderin=null;
URL realUrl =newURL(url);
URLConnection conn = realUrl.openConnection();
// 設定連線引數
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setConnectTimeout(5000);
conn.setReadTimeout(20000);
conn.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
// 提交資料
out =newOutputStreamWriter(conn.getOutputStream(),"UTF-8");
out.write(body);
out.flush();
// 讀取返回資料
in=newBufferedReader(newInputStreamReader(conn.getInputStream(),"UTF-8"));
Stringline ="";
booleanfirstLine =true;// 讀第一行不加換行符
while((line =in.readLine()) !=null)
{
if(firstLine)
{
firstLine =false;
}else
{
result += System.lineSeparator();
}
result += line;
}
}catch(Exception e)
{
e.printStackTrace();
}
returnresult;
}
/**
* 回撥測試工具方法
*
* @param url
* @param reqStr
* @return
*/
publicstaticStringpostHuiDiao(Stringurl,Stringbody)
{
Stringresult ="";
try
{
OutputStreamWriter out =null;
BufferedReaderin=null;
URL realUrl =newURL(url);
URLConnection conn = realUrl.openConnection();
// 設定連線引數
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setConnectTimeout(5000);
conn.setReadTimeout(20000);
// 提交資料
out =newOutputStreamWriter(conn.getOutputStream(),"UTF-8");
out.write(body);
out.flush();
// 讀取返回資料
in=newBufferedReader(newInputStreamReader(conn.getInputStream(),"UTF-8"));
Stringline ="";
booleanfirstLine =true;// 讀第一行不加換行符
while((line =in.readLine()) !=null)
{
if(firstLine)
{
firstLine =false;
}else
{
result += System.lineSeparator();
}
result += line;
}
}catch(Exception e)
{
e.printStackTrace();
}
returnresult;
}
}
Part5生成四位數的方法
publicstaticStringrunNumber() {
Stringstr="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
StringBuilder sb=newStringBuilder(4);
for(int i=0;i<4;i++)
{
char ch=str.charAt(newRandom().nextInt(str.length()));
sb.append(ch);
}
System.out.println(sb.toString());
Stringcode = sb.toString();
returncode;
}
4、執行方法execute(),便會發送成功
publicclassIndustrySMS
{
privatestaticStringoperation ="/industrySMS/sendSMS";
privatestaticStringaccountSid = Config.ACCOUNT_SID;
privatestaticStringto ="15342349382";
privatestaticStringsmsContent ="【小陶科技】登入驗證碼:{"+runNumber().toString()+"},如非本人操作,請忽略此簡訊。";
/**
* 驗證碼通知簡訊
*/
publicstaticvoidexecute()
{
StringtmpSmsContent =null;
try{
tmpSmsContent = URLEncoder.encode(smsContent,"UTF-8");
}catch(Exception e){
}
Stringurl = Config.BASE_URL + operation;
Stringbody ="accountSid="+ accountSid +"&to="+ to +"&smsContent="+ tmpSmsContent
+ HttpUtil.createCommonParam();
// 提交請求
Stringresult = HttpUtil.post(url, body);
System.out.println("result:"+ System.lineSeparator() + result);
}