短信登录接口-web
说明
部署后,小程序是没有session概念的,所以仅适用web端,小程序看另一篇
pom.xml
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.0.3</version>
</dependency>
application.yml
sms:
aliyun:
accessKeyId: LTAI4*****
accessSecret: PFY0r8*****
#签名通用版版,测试版只能发验证码
signName: 楚***
#登录
templateCode:
#登录
login: SMS_188****
#派单
order: SMS_189*****
RestSmsController.java
package com.ruoyi.api.sms.controller;
import com.ruoyi.api.sms.service.IRestSmsService;
import com.ruoyi.framework.web.controller.BaseController;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import java.util.Map;
/**
* @author wangjiao
* @version 1.0
* @date 2020/4/28
*/
@Api(tags = "短信相关接口")
@RestController
@RequestMapping("/rest/sms")
@Slf4j
public class RestSmsController extends BaseController {
@Autowired
private IRestSmsService service;
@ApiOperation(value = "发送登录短信验证码", notes = "所有参数必填,验证码3分钟有效,3分钟内不能重复发送")
@ApiImplicitParams({
@ApiImplicitParam(name = "openId", value = "微信openId"),
@ApiImplicitParam(name = "userMobile", value = "手机号")
})
@PostMapping("/sendCode")
@ResponseBody
public Map<String, Object> sendCode(String openId,String userMobile, HttpServletRequest request) {
return service.sendSmsLogin(openId,userMobile,request);
}
@ApiOperation(value = "验证登录短信验证码", notes = "所有参数必填,验证码3分钟有效,3分钟内不能重复发送")
@ApiImplicitParams({
@ApiImplicitParam(name = "openId", value = "微信openId"),
@ApiImplicitParam(name = "userMobile", value = "手机号"),
@ApiImplicitParam(name = "code", value = "短信验证码")
})
@PostMapping("/verifyCode")
@ResponseBody
public Map<String, Object> verifyCode(String openId, String userMobile, String code, HttpServletRequest request) {
return service.verifySmsLogin(openId,userMobile,code,request);
}
}
IRestSmsService.java
package com.ruoyi.api.sms.service;
import javax.servlet.http.HttpServletRequest;
import java.util.Map;
/**
* @author wangjiao
* @version 1.0
* @date 2020/4/28
*/
public interface IRestSmsService {
Map<String,Object> sendSmsLogin(String openId, String userMobile, HttpServletRequest request);
Map<String,Object> verifySmsLogin(String openId, String userMobile, String code, HttpServletRequest request);
}
RestSmsServiceImpl.java
package com.ruoyi.api.sms.service;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Maps;
import com.ruoyi.admin.wechat.service.IEpWechatUserService;
import com.ruoyi.api.sms.util.SendSms;
import com.ruoyi.api.wechat.domain.EpWechatUser;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.Map;
import java.util.Objects;
/**
* @author wangjiao
* @version 1.0
* @date 2020/4/28
*/
@Service
public class RestSmsServiceImpl implements IRestSmsService {
@Value("${sms.aliyun.accessKeyId}")
public String accessKeyId;
@Value("${sms.aliyun.accessSecret}")
public String accessSecret;
@Value("${sms.aliyun.signName}")
public String signName;
@Value("${sms.aliyun.templateCode.login}")
public String templateCode_login;
@Autowired
private IEpWechatUserService service;
@Override
public Map<String, Object> sendSmsLogin(String openId, String userMobile, HttpServletRequest request) {
if (StringUtils.isBlank(openId)) {
Map<String, Object> map = Maps.newHashMap();
map.put("Code", "203");
map.put("Message", "发送失败,openId不能为空");
return map;
}
//三分钟内不能重复发送
StringBuilder sessionKey = new StringBuilder();
sessionKey.append(openId);
sessionKey.append("_");
sessionKey.append(userMobile);
HttpSession session = request.getSession();
Object sessionObj = session.getAttribute(sessionKey.toString());
if (Objects.nonNull(sessionObj)) {
JSONObject sessionJson = JSON.parseObject(sessionObj.toString());
Long nowTime = System.currentTimeMillis();
Long SendTime = sessionJson.getLong("SendTime");
if ((nowTime - SendTime) < (1000 * 60 * 3)) {
Map<String, Object> map = Maps.newHashMap();
map.put("Code", "203");
map.put("Message", "发送失败,3分钟内不能重复发送");
return map;
}else{
//超时移除session
session.removeAttribute(sessionKey.toString());
}
}
//验证成功,发送短信
JSONObject resultJson = SendSms.sendSmsLogin(userMobile, accessKeyId, accessSecret, signName, templateCode_login);
if (Objects.equals(resultJson.get("Code"), "200")) {
//将验证码和发送时间戳存入session
sessionKey = new StringBuilder();
sessionKey.append(openId);
sessionKey.append("_");
sessionKey.append(userMobile);
JSONObject sessionJson = new JSONObject();
sessionJson.put("SmsCode", resultJson.get("SmsCode"));
sessionJson.put("SendTime", resultJson.get("SendTime"));
session.setAttribute(sessionKey.toString(), sessionJson);
}
return resultJson;
}
@Override
public Map<String, Object> verifySmsLogin(String openId, String userMobile, String code, HttpServletRequest request) {
Map<String, Object> map = Maps.newHashMap();
if (StringUtils.isBlank(openId) || StringUtils.isBlank(userMobile) || StringUtils.isBlank(code)) {
map.put("code", 201);
map.put("msg", "必填参数不能为空");
return map;
}
//1、验证用户
EpWechatUser entity = service.selectEntityByOpenId(openId);
if (Objects.isNull(entity)) {
map = Maps.newHashMap();
map.put("code", 202);
map.put("msg", "不存在该用户");
return map;
}
//2、验证短信验证码
StringBuilder sessionKey = new StringBuilder();
sessionKey.append(openId);
sessionKey.append("_");
sessionKey.append(userMobile);
HttpSession session = request.getSession();
Object sessionObj = session.getAttribute(sessionKey.toString());
if (Objects.isNull(sessionObj)) {
map = Maps.newHashMap();
map.put("code", 203);
map.put("msg", "没有验证码,请重新发送");
return new JSONObject(map);
}
JSONObject sessionJson = JSON.parseObject(sessionObj.toString());
Long nowTime = System.currentTimeMillis();
Long SendTime = sessionJson.getLong("SendTime");
if ((nowTime - SendTime) > (1000 * 60 * 3)) {
map = Maps.newHashMap();
map.put("code", 203);
map.put("msg", "验证码已超时,请重新发送");
return new JSONObject(map);
}
String SmsCode = sessionJson.getString("SmsCode");
if (Objects.isNull(SmsCode)) {
map = Maps.newHashMap();
map.put("code", 203);
map.put("msg", "验证码已失效,请重新发送");
return new JSONObject(map);
}
if (!Objects.equals(SmsCode, code)) {
map = Maps.newHashMap();
map.put("code", 204);
map.put("msg", "验证码有误,请重试");
return new JSONObject(map);
}
//2、更新用户信息
entity.setUserMobile(userMobile);
int result = service.updateEntity(entity);
if (result > 0) {
session.removeAttribute(sessionKey.toString());
map = Maps.newHashMap();
map.put("code", 200);
map.put("msg", "绑定成功");
map.put("data", entity);
return map;
}
map = Maps.newHashMap();
map.put("code", 205);
map.put("msg", "绑定账号失败");
return map;
}
}