短信登录接口-小程序登录

短信登录接口-小程序登录

说明

部署后,小程序是没有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.*;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
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 = "获取sessionId", notes = "小程序在Page_onReady获取服务器端的sessionId, 并存储到本地中,请求短信接口时在header中构造: \"Cookie\": sessionId")
    @GetMapping("/getSessionId")
    @ResponseBody
    public Object getSessionId(HttpServletRequest request) {
        try {
            HttpSession session = request.getSession();
            return session.getId();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    @ApiOperation(value = "发送短信登录验证码", notes = "所有参数必填,验证码3分钟有效,3分钟内不能重复发送,header中需携带\"Cookie\": sessionId")
    @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分钟内不能重复发送,header中需携带\"Cookie\": sessionId")
    @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;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值