发送手机验证码

article/2025/8/27 22:13:13

手机验证码不能自己生成,需要由第三方来完成发送。本文选择网易云作为第三方来发送验证码。

首先,我们要注册网易云账号,完成登陆。选择“产品与服务”选项中的“通信与视频”,点击创建应用,完成后,下方有许多功能,我们选择“短信”选项,点击申请试用。完成后,上方的功能管理就会出现短信一栏。如图:

然后点击模板管理,出现三类模板,如图:

点击验证码模板,我们会发现已经有一个默认的模板,因为该模板为语言提示,不是手机短信提示,所以我们需要再创建一个新的模板,如图:

创建完成后,可能需要审核一段时间,完成后如图:

复制审核通过的模板ID,将ID写入下面的代码中。

public class CaptchaMsgTest {private static String mobile = "";//mobile 是接受短信的手机号/*** 短信内容:您的验证码为%s,10分钟内有效。* * */@SuppressWarnings("resource")public static void main(String[] args) {if(SMSUtils.isMobile(mobile)){try {SMSUtils.sendCode(mobile,"3953586");//mobile 是接受短信的手机号,"3953586" 是模板ID} catch (IOException e) {e.printStackTrace();}}System.out.print("请输入您收到的短信验证码:");String code = new Scanner(System.in).next();try {if(SMSUtils.verifyCode(mobile, code)){//校验验证码System.out.println("验证码正确...");}else{System.out.println("验证码错误...");}} catch (IOException e) {e.printStackTrace();}}
}

下面是工具类代码:

public class SMSUtils {private static final String NONCE = "123456";private static final String APP_SECRET = "79660bb740bc";private static final String APP_KEY = "b331b7254d0726ebac9afa98502a9507";/*** 检测手机号有效性* * @param mobile 手机号码* @return 是否有效*/public static final boolean isMobile(String mobile){Pattern pattern = Pattern.compile("^((1[3578][0-9])|(14[57]))\\d{8}$");Matcher matcher = pattern.matcher(mobile);return matcher.matches();}/*** * @param mobile 手机号码* @param templateId 验证码模板ID* @return 是否发送成功*/public static final boolean sendCode(String mobile, String templateId) throws IOException {HttpPost httpPost = new HttpPost("https://api.netease.im/sms/sendcode.action");String currentTime = String.valueOf(new Date().getTime()/1000L);String checkSum = CheckSumBuilder.getCheckSum(APP_SECRET,NONCE,currentTime);//set headerhttpPost.setHeader("AppKey",APP_KEY);httpPost.setHeader("CurTime",currentTime);httpPost.setHeader("Nonce",NONCE);httpPost.setHeader("CheckSum",checkSum);httpPost.setHeader("Content-Type","application/x-www-form-urlencoded;charset=utf-8");//set dataList<NameValuePair> nameValuePairList = new ArrayList<NameValuePair>();nameValuePairList.add(new BasicNameValuePair("mobile",mobile));nameValuePairList.add(new BasicNameValuePair("templateid", templateId));httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairList,"utf-8"));//start requestCloseableHttpClient closeableHttpClient = HttpClients.createDefault();HttpResponse httpResponse = closeableHttpClient.execute(httpPost);String responseResult = EntityUtils.toString(httpResponse.getEntity(),"utf-8");System.out.println("responseResult:"+responseResult);String stateCode = JSON.parseObject(responseResult).getString("code");if(stateCode.equals("200")){return true;}return false;}/*** 判断用户输入验证码与网易云生成的验证码是否一致* * @param mobile 电话号码* @param code 发送到mobile上的短信*/public static final boolean verifyCode(String mobile, String code) throws IOException {HttpPost httpPost = new HttpPost("https://api.netease.im/sms/verifycode.action");String currentTime = String.valueOf(new Date().getTime()/1000L);String checkSum = CheckSumBuilder.getCheckSum(APP_SECRET,NONCE,currentTime);//set headerhttpPost.setHeader("AppKey",APP_KEY);httpPost.setHeader("CurTime",currentTime);httpPost.setHeader("Nonce",NONCE);httpPost.setHeader("CheckSum",checkSum);httpPost.setHeader("Content-Type","application/x-www-form-urlencoded;charset=utf-8");//set dataList<NameValuePair> nameValuePairList = new ArrayList<NameValuePair>();nameValuePairList.add(new BasicNameValuePair("code",code));nameValuePairList.add(new BasicNameValuePair("mobile",mobile));httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairList,"utf-8"));//start requestCloseableHttpClient closeableHttpClient = HttpClients.createDefault();HttpResponse httpResponse = closeableHttpClient.execute(httpPost);String responseResult = EntityUtils.toString(httpResponse.getEntity(),"utf-8");System.out.println("responseResult:"+responseResult);String stateCode = JSON.parseObject(responseResult).getString("code");if(stateCode.equals("200")){return true;}return false;}
}

上面代码中的字符串类型变量APP_SECRET和APP_KEY并不是任意的,这就需要网易云账号里找到它们的值。

点击网易云账号里的应用手机验证码,如图:

点击App Key管理,找到App Key,如图:

这两个字符串就是APP_SECRET和APP_KEY的值。

 

下面是另一个工具类代码:

public class CheckSumBuilder {private static final char[] HEX_DIGITS = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};public static String getCheckSum(String appSecret, String nonce, String curTime){return encode("SHA",appSecret+nonce+curTime);}private static String encode(String algorithm, String value){if(value == null){return null;}try {MessageDigest messageDigest = MessageDigest.getInstance(algorithm);messageDigest.update(value.getBytes());return getFormattedText(messageDigest.digest());}catch (Exception e){throw new RuntimeException(e);}}private static String getFormattedText(byte[] bytes){int length = bytes.length;StringBuilder stringBuilder = new StringBuilder(length*2);for(int i=0;i<length;i++){stringBuilder.append(HEX_DIGITS[(bytes[i]>>4)&0x0f]);stringBuilder.append(HEX_DIGITS[(bytes[i]&0x0f)]);}return stringBuilder.toString();}
}

运行第一段代码就可以向手机发送验证码了。


http://chatgpt.dhexx.cn/article/2K2CNgyo.shtml

相关文章

java发送手机验证码实现

正文 今天来用java实现手机验证码的发送。 短信平台有很多&#xff0c;中国网建提供的SMS短信通&#xff0c;注册免费5条短信&#xff0c;3条彩信&#xff0c; http://sms.webchinese.cn/ 但是刚才试了&#xff0c;第一次用官方提供的demo发送成功&#xff0c;然后整合到自…

Excel 字符串拼接

例子&#xff1a;“exec sp_addextendedproperty N’MS_Description’, N’”&B1&“‘, N’SCHEMA’, N’dbo’,N’table’, N’”&A1&“” &#xff1a;公式 “ abc ” &#xff1a; “”中间为任意字符/字符串 & A1 &&#xff1a;&&中间为拼…

Excel如何插入文本字符串或字符

目录 1.用“&”连接的方法插入文本或字符的办法及实例 2.用TEXT函数插入“&#xffe5;”或“$"字符 3.用TEXT函数以及“&”连接符插入文本或符号 1.用“&”连接的方法插入文本或字符的办法及实例 &#xff08;1&#xff09;方法&#xff1a;关键在于用“&a…

excel连接字符串

Excel连接字符串的功能挺强大的。 很实用。 有2种方式。 1&#xff1a; 2&#xff1a; 1个是调用了concatnate函数&#xff0c;一个是使用了&(就是号的功能了)。

excel字符串和单元格拼接,Excel中将单元格的字符串进行合并的具体方法

在利用Excel进行办公时&#xff0c;对多个单元格的字符串进行合并是很常见的操作&#xff0c;但是对于刚接触Excel软件的小伙伴来说&#xff0c;可能有些困难。下面小编就与大家分享一下在Excel中实现字符串合并的方法&#xff0c;有需要的用户可以参考下。 Excel中如何合并文本…

excel中按条件合并字符串

若B列不为空则将A列和B列合并后给C列&#xff1b; C IF(ISBLANK(B1), B1,CONCAT(A1,B1)) 结果却出问题&#xff0c;当B列为空时&#xff0c;C列却显示0&#xff0c;解决方法是&#xff1a;选择C列设置单元格格式&#xff0c;选择自定义&#xff0c;在类型处添加 [0]" &q…

Excel技巧:巧用字符串连接

Excel中有一个基本的公式&#xff0c;就是把几个单元格中的字符串连接起来。 比如上面这个例子&#xff0c;A1&#xff0c;B1&#xff0c;C1单元格中字符串连接起来&#xff0c;只要在D1单元格中输入 A1&B1&C1即可。 下面我们开始使用字符串连接功能。 例1&#xff1a;…

Excel字符连接(concat)

Excel连接字符串有两个比较常用的方法。 1.concat函数 2.”&”连接符

C#操作Excel文件三种方式及连接字符串

转自&#xff1a;http://www.cnblogs.com/JacobHuang/p/5663926.html .Net平台上对Excel进行操作主要有两种方式。第一种&#xff0c;把Excel文件看成一个数据库&#xff0c;通过OleDb的方式进行读取与操作&#xff1b;第二种&#xff0c;调用Excel的COM组件。两种方式各有特点…

EXCEL 连接符的简单使用

在使用EXCEL处理大量表格数据的时候&#xff0c;学会【连接符】的使用很重要。 如下图所示&#xff1a; 如果我们需要在【A列】的内容后面加两个字【“编号”】两个字&#xff0c;我们就可以使用【连接符“&”】。 1&#xff1a;在B列的此处输入【】。 2&#xff1a;选中【…

Excel连接文本字符串

Excel连接文本字符串 一&#xff1a;CONCATENATE 1&#xff09;使用 CONCATENATE 函数。在这种情况下&#xff0c;您的公式将如下所示。其中X1、X2 和 X3 是你要加入的单元格。 CONCATENATE(X1,X2,X3)2&#xff09;如果要用空格分隔单元格的值&#xff0c;可以将它们添加在引…

STM32开发入门

stm32f407系列单片机基础知识 参考stc公司标准开发手册 STM32F4xx中文参考手册1.pdf ##本文是基于stm32f407zgt6单片机做出介绍 stm32系列单片机是stc公司开发并设计出的一类高速低功耗芯片&#xff0c;其具有众多可用内部资源&#xff0c;在下文将一一介绍 芯片实物图 内部资…

Structured Streaming 快速入门系列(三)Structured Streaming 实战之 Sink

文章目录 SinkHDFS SinkKafka SinkForeach Writer自定义 SinkTigger从 Source 到 Sink 的流程错误恢复和容错语义 Sink 目标和步骤 目标 能够串联两端, 理解整个流式应用, 以及其中的一些根本的原理, 比如说容错语义能够知道如何对接外部系统, 写入数据 步骤 HDFS SinkKaf…

STM32基础入门学习笔记:内部高级功能应用

文章目录&#xff1a; 一&#xff1a;低功耗模式 1.睡眠模式测试程序 NVIC.h NVIC.c key.h key.c main.c 2.停机模式测试程序 main.c 3.待机模式测试程序 main.c 二&#xff1a;看门狗 1.独立看门狗测试程序 iwdg.h iwdg.c main.c 2.窗口看门狗测试程序 wwdg…

STM32初学者入门FreeRTOS操作系统,多任务实时系统

1.详细介绍FreeRTOS操作系统&#xff0c;然后举了几个实例 FreeRTOS&#xff08;Free Real-Time Operating System&#xff09;是一个开源的嵌入式实时操作系统&#xff0c;它专门设计用于在资源有限的嵌入式系统中运行。FreeRTOS提供了一些用于任务管理、调度、同步和通信的功…

【STM32系列汇总】博主的STM32实战快速进阶之路(持续更新)

我把之前在学习和工作中使用STM32进行嵌入式开发的经验和教程等相关整理到这里&#xff0c;方便查阅学习&#xff0c;如果能帮助到您&#xff0c;请帮忙点个赞&#xff1b; 本文的宗旨 STM32 只是一个硬件平台&#xff0c;同样地他可以换成MSP430&#xff0c;NXP的RT等等&…

<STC32G12K128入门第四节>USAT串口(实战使用ESP32进行TCP通信)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、串口是什么?二、UART寄存器1.引脚配置寄存器2.SCON寄存器3.SBUF数据发送接收缓冲区4.辅助寄存器5.串口重定向三、案例总结前言 一、串口是什么? 这个我不想多说就是一种通讯方式,想具体…

STM32入门(二)

STM32入门&#xff08;二&#xff09; 一、新建工程 二、库开发与寄存器开发的关系 固件库就是函数的集合&#xff0c;固件库函数的作用是向下负责与寄存器直接打交道&#xff0c;向上提供用户函数调用的接口&#xff08;API&#xff09;。在51的开发中我们常常的作法是直接操…

STM32 快速入门(内核架构,启动方式,开发参考资料,芯片选型)

文章目录 1、启动方式&#xff08;Start up&#xff09;2、开发参考资料2.1 STM32 中文参考手册 3、通常的芯片选型步骤4、存储器和总线构架4.1 系统构架4.1.1 ICode 总线4.1.2 DCode 总线4.1.3 系统总线4.1.4 DMA 总线4.1.5 总线矩阵4.1.6 AHB/APB 桥(APB) 4.2 存储器组织&…

STM32—串口使用及配置(入门详解)

目录 一、常用函数 二、状态标记变量 三、串口接收中断流程 四、串口工具 五、配置1&#xff08;非中断&#xff09; 六、main.c代码&#xff08;非中断&#xff09; 七、配置2&#xff08;中断&#xff09; 八、main.c代码&#xff08;中断&#xff09; 一、常用函数 …