天天看點

Java實作發送短信驗證碼功能

最近用學習了一下調用第三方接口發送短信驗證碼的程式,希望能夠幫助到大家。

1.首先下圖為項目的目錄結構,需要帶入三個包:

commons-httpclient-3.1.jar

commons-logging-1.0.4.jar

codec-1.3.jar

Java實作發送短信驗證碼功能
Java實作發送短信驗證碼功能

2.其次要建立模拟POST、GET請求的工具類:

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;


public class HttpRequestUtil {
	/**
	 * HttpClient 模拟POST請求
	 * @param url
	 * @param params
	 * @return
	 */
    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
     */
    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;
    }
}
           

3.建立發送短信的方法,其中要通過短信内容要進行設定編碼集為utf-8,調用第三方接口傳參要按照第三方文檔規範:

package com.demo.util;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;


public class SendMsgUtil {
	/**
     * 發送短信消息
      * 方法說明
      * @Discription:擴充說明
      * @param phones
      * @param content
      * @return
      * @return String
     */
    @SuppressWarnings("deprecation")
    public static String sendMsg(String phones,String content) {
			try {
				content = java.net.URLEncoder.encode(content,"utf-8");
				System.out.println(content);
			} catch (UnsupportedEncodingException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
        //短信接口URL送出位址
        String url = "https://api.dingdongcloud.com/v1/sms/sendyzm?apikey=b46c4961aa875f626b7924aace0d53f7&mobile="+phones+"&content="+content;

        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
     */
    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
     */
    public static void main(String[] args) {
//      System.out.println(SendMsgUtil.createRandomVcode());
//      System.out.println("&ecb=12".substring(1));
        System.out.println(sendMsg("18201150549", "【簽名】尊敬的使用者,您的驗證碼為" + SendMsgUtil.createRandomVcode() + ",請在10分鐘内輸入。請勿告訴其他人!"));
    }
}
           

4.調用main方法可以進行測試,如果控台太輸出傳回狀态值不是200,可以參考第三方發短信的文檔傳回參數說明。