若依集成短信宝平台实现短信验证登录功能

短信宝平台简单介绍:
   一个可以发送短信验证码的平台,里面有各种语言的开发文档,这里我们以Java为例。虽没有阿里云,腾讯云短信平台规模大,但上手很快,当然肯定也是收费的

   短信宝平台官网:http://smsbao.com/

 

以下结合若依代码进行介绍

1.这是若以脚手架进行短信登录验证的controller

/**
     * 短信验证码
     *
     * @param phonenumber 用户手机号
     */
    @GetMapping("/captchaSms")
    public R<Void> smsCaptcha(@NotBlank(message = "{user.phonenumber.not.blank}") String phonenumber){
        if (!smsProperties.getEnabled()) {
            return R.fail("当前系统没有开启短信功能!");
        }
        String key = CacheConstants.CAPTCHA_CODE_KEY + phonenumber;
        String code = RandomUtil.randomNumbers(6);
        RedisUtils.setCacheObject(key, code, Duration.ofMinutes(Constants.CAPTCHA_EXPIRATION));
        // 验证码模板id 自行处理 (查数据库或写死均可)
        String templateId = "1";
        Map<String, String> map = new HashMap<>(1);
        map.put("code", code);
        map.put("username","");
        map.put("password","");
        try {
            SmsUtilsByLogin.send(phonenumber, templateId, map);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
            return R.fail("发送失败");
        }
        return R.ok("发送成功");
    }

2.其中最为核心的部分就是send方法,这是短信发送的核心方法,而这个send方法被一个工具类调用,SmsUtilsByLogin,就是短信发送的工具类,是我自己封装的,代码来自于官网的开发文档,可以直接拿去使用

package com.ruoyi.sms.utils;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Map;

/**
 * @ClassName SmsUtilsByLogin
 * @Description TODO
 * @Author cmk123
 * @Data 2023-09-13 18:54
 * @Version 1.0
 **/
public class SmsUtilsByLogin {

    public static void sendCode(String phoneNumber, Map<String, String> param) throws NoSuchAlgorithmException {
        String testContent = "【若依审批平台】您正在进行注册,您的验证码是"+param.get("code")+",2分钟内有效,如非本人操作,请谨慎操作";
        String httpUrl = "http://api.smsbao.com/sms";
        StringBuffer httpArg = new StringBuffer();
        httpArg.append("u=").append(param.get("username")).append("&");
        httpArg.append("p=").append(SmsUtilsByLogin.md5(param.get("password"))).append("&");
        httpArg.append("m=").append(phoneNumber).append("&");
        httpArg.append("c=").append(SmsUtilsByLogin.encodeUrlString(testContent, "UTF-8"));
        SmsUtilsByLogin.request(httpUrl, httpArg.toString());
    }

    public static String request(String httpUrl, String httpArg) {
        BufferedReader reader = null;
        String result = null;
        StringBuffer sbf = new StringBuffer();
        httpUrl = httpUrl + "?" + httpArg;

        try {
            URL url = new URL(httpUrl);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("GET");
            connection.connect();
            InputStream is = connection.getInputStream();
            reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
            String strRead = reader.readLine();
            if (strRead != null) {
                sbf.append(strRead);
                while ((strRead = reader.readLine()) != null) {
                    sbf.append("\n");
                    sbf.append(strRead);
                }
            }
            reader.close();
            result = sbf.toString();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }

    public static String md5(String plainText) throws NoSuchAlgorithmException {
        StringBuffer buf = null;
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            md.update(plainText.getBytes());
            byte b[] = md.digest();
            int i;
            buf = new StringBuffer("");
            for (int offset = 0; offset < b.length; offset++) {
                i = b[offset];
                if (i < 0)
                    i += 256;
                if (i < 16)
                    buf.append("0");
                buf.append(Integer.toHexString(i));
            }
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return buf.toString();
    }

    public static String encodeUrlString(String str, String charset) {
        String strret = null;
        if (str == null)
            return str;
        try {
            strret = java.net.URLEncoder.encode(str, charset);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
        return strret;
    }

    public static void send(String phonenumber, String templateId, Map<String, String> map) throws NoSuchAlgorithmException {
        SmsUtilsByLogin.sendCode(phonenumber,map);
    }
}

 3.想要发送短信,首先要去短信宝平台注册账号密码,短信1毛钱1条,自行购买就可以,然后将你的账号密码,粘贴到controller层的 smsCaptcha方法里面,具体位置如下,封装到一个map集合中,进行传递给send方法

Map<String, String> map = new HashMap<>(1);
map.put("code", code);
map.put("username","");
map.put("password","");

 4.send方法又调用了本类sendCode方法,额。。。其实这才是短信发送的核心代码,send只不过做了一层调用,那我们就来看一下这个sendCode方法,testContent的内容就是短信发送的内容,其中code是6位随机码,httpUrl是短信宝网址,调用的它的接口,然后后面append()都是再添加name=value&name=value参数罢了,最核心的是SmsUtilsByLogin类的request方法,因为这个方法要真正发送调用短信宝的接口

 

public static void sendCode(String phoneNumber, Map<String, String> param) throws NoSuchAlgorithmException {
        String testContent = "【若依审批平台】您正在进行注册,您的验证码是"+param.get("code")+",2分钟内有效,如非本人操作,请谨慎操作";
        String httpUrl = "http://api.smsbao.com/sms";
        StringBuffer httpArg = new StringBuffer();
        httpArg.append("u=").append(param.get("username")).append("&");
        httpArg.append("p=").append(SmsUtilsByLogin.md5(param.get("password"))).append("&");
        httpArg.append("m=").append(phoneNumber).append("&");
        httpArg.append("c=").append(SmsUtilsByLogin.encodeUrlString(testContent, "UTF-8"));
        SmsUtilsByLogin.request(httpUrl, httpArg.toString());
}

5至于PhoneNumber是前端传过来的,code是用RandomUtil类直接生成的,代码如下:

String code = RandomUtil.randomNumbers(6);

 全名cn.hutool.core.util.RandomUtil,不知道是谁写的,随便百度一下引一个依赖应该就可以,用起来还是很方便的.

posted @ 2023-09-24 18:51  cmk123456  阅读(1179)  评论(0)    收藏  举报