JAVA應用第三方平台發送短信驗證碼。。本站提示廣大學習愛好者:(JAVA應用第三方平台發送短信驗證碼。)文章只能為提供參考,不一定能成為您想要的結果。以下是JAVA應用第三方平台發送短信驗證碼。正文
前段時間自己做的一個小項目中,觸及到用短信驗證碼登錄、注冊的問題,之前沒觸及過這一塊,看了他人的博客其實也是似懂非懂的,如今就將自己做的應用第三方短信平台來發送驗證碼這個功用記上去。
本文以注冊為例,在SpringMVC+Spring+Mybatis框架的根底上完成該短信驗證碼功用。
發送短信驗證碼的原理是:隨機生成一個6位數字,將該6位數字保管到session當中,客戶端經過sessionid判別對應的session,用戶輸出的驗證碼再與session記載的驗證碼停止比擬。
為了避免有廣告嫌疑這裡就不說短信平台是哪個了。
普通的第三方短信平台都會有他們自己的短信接口,只需讀懂他們的接口稍作稍作改動就能滿足自己的需求。
首先將短信平台接口代碼列出:這裡要下載三個jar包commons-logging-1.1.1.jar,commons-httpclient-3.1.jar,commons-codec-1.4.jar
import java.io.UnsupportedEncodingException; import org.apache.commons.httpclient.Header; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.NameValuePair; import org.apache.commons.httpclient.methods.PostMethod; public class SendMsg_webchinese { public static void main(String[] args)throws Exception { HttpClient client = new HttpClient(); PostMethod post = new PostMethod("http://gbk.sms.webchinese.cn"); //該第三方短服氣務地址 post.addRequestHeader("Content-Type","application/x-www-form-urlencoded;charset=gbk");//在頭文件中設置轉碼 NameValuePair[] data ={ new NameValuePair("Uid", "本站用戶名"),new NameValuePair("Key", "接口平安秘鑰"),new NameValuePair("smsMob","手機號碼"),new NameValuePair("smsText","驗證碼:8888")}; post.setRequestBody(data); client.executeMethod(post); Header[] headers = post.getResponseHeaders(); int statusCode = post.getStatusCode(); System.out.println("statusCode:"+statusCode); for(Header h : headers) { System.out.println(h.toString()); } String result = new String(post.getResponseBodyAsString().getBytes("gbk")); System.out.println(result); //打印前往音訊形態 post.releaseConnection(); } }
不好看出,我們想要發送的信息是在這行代碼外面:NameValuePair[] data ={ new NameValuePair("Uid", "本站用戶名"),new NameValuePair("Key", "接口平安秘鑰"),new NameValuePair("smsMob","手機號碼"),new NameValuePair("smsText","驗證碼:8888")};
該接口中還有一個result信息,它的作用是通知用戶短信發送的形態,1表示發送成功,其他的小於0的為失敗,這裡只需知道1是成功即可。
我們實踐的操作中,驗證碼一定是要我們自己生成的。將result信息與驗證碼一同失掉,於是很容易想到用一個HashMap集合。上面是以項目自己的需求對接口的更改:
import java.util.HashMap; import org.apache.commons.httpclient.Header; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.NameValuePair; import org.apache.commons.httpclient.methods.PostMethod; import com.yuetile.utils.VerifyingCodeGenerator; public class SendMsg_webchineseController { public static HashMap<String,String> getMessageStatus(String phone)throws Exception{ HashMap<String,String> m=new HashMap<String,String>(); HttpClient client = new HttpClient(); PostMethod post = new PostMethod("http://gbk.sms.webchinese.cn"); post.addRequestHeader("Content-Type","application/x-www-form-urlencoded;charset=gbk");//在頭文件中設置轉碼 String code=VerifyingCodeGenerator.generate();//驗證碼 NameValuePair[] data ={ new NameValuePair("Uid", "****"),new NameValuePair("Key", "******"),new NameValuePair("smsMob",phone),new NameValuePair("smsText","您正在注冊本站會員,本次驗證碼為:"+code+""+"無效時間為5分鐘")}; m.put("code", code); post.setRequestBody(data); client.executeMethod(post); Header[] headers = post.getResponseHeaders(); int statusCode = post.getStatusCode(); System.out.println("statusCode:"+statusCode); for(Header h : headers) { System.out.println(h.toString()); } String result = new String(post.getResponseBodyAsString().getBytes("gbk")); System.out.println(result); //打印前往音訊形態 m.put("result", result); post.releaseConnection(); return m; } }
***表示的是在第三方平台注冊的賬號密碼。
ACTION層:
/** * @author hang * @Decription 注冊,發送短信驗證碼,保管到Session中 * @param 封裝客戶端懇求 POST * @return 前往形態參數 * @throws Exception */ @ResponseBody @RequestMapping(value = UrlDefine.Register.CHECKMESSAGEWORK, method = RequestMethod.POST) public Object SendCheckMessage(HttpServletRequest request, @RequestBody UserBean u) throws Exception { String message = "發送成功"; String phone=u.getTelephone(); //獲取到客戶端發來的手機號 UserBean user = userService.getByPhone(phone); if (user != null) { message = "該手機號已被注冊"; return new Response(Status.ERROR, message); } else { HashMap<String, String> m = SendMsg_webchineseController.getMessageStatus(phone); //使用發送短信接口 String result = m.get("result"); //獲取到result值 if (result.trim().equals("1")) { //假如為1,表示成功發送 String code = m.get("code"); //獲取發送的驗證碼內容 logger.info("發送的驗證碼:"+code); //打印日志 HttpSession session = request.getSession(); //設置session session.setAttribute("code", code); //將短信驗證碼放到session中保管 session.setMaxInactiveInterval(60 * 5);//保管時間 暫時設定為5分鐘 return new Response(Status.SUCCESS, message); } else { message = "短信發送失敗"; return new Response(Status.ERROR, message); } } }
這樣就能發送成功了。
測試:
應用POSTMAN在本地停止測試:
後果:
到此發送成功。