1.先在一些短信平台进行注册配置短信格式等等。
我的用的是秒嘀。
2.`package com.spring.test.SMS;
/**
-
系统常量
/
public class Config
{
/*- url前半部分
*/
public static final String BASE_URL = “https://api.miaodiyun.com/20150822”;
/**
- 开发者注册后系统自动生成的账号,可在官网登录后查看
*/
public static final String ACCOUNT_SID = “404fd80aae20476a9cc376007117bb70”;
/**
- 开发者注册后系统自动生成的TOKEN,可在官网登录后查看
*/
public static final String AUTH_TOKEN = “8e4fa096cd504ab9b57c097ada403cbd”;
/**
- 响应数据类型, JSON或XML
*/
public static final String RESP_DATA_TYPE = “json”;
}
- url前半部分
3.
package com.spring.test.SMS;
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 “×tamp=” + 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;
}
}
4.
package com.spring.test.SMS;
import java.net.URLEncoder;
-
import com.spring.test.SMS.Config;
import com.spring.test.SMS.HttpUtil;
import com.spring.test.redis.RedisUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
- 验证码通知短信接口
- @ClassName: IndustrySMS
- @Description: 验证码通知短信接口
*/
@Service(“industrySMS”)
public class IndustrySMS
{
@Autowired
private static RedisUtils redisUtils;
private static String operation = “/industrySMS/sendSMS”;
private static String accountSid = Config.ACCOUNT_SID;
private static String to = "17863051322";
private static String code = smsCode();
// 登录验证码:{1},如非本人操作,请忽略此短信。
private static String smsContent = "【欧阳科技】登录验证码:"+code+",如非本人操作,请忽略此短信。";
/**
* 验证码通知短信
*/
public static SMSDetail execute()
{
SMSDetail smsDetail =new SMSDetail();
smsDetail.setCode(code);
smsDetail.setTo(to);
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);
return smsDetail;
}
//创建验证码
public static String smsCode(){
String random=(int)((Math.random()*9+1)*100000)+"";
System.out.println("验证码:"+random);
return random;
}
}`
5.`package com.spring.test.SMS;
public class SMSDetail {
private String code;
private String to;
public String getTo() {
return to;
}
public void setTo(String to) {
this.to = to;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
}
6.
package com.spring.test.SMS;
import com.alibaba.fastjson.JSONObject;
import com.spring.test.Email.EmailDetail;
import com.spring.test.redis.RedisUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Scanner;
@Service(“pd”)
public class pd {
@Autowired
private static RedisUtils redisUtils;
public static void pd() {
Scanner input = new Scanner(System.in);
SMSDetail a = new SMSDetail();
System.out.println("请输入验证码:");
String code = input.next();
String sms = (String) redisUtils.get("SMS");
SMSDetail parse = JSONObject.parseObject(sms, SMSDetail.class);
if (code.equals(parse.getCode())) {
System.out.println("成功");
} else {
System.out.println("失败");
}
}
}`
这一部分主要是进行登陆判断。
首先要得到redis中缓存的验证码信息(这个信息是一个String类型的)
所以要将它解析成Object类型。
然后在根据对象的code进行判断。
6.package com.spring.test.SMS;
import com.alibaba.fastjson.JSON;
import com.spring.test.Email.SendEmail;
import com.spring.test.redis.RedisUtils;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test
{
/**
* @param args
*/
public static void main(String[] args)
{
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
context.start();
RedisUtils redisUtils = (RedisUtils) context.getBean("redisUtils");
redisUtils.set("SMS", JSON.toJSONString(IndustrySMS.execute()), 100L);
pd.pd();
}
}
`
注入bean,将发送的短信(Object类)进行缓存。
总结一下
将要发送的短信内容,发给谁等等封装成对象
根据秒嘀提供的api进行配置,主要是to ,url ,ACCOUNT SID,AUTH TOKEN.
短信内容存入redis中要进行类型转换。转换成json。
当进行判断验证码是否正确的时候,要取到Redis中的信息(根据key)并解析成对象。
redis这里代码不全以后慢慢写。