接入短信平台(云片)实现短信更改密码(登陆同流程)

云片开发文档

https://www.yunpian.com/official/document/sms/zh_CN/scene/smsverify

SDK整合

pom依赖

        <dependency>
            <groupId>com.yunpian.sdk</groupId>
            <artifactId>yunpian-java-sdk</artifactId>
            <version>1.2.7</version>
        </dependency>

发送短信工具类

import com.yunpian.sdk.YunpianClient;
import com.yunpian.sdk.model.Result;
import com.yunpian.sdk.model.SmsSingleSend;

import java.util.HashMap;
import java.util.Map;

/**
 * 短信工具包
 */
public class MessageUtil {

    private static final String APIKEY = "this is yunpian apikey";

    /**]
     * 发送短信
     * @param code      验证码
     * @param phone     手机号
     */
    public static Map sendCodeMessage(String code, String phone){
        Map res = new HashMap();
        //初始化clnt,使用单例方式
        YunpianClient clnt = new YunpianClient(APIKEY).init();
        //发送短信API
        Map<String, String> param = clnt.newParam(2);
        param.put(YunpianClient.MOBILE, phone);
        param.put(YunpianClient.TEXT, "【夲家信息技术】您的验证码是"+code+"。如非本人操作,请忽略本短信");
        Result<SmsSingleSend> r = clnt.sms().single_send(param);
        //获取返回结果,返回码:r.getCode(),返回码描述:r.getMsg(),API结果:r.getData(),其他说明:r.getDetail(),调用异常:r.getThrowable()
        //账户:clnt.user().* 签名:clnt.sign().* 模版:clnt.tpl().* 短信:clnt.sms().* 语音:clnt.voice().* 流量:clnt.flow().* 隐私通话:clnt.call().*
        //释放clnt
        res.put("code",r.getCode());
        res.put("msg",r.getMsg());
        clnt.close();
        return res;
    }

    public static void main(String[] args) {
        Map map = sendCodeMessage("123456", "15011111111");
        System.out.println(map);
    }

}

至此,可以发送短信至手机

短信修改密码

前端展示

业务流程

前端调用获取验证码接口,填入验证码和手机号新密码一起请求修改密码接口。

开发前准备

准备一个全局Map容器就,用于保存下发的验证码、手机号和验证码生效时间

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.Map;

/**
 * 全局变量
 */
@Configuration
@Component
@ConfigurationProperties(prefix ="param")
public class GlobalVar {
    private Map<String,String> map = new HashMap<>();

    public Map<String, String> getMap() {
        return map;
    }

    public void setMap(Map<String, String> map) {
        this.map = map;
    }
}

获取验证码

    @Resource
    private GlobalVar globalVar;

    /**
     * 发送验证码
     * @param request   phone手机号
     */
    @RequestMapping("/getMessageCode")
    public Map getMessageCode(HttpServletRequest request) {
        return sendCode(request.getParameter("phone"));
    }

    /**
     * 发送验证码
     * @param phone 手机号
     */
    public Map sendCode(String phone) {
        if (phone == null || phone.length() < 1) {
            return fail("手机号错误");
        }
        boolean flag = globalVar.getMap().containsKey("_" + phone);
        if (!flag || (flag && TimeUtil.comparaCurrentTime(globalVar.getMap().get(("_" + phone)), 60))) {
           String code = CommonUtil.getCode(6);
           Map map = MessageUtil.sendCodeMessage(code, phone);
           if (map.get("code").equals(0)) {
               globalVar.getMap().put(phone, code);//验证码
               globalVar.getMap().put("_" + phone, TimeUtil.getTimeYMDHMS());//生效时间
               return successMsg("发送成功");
           }
           return fail(map.get("msg").toString());
        }
        return fail("验证码发送过于频繁,请稍后再试");
    }

修改密码

/**
     * 修改密码
     * @param request   phone手机号、code验证码、password新密码、passwords再次输入密码
     */
    @RequestMapping("/passwordEdit")
    public Map passwordEdit(HttpServletRequest request) {
        if (isNull(request, "phone", "code", "password", "passwords")) {
            return fail("缺少参数");
        }
        String password = request.getParameter("password");
        String passwords = request.getParameter("passwords");
        if (!password.equals(passwords)) {
            return fail("二次输入密码不一致");
        }
        //通过获取servlet中的访问用户id去数据库中获取用户信息
        MobileUser mobileUser = mobileUserService.getById(getMobileUserId(request));
        if (mobileUser == null) {
            return fail("未获取到用户信息");
        }
        String phone = request.getParameter("phone");
        if (!mobileUser.getPhone().equals(phone)) {
            return fail("输入的手机号不是账户绑定手机号");
        }
        //验证码是否过期   是否与下发一致
        if (globalVar.getMap().containsKey("_" + phone) && !TimeUtil.comparaCurrentTime(globalVar.getMap().get(("_" + phone)), 60 * 5)
        && globalVar.getMap().containsKey(phone) && globalVar.getMap().get(phone).equals(request.getParameter("code"))) {
            mobileUser.setPassword(MD5Util.encrypt(password));
            if (mobileUserService.updateById(mobileUser)) {
                //清楚该手机号验证码相关
                globalVar.getMap().remove(phone);
                globalVar.getMap().remove("_" + phone);
                return success();
            } else {
                return fail("密码更改异常");
            }
        }
        return fail("验证码错误");
    }

接口文档

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章