Java調用WebService接口實現發送手機短信驗證碼功能

原文:Java調用WebService接口實現發送手機短信驗證碼功能


近來由於項目需要,需要用到手機短信驗證碼的功能,其中最主要的是用到了第三方提供的短信平臺接口WebService客戶端接口,下面我把我在項目中用到的記錄一下,以便給大家提供個思路,由於本人的文采有限,還請大家見諒!

一:首先上幾張案例截圖,以便大家可以瞭解一下短信驗證碼的流程,這裏我在做的過程中也參考了很多網站的短信驗證碼,比如:58同城,汽車之家等。

1.點擊獲取驗證碼之前的樣式:

20140625153702471.jpg

2.輸入正確的手機號後點擊獲取驗證碼之後的樣式:

20140625153725662.jpg

3.如果手機號已經被註冊的樣式:

20140625153759205.jpg

4.如果一個手機號一天發送超過3次就提示不能發送:

20140625153823814.jpg

二:前臺的註冊頁面的代碼:reg.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags"%>
<%@page import="cn.gov.csrc.base.action.FindAllData"%>
<%
	String path = request.getContextPath();
	String basePath = request.getScheme() + "://"
			+ request.getServerName() + ":" + request.getServerPort()
			+ path + "/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>中國證券會證券期貨違法違規舉報中心-註冊</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<link rel="shortcut icon" type="image/x-icon" href="<%=request.getContextPath()%>/images/favicon.ico" />
<link rel="stylesheet" type="text/css"
	href="<%=request.getContextPath()%>/css/main.css">
<link
	href="<%=request.getContextPath()%>/formValidator1/style/validator.css"
	rel="stylesheet" type="text/css" />
<style type="text/css">
button {
	background: #F0F0F0 repeat-x;
	padding-top: 3px; 
	border-top : 1px solid #708090;
	border-right: 1px solid #708090;
	border-bottom: 1px solid #708090;
	border-left: 1px solid #708090;
	width: auto;
	line-height: 12pt; 
	font-size : 10pt;
	cursor: hand;
	font-size: 10pt;
	border-top: 1px solid #708090;
}
</style>
<script src="<%=request.getContextPath()%>/js/jquery-1.7.2.min.js"
	type="text/javascript"></script>
<script src="<%=request.getContextPath()%>/formValidator1/formValidator-4.0.1.js"
	type="text/javascript"></script>
<script src="<%=request.getContextPath()%>/formValidator1/formValidatorRegex.js"
	type="text/javascript"></script>
<script src="<%=request.getContextPath()%>/js/register.js"
	type="text/javascript"></script>
<script src="<%=request.getContextPath()%>/js/sms.js"
	type="text/javascript"></script>
<script type="text/javascript">
	function changeCheckNum() {
		var checkNumImage_ = document.getElementById("checkNumImage");
		checkNumImage_.src = "${pageContext.request.contextPath}/image.jsp?timeStamp="+ new Date().getTime();
	}
</script>
<script type="text/javascript">
	var msg = "${message}";
	if (msg != "") {
		alert(msg);
	}
</script>
</head>
<body>
	<%@include file="/statics/top.jspf"%>
	<div class="center_division">
		<div class="center_body">
			<div class="center_menu">
				<font color="#000000">當前位置:</font>
				<a href="<%=request.getContextPath()%>/statics/reg.jsp"><font color="#000000">用戶註冊</font></a>
			</div>
		</div>
		<div class="center_body_menu">
			<s:form action="RegisterAction_register" id="form1" name="form1" method="post" namespace="/">
				<table id="tb">
					<tr>
						<td colspan="3" align="center" bgcolor="#DDDFE1">舉報人基本信息</td>
					</tr>
					<tr>
						<td align="center" width="30%">&nbsp;&nbsp;&nbsp;&nbsp;<img src="images/new_reg_xing.gif"/>用戶名:</td>
						<td align="center" width="40%">
							<s:textfield name="username" id="username" cssStyle="width:160px;height:24px;" οnblur="checkusername()"/>
						</td>
						<td align="left" width="30%">
							<span id="usernameTip">
								<s:fielderror cssStyle="color:red;padding-left:10px;">
									<s:param>username</s:param>
								</s:fielderror>
							</span>
						</td>
					</tr>
					<tr>
						<td align="center" width="30%"><img src="images/new_reg_xing.gif"/>登錄密碼:</td>
						<td align="center" width="40%">
							<s:password name="password" id="password" cssStyle="width:160px;height:24px;" οnblur="checkpassword()"/>
						</td>
						<td align="left" width="30%">
							<span id="passwordTip">
								<s:fielderror cssStyle="color:red;padding-left:10px;">
									<s:param>password</s:param>
								</s:fielderror>
							</span>
						</td>
					</tr>
					<tr>
						<td align="center" width="30%"><img src="images/new_reg_xing.gif"/>確認密碼:</td>
						<td align="center" width="40%">
							<s:password name="passwordRepeat" id="passwordRepeat" cssStyle="width:160px;height:24px;" οnblur="checkpasswrodb()"/>
						</td>
						<td align="left" width="30%">
							<span id="passwordRepeatTip">
								<s:fielderror cssStyle="color:red;padding-left:10px;">
									<s:param>passwordRepeat</s:param>
								</s:fielderror>
							</span>
						</td>
					</tr>
					<tr>
						<td align="center" width="30%"><img src="images/new_reg_xing.gif"/>姓&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;名:</td>
						<td align="center" width="40%">
							<s:textfield name="nickname" id="nickname" cssStyle="width:160px;height:24px;" οnblur="checknickname()"/>
						</td>
						<td align="left" width="30%">
							<span id="nicknameTip">
								<s:fielderror cssStyle="color:red;padding-left:10px;">
									<s:param>nickname</s:param>
								</s:fielderror>
							</span>
						</td>
					</tr>
					<tr>
						<td align="center" width="30%">性&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;別:</td>
						<td align="center" width="40%">
							<s:radio list="#application.dataMap.get('10001')" name="jbSex" cssStyle="height:24px;"/>
						</td>
						<td align="left" width="30%"></td>
					</tr>
					<tr>
						<td align="center" width="30%">聯繫地址:</td>
						<td align="center" width="40%">
							<s:textfield name="jbAddress" id="jbAddress" cssStyle="width:160px;height:24px;" />
						</td>
						<td align="left" width="30%">
							<span id="jbAddressTip">
								<s:fielderror cssStyle="color:red;padding-left:10px;">
									<s:param>jbAddress</s:param>
								</s:fielderror>
							</span>
						</td>
					</tr>
					<tr>
						<td align="center" width="30%"><img src="images/new_reg_xing.gif"/>聯繫手機:</td>
						<td align="center" width="40%">
							<s:textfield id="jbPhone" name="jbPhone" cssStyle="width:160px;height:24px;" οnblur="checkjbPhone()"/>
						</td>
						<td align="left" width="30%">
							<span id="jbPhoneTip">
								<s:fielderror cssStyle="color:red;padding-left:10px;">
									<s:param>jbPhone</s:param>
								</s:fielderror>
							</span>
						</td>
					</tr>
					<tr>
						<td align="center"><img src="images/new_reg_xing.gif"/>短信驗證碼:</td>
						<td align="left" colspan="2" style="padding-left: 112px;">
							<s:textfield id="SmsCheckCode" name="SmsCheckCode" cssStyle="width:80px;height:24px;" maxLength="6" />
							<span><input type="button" id="btnSendCode" name="btnSendCode" value="免費獲取驗證碼" οnclick="sendMessage()" /></span>
							<span id="SmsCheckCodeTip">
								<s:fielderror cssStyle="color:red;padding-left:10px;">
									<s:param>SmsCheckCodeTip</s:param>
								</s:fielderror>
							</span>
						</td>
					</tr>
					<tr>
						<td align="center" width="30%"><img src="images/new_reg_xing.gif"/>證件類型:</td>
						<td align="center" width="40%">
						<s:select list="#application.dataMap.get('10002')" label=""
								headerKey="" headerValue="--請選擇--" value="1" listValue="value" οnchange="enableCredentialsCode(this)"
								name="jbCredentialsName" id="jbCredentialsName" cssStyle="width:160px;height:24px;"/>
						</td>
						<td align="left" width="30%">
							<s:fielderror cssStyle="color:red;padding-left:10px;">
								<s:param>jbCredentialsName</s:param>
							</s:fielderror>
						</td>
					</tr>
					<tr>
						<td align="center" width="30%"><img src="images/new_reg_xing.gif"/>證件號碼:</td>
						<td align="center" width="40%">
							<s:textfield name="jbCredentialsCode" id="jbCredentialsCode" cssStyle="width:160px;height:24px;" οnblur="checkjbCredentialsCode()"/>
						</td>
						<td align="left" width="30%">
							<span id="jbCredentialsCodeTip">
								<s:fielderror cssStyle="color:red;padding-left:10px;">
									<s:param>jbCredentialsCode</s:param>
								</s:fielderror>
							</span>
						</td>
					</tr>
					<tr>
						<td align="center" width="30%">單位名稱:</td>
						<td align="center" width="40%">
							<s:textfield name="jbCompanyName" id="jbCompanyName" cssStyle="width:160px;height:24px;" />
						</td>
						<td align="left" width="30%">
							<span id="jbCompanyNameTip">
								<s:fielderror cssStyle="color:red;padding-left:10px;">
									<s:param>jbCompanyName</s:param>
								</s:fielderror>
							</span>
						</td>
					</tr>
					<tr>
						<td align="center" width="30%"><img src="images/new_reg_xing.gif"/>所在地區:</td>
						<td align="center" width="40%">
						<s:select list="#application.dataMap.get('10003')" label=""
								headerKey="" headerValue="--請選擇--" listKey="key"
								cssStyle="width:160px;height:24px;" listValue="value" id="jbSourceArea"
								name="jbSourceArea" οnblur="checkjbSourceArea()"/>
						</td>
						<td align="left" width="30%">
							<span id="jbSourceAreaTip">
								<s:fielderror cssStyle="color:red;padding-left:10px;">
									<s:param>jbSourceArea</s:param>
								</s:fielderror>
							</span>
						</td>
					</tr>
					<tr>
						<td align="center" width="30%">&nbsp;&nbsp;&nbsp;&nbsp;<img src="images/new_reg_xing.gif"/>驗證碼:</td>
						<td align="center" width="40%">
							<s:textfield id="checkNum" name="checkNum" cssStyle="width:60px;height:24px;" οnblur="checkNumber()" maxLength="4"/>
							<img id="checkNumImage" src="${pageContext.request.contextPath}/image.jsp">
							<a onClick="changeCheckNum()" title="點擊換一張" style="cursor:hand;">&nbsp;換一張</a>
						</td>
						<td align="left" width="30%">
							<span id="checkNumTip">
								<s:fielderror cssStyle="color:red;padding-left:10px;">
									<s:param>checkNumTip</s:param>
								</s:fielderror>
							</span>
						</td>
					</tr>
					<tr>
						<td colspan="3" style="vertical-align: top; padding-top: 5px;padding-bottom: 5px;">
							<input type="submit" value="註冊" style="width:50px; height:24px;"/>
							&nbsp;&nbsp;
							<input type="reset" value="重置" style="width:50px; height:24px;"/>
						</td>
					</tr>
				</table>
			</s:form>
		</div>
	</div>
	<%@include file="/common/buttom.jspf"%>
</body>
</html>

三:前臺獲取短信驗證碼的js:sms.js

var InterValObj; //timer變量,控制時間
var count = 120; //間隔函數,1秒執行
var curCount;//當前剩餘秒數
var code = ""; //驗證碼
var codeLength = 6;//驗證碼長度

function sendMessage() {
	curCount = count;
	var jbPhone = $("#jbPhone").val();
	var jbPhoneTip = $("#jbPhoneTip").text();
	if (jbPhone != "") {
		if(jbPhoneTip == "√ 該手機號碼可以註冊,輸入正確" || jbPhoneTip == "√ 短信驗證碼已發到您的手機,請查收"){
			// 產生驗證碼
			for ( var i = 0; i < codeLength; i++) {
				code += parseInt(Math.random() * 9).toString();
			}
			// 設置button效果,開始計時
			$("#btnSendCode").attr("disabled", "true");
			$("#btnSendCode").val("請在" + curCount + "秒內輸入驗證碼");
			InterValObj = window.setInterval(SetRemainTime, 1000); // 啓動計時器,1秒執行一次
			// 向後臺發送處理數據
			$.ajax({
				type: "POST", // 用POST方式傳輸
				dataType: "text", // 數據格式:JSON
				url: "UserAction_sms.action", // 目標地址
				data: "jbPhone=" + jbPhone +"&code=" + code,
				error: function (XMLHttpRequest, textStatus, errorThrown) { 
					
				},
				success: function (data){ 
					data = parseInt(data, 10);
					if(data == 1){
						$("#jbPhoneTip").html("<font color='#339933'>√ 短信驗證碼已發到您的手機,請查收</font>");
					}else if(data == 0){
						$("#jbPhoneTip").html("<font color='red'>× 短信驗證碼發送失敗,請重新發送</font>");
					}else if(data == 2){
						$("#jbPhoneTip").html("<font color='red'>× 該手機號碼今天發送驗證碼過多</font>");
					}
				}
			});
		}
	}else{
		$("#jbPhoneTip").html("<font color='red'>× 手機號碼不能爲空</font>");
	}
}

//timer處理函數
function SetRemainTime() {
	if (curCount == 0) {                
		window.clearInterval(InterValObj);// 停止計時器
		$("#btnSendCode").removeAttr("disabled");// 啓用按鈕
		$("#btnSendCode").val("重新發送驗證碼");
		code = ""; // 清除驗證碼。如果不清除,過時間後,輸入收到的驗證碼依然有效
	}else {
		curCount--;
		$("#btnSendCode").val("請在" + curCount + "秒內輸入驗證碼");
	}
}

$(document).ready(function() {
	$("#SmsCheckCode").blur(function() {
		var SmsCheckCodeVal = $("#SmsCheckCode").val();
		// 向後臺發送處理數據
		$.ajax({
			url : "UserAction_checkCode.action", 
			data : {SmsCheckCode : SmsCheckCodeVal}, 
			type : "POST", 
			dataType : "text", 
			success : function(data) {
				data = parseInt(data, 10);
				if (data == 1) {
					$("#SmsCheckCodeTip").html("<font color='#339933'>√ 短信驗證碼正確,請繼續</font>");
				} else {
					$("#SmsCheckCodeTip").html("<font color='red'>× 短信驗證碼有誤,請覈實後重新填寫</font>");
				}
			}
		});
	});
});

四:後臺action的代碼:UserAction.java(這裏只是調用了我們的第三方給提供的客戶端代碼的發送短信的方法,如果是調用其他的短信平臺,可以換成他們的發送短信的方法,這裏只是給大家做個參考)

/**
	 * 驗證手機短信是否發送成功
	 * 
	 * @throws Exception
	 */
	@Action(value = "UserAction_sms")
	public void sms() throws Exception {
		String result = "0";
		/** 手機號碼 */
		String jbPhone = WebContextUtil.getRequest().getParameter("jbPhone");
		/** 短信驗證碼 */
		String code = WebContextUtil.getRequest().getParameter("code");
		/** 短信驗證碼存入session(session的默認失效時間30分鐘) */
		WebContextUtil.getSession().setAttribute("code", code);
		/** 如何初始化失敗返回 */
		if(!initClient()) {
			return;
		}
		/** 單個手機號發送短信的方法的參數準備 */
		// 手機號碼
		String mobilephone = jbPhone;
		// 短信內容+隨機生成的6位短信驗證碼
		String content = "根據中國證監會舉報中心委託,特向您發送此條短信。您的註冊驗證碼爲:" + code;
		// 操作用戶的ID
		Integer operId = Integer.parseInt(Env.getInstance().getProperty("operId"));
		// 定時發送的的發送時間(缺省爲空,如果即時發送,填空)
		String tosend_time = "";
		// 應用系統的短信ID,用戶查詢該短信的狀態報告(缺省爲0,即不需查詢短信的狀態報告)
		int sms_id = 0;
		// 黑名單過濾(0:不需要黑名單過濾,1:需要黑名單過濾,缺省爲0)
		short backlist_filter = 0;
		// 禁止語過濾(0:不需要禁止語過濾,1:需要禁止語過濾,缺省爲0)
		short fbdword_filter = 0;
		// 優先級(值越大優先級越高,0:普通,1,:優先,2:最高,缺省爲0)
		short priority = 0;
		// 短信有效時間(格式爲:YYYY-MM-DD HH:mm:ss目前爲空)
		String valid_time = "";
		/** 發送短信之前先統計一個已經發送的短信條數 */
		int messageCount = countService.findAllRecord(mobilephone);
		System.out.println("已發短信條數爲:" +messageCount);
		if(messageCount < 5){
			/** 單個手機號發送短信 */
			if (!sendMessage(mobilephone, content, operId, tosend_time, sms_id,
					backlist_filter, fbdword_filter, priority, valid_time)) {
				result = "0";// 失敗
			} else {
				result = "1";// 成功
				/** 發送一條短信,記錄一條短信記錄,爲了方便之後的統計短信發送次數 */
				count.setPhone(mobilephone);// 手機號碼
				count.setCaptcha(code);// 短信驗證碼
				count.setSendTime(CommonUtil.getNowDate());// 短信發送時間
				if(count != null){
					countService.saveEntity(count);
					System.out.println("保存成功!");
				}
			}
		}else{
			System.out.println("該手機號碼今天發送驗證碼過多");
			result = "2";//一個手機號碼最多發送3條短信驗證碼
		}
		HttpServletResponse response = WebContextUtil.getResponse();
		response.setContentType("application/json;charset=UTF-8");
		response.setHeader("Cache-Control", "no-cache");
		PrintWriter out = response.getWriter();
		out.write(result.toString());
	}
	
	/**
	 * WebService客戶端初始化
	 * 
	 */
	public static boolean initClient() {
		/**
		 * 判斷客戶端是否已經初始化
		 */
		if (!SmsWebClient.enable()) {
			int ret = 0;
			try {
				ret = SmsWebClient.init(url, userName, passWord);
				if (ret == -1 || !SmsWebClient.enable()) {
					System.out.println("短信平臺接口初始化失敗!");
					return false;
				}
				System.out.println("短信平臺接口初始化成功!"+ret+"----------");
			} catch (Exception ex) {
				ex.printStackTrace();
				System.out.println("短信平臺接口初始化過程中異常!");
			}
		}
		return true;
	}
	
	/**
	 * 單個手機號碼發送
	 * 
	 * @param mobilephone
	 *            手機號
	 * @param content
	 *            短信內容
	 * @param operId
	 *            操作用戶的ID
	 * @param tosend_time
	 *            定時發送的發送時間
	 * @param sms_id
	 *            應用系統的短信ID
	 * @param backlist_filter
	 *            黑名單過濾
	 * @param fbdword_filter
	 *            禁止語過濾
	 * @param priority
	 *            優先級
	 * @param valid_time
	 *            短信有效時間
	 */
	public static boolean sendMessage(java.lang.String mobilephone,
			java.lang.String content, int operId, java.lang.String tosend_time,
			int sms_id, short backlist_filter, short fbdword_filter,
			short priority, java.lang.String valid_time) {
		// 單個手機號碼發送
		try {
			SmsReturnObj retObj = SmsWebClient.webSendMessage(mobilephone,
					content, operId, tosend_time, sms_id, backlist_filter,
					fbdword_filter, priority, valid_time);
			if (retObj.getReturnCode() != 1) {
				System.out.println("短信發送失敗,原因爲:" + retObj.getReturnMsg());
				return false;
			} else {
				System.out.println("短信發送成功!返回結果爲:" + retObj.getReturnMsg());
				return true;
			}
		} catch (Exception ex) {
			ex.printStackTrace();
			System.out.println("短信發送過程發生異常!");
		}
		return true;
	}
	

五:具體的短信接口demo到這裏下,這裏你下載了也不能成功的發送短信,因爲你必須要短信平臺商給你提供:url,userName,passWord,operId,以及短信平臺商還要綁定你的外網ip地址,這樣才能真正的發送短信。

鏈接: http://pan.baidu.com/s/1pJLRsxX

詳情請看:http://blog.csdn.net/sxdtzhaoxinguo/article/details/34437591

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章