1. 程式人生 > >JAVA開發簡訊驗證碼系統

JAVA開發簡訊驗證碼系統

開發一個簡訊驗證碼系統,我們是需要去對接外部API的,那麼在百度上搜一搜會出現很多,我用的某一家公司的API,為了防止說打廣告,最後再放上公司名和連結。

對接一個簡訊API需要做什麼工作呢,不同的API請求引數是不同的,下面以我使用的API引數為例。


這是請求的引數表,必選的是我們必須寫上的,到時候我們會把他們拼接到請求地址中。

對於時間戳timestamp和Sig MD5加密我們會在下面使用java來進行處理

這邊的ID和TOKEN等你註冊以後使用自己的就可以了。



他的官網也給出了請求例項,我們可以參考。

---------------------------------------------------------------------------分割線------------------------------------------------------------

首先我們建立一個QueryUtil類,這個類是用來建立生成時間戳和MD5加密,並返回拼接的地址的字串

/**
 * 
 *	傳送驗證碼工具類
 *	QueryUtil
 *	@author houzhiyang
 *	@data 2017-7-12 15:41:12
 *	@version 1.0.0
 */
public class QueryUtil {
	
	
	
	public static String qureyArguments(String ACCOUNT_SID,String AUTH_TOKEN,String smsContent,String to){
		//時間戳
		String timestamp = getTimestamp();
		//簽名驗證
		String sig = MD5(ACCOUNT_SID,AUTH_TOKEN,timestamp);
		//地址引數拼接
		String str = "accountSid="+ACCOUNT_SID+"&smsContent="+smsContent+
				"&to="+to+"&playTimes=2"+"&timestamp="+timestamp+"&sig="+sig;
		
		return str;
	}
	/**
	 * 獲取時間戳
	 * @return
	 */
	
	public static String getTimestamp(){
		SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
		return format.format(new Date());
	}
	
	public static String MD5(String... args){
		StringBuffer result = new StringBuffer();
		if(args==null||args.length==0){
			return "";
		}else{
			StringBuffer sb = new StringBuffer();
			for (String string : args) {
				sb.append(string);
			}
			System.out.println("編碼前:\t"+sb.toString());
			
			MessageDigest digest;
			try {
				digest = MessageDigest.getInstance("MD5");
				
				byte[] bytes = digest.digest(sb.toString().getBytes());
				for (byte b : bytes) {
					String hex = Integer.toHexString(b&0xff);//16進位制轉換
					if(hex.length()==1){
						result.append("0"+hex);
					}else{
						result.append(hex);
					}
				}
				
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return result.toString();
	}
}

1.對於時間戳的設定,使用SimpleDateFormat類的format方法即可,他會返回String型別。

2.MD5加密 使用MessageDigest下的getInstance傳入MD5引數獲取一個例項,再將傳入的引數使用digest方法獲取一個byte陣列。使用foreach遍歷byte陣列String hex = Integer.toHexString(b&0xff);//16進位制轉換 使用這句將其轉換為16進位制的MD5加密。

在建立一個產生隨機數的類

/**
 * 
 *	類描述:隨機數工具類
 *	RandomUtil
 *	@author houzhiyang
 *	@data 2017-7-12下午9:26:43
 *	@version 1.0.0
 */
public class RandomUtil {
	public static String getRandom(){
		String randNum = new Random().nextInt(1000000)+"";
		if(randNum.length()!=6){
			return getRandom();
		}
		return randNum;
	}
}


最後建立主類GetPhoneMessage

/**
 * 
 *	獲取簡訊驗證碼類
 *	GetPhoneMessage
 *	@author houzhiyang
 *	@data 2017-7-12 5:36:06
 *	@version 1.0.0
 */

public class GetPhoneMessage {
	//使用者ID
	public static final String ACCOUNT_SID = "填入你申請賬號的對應值";
	//金鑰
	public static final String AUTH_TOKEN = "填入你申請賬號的對應值";
	//請求地址前半部分
	public static final String BASE_URL = "https://api.miaodiyun.com/20150822/industrySMS/sendSMS";
	//隨機數
	public static String randNum = RandomUtil.getRandom();
	//簡訊內容
	public static String smsContent = "按照你設定的模版內容填寫,如不一樣會報錯";
	/**
	 * 獲取簡訊驗證碼
	 * @param to
	 * @return
	 */
	public static String getResult(String to){
		String args = QueryUtil.qureyArguments(ACCOUNT_SID, AUTH_TOKEN, smsContent, to);
		System.out.println(args);
		OutputStreamWriter out = null;
		InputStream in = null;
		BufferedReader br = null;
		StringBuffer sb = new StringBuffer();
		try {
			URL url = new URL(BASE_URL);
			URLConnection connection = url.openConnection();//開啟連結
			connection.setDoOutput(true);
			connection.setDoInput(true);
			connection.setConnectTimeout(5000);//設定請求連結超時時間
			connection.setReadTimeout(10000);//設定讀取結果超時
			//提交資料
			out = new OutputStreamWriter(connection.getOutputStream(),"UTF-8");
			out.write(args);
			out.flush();
			//讀取返回資料
			
			in = connection.getInputStream();
			br = new BufferedReader(new InputStreamReader(in));
			String line = "";
			while((line =br.readLine())!= null){
				sb.append(line);
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		return sb.toString();
	}
	
	public static void main(String[] args) {
		System.out.println("驗證碼:"+randNum);
		System.out.println(getResult("這裡傳入你要測試的手機號碼"));
	}
}



我這邊使用的是秒嘀雲的API,他對於一個新註冊的賬號贈送了200條簡訊的體驗,對於我們測試開發來說足夠了,我的例子也是使用秒嘀雲來進行的。不過賬號需要小夥伴們自己註冊了,因為我的條數已經被浪的差不多了,哈哈哈。

PS:在你註冊後,進第一步去簡訊驗證碼的模版功能新增模版,因為沒有模版是不能用的,模版也需要稽核。如果你對接其他的API這些就按照別的網站的要求做。http://www.miaodiyun.com/