java手机找回密码--阿里云发送验证码

0.前置条件

pom.xml新增

<!--短信验证  阿里云Start-->
<!-- https://mvnrepository.com/artifact/com.aliyun/aliyun-java-sdk-core -->
<dependency>
  <groupId>com.aliyun</groupId>
  <artifactId>aliyun-java-sdk-core</artifactId>
  <version>3.5.0</version>
</dependency>
<dependency>
  <groupId>com.aliyun</groupId>
  <artifactId>aliyun-java-sdk-dysmsapi</artifactId>
  <version>1.0.0</version>
</dependency>
<!--短信验证  阿里云End-->
2.基本数据输入

java手机找回密码--阿里云发送验证码

//提交,最终验证。
var isSure = true;
$('#submit2').click(function(){
    $(".find-form2 :input").trigger('blur');
    if(isSure){
        isSure = false;
        var myphone = $("#myphone").val();
        var validateCode = $("#validateCode").val();
        var newPwd = $("#newPwd").val();
        $.ajax({
            url: "/user/foundPWDByTel",
            type: 'post',
            dataType: "json",
            data: {myphone:myphone,validateCode:validateCode,newPwd:md5(newPwd)},
            cache: false,
            async: false,
            success: function (data) {
                isSure = true;
                if (data.code == 0) {
                    alert("短信验证码有误,找回密码失败");
                } else if(data.code == 1) {
                    alert("新密码已生效,请重新登录");
                    window.location.href="/user/weblogout";
                } else if(data.code == 2) {
                    alert("手机号信息有误,找回密码失败");
                    window.location.href="/user/weblogout";
                }else {
                    alert("系统错误,找回密码失败");
                }
            },
            error: function (data) {
               isSure = true;
               alert("系统错误,找回密码失败");
            }
        });
        
    }
});
3.发送验证码

var count = 60;
var isSuccess = true;
$(".btn-send").click(function(){
    var myphone = $("#myphone").val();
    if( myphone=="" || ( myphone!="" && !/^1[3|4|5|7|8][0-9]{9}$/.test(myphone) ) ){
        $("#myphone").focus();
    }else{
        setTime(count);
        // 向后台发送处理数据
        $.ajax({
            url: "/user/aliyunSms",
            type: 'post',
            dataType: "json",
            data: {phone:myphone},
            cache: false,
            async: false,
            success: function (data){
                if(data.code == 1){
                    document.getElementById("showHtml").innerHTML = '<span style="color:green;">√ 短信验证码已发到您的手机,请查收</span>';
                }else if(data.code == 2){
                    document.getElementById("showHtml").innerHTML = '<span style="color:red;">该手机号在系统中不存在,请注册后登录系统</span>';
                    isSuccess = false;
                }else{
                    document.getElementById("showHtml").innerHTML = '<span style="color:red;">× 短信验证码发送失败,请重新发送</span>';
                    isSuccess = false;
                }
                $("#showHtml").fadeIn(2000);
            },
            error: function () {
            }
        });
    }
});

function setTime(val){
    var $send = $(".btn-send");
    if(val == 0 || !isSuccess){
        $send.html("重新发送").attr("disabled",false);
        count = 60;
        isSuccess = true;
    }else{
        $send.html(count + " s").attr("disabled",true);
        count--;
        setTimeout(function(){
            setTime(count);
        },1000)
    }
}

验证码发送后台:

/**
 * 验证手机短信是否发送成功
 *
 * @throws Exception
 */
@RequestMapping(value = "/aliyunSms", method = RequestMethod.POST)
@ResponseBody
public HashMap aliyunSms(HttpServletRequest request) throws Exception {
    String result = "0";
    HashMap map = new HashMap();
    /** 手机号码 */
    String phone = request.getParameter("phone");
    String type = request.getParameter("type");//0:未注册,其他:已注册
    Integer telphoneCount =  usersService.isExistByTel(phone);
    if((!"0".equals(type) && telphoneCount>0) || ("0".equals(type)&& telphoneCount==0)){
        /** 短信验证码 */
        String code = (int)((Math.random()*9+1)*100000) +"";
        /** 短信验证码存入session(session的默认失效时间30分钟) ,session失效时间*/
        request.getSession().setAttribute("code", code);
        request.getSession().setAttribute("codeTel", phone);
        //发短信
        SendSmsResponse response = AliyunSms.sendSms(code,phone);//阿里云接口发送验证码
        if(response.getCode() != null && "OK".equals(response.getCode())){//发送成功
            result = "1";
        }
    }else{
        result = "2";
    }
    map.put("code", result);
    return map;
}
/**
 * 阿里云接口发送验证码
 *
 * @throws Exception
 */
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.dysmsapi.model.v20170525.QuerySendDetailsRequest;
import com.aliyuncs.dysmsapi.model.v20170525.QuerySendDetailsResponse;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * Created by zhangluzhen on 2017/11/22.
 */
public class AliyunSms {
    //产品名称:云通信短信API产品,开发者无需替换
    static final String PRODUCT = "Dysmsapi";
    //产品域名,开发者无需替换
    static final String DOMAIN = "dysmsapi.aliyuncs.com";

    // TODO 此处需要替换成开发者自己的AK(在阿里云访问控制台寻找)
    static final String ACCESS_KEY_ID = "XXXXXX";
    static final String ACCESS_KEY_SECRET = "XXXXXX";

    public static SendSmsResponse sendSms(String code,String telphone) throws ClientException {

        //可自助调整超时时间
        System.setProperty("sun.net.client.defaultConnectTimeout", "60000");
        System.setProperty("sun.net.client.defaultReadTimeout", "60000");

        //初始化acsClient,暂不支持region化
        IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", ACCESS_KEY_ID, ACCESS_KEY_SECRET);
        DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", PRODUCT, DOMAIN);
        IAcsClient acsClient = new DefaultAcsClient(profile);

        //组装请求对象-具体描述见控制台-文档部分内容
        SendSmsRequest request = new SendSmsRequest();
        //必填:待发送手机号
        request.setPhoneNumbers(telphone);
        //必填:短信签名-可在短信控制台中找到
        request.setSignName("XXXXXX");
        //必填:短信模板-可在短信控制台中找到
        request.setTemplateCode("XXXXXX");
        //可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为
        request.setTemplateParam("{\"code\":\""+code+"\"}");

        //选填-上行短信扩展码(无特殊需求用户请忽略此字段)
        //request.setSmsUpExtendCode("90997");

        //可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者
        request.setOutId("yourOutId");

        //hint 此处可能会抛出异常,注意catch
        SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);

        return sendSmsResponse;
    }


    public static QuerySendDetailsResponse querySendDetails(String bizId,String telphone) throws ClientException {

        //可自助调整超时时间
        System.setProperty("sun.net.client.defaultConnectTimeout", "60000");
        System.setProperty("sun.net.client.defaultReadTimeout", "60000");

        //初始化acsClient,暂不支持region化
        IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", ACCESS_KEY_ID, ACCESS_KEY_SECRET);
        DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", PRODUCT, DOMAIN);
        IAcsClient acsClient = new DefaultAcsClient(profile);

        //组装请求对象
        QuerySendDetailsRequest request = new QuerySendDetailsRequest();
        //必填-号码
        request.setPhoneNumber(telphone);
        //可选-流水号
        request.setBizId(bizId);
        //必填-发送日期 支持30天内记录查询,格式yyyyMMdd
        SimpleDateFormat ft = new SimpleDateFormat("yyyyMMdd");
        request.setSendDate(ft.format(new Date()));
        //必填-页大小
        request.setPageSize(10L);
        //必填-当前页码从1开始计数
        request.setCurrentPage(1L);

        //hint 此处可能会抛出异常,注意catch
        QuerySendDetailsResponse querySendDetailsResponse = acsClient.getAcsResponse(request);

        return querySendDetailsResponse;
    }

    public static void main(String[] args) throws ClientException, InterruptedException {

        //发短信
        SendSmsResponse response = sendSms("123456","15800000000");
        System.out.println("短信接口返回的数据----------------");
        System.out.println("Code=" + response.getCode());
        System.out.println("Message=" + response.getMessage());
        System.out.println("RequestId=" + response.getRequestId());
        System.out.println("BizId=" + response.getBizId());

        Thread.sleep(3000L);

        //查明细
        if(response.getCode() != null && "OK".equals(response.getCode())) {
            QuerySendDetailsResponse querySendDetailsResponse = querySendDetails(response.getBizId(),"15800000000");
            System.out.println("短信明细查询接口返回数据----------------");
            System.out.println("Code=" + querySendDetailsResponse.getCode());
            System.out.println("Message=" + querySendDetailsResponse.getMessage());
            int i = 0;
            for(QuerySendDetailsResponse.SmsSendDetailDTO smsSendDetailDTO : querySendDetailsResponse.getSmsSendDetailDTOs())
            {
                System.out.println("SmsSendDetailDTO["+i+"]:");
                System.out.println("Content=" + smsSendDetailDTO.getContent());
                System.out.println("ErrCode=" + smsSendDetailDTO.getErrCode());
                System.out.println("OutId=" + smsSendDetailDTO.getOutId());
                System.out.println("PhoneNum=" + smsSendDetailDTO.getPhoneNum());
                System.out.println("ReceiveDate=" + smsSendDetailDTO.getReceiveDate());
                System.out.println("SendDate=" + smsSendDetailDTO.getSendDate());
                System.out.println("SendStatus=" + smsSendDetailDTO.getSendStatus());
                System.out.println("Template=" + smsSendDetailDTO.getTemplateCode());
            }
            System.out.println("TotalCount=" + querySendDetailsResponse.getTotalCount());
            System.out.println("RequestId=" + querySendDetailsResponse.getRequestId());
        }

    }
}

4.获取验证码,修改密码(后台)

/**
 * 手机修改新密码
 *
 * @throws Exception
 */
@RequestMapping(value = "/foundPWDByTel", method = RequestMethod.POST)
@ResponseBody
public HashMap foundPWDByTel(HttpServletRequest request) throws Exception {
    String result = "0";
    HashMap map = new HashMap();
    /** 手机号码 */
    String myphone = request.getParameter("myphone");
    /** 短信验证码 */
    String validateCode = request.getParameter("validateCode");
    /** 新密码MD5已加密 */
    String newPwd = request.getParameter("newPwd");
    /** 短信验证码存入session(session的默认失效时间30分钟) */
    String code = request.getSession().getAttribute("code")+"";
    String codeTel = request.getSession().getAttribute("codeTel")+"";
    if(validateCode.equals(code)){
        if(codeTel.equals(myphone)){
            result = userService.foundPWDByTel(newPwd,myphone);
        }else{
            result = "2";
        }
    }
    map.put("code", result);
    return map;
}