对接阿里云的短信接口发送手机验证码

最近做的项目涉及到对接阿里云的短信接口实现用户注册时发送验证码,我们在一个网站进行注册时要用到手机号获取验证码,这是很常见的操作。本篇博客记录如何对接阿里云的短信接口用手机号获取验证码,步骤如下:

1、对接阿里云短信接口的准备工作

上图的流程中,需要我们开发来弄的就是最后两步,其他的不用管,让上级去弄,调用接口要用到的配置性的东西,也向上级要就好了,当然可能你的上级不会直接给你,因为他根本不知道你需要哪些东西,那就向他要阿里云的账号,自己登陆进去找,接口文档如下:

https://help.aliyun.com/document_detail/55284.html

调用接口需要哪些东西,文档里都有,然后去对应的地方找到就好了,其中“短信服务控制台”由此进:

对接阿里云的短信接口发送手机验证码_第1张图片

2、对接阿里云短信接口相关逻辑以及代码

准备工作做好后,我们就可以正式对接接口了,思路如下:用户在页面填完手机号点击“获取验证码”后,调用controller,在这个controller里首先判断该号码是否已注册过,如果没注册过则随机生成一个验证码,存到Redis里(key为手机号,value为验证码),并将生成的验证码作为阿里短信模板的参数,然后根据阿里短信接口的返回值判断短信是否发送成功;用户提交注册信息后先根据手机号去Redis取验证码,判断用户输入的验证码是否正确,再做后面的逻辑

需导入的pom依赖:


    com.aliyun
    aliyun-java-sdk-core
    4.1.0

controller层代码:

    /**
     * 发送短信的接口
     * @author LiJun
     * @Date 2019/10/25
     * @Time 11:17
     * @param request
     * @return com.ue.core.util.JsonRespData
     */
    @RequestMapping(value = "sendSms",method = RequestMethod.POST)
    @ResponseBody
    @ApiOperation(value = "发送短信的接口",response = JsonRespData.class)
    @ApiImplicitParam(name = "phone",value = "手机号",required = true,paramType = "query")
    public JsonRespData sendSms(HttpServletRequest request){
        return agentEnlistService.sendSms(request);
    }

service层相关逻辑:

    /**
     * 发送短信的接口
     * @author LiJun
     * @Date 2019/10/25
     * @Time 11:16
     * @param request
     * @return com.ue.core.util.JsonRespData
     */
    public JsonRespData sendSms(HttpServletRequest request){
        try {
            String phone = request.getParameter("phone");//填写的手机号
            if (StringUtils.isBlank(phone)){
                return JsonRespData.fail(REQUEST_206,"号码不能为空");
            }
            if (BeanUtil.isNotBlank(userDao.getUserByPhone(phone))){
                return JsonRespData.fail(REQUEST_206,"该号码已被注册");
            }

            String state = AliSms.sendSms(phone);//调用短信接口
            log.info("调用短信接口后的返回值:" + state);
            if ("OK".equals(state)) {
                return JsonRespData.success(REQUEST_SUCCESS,"短信发送成功");
            }else if ("isv.BUSINESS_LIMIT_CONTROL".equals(state)) {
                return JsonRespData.fail(REQUEST_206,"短信发送过于频繁,请稍后再试");
            }else {
                return JsonRespData.fail(REQUEST_206,"短信发送失败,请稍后重试");
            }
        }catch (Exception e){
            log.error("调用短信接口出现异常:" + e);
            return JsonRespData.fail(INTERNAL_SERVER_ERROR,"服务器出现异常");
        }
    }

AliSms.java代码:

package com.ue.core.util;

import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;
import com.ue.core.common.Constant;
import redis.clients.jedis.Jedis;

/**
 * 调用短信接口
 * @author LiJun
 * @Date 2019年10月25日
 * @Time 10:43
 */
public class AliSms {
    public static String sendSms(String phone) throws ClientException {
        //设置超时时间-可自行调整
        System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
        System.setProperty("sun.net.client.defaultReadTimeout", "10000");

        //初始化ascClient需要的几个参数
        final String product = "Dysmsapi";//短信API产品名称(短信产品名固定,无需修改)
        final String domain = "dysmsapi.aliyuncs.com";//短信API产品域名(接口地址固定,无需修改)

        //替换成你的AK
        final String accessKeyId = Constant.ACCESSKEYID;//你的accessKeyId
        final String accessKeySecret = Constant.ACCESSKEYSECRET;//你的accessKeySecret
        //初始化ascClient,暂时不支持多region(请勿修改)
        IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret);
        DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);
        IAcsClient acsClient = new DefaultAcsClient(profile);
        //组装请求对象
        SendSmsRequest request = new SendSmsRequest();
        //使用post提交
        request.setMethod(MethodType.POST);
        //必填:待发送手机号
        request.setPhoneNumbers(phone);
        //必填:短信签名-可在短信控制台中找到
        request.setSignName(Constant.SIGNNAME);
        //必填:短信模板-可在短信控制台中找到,发送国际/港澳台消息时,请使用国际/港澳台短信模版
        request.setTemplateCode(Constant.TEMPLATECODE);
        //随机产生一个6位数的验证码
        String random = (int)((Math.random() * 9 + 1) * 100000) + "";
        //将生成的6位随机数存入Redis里(规则:key=手机号,value=验证码),5分钟内有效
        Jedis jedis = JedisUtil.getJedisConn();
        jedis.set(phone,random);
        jedis.expire(phone, 300);
        //可选:模板中的变量替换JSON串
        request.setTemplateParam(Constant.TEMPLATEPARAM.replace("${param}",random));
        //请求失败这里会抛ClientException异常
        SendSmsResponse sendSmsResponse = null;
        try {
            sendSmsResponse = acsClient.getAcsResponse(request);
        } catch (Exception e) {
            return "FAIL";
        }finally {
            if (jedis != null){
                jedis.close();
            }
        }
        return sendSmsResponse.getCode();
    }
}

其中我短信模板中的变量替换JSON串如下:

3、感受与总结

其实对接别人的接口并不难,重要的是要看懂人家的文档,别产生畏难情绪

你可能感兴趣的:(总结)