Java注册手机获取验证码

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010363836/article/details/49783377

注册发送手机验证码:

    @RequestMapping(value = "/register/sendCode", method = RequestMethod.POST)
    public ResponseEntity<AjaxPostResponse> sendCode(HttpServletRequest request, HttpServletResponse response) {
    	String schoolId = this.getSchoolId(request);
    	String mobile = ServletRequestUtils.getStringParameter(request, "mobile", "").trim();
    	
    	if (StringUtils.isBlank(mobile)) {
    		return this.errorResponse("手机号不能为空");
    	}
    	
    	Pattern p = Pattern.compile("^((13[0-9])|(15[^4,\\D])|(18[0-9]))\\d{8}$");
    	Matcher m = p.matcher(mobile);
    	if (false == m.matches()) {
    		return this.errorResponse("手机号格式不正确");
    	}
    	
    	User user = userManager.getUserByMobile(schoolId, mobile);
    	if (null != user) {
    		return this.errorResponse("该手机号已注册");
    	}
    	
    	School school = schoolManager.getSchool(schoolId);
    	SchoolSettings schoolSettings = school.getSchoolSettingsBean();
    	
    	Integer sendTime = 0;	// 预防短信轰炸
    	sendTime = memcachedClient.get("mobileCode_" + mobile) == null ? 0 : (Integer) memcachedClient.get("mobileCode_" + mobile);
    	if (0 == sendTime) {
    		memcachedClient.add("mobileCode_" + mobile, 30 * 60, sendTime); // 30 minutes
    	}
    	
    	if (5 < sendTime) {
    		return this.errorResponse("获取验证码次数过多");
    	}
    	
    	if (YesNoStatus.YES.getValue().equals(schoolSettings.getRegisterSetting())) {
    		String serviceURL = schoolSettings.getActivationMobileUrl();
    		String sn = schoolSettings.getActivationMobileSn();
    		String password = schoolSettings.getActivationMobilePassword();
    		String content = schoolSettings.getActivationMobileContent();
    		String code = PrimaryKeyUtils.generateRandomKey().substring(0, 4);
    		
    		request.getSession().setAttribute("mobile_code"+mobile, code);
    		
    		content = content.replaceAll("\\$\\{schoolName\\}", school.getName());
    		content = content.replaceAll("\\$\\{mobile\\}", mobile);
    		content = content.replaceAll("\\$\\{verificationCode\\}", code);
    		
    		try {
				MobileServerUtils.sendMobileCode(mobile, serviceURL, sn, password, content);
			} catch (UnsupportedEncodingException e) {
				logger.info("RegisterController UnsupportedEncodingException", e);
			}
    		
    		// 把请求验证码次数存储到MemCached中
            try {
                String key = "mobileCode_" + mobile;
                sendTime++;
                memcachedClient.replace(key, 30 * 60, sendTime); // 30 minutes
            } catch (Exception e) {
                logger.warn("把用户信息保存在Memcached中时发生异常,Cause: ", e);
            }
    		
    		return this.okResponse(true);
    	}
    	
    	return this.errorResponse("暂不开放注册");
    }

发送手机验证码的处理类:

package com.school.util;

import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 手机验证码工具类
 * @author FeiFan Lin
 */
public class MobileServerUtils {
	
	private static final Logger LOG = LoggerFactory.getLogger(MobileServerUtils.class);
	private String serviceURL = "";
	private String sn = "";	// 序列号
	private String password = "";
	private String pwd = "";// 密码
	
	/*
	 * 构造函数
	 */
	private MobileServerUtils(String serviceURL, String sn, String password) throws UnsupportedEncodingException {
		this.serviceURL = serviceURL;
		this.sn = sn;
		this.password = password;
		// 密码为md5(sn+password)
		this.pwd = this.getMD5(sn + password);
	}
	
	/**
	 * 发送验证码到手机
	 * @param mobile 手机号
	 * @param serviceURL 手机平台服务器地址
	 * @param sn 序列号
	 * @param password 密码
	 * @param content 内容
	 * @return 唯一标识
	 * @throws UnsupportedEncodingException 
	 */
	public static String sendMobileCode(String mobile, String serviceURL, String sn, String password, String content) throws UnsupportedEncodingException {
		MobileServerUtils ms = new MobileServerUtils(serviceURL, sn, password);
		content = URLEncoder.encode(content, "utf8");
		String result_mt = ms.mdsmssend(mobile, content, "", "", "", "");
		return result_mt;
	}
	
	/*
	 * 方法名称:getMD5 
	 * 功    能:字符串MD5加密 
	 * 参    数:待转换字符串 
	 * 返 回 值:加密之后字符串
	 */
	private String getMD5(String sourceStr) throws UnsupportedEncodingException {
		String resultStr = "";
		try {
			byte[] temp = sourceStr.getBytes();
			MessageDigest md5 = MessageDigest.getInstance("MD5");
			md5.update(temp);
			// resultStr = new String(md5.digest());
			byte[] b = md5.digest();
			for (int i = 0; i < b.length; i++) {
				char[] digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8',
						'9', 'A', 'B', 'C', 'D', 'E', 'F' };
				char[] ob = new char[2];
				ob[0] = digit[(b[i] >>> 4) & 0X0F];
				ob[1] = digit[b[i] & 0X0F];
				resultStr += new String(ob);
			}
			return resultStr;
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
			return null;
		}
	}


	/*
	 * 方法名称:mdgetSninfo 
	 * 功    能:获取信息
	 * 参    数:sn,pwd(软件序列号,加密密码md5(sn+password))
	 * 
	 */
	private String mdgetSninfo() {
		String result = "";
		String soapAction = "http://entinfo.cn/mdgetSninfo";
		String xml = "<?xml version=\"1.0\" encoding=\"utf-8\"?>";
		xml += "<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">";
		xml += "<soap:Body>";
		xml += "<mdgetSninfo xmlns=\"http://entinfo.cn/\">";
		xml += "<sn>" + sn + "</sn>";
		xml += "<pwd>" + pwd + "</pwd>";
		xml += "</mdgetSninfo>";
		xml += "</soap:Body>";
		xml += "</soap:Envelope>";

		URL url;
		try {
			url = new URL(serviceURL);

			URLConnection connection = url.openConnection();
			HttpURLConnection httpconn = (HttpURLConnection) connection;
			ByteArrayOutputStream bout = new ByteArrayOutputStream();
			bout.write(xml.getBytes());
			byte[] b = bout.toByteArray();
			httpconn.setRequestProperty("Content-Length", String
					.valueOf(b.length));
			httpconn.setRequestProperty("Content-Type",
					"text/xml; charset=gb2312");
			httpconn.setRequestProperty("SOAPAction", soapAction);
			httpconn.setRequestMethod("POST");
			httpconn.setDoInput(true);
			httpconn.setDoOutput(true);

			OutputStream out = httpconn.getOutputStream();
			out.write(b);
			out.close();

			InputStreamReader isr = new InputStreamReader(httpconn
					.getInputStream());
			BufferedReader in = new BufferedReader(isr);
			String inputLine;
			while (null != (inputLine = in.readLine())) {
				Pattern pattern = Pattern.compile("<mdgetSninfoResult>(.*)</mdgetSninfoResult>");
				Matcher matcher = pattern.matcher(inputLine);
				while (matcher.find()) {
					result = matcher.group(1);
				}
			}
			return result;
		} catch (Exception e) {
			e.printStackTrace();
			return "";
		}
	}

	
	/*
	 * 方法名称:mdgxsend 
	 * 功    能:发送个性短信 
	 * 参    数:mobile,content,ext,stime,rrid,msgfmt(手机号,内容,扩展码,定时时间,唯一标识,内容编码)
	 * 返 回 值:唯一标识,如果不填写rrid将返回系统生成的
	 */
	private String mdgxsend(String mobile, String content, String ext, String stime,
			String rrid, String msgfmt) {
		String result = "";
		String soapAction = "http://entinfo.cn/mdgxsend";
		String xml = "<?xml version=\"1.0\" encoding=\"utf-8\"?>";
		xml += "<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">";
		xml += "<soap:Body>";
		xml += "<mdgxsend xmlns=\"http://entinfo.cn/\">";
		xml += "<sn>" + sn + "</sn>";
		xml += "<pwd>" + pwd + "</pwd>";
		xml += "<mobile>" + mobile + "</mobile>";
		xml += "<content>" + content + "</content>";
		xml += "<ext>" + ext + "</ext>";
		xml += "<stime>" + stime + "</stime>";
		xml += "<rrid>" + rrid + "</rrid>";
		xml += "<msgfmt>" + msgfmt + "</msgfmt>";
		xml += "</mdgxsend>";
		xml += "</soap:Body>";
		xml += "</soap:Envelope>";

		URL url;
		try {
			url = new URL(serviceURL);

			URLConnection connection = url.openConnection();
			HttpURLConnection httpconn = (HttpURLConnection) connection;
			ByteArrayOutputStream bout = new ByteArrayOutputStream();
			bout.write(xml.getBytes());
			byte[] b = bout.toByteArray();
			httpconn.setRequestProperty("Content-Length", String
					.valueOf(b.length));
			httpconn.setRequestProperty("Content-Type",
					"text/xml; charset=gb2312");
			httpconn.setRequestProperty("SOAPAction", soapAction);
			httpconn.setRequestMethod("POST");
			httpconn.setDoInput(true);
			httpconn.setDoOutput(true);

			OutputStream out = httpconn.getOutputStream();
			out.write(b);
			out.close();

			InputStreamReader isr = new InputStreamReader(httpconn
					.getInputStream());
			BufferedReader in = new BufferedReader(isr);
			String inputLine;
			while (null != (inputLine = in.readLine())) {
				Pattern pattern = Pattern.compile("<mdgxsendResult>(.*)</mdgxsendResult>");
				Matcher matcher = pattern.matcher(inputLine);
				while (matcher.find()) {
					result = matcher.group(1);
				}
			}
			return result;
		} catch (Exception e) {
			e.printStackTrace();
			return "";
		}
	}
	
	
	/**
	 * 方法名称:mdsmssend
	 * 功    能:发送短信 
	 * @param mobile 手机号
	 * @param content 内容
	 * @param ext 扩展码
	 * @param stime 定时时间
	 * @param rrid 唯一标识
	 * @param msgfmt 内容编码
	 * @return 唯一标识,如果不填写rrid将返回系统生成的
	 */
	private String mdsmssend(String mobile, String content, String ext, String stime,
			String rrid,String msgfmt) {
		String result = "";
		String soapAction = "http://entinfo.cn/mdsmssend";
		String xml = "<?xml version=\"1.0\" encoding=\"utf-8\"?>";
		xml += "<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">";
		xml += "<soap:Body>";
		xml += "<mdsmssend  xmlns=\"http://entinfo.cn/\">";
		xml += "<sn>" + sn + "</sn>";
		xml += "<pwd>" + pwd + "</pwd>";
		xml += "<mobile>" + mobile + "</mobile>";
		xml += "<content>" + content + "</content>";
		xml += "<ext>" + ext + "</ext>";
		xml += "<stime>" + stime + "</stime>";
		xml += "<rrid>" + rrid + "</rrid>";
		xml += "<msgfmt>" + msgfmt + "</msgfmt>";
		xml += "</mdsmssend>";
		xml += "</soap:Body>";
		xml += "</soap:Envelope>";

		URL url;
		try {
			url = new URL(serviceURL);

			URLConnection connection = url.openConnection();
			HttpURLConnection httpconn = (HttpURLConnection) connection;
			ByteArrayOutputStream bout = new ByteArrayOutputStream();
			//bout.write(xml.getBytes());
			bout.write(xml.getBytes("GBK"));
			byte[] b = bout.toByteArray();
			httpconn.setRequestProperty("Content-Length", String
					.valueOf(b.length));
			httpconn.setRequestProperty("Content-Type",
					"text/xml; charset=gb2312");
			httpconn.setRequestProperty("SOAPAction", soapAction);
			httpconn.setRequestMethod("POST");
			httpconn.setDoInput(true);
			httpconn.setDoOutput(true);

			OutputStream out = httpconn.getOutputStream();
			out.write(b);
			out.close();

			InputStreamReader isr = new InputStreamReader(httpconn
					.getInputStream());
			BufferedReader in = new BufferedReader(isr);
			String inputLine;
			while (null != (inputLine = in.readLine())) {
				Pattern pattern = Pattern.compile("<mdsmssendResult>(.*)</mdsmssendResult>");
				Matcher matcher = pattern.matcher(inputLine);
				while (matcher.find()) {
					result = matcher.group(1);
				}
			}
			return result;
		} catch (Exception e) {
			e.printStackTrace();
			return "";
		}
	}
}

跟通信运营商开通发短信服务:

会有

"activationMobilePassword":   密码--通信运营商提供的
"activationMobileSn": 序列号--通信运营商提供的
"activationMobileUrl": 短信服务接口---通信运营商提供的

下面的是自己编辑的 短信的内容:验证码、
"activationMobileContent":"${verificationCode} (${schoolName}注册验证码,五分钟内有效)【${schoolName}】",
"forgotPasswordTitle":"${nickname},请重置您${schoolName}的登录密码",
"forgotPasswordContent":"Hi, ${nickname} \r



猜你喜欢

转载自blog.csdn.net/u010363836/article/details/49783377