- 使用阿里云短信接口则需要通过阿里云平台获取一些参数
- 如果没有对应key值的需要自己创建新的key
- 添加签名和对应自己的模板
- 在项目如添加maven依赖包
<!--阿里云短信-->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.0.6</version> <!-- 注:如提示报错,先升级基础包版,无法解决可联系技术支持 -->
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-dysmsapi</artifactId>
<version>1.1.0</version>
</dependency>
- 编写实例代码
/**
* 短信统一发送
* @param tel 手机号
* @param templateCode 模板id 对应阿里云后台模板
* @return
* @throws ClientException
*/
@Override
public Map<String, Object> getVerifyCodeLast(String tel, String templateCode, HttpServletRequest request) {
Map<String, Object> map = chekTel(request, tel);
if(map.get("status").equals(true)){
SendSmsResponse sendSmsResponse = null;
try {
//可自助调整超时时间
System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
System.setProperty("sun.net.client.defaultReadTimeout", "10000");
//初始化acsClient,暂不支持region化
//初始化acsClient,暂不支持region化
IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", Constants.accessKeyId, Constants.accessKeySecret);
DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", Constants.product, Constants.domain);
IAcsClient acsClient = new DefaultAcsClient(profile);
//组装请求对象-具体描述见控制台-文档部分内容
SendSmsRequest sendSmsRequest = new SendSmsRequest();
//必填:待发送手机号
sendSmsRequest.setPhoneNumbers(tel);
//必填:短信签名-可在短信控制台中找到
sendSmsRequest.setSignName(“替换自己的短信签名”);
//必填:短信模板-可在短信控制台中找到
sendSmsRequest.setTemplateCode(templateCode);
//可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为
//随机生成6位数短信验证码
String code = Constants.getCode(6);
Map<String, Object> resultMap = new HashMap<>();
resultMap.put("code", code);
JSONObject o = (JSONObject)JSONObject.toJSON(resultMap);
String str = o.toString();
sendSmsRequest.setTemplateParam(str);
//选填-上行短信扩展码(无特殊需求用户请忽略此字段)
//request.setSmsUpExtendCode("90997");
//可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者
sendSmsRequest.setOutId("yourOutId");
//hint 此处可能会抛出异常,注意catch
sendSmsResponse = null;
try {
sendSmsResponse = acsClient.getAcsResponse(sendSmsRequest);
} catch (ClientException e) {
e.printStackTrace();
}
//通过session记录短信验证码 手机号等 后期与前台传来一同教验
request.getSession().setAttribute(Constants.SESSION_PHONE_CODE,code);
request.getSession().setAttribute(Constants.SERVER_TIME,new Date());
request.getSession().setAttribute(Constants.SESSION_PHONE_NUMBER,tel);
System.out.println("SESSION_PHONE_CODE="+request.getSession().getAttribute(Constants.SESSION_PHONE_CODE)+
",SERVER_TIME="+request.getSession().getAttribute(Constants.SERVER_TIME)+
",SESSION_PHONE_NUMBER="+request.getSession().getAttribute(Constants.SESSION_PHONE_NUMBER));
//入库短信记录
MessageLog messageLog = new MessageLog();
messageLog.setCreateAt(new Date());
messageLog.setPhone(tel);
messageLog.setContent(code);
messageLog.setSendId(FilterContextHandler.getUserId());
messageLog.setIpAddress(TCPIPUtil.getIpAddr(request));
messageLog.setModuleId(templateCode);
if(sendSmsResponse.getCode().equals("OK")) {
messageLog.setStatus(DicEnum.短信发送_成功.getCode());
}else{
messageLog.setStatus(DicEnum.短信发送_失败.getCode());
}
messageLogDao.insertSelective(messageLog);
if(sendSmsResponse.getCode().equals("OK")){
map.put("status",true);
map.put("msg","短信发送成功");
} else {
map.put("status",false);
map.put("msg",sendSmsResponse.getMessage());
}
} catch (ClientException e) {
e.printStackTrace();
map.put("status",false);
map.put("msg","短信发送失败--no");
return map;
}
}
return map;
}
校验短信一些流程 可更具自己条件添加
/**
* 短信校验 是否合格
* @param request
* @param tel
* @return
*/
private Map<String,Object> chekTel(HttpServletRequest request,String tel){
Map<String, Object> map = new HashMap<>();
if(tel == null || "".equals(tel) || !Utils.isPhone(tel)) {
map.put("msg", "手机号不正确");
map.put("status", false);
return map;
}
//获取发送短信的ip地址
String ip = TCPIPUtil.getIpAddr(request);
logger.debug("发送短信验证码,IP地址:" + ip + "手机号码:" + tel);
//判断是否达到短信发送时间间隔
int intervalTime = 60;//若没有设置,则默认60秒
SysParam param = sysParamDao.selectOne(SysParam.builder().paramIndex(Constants.SMS_SEND_SMS_INTERVAL_TIME).build());
if(param != null) {
intervalTime = Integer.valueOf(param.getParamValue());
}
Calendar cal = Calendar.getInstance();
cal.add(Calendar.SECOND, - intervalTime);
MessageLog messageLog = new MessageLog();
messageLog.setCreateAt(cal.getTime());
messageLog.setPhone(tel);
long count = messageLogDao.getCount(messageLog);
//获取是否过于频繁
if(count > 0){
logger.debug("短信发送过于频繁,请" + intervalTime + "秒再稍后尝试");
map.put("msg", "短信发送过于频繁,请" + intervalTime + "秒再稍后尝试");
map.put("status", false);
return map;
}
//判断是否被设置了IP黑名单
if(ip != null && !"".equals(ip)) {
param = sysParamDao.selectOne(SysParam.builder().paramIndex(Constants.SMS_BLACK_NAME_LIST_OF_IP).build());
if(param != null && param.getParamValue() != null && param.getParamValue().contains(ip)) {
logger.debug("您的IP已禁用,请联系客服");
map.put("msg", "您的IP已禁用,请联系客服");
map.put("status", false);
return map;
}
}
//判断是否被设置了手机号黑名单
param = sysParamDao.selectOne(SysParam.builder().paramIndex(Constants.SMS_BLACK_NAME_LIST_OF_PHONE).build());
if(param != null && param.getParamValue() != null && param.getParamValue().contains(tel)) {
logger.debug( "您的手机号已禁用,请联系客服");
map.put("msg", "您的手机号已禁用,请联系客服");
map.put("status", false);
return map;
}
//判断是否达到IP发送短信上限
cal.add(Calendar.SECOND, intervalTime);
cal.add(Calendar.DAY_OF_YEAR, -1);
messageLog.setCreateAt(cal.getTime());
if(ip != null && !"".equals(ip)) {
param = sysParamDao.selectOne(SysParam.builder().paramIndex(Constants.SMS_PER_IP_SMS_MAX_NUM).build());
if(param != null) {
messageLog.setIpAddress(ip);
count = messageLogDao.getCount(messageLog);
if(count > Integer.valueOf(param.getParamValue()) - 1) {
logger.debug( "您的IP在24小时内已超过访问累计上限");
map.put("msg", "您的IP在24小时内已超过访问累计上限");
map.put("status", false);
return map;
}
}
}
//判断是否达到手机号发送短信上限
param = sysParamDao.selectOne(SysParam.builder().paramIndex(Constants.SMS_PER_PHONE_SMS_MAX_NUM).build());
if(param != null) {
messageLog.setPhone(tel);
count = messageLogDao.getCount(messageLog);
if(count > Integer.valueOf(param.getParamValue()) - 1) {
logger.debug( "您的手机号在24小时内已超过访问累计上限");
map.put("msg", "您的手机号在24小时内已超过访问累计上限");
map.put("status", false);
return map;
}
}
map.put("status", true);
return map;
}
至此就完成了