Java 集成阿里云短信服务实现通过手机号码找回密码功能

A. 概述

首先明确一下目标:做一个通过手机验证找回(修改)账户密码的功能,例如:

在这里插入图片描述
流程大致如下:

1)用户输入手机号码
2)点击获取验证码(这时候前端有一些任务,如验证手机号格式,时间倒计时,按钮状态等等,这里只记录java部分)
3)后台验证手机号码是否属于且只属于某个账户,如果是生成验证码发送给该手机号并保存验证码、手机号、发送时间、有效时间为一条验证记录到数据库中等待验证
4)用户收到信息并将验证码输入,填写新密码后点击确认
5)后台验证用户提交的验证记录是否存在,如果存在,修改密码

这里记录的是后台的这两个接口。

B. 准备工作

a. 阿里云短信服务账户,AccessKey、短信模板、短信签名等,还需要在账户中存一点点钱或者买短信包。

在这里插入图片描述

在这里插入图片描述

b. 阿里云短信官方API 短信服务 > API参考 > 发送短信 > SendSms

C. 实现
  1. 依赖:
        <!-- 阿里云验证码使用SDK -->
        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>aliyun-java-sdk-core</artifactId>
            <version>4.5.0</version>
        </dependency>
  1. 配置信息:

在这里插入图片描述

  1. 获取验证码接口:
    @PreAuthorize("@el.check('anonymous')")
    @GetMapping("/sendMsg/{phone}")
    public String sendMsg(@PathVariable("phone") String phone) {
    
        // TODO 查找验证表中是否有当前手机号(如果系统有多种业务还要看当前业务)是否有仍在有效期的验证码记录

        String code;

        DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, secret);
        IAcsClient client = new DefaultAcsClient(profile);
        CommonRequest request = new CommonRequest();
        request.setSysMethod(MethodType.POST);
        request.setSysDomain("dysmsapi.aliyuncs.com");
        request.setSysVersion("2017-05-25");
        request.setSysAction("SendSms");
        request.putQueryParameter("RegionId", "cn-hangzhou");
        request.putQueryParameter("PhoneNumbers", phone);
        request.putQueryParameter("SignName", "——————");	// 短信签名的名称
        request.putQueryParameter("TemplateCode", "——————");	// 短信模板的模板CODE,格式大概是 SMS_***

        if( /* 验证表中存在当前手机号(当前业务)仍在有效期的验证码记录 */) {		
            try {
                code = RandomUtil.randomNumbers(6);	// 生成新的六位验证码
                request.putQueryParameter("TemplateParam", "{\"code\": \"" + code + "\"}");
                CommonResponse response = client.getCommonResponse(request);    // 发送短信

                JSONObject resp = JSON.parseObject(response.getData());
                if (resp.get("Code").toString().equals("OK") && resp.get("Message").toString().equals("OK")) {	// 发送成功
                    // TODO 保存验证码记录至数据库,包括手机号、验证码、(业务类型、)发送时间、有效时间
                    
                    return "success";
                }
            } catch (ClientException e) {
                e.printStackTrace();
            }
        } else {	// 如果有记录就不用生成新的验证码
            try {
                code = /* 从记录中获取code */;
                request.putQueryParameter("TemplateParam", "{\"code\": \"" + code + "\"}");
                CommonResponse response = client.getCommonResponse(request);    // 发送短信
                JSONObject resp = JSON.parseObject(response.getData());
                if (resp.get("Code").toString().equals("OK") && resp.get("Message").toString().equals("OK")) {
                	// 也不需要保存记录
                    return "success";
                }
            } catch (ClientException e) {
                e.printStackTrace();
            }
        }
        return "failed";
    }

在这里插入图片描述
在这里插入图片描述

  1. 提交修改密码接口:
    @PreAuthorize("@el.check('anonymous')")
    @PostMapping(value = "/findPass")
    public ResponseEntity findPass(@RequestBody Map<String, String> params){
       
        // TODO 根据params中的手机号、验证码(以及当前业务)和当前时间查找验证表是否有记录
       
        // TODO 如果存在,可以修改账户密码
        
        return new ResponseEntity(HttpStatus.OK);
    }
  • 4
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值