前因

温馨提醒:阅读本文需要8分钟

[半藏商城]之前的登录只是普通的手机号,密码,验证码进行登录,并不支持手机验证码免密登录,刘苏墨(感谢哈)建议我加入手机验证码直接登录功能,正好有这个实力,安排上了。接下来分享一下我的手机短信验证码实现登录的代码实现流程。

开通阿里云的短信服务

首先需要在阿里云的控制台开通阿里云的短信服务,个人的话每条短信的价格是0.045元(不贵,冲10元够用好久了)。开通短信服务后,还需要申请短信的模板和签名等信息(会有客服审核,不成功的话会提示你怎么改,这个必须申请,代码里会用到)。最重要的一步是需要给accessKey赋予短信的权限(必须!本节内容不涉及代码,不过多讲解,百度有详细的开通教程。嘿嘿,代码我也不会过多讲解,主要是分享流程以及踩过的坑,因为很多人想弄,但是不知道从那一步开始弄,代码是这里面最简单的东西)。

Maven引包

首先进行在pom.xml中进行引包,还在为引哪个版本的包而困扰的同学推荐这个Maven在线查找依赖的网站,想用什么输入搜索,复制过来就可以了。

<!-- 阿里短信平台-->
<dependency>
   <groupId>com.aliyun</groupId>
   <artifactId>aliyun-java-sdk-core</artifactId>
   <version>4.5.0</version>
</dependency>
<dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>aliyun-java-sdk-dysmsapi</artifactId>
    <version>2.1.0</version>
</dependency>

配置application.properties

我喜欢用application.properties,有的人喜欢用yml的,我感觉这个格式看着比较清晰,一行一行的,个人习惯哈。

#springboot集成短信
#访问阿里云API的验证
sms.accessKeyId=你的accessKeyId
#访问阿里云API的验证
sms.accessKeySecret=你的accessKeySecret
#阿里云云通信短信API产品
sms.product=Dysmsapi
#产品域名
sms.domain=dysmsapi.aliyuncs.com
#签名
sms.signName=半藏商城
#发送验证码模版CODE
sms.templateCode=SMS_185843228

编写业务层接口代码

/**
 * @author 皓宇QAQ
 * @qq交流群 951485783
 * @email 2469653218@qq.com
 * @link https://github.com/Tianhaoy/hanzomall
 * 2020年3月17日17:18:31
 * @发送短信接口
 */
public interface SmsService {
    /**
     * 发送短信接口
     * @param phoneNumber
     * @param randomCode
     * @return
     */
    boolean sendSms(String phoneNumber, String randomCode);
}

编写业务层接口实现类代码

/**
 * @author 皓宇QAQ
 * @qq交流群 951485783
 * @email 2469653218@qq.com
 * @link https://github.com/Tianhaoy/hanzomall
 * 2020年3月17日17:18:22
 * @发送短信接口实现
 */
@Slf4j
@Service
public class SmsServiceImpl implements SmsService {

    @Value("${sms.accessKeyId}")
    private String accessKeyId;

    @Value("${sms.accessKeySecret}")
    private String accessKeySecret;

    @Value("${sms.product}")
    private String product;

    @Value("${sms.domain}")
    private String domain;

    @Value("${sms.signName}")
    private String signName;

    @Value("${sms.templateCode}")
    private String templateCode;

    @Override
    public boolean sendSms(String phoneNumber, String randomCode) {
        //设置超时时间-可自行调整
        System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
        System.setProperty("sun.net.client.defaultReadTimeout", "10000");
        DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret);
        IAcsClient client = new DefaultAcsClient(profile);
        CommonRequest request = new CommonRequest();
        request.setSysMethod(MethodType.POST);
        request.setSysDomain(domain);
        request.setSysVersion("2017-05-25");
        request.setSysAction("SendSms");
        request.putQueryParameter("RegionId", "cn-hangzhou");
        request.putQueryParameter("PhoneNumbers", phoneNumber);
        request.putQueryParameter("SignName", "半藏商城");//直接取signName就会提示签名不合法 这样写就可以发送短信
        request.putQueryParameter("TemplateCode", templateCode);
        JSONObject object = new JSONObject();
        try {
            object.put("code",randomCode);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        String templateParam =object.toString();
        request.putQueryParameter("TemplateParam", templateParam);
        try {
            //请求失败这里会抛ClientException异常
            CommonResponse response = client.getCommonResponse(request);
            log.info("阿里云短信服务返回消息:"+response.getData());
            // 使用alibaba的fastjson
            Map<String, Object> map=  JSON.parseObject(response.getData());
            if (("OK").equals(map.get("Code"))){
                return true;
            }else{
                return  false;
            }
        } catch (ClientException e) {
            e.printStackTrace();
            log.error(e.getMessage());
        }
        return false;
    }
}

编写Controller层代码

/**
 * @author 皓宇QAQ
 * @qq交流群 951485783
 * @email 2469653218@qq.com
 * @link https://github.com/Tianhaoy/hanzomall
 * @发送短信
 */
@Slf4j
@RestController
public class SmsSendController {

    @Resource
    private SmsService smsService;

    @RequestMapping("/sendCodeSms/{phoneNumber}")
    public Result SmsSendKaptcha(@PathVariable("phoneNumber") String phoneNumber, HttpSession httpSession) {
        //先验证手机号是否符合规则
        if (PhoneUtil.confPhone(phoneNumber)){
            try {
                //生成6位随机码
                String randomCode = EmailCodeUtils.getRandomCode();
                boolean sign = smsService.sendSms(phoneNumber,randomCode);
                if (sign){
                    //发送成功 将随机验证码放到session中
                    log.info("发送短信成功");
                    httpSession.setAttribute(Constants.RANDOM_CODE,randomCode);
                }else {
                    return ResultGenerator.genFailResult("服务怠机,请稍后重试");
                }
            }catch (Exception e){
                e.printStackTrace();
                log.error("发送短信失败"+e.getMessage());
                return ResultGenerator.genFailResult("服务怠机,请稍后重试");
            }
        }else {
            return ResultGenerator.genFailResult("手机号不符合规则,请重新输入");
        }
        return ResultGenerator.genSuccessResult();
    }
}

小结

到此为止,整个发送短信验证码的流程就介绍完毕了,知识只有分享出来才有价值。如果有问题的话,可以在关于我的页面,通过我的邮箱联系我进行探讨。

Q.E.D.


Remain true to our original aspiration.