標籤:傳送簡訊 驗證碼 httpclient 簡訊平台
這幾天老大讓我弄一個傳送簡訊驗證碼的功能,使用的是信易通的簡訊平台介面,然後在Java中使用HttpClient類比POST請求或者GET請求(看簡訊平台要求,一般的情況下都是POST請求),調用簡訊平台提供的介面(遵循簡訊平台的介面規範即可)。具體看代碼:
使用HttpClient的時候需要在項目中引入:
commons-httpclient-3.1.jar
這個jar包,
項目結構:
1、建立一個Http的類比請求工具類,然後寫一個POST方法或者GET方法
/** * 檔案說明 * @Description:擴充說明 * @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請求 * 方法說明 * @Discription:擴充說明 * @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) { //構造HttpClient的執行個體 HttpClient httpClient = new HttpClient(); //建立POST方法的執行個體 PostMethod postMethod = new PostMethod(url); //佈建要求頭資訊 postMethod.setRequestHeader("Connection", "close"); //添加參數 for (Map.Entry<String, String> entry : params.entrySet()) { postMethod.addParameter(entry.getKey(), entry.getValue()); } //使用系統提供的預設的恢複策略,佈建要求重試處理,用的是預設的重試處理:請求三次 httpClient.getParams().setBooleanParameter("http.protocol.expect-continue", false); //接收處理結果 String result = null; try { //執行Http Post請求 httpClient.executeMethod(postMethod); //返回處理結果 result = postMethod.getResponseBodyAsString(); } catch (HttpException e) { // 發生致命的異常,可能是協議不對或者返回的內容有問題 System.out.println("請檢查輸入的URL!"); e.printStackTrace(); } catch (IOException e) { // 發生網路異常 System.out.println("發生網路異常!"); e.printStackTrace(); } finally { //釋放連結 postMethod.releaseConnection(); //關閉HttpClient執行個體 if (httpClient != null) { ((SimpleHttpConnectionManager) httpClient.getHttpConnectionManager()).shutdown(); httpClient = null; } } return result; } /** * HttpClient 類比GET請求 * 方法說明 * @Discription:擴充說明 * @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) { //構造HttpClient執行個體 HttpClient client = new HttpClient(); //拼接參數 String paramStr = ""; for (String key : params.keySet()) { paramStr = paramStr + "&" + key + "=" + params.get(key); } paramStr = paramStr.substring(1); //建立GET方法的執行個體 GetMethod method = new GetMethod(url + "?" + paramStr); //接收返回結果 String result = null; try { //執行HTTP GET方法請求 client.executeMethod(method); //返回處理結果 result = method.getResponseBodyAsString(); } catch (HttpException e) { // 發生致命的異常,可能是協議不對或者返回的內容有問題 System.out.println("請檢查輸入的URL!"); e.printStackTrace(); } catch (IOException e) { // 發生網路異常 System.out.println("發生網路異常!"); e.printStackTrace(); } finally { //釋放連結 method.releaseConnection(); //關閉HttpClient執行個體 if (client != null) { ((SimpleHttpConnectionManager) client.getHttpConnectionManager()).shutdown(); client = null; } } return result; }}
2、在建立一個類,產生驗證碼,然後傳遞相應的參數(不同的簡訊平台介面會有不同的參數要求,這個一般簡訊平台提供的介面文檔中都會有的,直接看文檔然後按要求來即可)
/** * 檔案說明 * @Description:擴充說明 * @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 { /** * 傳送簡訊訊息 * 方法說明 * @Discription:擴充說明 * @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", "使用者帳號"); params.put("mm", "使用者密碼"); params.put("dxlbid", "簡訊類別編號"); params.put("extno", "擴充編號"); //手機號碼,多個號碼使用英文逗號進行分割 params.put("hm", phones); //將簡訊內容進行URLEncoder編碼 params.put("nr", URLEncoder.encode(content)); return HttpRequestUtil.getRequest(url, params); } /** * 隨機產生6位隨機驗證碼 * 方法說明 * @Discription:擴充說明 * @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(){ //驗證碼 String vcode = ""; for (int i = 0; i < 6; i++) { vcode = vcode + (int)(Math.random() * 9); } return vcode; } /** * 測試 * 方法說明 * @Discription:擴充說明 * @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", "尊敬的使用者,您的驗證碼為" + SendMsgUtil.createRandomVcode() + ",有效期間為60秒,如有疑慮請詳詢400-069-2886(客服電話)【XXX中心】")); }}
然後執行一下,一般的情況下參數傳遞正確,按照介面文檔的規範來操作的話,都會發送成功的,手機都能收到驗證碼的,然後可能會出現的問題就是:發送的簡訊內容有可能會出現中文亂碼,然後就會發送不成功,按照簡訊平台的要求進行相應的編碼即可。一般都會是UTF-8編碼。
完整代碼已上傳至csdn:
http://download.csdn.net/my
Java實現傳送簡訊驗證驗證碼功能