import com.alibaba.fastjson.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.StringUtils;
import javax.servlet.http.HttpServletRequest;
import java.text.MessageFormat;
public class SmsUtil {
private static Logger logger = LoggerFactory.getLogger(SmsUtil.class);
public static final int smsFlag =1; //1:发送短信 0:不发送短信
private static final String smsUrl = "http: //sms.253.com/msg/send";
private static final String user = "******";
private static final String pwd = "******";
/**
* 发送短信验证码
*
* @param phoneNum
* @return
*/
public static JSONObject sendSmsCode(HttpServletRequest request, String phoneNum) {
if(StringUtils.isEmpty(phoneNum)){
logger.error(String.format("发送短信失败,手机号:%s",phoneNum));
}
String verifyCode = RandomSeriUtil.genRandoms();
String smsTxt = String.format(Constants.SMSMODEL_VERIFYSMSCODE, verifyCode);
try {
String url = new StringBuffer(smsUrl).append("?un={0}&pw={1}&phone={2}&msg={3}&rd=1").toString();
/*try {
URLEncoder.encode(RandomSeriUtil.formatStr(smsContent, RandomSeriUtil.genRandoms()), "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}*/
String urlParam = MessageFormat.format(url, user, pwd, phoneNum, smsTxt);
if (smsFlag == 1) {
String smsResp = HttpTool.httpGetRequest(urlParam);
if (smsResp.contains(String.valueOf(ConstVar.ZERO))) {
SessionUtil.setAttr(request, Constants.SMSCODE_KEY, verifyCode + Constants.GLOBAL_DEFAULT_FENFGEFU + System.currentTimeMillis() + Constants.GLOBAL_DEFAULT_FENFGEFU + phoneNum);
return RespMsg.SUCCESS();
}
} else {
logger.info("接收手机:" + phoneNum + "验证码内容:" + smsTxt);
SessionUtil.setAttr(request, Constants.SMSCODE_KEY, verifyCode + Constants.GLOBAL_DEFAULT_FENFGEFU + System.currentTimeMillis() + Constants.GLOBAL_DEFAULT_FENFGEFU + phoneNum);
return RespMsg.SUCCESS();
}
} catch (Exception e) {
logger.error(String.format("发送短信失败,手机号:%s******短信内容:%s",phoneNum,smsTxt));
e.printStackTrace();
}
return RespMsg.FAIL("获取验证码错误");
}
/**
* 发送短信
*
* @param phoneNum
* @return
*/
public static JSONObject sendSmsMessage(String phoneNum,String message) {
try {
String url = new StringBuffer(smsUrl).append("?un={0}&pw={1}&phone={2}&msg={3}&rd=1").toString();
String urlParam = MessageFormat.format(url, user, pwd, phoneNum, message);
if (smsFlag == 1) {
String smsResp = HttpTool.httpGetRequest(urlParam);
if (smsResp.contains(String.valueOf(ConstVar.ZERO))) {
return RespMsg.SUCCESS();
}
} else {
logger.info("接收手机:" + phoneNum + "验证码内容:" + message);
return RespMsg.SUCCESS();
}
} catch (Exception e) {
logger.error(String.format("发送短信失败,手机号:%s******短信内容:%s",phoneNum,message));
}
return RespMsg.FAIL("发送短信消息错误");
}
/**
* 校验验证码
*
* @param request
* @param verifyCode
* @return
*/
public static boolean verifySmsCode(HttpServletRequest request, String verifyCode,String phoneNum) {
String codeStr = (String) SessionUtil.getAttrs(request, Constants.SMSCODE_KEY);
//未发送验证码
if (StringUtils.isEmpty(codeStr) || StringUtils.isEmpty(verifyCode) || StringUtils.isEmpty(phoneNum)) {
return false;
}
try{
String localCode = codeStr.split(Constants.GLOBAL_DEFAULT_FENFGEFU)[0];
long timeSpan = Long.valueOf(codeStr.split(Constants.GLOBAL_DEFAULT_FENFGEFU)[1]);
String phone = codeStr.split(Constants.GLOBAL_DEFAULT_FENFGEFU)[2];
int diff = (int) (System.currentTimeMillis() - timeSpan) / (1000 * 60);
//验证码过期,删除本地缓存
if (diff >= Constants.SMS_CODE_EFFECTIVE_TIME) {
SessionUtil.removeCacheInfo(request, Constants.SMSCODE_KEY);
return false;
}
if (!verifyCode.equals(localCode) || !phoneNum.equals(phone)) {
return false;
}
//验证通过,删除本地缓存
SessionUtil.removeCacheInfo(request, Constants.SMSCODE_KEY);
return true;
}catch (Exception e){
logger.error(e.getMessage());
return false;
}
}
/**
* 注册码发送频率验证
*
* @param request
* @return
*/
public static boolean verifyFrequency(HttpServletRequest request) {
String codeStr = (String) SessionUtil.getAttrs(request, Constants.SMSCODE_KEY);
//未发送验证码
if (StringUtils.isEmpty(codeStr)) {
return true;
}
long timeSpan = Long.valueOf(codeStr.split(Constants.GLOBAL_DEFAULT_FENFGEFU)[1]);
int diff = (int) (System.currentTimeMillis() - timeSpan) / (1000 * 60);
//距上次申请时间超过1分钟
if (diff >= 1) {
return true;
}
return false;
}
public static void main(String[] args) {
sendSmsMessage("******","*********");
}
}
1、注册253短信账号,购买服务,获取api地址、账号和密码
2、绑定发送短信的ip、白名单