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隨機(jī)生成手機(jī)短信驗(yàn)證碼的方法
- java實(shí)現(xiàn)短信驗(yàn)證碼5分鐘有效時(shí)間
- java實(shí)現(xiàn)發(fā)送短信驗(yàn)證碼
- 基于JAVA的短信驗(yàn)證碼api調(diào)用代碼實(shí)例
- java短信驗(yàn)證碼獲取次數(shù)限制實(shí)例
- 基于Java隨機(jī)生成手機(jī)短信驗(yàn)證碼的實(shí)例代碼
- Java開(kāi)發(fā)完整短信驗(yàn)證碼功能的全過(guò)程
- Java 防止短信驗(yàn)證碼接口被盜刷問(wèn)題解決
相關(guān)文章
MyBatis-Plus分頁(yè)時(shí)排序的實(shí)現(xiàn)方法
這篇文章主要介紹了MyBatis-Plus分頁(yè)時(shí)的排序,分頁(yè)時(shí)排序的方法,后端OrderItems排序、Wrapper排序前端指定排序,文章結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-03-03
Java Character類對(duì)單個(gè)字符操作原理解析
這篇文章主要介紹了Java Character類對(duì)單個(gè)字符操作原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03
MyBatis多表關(guān)聯(lián)查詢的實(shí)現(xiàn)示例
本文主要介紹了MyBatis多表關(guān)聯(lián)查詢的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03
Java設(shè)計(jì)模式之命令模式_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
命令模式就是對(duì)命令的封裝,下文中給大家介紹了命令模式類圖中的基本結(jié)構(gòu),對(duì)java設(shè)計(jì)模式之命令模式相關(guān)知識(shí)感興趣的朋友一起看看吧2017-08-08
Java中的動(dòng)態(tài)代理實(shí)現(xiàn)代碼實(shí)例
這篇文章主要介紹了Java中的動(dòng)態(tài)代理實(shí)現(xiàn)代碼實(shí)例,jdk動(dòng)態(tài)代理本質(zhì)上是使用被代理對(duì)象的類加載器,通過(guò)被代理類實(shí)現(xiàn)的接口在運(yùn)行時(shí)動(dòng)態(tài)構(gòu)造出代理類來(lái)增強(qiáng)原始類的功能的方法,需要的朋友可以參考下2023-12-12
Java通過(guò)Timer與TimerTask實(shí)現(xiàn)定時(shí)任務(wù)調(diào)度方式
本文介紹了如何在Java中使用`Timer`和`TimerTask`類來(lái)實(shí)現(xiàn)定時(shí)任務(wù)調(diào)度,`Timer`類用于創(chuàng)建計(jì)時(shí)器并安排任務(wù),而`TimerTask`類用于定義具體的任務(wù),文章詳細(xì)介紹了這兩個(gè)類的方法和使用示例,包括創(chuàng)建任務(wù)、安排任務(wù)、取消任務(wù)等操作,通過(guò)一個(gè)簡(jiǎn)單的例子2024-12-12
如何從Java環(huán)境中調(diào)用GoLang函數(shù)
Go,常被稱為GoLang,Go語(yǔ)言憑借其豐富的標(biāo)準(zhǔn)庫(kù),以及 goroutines和 channels等獨(dú)特特性,在開(kāi)發(fā)可擴(kuò)展且高效的程序方面展現(xiàn)了顯著優(yōu)勢(shì),許多開(kāi)發(fā)者傾向于將Go與其他編程語(yǔ)言結(jié)合使用,在本文中,我們將深入探討如何從Java環(huán)境中調(diào)用GoLang函數(shù),以實(shí)現(xiàn)兩種語(yǔ)言的無(wú)縫集成2025-01-01
SpringBoot項(xiàng)目的配置文件中設(shè)置server.port不生效問(wèn)題
這篇文章主要介紹了SpringBoot項(xiàng)目的配置文件中設(shè)置server.port不生效問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11

