IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 项目实践——零基础实现手机验证码功能 -> 正文阅读

[Java知识库]项目实践——零基础实现手机验证码功能


本篇文章主要是讲如何免费白嫖,自己实现手机短信验证码的功能,保证不费一分一毛.
即使你什么也不懂,只要按照我的步骤操作,也一定能够实现,这在外人看来有些神秘莫测的短信手机验证!

1.阿里云短信服务

1.1.开通阿里云短信服务

在这里插入图片描述

1.2.添加签名管理与模板管理

(1)添加签名管理
选择 国内消息 - 签名管理 - 添加签名
在这里插入图片描述
点击添加签名,进入添加页面,填入相关信息
注意:签名要写的有实际意义
点击提交,等待审核,审核通过后可以使用。
(2)添加模板管理
选择 国内消息 - 模板管理 - 添加模板
在这里插入图片描述
点击 添加模板,进入到添加页面,输入模板信息
点击提交,等待审核,审核通过后可以使用

1.3.编写发送短信接口

新建短信微服务

1、在service模块下创建子模块service-msm
在这里插入图片描述
2、创建controller和service代码
在这里插入图片描述
3、配置application.properties

# 服务端口
server.port=8006
# 服务名
spring.application.name=service-msm
# mysql数据库连接
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/guli?serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=root
spring.redis.host=192.168.44.131
spring.redis.port=6379
spring.redis.database= 0
spring.redis.timeout=1800000
spring.redis.lettuce.pool.max-active=20
spring.redis.lettuce.pool.max-wait=-1
#最大阻塞等待时间(负数表示没限制)
spring.redis.lettuce.pool.max-idle=5
spring.redis.lettuce.pool.min-idle=0
#最小空闲
#返回json的全局时间格式
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
spring.jackson.time-zone=GMT+8
#配置mapper xml文件的路径
mybatis-plus.mapper-locations=classpath:com/atguigu/cmsservice/mapper/xml/*.xml
#mybatis日志
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

4、创建启动类

@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
@ComponentScan("com.atguigu")
public class MsmApplication {
    public static void main(String[] args) {
        SpringApplication.run(MsmApplication.class,args);
    }
}

5、在service-msm的pom中引入依赖

<dependencies>
	<dependency>
		<groupId>com.alibaba</groupId>
		<artifactId>fastjson</artifactId>
	</dependency>
	<dependency>
		<groupId>com.aliyun</groupId>
		<artifactId>aliyun-java-sdk-core</artifactId>
	</dependency>
</dependencies>

6、编写controller,根据手机号发送短信

@RestController
@RequestMapping("/edumsm/msm")
//@CrossOrigin
public class MsmController {

    @Autowired
    private MsmService msmService;

    @Autowired
    private RedisTemplate<String,String> redisTemplate;

    //发送短信的方法
    @GetMapping("send/{phone}")
    public R sendMsm(@PathVariable String phone) {
        //1 从redis获取验证码,如果获取到直接返回
        String code = redisTemplate.opsForValue().get(phone);
        if(!StringUtils.isEmpty(code)) {
            return R.ok();
        }
        //2 如果redis获取 不到,进行阿里云发送
        //生成随机值,传递阿里云进行发送
        code = RandomUtil.getFourBitRandom();
        Map<String,Object> param = new HashMap<>();
        param.put("code",code);
        //调用service发送短信的方法
        boolean isSend = msmService.send(param,phone);
        if(isSend) {
            //发送成功,把发送成功验证码放到redis里面
            //设置有效时间
            redisTemplate.opsForValue().set(phone,code,5, TimeUnit.MINUTES);
            return R.ok();
        } else {
            return R.error().message("短信发送失败");
        }
    }
}

7、编写service

@Service
public class MsmServiceImpl implements MsmService {

    //发送短信的方法
    @Override
    public boolean send(Map<String, Object> param, String phone) {
        if(StringUtils.isEmpty(phone)) return false;

        DefaultProfile profile =
                DefaultProfile.getProfile("default", "LTAI4Fy76hybzhPUECfCt19E", "jJZ2Nk9JXt8YH94UG3ZIApy7ltRuXe");
        IAcsClient client = new DefaultAcsClient(profile);

        //设置相关固定的参数
        CommonRequest request = new CommonRequest();
        //request.setProtocol(ProtocolType.HTTPS);
        request.setMethod(MethodType.POST);
        request.setDomain("dysmsapi.aliyuncs.com");
        request.setVersion("2017-05-25");
        request.setAction("SendSms");

        //设置发送相关的参数
        request.putQueryParameter("PhoneNumbers",phone); //手机号
        request.putQueryParameter("SignName","我的谷粒在线教育网站"); //申请阿里云 签名名称
        request.putQueryParameter("TemplateCode","SMS_213772127"); //申请阿里云 模板code
        request.putQueryParameter("TemplateParam", JSONObject.toJSONString(param)); //验证码数据,转换json数据传递

        try {
            //最终发送
            CommonResponse response = client.getCommonResponse(request);
            boolean success = response.getHttpResponse().isSuccess();
            return success;
        }catch(Exception e) {
            e.printStackTrace();
            return false;
        }

    }
}

1.4.免费试用产品

帮助文档:https://help.aliyun.com/product/44282.html?spm=5176.10629532.0.0.38311cbeYzBm73

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

2.腾讯云短信服务

因为短信手机验证功能必须依靠腾讯云和阿里云来进行实现,然而两者的申请,现在阿里云已经无法实现个人申请(网络安全考虑),所以此次选择腾讯云。

2.1.注册微信公众号

首先百度搜索微信公众平台,然后进入平台后进行注册,步骤如下,上图:
1.注册在这里插入图片描述
2.选择订阅号
在这里插入图片描述
3.选择类型
在这里插入图片描述
在这里插入图片描述
注册完成之后,会调整到管理页面,然后截图该页面,后面注册签名管理有大作用:
在这里插入图片描述

2.2.申请签名管理和模板管理

签名管理就是要标明该短信是由哪个公司,组织,机构,当然也可以是公众号所发出的。
所以这也是我们为什么要注册微信公众号的原因了,为的申请这个签名管理!

2.2.1签名管理
直接搜素短信功能,进入页面:
国内短信–签名管理–创建签名
然后进入下面该页面,按照下面填写:
在这里插入图片描述

(签名内容为公众号的名字,注意:上传的照片就是我上面提及的你注册微信公众号的管理界面,不懂官网左边也有提醒。)

然后就是静静等待,大概等一个十到二十分钟左右,就会审批通过,如下图所示:
在这里插入图片描述
2.2.2模板管理
模板管理就是发给手机的短信内容的模式,大体不变,只是里面的验证码发生改变而已!(用程序员的话,那就是框架)
国内短信–正文模板管理–创建正文模板
在这里插入图片描述
点击之后进行申请页面,短信内容可以使用模板套用,轻松简单:
在这里插入图片描述
最后依旧是等待审核通过,出现下面情况就说明ok!
在这里插入图片描述

2.3.编写代码

在线教育的短信验证模块:模块框架如下
在这里插入图片描述
pom.xml文件依赖如下:

<!--腾讯云短信服务-->
    <dependencies>
        <!--腾讯云短信服务-->
        <dependency>
            <groupId>com.github.qcloudsms</groupId>
            <artifactId>qcloudsms</artifactId>
            <version>1.0.2</version>
        </dependency>
        <dependency>
            <groupId>commons-lang</groupId>
            <artifactId>commons-lang</artifactId>
            <version>2.6</version>
        </dependency>
       <!--json的转换工具-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
        </dependency>
        <dependency>
                <groupId>com.aliyun</groupId>
                <artifactId>aliyun-java-sdk-core</artifactId>
            </dependency>

    </dependencies>

application.properties(记得将redisd地址填上):

# 服务端口
server.port=8005
# 服务名
spring.application.name=service-msm
        
# nacos服务地址
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
spring.redis.host=
spring.redis.port=6379
spring.redis.database= 0
spring.redis.soTimeout=1800000
spring.redis.lettuce.pool.max-active=20
#spring.redis.lettuce.pool.max-wait=-1
spring.redis.lettuce.pool.max-wait=-1ms
#最大阻塞等待时间(负数表示没限制)
spring.redis.lettuce.pool.max-idle=5
spring.redis.lettuce.pool.min-idle=0
#最小空闲
#返回json的全局时间格式
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
spring.jackson.time-zone=GMT+8
#配置mapper xml文件的路径
mybatis-plus.mapper-locations=classpath:com/atguigu/cmsservice/mapper/xml/*.xml
mybatis日志
mybatis-plus.configuration.logimpl=org.apache.ibatis.logging.stdout.StdOutImpl

工具类RandomUtils:

public class RandomUtils {

    /**
     * 获取六位随机数
     *
     * @return
     */
    public static String getRandom() {
        int newNum = (int) ((Math.random() * 9 + 1) * 100000);
        return String.valueOf(newNum);

    }
}

TencentUtils(此处记得将你前面配置的信息填上):

public class TencentUtils {

    // 短信应用SDK AppID
    public static final int APPID = ;

    // 短信应用SDK AppKey
    public static final String APPKEY = "";

    // 国家标识
    public static final String NATIONCODE = "86";

    // 短信模板ID,需要在短信应用中申请
    public static final int TEMPLATECODE = ;

    // 签名(微信公众号名字)
    public static final String SIGN = "新注册公众号";

}

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

Msmservice:


public interface Msmservice {
    //发送短信的方法
    String send(String phone);
}

MsmserviceImpl:

@Service
public class MsmserviceImpl implements Msmservice {

    @Autowired
    private RedisTemplate<String, String> redisTemplate;

    @Override
    public String send(String phoneNum) {

        //判断redis中是否有验证码或有效期未过
        String code = redisTemplate.opsForValue().get(phoneNum);
        if (!StringUtils.isEmpty(code)) {
            return code;
        }

        // 如果没有则进行腾讯云短信发送
        //生成6位随机验证码(验证码参数需要数组对象) 可以随意给出6为数字 我这里使用随机数
        String[] params = {RandomUtils.getRandom()};

        try {
            //创建短信发送对象
            SmsSingleSender ssender = new SmsSingleSender(TencentUtils.APPID, TencentUtils.APPKEY);

            SmsSingleSenderResult result = ssender.sendWithParam(TencentUtils.NATIONCODE, phoneNum,
                    TencentUtils.TEMPLATECODE, params, TencentUtils.SIGN, "", "");

            //验证是否发送成功,发送成功将验证码返回 等待用户输入从而进行数据验证
            //{"result":0,"errmsg":"OK","ext":"","sid":"2433:22806866016300548263905129","fee":1,"isocode":"CN"}
            if (result.result == 0) {
                //发送成功 把验证码存入redis 并设置有效期5分钟
                redisTemplate.opsForValue().set(phoneNum, params[0], 5, TimeUnit.MINUTES);
                return params[0];
            }

        } catch (HTTPException e) {
            // HTTP 响应码错误
            e.printStackTrace();
        } catch (JSONException e) {
            // JSON 解析错误
            e.printStackTrace();
        } catch (IOException e) {
            // 网络 IO 错误
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "";
    }
}

MsmController:

@RestController
//@CrossOrigin
@Api(tags = "腾讯云短信验证")
@RequestMapping("/edumsm/msm")
public class MsmController {

    @Autowired
    private Msmservice msmservice;

    //获取手机号发送验证码
    @GetMapping("send/{phone}")
    @ApiOperation(value = "发送验证码")
    public R sendMsm(@ApiParam("用户手机号") @PathVariable String phone) {

        String verCode = msmservice.send(phone);
        return verCode != "" ? R.ok().data("", verCode) : R.error().message("短信发送失败");
    }
}

MsmApplication:

@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
@ComponentScan({"com.atguigu"}) //扫描指定的文件
@EnableDiscoveryClient
//@MapperScan("com.atguigu.educms.mapper")
public class MsmApplication {
    public static void main(String[] args) {
        SpringApplication.run(MsmApplication.class,args);
    }
}

3.第三方短信服务

可以采取第三方短信服务,不过要花一点,都懂的哈,
云市场–短信服务
可以任意选择,当然记得选择只需个人认证的。

3.1操作方法

在这里插入图片描述
比如点开一个:
在这里插入图片描述
购买之后:
在这里插入图片描述
短信通知:
在这里插入图片描述
请求示例:

import okhttp3.FormBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
public class Test {

    public static void main(String[] args) throws IOException {
        String url = "https://smssend.shumaidata.com/sms/send";
        String appCode = "你自己的AppCode";

        Map<String, String> params = new HashMap<>();
        params.put("receive", "188****1212");
        params.put("tag", "2345");
        params.put("templateId", "MD8B7116BC");

        String result = postForm(appCode, url, params);
        System.out.println(result);
    }
    /**
     * 用到的HTTP工具包:okhttp 3.13.1
     * <dependency>
     * <groupId>com.squareup.okhttp3</groupId>
     * <artifactId>okhttp</artifactId>
     * <version>3.13.1</version>
     * </dependency>
     */
    public static String postForm(String appCode, String url, Map<String, String> params) throws IOException {
        url = url + buildRequestUrl(params);
        OkHttpClient client = new OkHttpClient.Builder().build();
        FormBody.Builder formbuilder = new FormBody.Builder();
        Iterator<String> it = params.keySet().iterator();
        while (it.hasNext()) {
            String key = it.next();
            formbuilder.add(key, params.get(key));
        }
        FormBody body = formbuilder.build();
        Request request = new Request.Builder().url(url).addHeader("Authorization", "APPCODE " + appCode).post(body).build();
        Response response = client.newCall(request).execute();
        System.out.println("返回状态码" + response.code() + ",message:" + response.message());
        String result = response.body().string();
        return result;
    }

    public static String buildRequestUrl(Map<String, String> params) {
        StringBuilder url = new StringBuilder("?");
        Iterator<String> it = params.keySet().iterator();
        while (it.hasNext()) {
            String key = it.next();
            url.append(key).append("=").append(params.get(key)).append("&");
        }
        return url.toString().substring(0, url.length() - 1);
    }
}

正常返回示例:

{
    "msg": "成功",
    "success": true,
    "code": 200, 
    "data": {
        "taskId": "2020040211442081fffd9b",//短信发送任务ID
        "orderNo": "695237182989930496" //订单号
    }
}

失败返回示例:

{
    "msg": "templateId 无效",
    "success": false,
    "code": 400,
    "data": {}
}

错误码定义:
在这里插入图片描述

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-01-25 10:26:52  更:2022-01-25 10:27:49 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 9:42:35-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码