Spring Boot中对接Twilio以实现发送验证码和验证短信码

Twilio介绍

Twilio是一家提供云通信服务的公司,旨在帮助开发者和企业通过简单的API实现各种通信功能。以下是Twilio的一些主要特点和服务介绍:

核心功能

  • 短信服务(SMS):允许用户通过API发送和接收短信,支持全球范围内的短信发送。
  • 语音通话:提供语音通话的API,支持拨打和接听电话,语音识别等功能。
  • 视频通话:支持实时视频通话和视频会议,适用于各种应用场景。
  • 聊天服务:提供多种聊天功能,包括Web聊天、SMS聊天和社交媒体集成。
  • 电子邮件服务:通过SendGrid(Twilio收购的公司)提供电子邮件发送和管理服务。

代码工程

1. 添加依赖

在你的pom.xml中添加Twilio的依赖:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>springboot-demo</artifactId>
        <groupId>com.et</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>Twilio</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-autoconfigure</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.twilio.sdk</groupId>
            <artifactId>twilio</artifactId>
            <version>8.25.0</version> 
        </dependency>
    </dependencies>
</project>

2. 配置Twilio

application.propertiesapplication.yml中添加Twilio的配置:

twilio.account-sid=你的Twilio账户SID
twilio.auth-token=你的Twilio认证Token
twilio.phone-number=你的Twilio电话号码

3. 创建Twilio配置类

创建一个配置类来初始化Twilio客户端:

package com.et.twilio.config;

import com.twilio.Twilio;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class TwilioConfig {

    @Value("${twilio.account-sid}")
    private String accountSid;

    @Value("${twilio.auth-token}")
    private String authToken;

    @Bean
    public void init() {
        Twilio.init(accountSid, authToken);
    }
}

4. 创建服务类

创建一个服务类来处理发送验证码和验证短信码的逻辑:

package com.et.twilio.service;

import com.twilio.rest.api.v2010.account.Message;
import com.twilio.type.PhoneNumber;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.Map;
import java.util.Random;

@Service
public class SmsService {

    @Value("${twilio.phone-number}")
    private String twilioPhoneNumber;

    private Map<String, String> verificationCodes = new HashMap<>();

    public void sendVerificationCode(String toPhoneNumber) {
        String code = generateVerificationCode();
        verificationCodes.put(toPhoneNumber, code);

        Message.creator(
                new PhoneNumber(toPhoneNumber),
                new PhoneNumber(twilioPhoneNumber),
                "Your verification code is: " + code)
                .create();
    }

    public boolean verifyCode(String phoneNumber, String code) {
        String storedCode = verificationCodes.get(phoneNumber);
        return storedCode != null && storedCode.equals(code);
    }

    private String generateVerificationCode() {
        Random random = new Random();
        return String.format("%06d", random.nextInt(1000000)); // 生成6位验证码
    }
}

5. 创建控制器

创建一个控制器来处理HTTP请求:

package com.et.twilio.controller;

import com.et.twilio.service.SmsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/api/sms")
public class SmsController {

    @Autowired
    private SmsService smsService;

    @PostMapping("/send")
    public String sendVerificationCode(@RequestParam String phoneNumber) {
        smsService.sendVerificationCode(phoneNumber);
        return "Verification code sent!";
    }

    @PostMapping("/verify")
    public String verifyCode(@RequestParam String phoneNumber, @RequestParam String code) {
        boolean isValid = smsService.verifyCode(phoneNumber, code);
        return isValid ? "Verification successful!" : "Invalid verification code!";
    }
}

以上只是一些关键代码,所有代码请参见下面代码仓库

代码仓库

  • GitHub - Harries/springboot-demo: a simple springboot demo with some components for example: redis,solr,rockmq and so on.(Twilio)

6. 测试功能

启动你的 Spring Boot应用程序,并使用Postman或其他工具测试以下API:

  • 发送验证码:POST /api/sms/send?phoneNumber=目标手机号
  • 验证验证码:POST /api/sms/verify?phoneNumber=目标手机号&code=验证码

注意事项

  • 确保你的Twilio账户已验证并且可以发送短信。
  • 处理验证码的存储和过期逻辑,以防止滥用。
  • 考虑使用更安全的存储方式(如数据库)来存储验证码,而不是使用内存中的Map。

这样,你就可以在Spring Boot中实现与Twilio的集成,发送和验证短信验证码的功能

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/982220.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

DeepSeek集成到VScode工具,让编程更高效

DeepSeek与VScode的强强联合&#xff0c;为编程效率树立了新标杆。 DeepSeek&#xff0c;一款卓越的代码搜索引擎&#xff0c;以其精准的索引和高速的检索能力&#xff0c;助力开发者在浩瀚的代码海洋中迅速定位关键信息。 集成至VScode后&#xff0c;开发者无需离开熟悉的编辑…

蓝桥杯 - 每日打卡(类斐波那契循环数)

题目: 解题思路&#xff1a; 假设输入数值为number 分析题目&#xff0c;如果想要解决这个问题&#xff0c;我们需要实现两个方法&#xff0c;第一个检查number是否是类斐波那契&#xff0c;第二个是模拟1e7 - 0的过程&#xff0c;因为是求最大的&#xff0c;那么我们从1e7开始…

JavaScript实现著名的“两数之和”问题

下面是使用 JavaScript 实现“两数之和”问题的一种常见解法&#xff0c;利用哈希表&#xff08;Map&#xff09;存储遍历过的数字和它们对应的下标&#xff0c;从而在一次遍历中完成查找。以下是详细的代码和说明&#xff1a; function twoSum(nums, target) {// 创建一个 Ma…

【微信小程序】每日心情笔记

个人团队的比赛项目&#xff0c;仅供学习交流使用 一、项目基本介绍 1. 项目简介 一款基于微信小程序的轻量化笔记工具&#xff0c;旨在帮助用户通过记录每日心情和事件&#xff0c;更好地管理情绪和生活。用户可以根据日期和心情分类&#xff08;如开心、平静、难过等&#…

【数据结构】什么是栈||栈的经典应用||分治递归||斐波那契问题和归并算法||递归实现||顺序栈和链栈的区分

文章目录 &#x1f967;栈的初步理解&#xff1a;&#x1f967;易错&#xff1a;如何判断栈满&#x1f967;栈满理解&#x1f967;栈的基本运算&#x1f4da;栈操作的伪代码逻辑&#xff08;顺序和链栈&#xff09;&#x1f4d5;顺序栈运算实现&#xff1a;顺序栈的表示&#x…

利用opencv_python(pdf2image、poppler)将pdf每页转为图片

1、安装依赖pdf2image pip install pdf2image 运行.py报错&#xff0c;因为缺少了poppler支持。 2、安装pdf2image的依赖poppler 以上命令直接报错。 改为手工下载&#xff1a; github: Releases oschwartz10612/poppler-windows GitHub 百度网盘&#xff1a; 百度网盘…

IDEA + DeepSeek 实现 AI辅助编程,提升效率10倍(全网超详细的终极图文实战指南)

前言 在软件开发的世界里&#xff0c;每个开发者都经历过这样的困境——在重复的CRUD代码中机械劳动&#xff0c;为复杂的业务逻辑调试数小时&#xff0c;或是在海量文档中寻找某个API的正确用法。传统的IDE工具虽能提供基础支持&#xff0c;却难以突破效率的“玻璃天花板”。而…

青训营:简易分布式爬虫

一、项目介绍 该项目是一个简易分布式爬虫系统&#xff0c;以分布式思想为基础&#xff0c;通过多节点协作的方式&#xff0c;将大规模的网页抓取任务分解&#xff0c;从而高效、快速地获取网络数据 。 项目地址&#xff1a;https://github.com/yanchengsi/distributed_crawle…

论坛系统测试报告

目录 一、项目背景二、论坛系统测试用例思维导图三、论坛系统测试3.1界面测试3.2登陆测试3.3主页测试3.4个人中心测试 四、自动化测试脚本4.1配置驱动4.2创建浏览器类4.3功能测试4.3.1登陆测试4.3.2注册测试4.3.3主页测试4.3.4帖子编辑4.3.5运行主代码 五、BUG分析六、测试总结…

C++ std::vector 超详细指南:基础实践(手搓vector)

目录 一.基本概念 二.类的常用接口说明 1.类对象的常见构造 2. vector类空间变化 1&#xff09;.size()&#xff08;获取数据个数&#xff09; 2&#xff09;.capacity()&#xff08;获取容量大小&#xff09; 3&#xff09;.empty()&#xff08;判断是否为空&#xff0…

文件上传漏洞:upload-labs靶场11-20

目录 pass-11 pass-12 pass-13 pass-14 pass-15 pass-16 pass-17 pass-18 pass-19 pass-20 pass-11 分析源代码 &#xff0c;发现上传文件的存放路径可控 if(isset($_POST[submit])){$ext_arr array(jpg,png,gif);$file_ext substr($_FILES[upload_file][name],st…

AGI 之 【Dify】 之 使用 Docker 在 Windows 端本地部署 Dify 大语言模型(LLM)应用开发平台

AGI 之 【Dify】 之 使用 Docker 在 Windows 端本地部署 Dify 大语言模型&#xff08;LLM&#xff09;应用开发平台 目录 AGI 之 【Dify】 之 使用 Docker 在 Windows 端本地部署 Dify 大语言模型&#xff08;LLM&#xff09;应用开发平台 一、简单介绍 二、Docker 下载安…

Redis的持久化-RDBAOF

文章目录 一、 RDB1. 触发机制2. 流程说明3. RDB 文件的处理4. RDB 的优缺点 二、AOF1. 使用 AOF2. 命令写⼊3. 文件同步4. 重写机制5 启动时数据恢复 一、 RDB RDB 持久化是把当前进程数据生成快照保存到硬盘的过程&#xff0c;触发 RDB 持久化过程分为手动触发和自动触发。 …

常见网络协议考察知识点

说说http,https协议&#xff1b; HTTPS&#xff08;Secure Hypertext Transfer Protocol&#xff09;安全超文本传输协议&#xff1a; 它是一个安全通信通道&#xff0c;它基于HTTP开发&#xff0c;用于在客户计算机和服务器之间交换信息&#xff0c;它使用安全套接字层(SSL)…

上海市闵行区数据局调研云轴科技ZStack,共探数智化转型新路径

为进一步深化人工智能、大模型技术的应用&#xff0c;推动区域数字经济高质量发展&#xff0c;2025年2月27日&#xff0c;上海市闵行区数据局局长吴畯率队赴上海云轴科技股份有限公司&#xff08;以下简称“云轴科技ZStack”&#xff09;开展专题调研。此次调研旨在深入了解企业…

数据结构秘籍(四) 堆 (详细包含用途、分类、存储、操作等)

1 引言 什么是堆&#xff1f; 堆是一种满足以下条件的树&#xff1a;&#xff08;树这一篇可以参考我的文章数据结构秘籍&#xff08;三&#xff09;树 &#xff08;含二叉树的分类、存储和定义&#xff09;-CSDN博客&#xff09; 堆中的每一个结点值都大于等于&#xff08…

MySQL增量更新数据:高效同步策略与PanguSync实战指南

Mysql增量更新数据软件下载https://pan.baidu.com/s/1WesHaKGO7uQMhPNE-BTDmg?pwdabcd#list/path%2F 在数据驱动的商业环境中&#xff0c;实时数据同步已成为企业数字化转型的关键。本文将深入探讨MySQL增量更新的核心技术&#xff0c;并详细解析如何通过PanguSync工具实现高…

【Wireshark 02】抓包过滤方法

一、官方教程 Wireshark 官网文档 &#xff1a; Wireshark User’s Guide 二、显示过滤器 2.1、 “数据包列表”窗格的弹出过滤菜单 例如&#xff0c;源ip地址作为过滤选项&#xff0c;右击源ip->prepare as filter-> 选中 点击选中完&#xff0c;显示过滤器&#…

run方法执行过程分析

文章目录 run方法核心流程SpringApplicationRunListener监听器监听器的配置与加载SpringApplicationRunListener源码解析实现类EventPublishingRunListener 初始化ApplicationArguments初始化ConfigurableEnvironment获取或创建环境配置环境 打印BannerSpring应用上下文的创建S…