前段時間自己做的一個小項目中,涉及到用簡訊驗證碼登入、註冊的問題,之前沒涉及過這一塊,看了別人的部落格其實也是似懂非懂的,現在就將自己做的利用第三方簡訊平台來發送驗證碼這個功能記下來。
本文以註冊為例,在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(); //設定sessionsession.setAttribute("code", code); //將簡訊驗證碼放到session中儲存session.setMaxInactiveInterval(60 * 5);//儲存時間 暫時設定為5分鐘return new Response(Status.SUCCESS, message);} else {message = "簡訊發送失敗";return new Response(Status.ERROR, message);}}}
這樣就能發送成功了。
測試:
利用POSTMAN在本地進行測試:
結果:
到此發送成功。
以上就是本文的全部內容,希望本文的內容對大家的學習或者工作能帶來一定的協助,同時也希望多多支援雲棲社區!