java實現手機簡訊驗證全過程

程式設計師歐陽思海發表於2018-06-16

手機簡訊驗證現在在各種系統可以說都是用的非常普遍的,這個可能是方便和安全性的考慮,所以才廣泛的使用,這篇文章就以一個簡訊介面的例項,來講解一下怎麼使用簡訊介面。

一、前期工作

首先,我們需要選定一家簡訊介面的公司,然後去註冊和獲取一系列的ID等,然後就可以正式的建立我們的簡訊業務了。下面以某個簡訊介面為例講解。

1.1、註冊

http://www.miaodiyun.com/index.html(對於用哪個平臺的看個人,這個只是例項)

1.2、獲取到ACCOUNT SID和AUTH TOKEN

這裡寫圖片描述

1.3、建立簡訊模板

這裡寫圖片描述

如上圖,點選配置管理,然後進入到簡訊模板,再點選新建模板,建立好你的簡訊模板

下面給出我的模板作為參考。

這裡寫圖片描述

注意:上面建立的簡訊模板的資訊,需要在程式碼中用到,並且一定需要保持一致,否則,會出現異常。

例如,上面的簡訊模板的資訊應為:“【歐陽科技】登入驗證碼:{1},如非本人操作,請忽略此簡訊。”,{1}為佔位符,是你的簡訊驗證碼。

好了,有了這些準備之後,就可以開始發簡訊了。

二、具體程式碼

config.java: 這個類主要是一些常亮引數的配置資訊。

這裡我們需要修改我們註冊時獲取到的ACCOUNT SIDAUTH TOKEN


/**
 * 系統常量
 */
public class Config
{
	/**
	 * url前半部分
	 */
	public static final String BASE_URL = "https://api.miaodiyun.com/20150822";

	/**
	 * 開發者註冊後系統自動生成的賬號,可在官網登入後檢視
	 */
	public static final String ACCOUNT_SID = "aac6e373c7534007bf47648ba34ba2f1";

	/**
	 * 開發者註冊後系統自動生成的TOKEN,可在官網登入後檢視
	 */
	public static final String AUTH_TOKEN = "47605360a97a4f81bcd576e8e0645edf";

	/**
	 * 響應資料型別, JSON或XML
	 */
	public static final String RESP_DATA_TYPE = "json";
}
複製程式碼

HttpUtil.java(http請求工具):


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.URL;
import java.net.URLConnection;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.apache.commons.codec.digest.DigestUtils;

/**
 * http請求工具
 */
public class HttpUtil
{
	/**
	 * 構造通用引數timestamp、sig和respDataType
	 * 
	 * @return
	 */
	public static String createCommonParam()
	{
		// 時間戳
		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
		String timestamp = sdf.format(new Date());

		// 簽名
		String sig = DigestUtils.md5Hex(Config.ACCOUNT_SID + Config.AUTH_TOKEN + timestamp);

		return "&timestamp=" + timestamp + "&sig=" + sig + "&respDataType=" + Config.RESP_DATA_TYPE;
	}

	/**
	 * post請求
	 * 
	 * @param url
	 *            功能和操作
	 * @param body
	 *            要post的資料
	 * @return
	 * @throws IOException
	 */
	public static String post(String url, String body)
	{
		System.out.println("url:" + System.lineSeparator() + url);
		System.out.println("body:" + System.lineSeparator() + body);

		String result = "";
		try
		{
			OutputStreamWriter out = null;
			BufferedReader in = null;
			URL realUrl = new URL(url);
			URLConnection conn = realUrl.openConnection();

			// 設定連線引數
			conn.setDoOutput(true);
			conn.setDoInput(true);
			conn.setConnectTimeout(5000);
			conn.setReadTimeout(20000);
			conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
			// 提交資料
			out = new OutputStreamWriter(conn.getOutputStream(), "UTF-8");
			out.write(body);
			out.flush();

			// 讀取返回資料
			in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));
			String line = "";
			boolean firstLine = true; // 讀第一行不加換行符
			while ((line = in.readLine()) != null)
			{
				if (firstLine)
				{
					firstLine = false;
				} else
				{
					result += System.lineSeparator();
				}
				result += line;
			}
		} catch (Exception e)
		{
			e.printStackTrace();
		}
		return result;
	}

	/**
	 * 回撥測試工具方法
	 * 
	 * @param url
	 * @param reqStr
	 * @return
	 */
	public static String postHuiDiao(String url, String body)
	{
		String result = "";
		try
		{
			OutputStreamWriter out = null;
			BufferedReader in = null;
			URL realUrl = new URL(url);
			URLConnection conn = realUrl.openConnection();

			// 設定連線引數
			conn.setDoOutput(true);
			conn.setDoInput(true);
			conn.setConnectTimeout(5000);
			conn.setReadTimeout(20000);

			// 提交資料
			out = new OutputStreamWriter(conn.getOutputStream(), "UTF-8");
			out.write(body);
			out.flush();

			// 讀取返回資料
			in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));
			String line = "";
			boolean firstLine = true; // 讀第一行不加換行符
			while ((line = in.readLine()) != null)
			{
				if (firstLine)
				{
					firstLine = false;
				} else
				{
					result += System.lineSeparator();
				}
				result += line;
			}
		} catch (Exception e)
		{
			e.printStackTrace();
		}
		return result;
	}
}
複製程式碼

驗證碼通知簡訊介面:(最重要) 這裡需要修改我們在註冊時獲取到的資訊。

  • 修改smsContent 把這個簡訊的內容修改為你建立的簡訊模板 **注意:**一定要保持一致。
import java.net.URLEncoder;

import com.miaodiyun.httpApiDemo.common.Config;
import com.miaodiyun.httpApiDemo.common.HttpUtil;

/**
 * 驗證碼通知簡訊介面
 * 
 * @ClassName: IndustrySMS
 * @Description: 驗證碼通知簡訊介面
 *
 */
public class IndustrySMS
{
	private static String operation = "/industrySMS/sendSMS";

	private static String accountSid = Config.ACCOUNT_SID;
	private static String to = "13767441759";
	
	private static String code = smsCode();
//	登入驗證碼:{1},如非本人操作,請忽略此簡訊。
	private static String smsContent = "【歐陽科技】登入驗證碼:"+code+",如非本人操作,請忽略此簡訊。";

	/**
	 * 驗證碼通知簡訊
	 */
	public static void execute()
	{
		String tmpSmsContent = null;
	    try{
	      tmpSmsContent = URLEncoder.encode(smsContent, "UTF-8");
	    }catch(Exception e){
	      
	    }
	    String url = Config.BASE_URL + operation;
	    String body = "accountSid=" + accountSid + "&to=" + to + "&smsContent=" + tmpSmsContent
	        + HttpUtil.createCommonParam();

	    // 提交請求
	    String result = HttpUtil.post(url, body);
	    System.out.println("result:" + System.lineSeparator() + result);
	}
	
	//建立驗證碼
	public static String smsCode(){
		String random=(int)((Math.random()*9+1)*100000)+"";	
		System.out.println("驗證碼:"+random);
		return random;
	}
}

複製程式碼

上面這些是主要的類,還有其他的類在文章末尾給出原始碼。

三、手機簡訊驗證測試


public class Test
{

	/**
	 * @param args
	 */
	public static void main(String[] args)
	{

		// 驗證碼通知簡訊介面
		 IndustrySMS.execute();

	}
	
	
}

複製程式碼
原始碼下載

https://download.csdn.net/download/sihai12345/10472391

文章有不當之處,歡迎指正,如果喜歡微信閱讀,你也可以關注我的微信公眾號:好好學java,獲取優質學習資源。

相關文章