Java實(shí)現(xiàn)發(fā)送短信驗(yàn)證碼功能
一個(gè)發(fā)送短信驗(yàn)證碼的功能,使用的是信易通的短信平臺(tái)接口,然后在Java中使用HttpClient模擬POST請(qǐng)求或者GET請(qǐng)求(看短信平臺(tái)要求,一般的情況下都是POST請(qǐng)求),調(diào)用短信平臺(tái)提供的接口(遵循短信平臺(tái)的接口規(guī)范即可)。具體看代碼:
使用HttpClient的時(shí)候需要在項(xiàng)目中引入:
commons-httpclient-3.1.jar
這個(gè)jar包,
項(xiàng)目結(jié)構(gòu):
1、創(chuàng)建一個(gè)Http的模擬請(qǐng)求工具類,然后寫一個(gè)POST方法或者GET方法
/** * 文件說(shuō)明 * @Description:擴(kuò)展說(shuō)明 * @Copyright: 2015 dreamtech.com.cn Inc. All right reserved * @Version: V6.0 */ package com.demo.util; import java.io.IOException; import java.util.Map; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.HttpException; import org.apache.commons.httpclient.SimpleHttpConnectionManager; import org.apache.commons.httpclient.methods.GetMethod; import org.apache.commons.httpclient.methods.PostMethod; /** * @Author: feizi * @Date: 2015年4月17日 上午9:26:34 * @ModifyUser: feizi * @ModifyDate: 2015年4月17日 上午9:26:34 * @Version:V6.0 */ public class HttpRequestUtil { /** * HttpClient 模擬POST請(qǐng)求 * 方法說(shuō)明 * @Discription:擴(kuò)展說(shuō)明 * @param url * @param params * @return String * @Author: feizi * @Date: 2015年4月17日 下午7:15:59 * @ModifyUser:feizi * @ModifyDate: 2015年4月17日 下午7:15:59 */ public static String postRequest(String url, Map<String, String> params) { //構(gòu)造HttpClient的實(shí)例 HttpClient httpClient = new HttpClient(); //創(chuàng)建POST方法的實(shí)例 PostMethod postMethod = new PostMethod(url); //設(shè)置請(qǐng)求頭信息 postMethod.setRequestHeader("Connection", "close"); //添加參數(shù) for (Map.Entry<String, String> entry : params.entrySet()) { postMethod.addParameter(entry.getKey(), entry.getValue()); } //使用系統(tǒng)提供的默認(rèn)的恢復(fù)策略,設(shè)置請(qǐng)求重試處理,用的是默認(rèn)的重試處理:請(qǐng)求三次 httpClient.getParams().setBooleanParameter("http.protocol.expect-continue", false); //接收處理結(jié)果 String result = null; try { //執(zhí)行Http Post請(qǐng)求 httpClient.executeMethod(postMethod); //返回處理結(jié)果 result = postMethod.getResponseBodyAsString(); } catch (HttpException e) { // 發(fā)生致命的異常,可能是協(xié)議不對(duì)或者返回的內(nèi)容有問(wèn)題 System.out.println("請(qǐng)檢查輸入的URL!"); e.printStackTrace(); } catch (IOException e) { // 發(fā)生網(wǎng)絡(luò)異常 System.out.println("發(fā)生網(wǎng)絡(luò)異常!"); e.printStackTrace(); } finally { //釋放鏈接 postMethod.releaseConnection(); //關(guān)閉HttpClient實(shí)例 if (httpClient != null) { ((SimpleHttpConnectionManager) httpClient.getHttpConnectionManager()).shutdown(); httpClient = null; } } return result; } /** * HttpClient 模擬GET請(qǐng)求 * 方法說(shuō)明 * @Discription:擴(kuò)展說(shuō)明 * @param url * @param params * @return String * @Author: feizi * @Date: 2015年4月17日 下午7:15:28 * @ModifyUser:feizi * @ModifyDate: 2015年4月17日 下午7:15:28 */ public static String getRequest(String url, Map<String, String> params) { //構(gòu)造HttpClient實(shí)例 HttpClient client = new HttpClient(); //拼接參數(shù) String paramStr = ""; for (String key : params.keySet()) { paramStr = paramStr + "&" + key + "=" + params.get(key); } paramStr = paramStr.substring(1); //創(chuàng)建GET方法的實(shí)例 GetMethod method = new GetMethod(url + "?" + paramStr); //接收返回結(jié)果 String result = null; try { //執(zhí)行HTTP GET方法請(qǐng)求 client.executeMethod(method); //返回處理結(jié)果 result = method.getResponseBodyAsString(); } catch (HttpException e) { // 發(fā)生致命的異常,可能是協(xié)議不對(duì)或者返回的內(nèi)容有問(wèn)題 System.out.println("請(qǐng)檢查輸入的URL!"); e.printStackTrace(); } catch (IOException e) { // 發(fā)生網(wǎng)絡(luò)異常 System.out.println("發(fā)生網(wǎng)絡(luò)異常!"); e.printStackTrace(); } finally { //釋放鏈接 method.releaseConnection(); //關(guān)閉HttpClient實(shí)例 if (client != null) { ((SimpleHttpConnectionManager) client.getHttpConnectionManager()).shutdown(); client = null; } } return result; } }
2、在創(chuàng)建一個(gè)類,生成驗(yàn)證碼,然后傳遞相應(yīng)的參數(shù)(不同的短信平臺(tái)接口會(huì)有不同的參數(shù)要求,這個(gè)一般短信平臺(tái)提供的接口文檔中都會(huì)有的,直接看文檔然后按要求來(lái)即可)
/** * 文件說(shuō)明 * @Description:擴(kuò)展說(shuō)明 * @Copyright: 2015 dreamtech.com.cn Inc. All right reserved * @Version: V6.0 */ package com.demo.util; import java.net.URLEncoder; import java.util.HashMap; import java.util.Map; /** * @Author: feizi * @Date: 2015年4月17日 上午9:24:48 * @ModifyUser: feizi * @ModifyDate: 2015年4月17日 上午9:24:48 * @Version:V6.0 */ public class SendMsgUtil { /** * 發(fā)送短信消息 * 方法說(shuō)明 * @Discription:擴(kuò)展說(shuō)明 * @param phones * @param content * @return * @return String * @Author: feizi * @Date: 2015年4月17日 下午7:18:08 * @ModifyUser:feizi * @ModifyDate: 2015年4月17日 下午7:18:08 */ @SuppressWarnings("deprecation") public static String sendMsg(String phones,String content){ //短信接口URL提交地址 String url = "短信接口URL提交地址"; Map<String, String> params = new HashMap<String, String>(); params.put("zh", "用戶賬號(hào)"); params.put("mm", "用戶密碼"); params.put("dxlbid", "短信類別編號(hào)"); params.put("extno", "擴(kuò)展編號(hào)"); //手機(jī)號(hào)碼,多個(gè)號(hào)碼使用英文逗號(hào)進(jìn)行分割 params.put("hm", phones); //將短信內(nèi)容進(jìn)行URLEncoder編碼 params.put("nr", URLEncoder.encode(content)); return HttpRequestUtil.getRequest(url, params); } /** * 隨機(jī)生成6位隨機(jī)驗(yàn)證碼 * 方法說(shuō)明 * @Discription:擴(kuò)展說(shuō)明 * @return * @return String * @Author: feizi * @Date: 2015年4月17日 下午7:19:02 * @ModifyUser:feizi * @ModifyDate: 2015年4月17日 下午7:19:02 */ public static String createRandomVcode(){ //驗(yàn)證碼 String vcode = ""; for (int i = 0; i < 6; i++) { vcode = vcode + (int)(Math.random() * 9); } return vcode; } /** * 測(cè)試 * 方法說(shuō)明 * @Discription:擴(kuò)展說(shuō)明 * @param args * @return void * @Author: feizi * @Date: 2015年4月17日 下午7:26:36 * @ModifyUser:feizi * @ModifyDate: 2015年4月17日 下午7:26:36 */ public static void main(String[] args) { // System.out.println(SendMsgUtil.createRandomVcode()); // System.out.println("&ecb=12".substring(1)); System.out.println(sendMsg("18123456789,15123456789", "尊敬的用戶,您的驗(yàn)證碼為" + SendMsgUtil.createRandomVcode() + ",有效期為60秒,如有疑慮請(qǐng)?jiān)斣?00-069-2886(客服電話)【XXX中心】")); } }
然后執(zhí)行一下,一般的情況下參數(shù)傳遞正確,按照接口文檔的規(guī)范來(lái)操作的話,都會(huì)發(fā)送成功的,手機(jī)都能收到驗(yàn)證碼的,然后可能會(huì)出現(xiàn)的問(wèn)題就是:發(fā)送的短信內(nèi)容有可能會(huì)出現(xiàn)中文亂碼,然后就會(huì)發(fā)送不成功,按照短信平臺(tái)的要求進(jìn)行相應(yīng)的編碼即可。一般都會(huì)是UTF-8編碼。
完整代碼:sendmassage
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- JAVA實(shí)現(xiàn)利用第三方平臺(tái)發(fā)送短信驗(yàn)證碼
- Java實(shí)現(xiàn)短信驗(yàn)證碼和國(guó)際短信群發(fā)功能的示例
- java短信驗(yàn)證碼獲取次數(shù)限制實(shí)例
- Java實(shí)現(xiàn)短信發(fā)送驗(yàn)證碼功能
- java實(shí)現(xiàn)發(fā)送短信驗(yàn)證碼
- Java開(kāi)發(fā)完整短信驗(yàn)證碼功能的全過(guò)程
- Java實(shí)現(xiàn)用戶短信驗(yàn)證碼登錄功能實(shí)例代碼
- Java實(shí)現(xiàn)短信驗(yàn)證碼服務(wù)的完整代碼示例
相關(guān)文章
對(duì)SpringBoot項(xiàng)目Jar包進(jìn)行加密防止反編譯
最近項(xiàng)目要求部署到其他公司的服務(wù)器上,但是又不想將源碼泄露出去,要求對(duì)正式環(huán)境的啟動(dòng)包進(jìn)行安全性處理,防止客戶直接通過(guò)反編譯工具將代碼反編譯出來(lái),本文介紹了如何對(duì)SpringBoot項(xiàng)目Jar包進(jìn)行加密防止反編譯,需要的朋友可以參考下2023-10-10Java Thread多線程開(kāi)發(fā)中Object類詳細(xì)講解
這篇文章主要介紹了Java Thread多線程開(kāi)發(fā)中Object類,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2023-03-03SpringBoot+Websocket實(shí)現(xiàn)一個(gè)簡(jiǎn)單的網(wǎng)頁(yè)聊天功能代碼
本篇文章主要介紹了SpringBoot+Websocket實(shí)現(xiàn)一個(gè)簡(jiǎn)單的網(wǎng)頁(yè)聊天功能代碼,具有一定的參考價(jià)值,有需要的可以了解一下2017-08-08Springboot集成Kafka實(shí)現(xiàn)producer和consumer的示例代碼
這篇文章主要介紹了Springboot集成Kafka實(shí)現(xiàn)producer和consumer的示例代碼,詳細(xì)的介紹了什么是Kafka和安裝Kafka以及在springboot項(xiàng)目中集成kafka收發(fā)message,感興趣的小伙伴們可以參考一下2018-05-05Java讀取網(wǎng)絡(luò)文件的實(shí)例代碼
這篇文章主要介紹了Java讀取網(wǎng)絡(luò)文件的實(shí)例代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07SpringBoot生成jar/war包的布局應(yīng)用
在 Spring Boot 中,"布局應(yīng)用"(Application Layout)指的是打包生成的可執(zhí)行 jar 或 war 文件中的內(nèi)容組織結(jié)構(gòu),本文給大家介紹了SpringBoot生成jar/war包的布局應(yīng)用,需要的朋友可以參考下2024-02-02使用logback實(shí)現(xiàn)日志打印過(guò)濾
這篇文章主要介紹了使用logback實(shí)現(xiàn)日志打印過(guò)濾的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07