短信驗證碼跟本身在Servlet畫的驗證碼不同,咱們不用管短信驗證碼是怎麼產生的,咱們只須要關注如何調用短信驗證碼,在短信驗證碼裏面添加java
本身須要的隨機數或者其餘的內容。ajax
如今直接上流程api
第一步找一個給用戶發送短信的短信平臺,我這裏用的秒滴科技的短信平臺,新人註冊有10元的免費額度,一條短信幾分,夠咱們測試用了。app
第二步 找到配置管理裏面的驗證碼短信模板本身寫好申請過了就能夠備用了。以下圖所示
dom
第三步 在右上角有個API文檔點進去,左邊有個開發者中心,裏面有個Https API 點開裏面有個驗證碼通知短信,這個是這個短信平臺接口的規則,必需要知足平臺接口的要求的參數異步
還有下面的必選參數以下圖截圖,必選的參數待會再後臺都必選要有否則會報錯。ide
第四步 進入Eelipse寫咱們的後臺代碼 。直接上代碼個人方法是在Dao層裏面寫的,本身定義了一個SmsDao短信驗證碼的持久接口。測試
package www.meizu.com.dao.impl; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Random; import www.meizu.com.dao.SmsDao; /** * 生產短信驗證碼持久接口實現類 * @author Administrator * */ public class SmsDaoImpl implements SmsDao{ //這裏的3個String 屬性對應的用戶中內心的開發者信息裏面的ACCOUNT SID 和 AUTHTOKEN 還有驗證碼通知短信接口中的請求地址這3個屬性待會須要用到 private String sendUrl="https://api.miaodiyun.com/20150822/industrySMS/sendSMS"; private String ACCOUNTSID="d85da4485e094a5296c2d401f459d487"; private String AUTHTOKEN="e225e0ef637046bc8eb72818923a808c";
而後咱們開始知足平臺的必要的參數。固然咱們從最簡單的參數開始知足,我首先知足的時間戳這個參數,方法很簡單如如下代碼ui
/** * 獲取時間戳,生產短信驗證碼須要時間戳 * @return */ public static String getTimeStamp(){ return new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()); }
而後在知足短信簽名,平臺要求須要MD5加密,32位小寫加密
/** * 短信簽名,生產短信驗證碼須要簽名 * 簽名。MD5(ACCOUNT SID + AUTH TOKEN + timestamp)共32位(小寫)。 * @param sdk 開發者帳號 * @param token 開發者密碼 * @param timeStamp 時間戳 * @return */ public static String getMD5(String sdk,String token,String timeStamp){ StringBuilder sb=new StringBuilder(); String source=sdk+token+timeStamp; try { MessageDigest md=MessageDigest.getInstance("MD5"); byte[] b=md.digest(source.getBytes()); for (byte c : b) { String hex=Integer.toHexString(c&0xff); if(hex.length()==1){ sb.append("0"+hex); }else{ sb.append(hex); } } } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } return sb.toString();
而後是請求參數拼接,註釋的模板是API文檔上的模板複製API文檔上的就能夠了,每一個人的請求參數模板好像都不同
/** * 請求參數拼接 * @param accounSid * @param smsContent * @param to * @param timestamp * @param sig * @param respDataType * @return 返回拼接好的參數 */ public static String pinJie(String accounSid,String smsContent,String to,String timestamp,String sig,String respDataType){ //accountSid=a14f6bfd43ce44c9b019de57f4e2de4b&smsContent=【秒嘀科技 to】您的驗證碼是345678,30分鐘輸入有效。 //&to=13896543210×tamp=20150821100312&sig=a14f6bfd43ue44c9b019du57f4e2ee4r&respDataType=JSON return "accountSid="+accounSid+"&smsContent="+smsContent+"&to="+to+"×tamp="+timestamp+"&sig="+sig+"&respDataType="+respDataType; }
而後生成短信驗證碼裏面的數字
/** * 生成短信驗證碼 * @return 返回驗證碼 */ public static String smsCode(){ String code=new Random().nextInt(1000000)+""; if(code.length()!=6){ return smsCode();//不夠6位,再次調用本身的方法,遞歸 }else{ return code; } }
接下來往平臺發送咱們參數
@Override public String getSmsCode(String phone) { String smsCode=smsCode();//獲取隨機短信驗證碼 code=smsCode; String timeStamp=getTimeStamp();//獲取時間戳 String md5=getMD5(ACCOUNTSID,AUTHTOKEN,timeStamp);//獲取簽名 String smsMoban="【j37】尊敬的用戶,您的驗證碼爲"+smsCode; StringBuilder sb=new StringBuilder(); try { URL url=new URL(sendUrl);//導net的包 HttpURLConnection connection=(HttpURLConnection) url.openConnection(); connection.setRequestMethod("POST");//設置傳送數據的方式 connection.setDoInput(true);//設置是否容許數據寫入 connection.setDoOutput(true);//設置是否容許數據輸出 connection.setConnectTimeout(5000);//設置鏈接時間 connection.setReadTimeout(10000);//設置讀取參數的時間 connection.setRequestProperty("Content-type","application/x-www-form-urlencoded");//設置請求頭 String args=pinJie(ACCOUNTSID,smsMoban,phone,timeStamp,md5,"JSON"); System.out.println(args); osw=new OutputStreamWriter(connection.getOutputStream(),"UTF-8"); osw.write(args); osw.flush(); //讀取返回參數 br=new BufferedReader(new InputStreamReader(connection.getInputStream(),"UTF-8")); String temp=""; while((temp=br.readLine())!=null){ sb.append(temp); } } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return sb.toString();
代碼比較分散這裏上一個完整的方法代碼
package www.meizu.com.dao.impl; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Random; import www.meizu.com.dao.SmsDao; /** * 生產短信驗證碼持久接口實現類 * @author Administrator * */ public class SmsDaoImpl implements SmsDao{ //這裏的3個String 屬性對應的用戶中內心的開發者信息裏面的ACCOUNT SID 和 AUTHTOKEN 還有驗證碼通知短信接口中的請求地址這3個屬性待會須要用到 private String sendUrl="https://api.miaodiyun.com/20150822/industrySMS/sendSMS"; private String ACCOUNTSID="d85da4485e094a5296c2d401f459d487"; private String AUTHTOKEN="e225e0ef637046bc8eb72818923a808c"; OutputStreamWriter osw=null; BufferedReader br=null; private String code=""; /** * 獲取6位數驗證碼的方法 * @return */ public String getCode(){ return code; } @Override public String getSmsCode(String phone) { String smsCode=smsCode();//獲取隨機短信驗證碼 code=smsCode; String timeStamp=getTimeStamp();//獲取時間戳 String md5=getMD5(ACCOUNTSID,AUTHTOKEN,timeStamp);//獲取簽名 String smsMoban="【j37】尊敬的用戶,您的驗證碼爲"+smsCode; StringBuilder sb=new StringBuilder(); try { URL url=new URL(sendUrl);//導net的包 HttpURLConnection connection=(HttpURLConnection) url.openConnection(); connection.setRequestMethod("POST");//設置傳送數據的方式 connection.setDoInput(true);//設置是否容許數據寫入 connection.setDoOutput(true);//設置是否容許數據輸出 connection.setConnectTimeout(5000);//設置鏈接時間 connection.setReadTimeout(10000);//設置讀取參數的時間 connection.setRequestProperty("Content-type","application/x-www-form-urlencoded");//設置請求頭 String args=pinJie(ACCOUNTSID,smsMoban,phone,timeStamp,md5,"JSON"); System.out.println(args); osw=new OutputStreamWriter(connection.getOutputStream(),"UTF-8"); osw.write(args); osw.flush(); //讀取返回參數 br=new BufferedReader(new InputStreamReader(connection.getInputStream(),"UTF-8")); String temp=""; while((temp=br.readLine())!=null){ sb.append(temp); } } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return sb.toString(); } /** * 獲取時間戳,生產短信驗證碼須要時間戳 * @return */ public static String getTimeStamp(){ return new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()); } /** * 短信簽名,生產短信驗證碼須要簽名 * 簽名。MD5(ACCOUNT SID + AUTH TOKEN + timestamp)共32位(小寫)。 * @param sdk 開發者帳號 * @param token 開發者密碼 * @param timeStamp 時間戳 * @return */ public static String getMD5(String sdk,String token,String timeStamp){ StringBuilder sb=new StringBuilder(); String source=sdk+token+timeStamp; try { MessageDigest md=MessageDigest.getInstance("MD5"); byte[] b=md.digest(source.getBytes()); for (byte c : b) { String hex=Integer.toHexString(c&0xff); if(hex.length()==1){ sb.append("0"+hex); }else{ sb.append(hex); } } } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } return sb.toString(); } /** * 生成短信驗證碼 * @return 返回驗證碼 */ public static String smsCode(){ String code=new Random().nextInt(1000000)+""; if(code.length()!=6){ return smsCode();//不夠6位,再次調用本身的方法,遞歸 }else{ return code; } } /** * 請求參數拼接 * @param accounSid * @param smsContent * @param to * @param timestamp * @param sig * @param respDataType * @return 返回拼接好的參數 */ public static String pinJie(String accounSid,String smsContent,String to,String timestamp,String sig,String respDataType){ //accountSid=a14f6bfd43ce44c9b019de57f4e2de4b&smsContent=【秒嘀科技 to】您的驗證碼是345678,30分鐘輸入有效。 //&to=13896543210×tamp=20150821100312&sig=a14f6bfd43ue44c9b019du57f4e2ee4r&respDataType=JSON return "accountSid="+accounSid+"&smsContent="+smsContent+"&to="+to+"×tamp="+timestamp+"&sig="+sig+"&respDataType="+respDataType; } }
短信驗證碼的方法就寫完了,前臺點擊經過ajax異步請求發送給後臺,後臺產生結果發送給平臺。流程就完了。