Android开发:发送验证码验证手机号——榛子云短信服务

榛子云短信官网

在这里插入图片描述
在这里插入图片描述
点击注册后进行登录 页面如下图所示很是简洁,也省去了很多复杂的流程

在这里插入图片描述
需要进行充值
在这里插入图片描述
价格相对公道,个人开发测试完全够用

我的应用中有后续开发要用到的AppIdAppSecret
在这里插入图片描述

短信模板中可以根据个人需要进行编辑但是要进行审核
后续开发中需要用到模版的ID
在这里插入图片描述

在官网的开发文档中有SDK开发文档在这里插入图片描述

文章目录

  • 一、在Spring boot工程中创建一个发送验证码的API
    • 1.创建一个新的Maven 模块
    • 2.引入相关依赖
    • 3.编写配置文件
    • 4.创建启动类以及添加随机数生成工具类
    • 5.Controller层
    • 6.Service层
    • 7.Impl实现类以及从配置文件中获取Secret、Id、模版Id的工具类
  • 二、Android 通过网络请求调用API实现验证码的发送?
    • 1.权限的配置
    • 2.依赖的导入
    • 3.Xml文件的编写(UI界面的绘制)
    • 4.Activity方法的代码
  • 三、实现效果图


一、在Spring boot工程中创建一个发送验证码的API

1.创建一个新的Maven 模块

在这里插入图片描述

2.引入相关依赖

在这里插入图片描述

3.编写配置文件

server:port: 8223
spring:profiles:active: devapplication:name: service-sms
#    redis数据库配置redis:host: 127.0.0.1port: 6379timeout: 3000mslettuce:pool:max-idle: 5min-idle: 0
#        nacos配置cloud:nacos:discovery:server-addr: localhost:8848 # nacos服务地址
#        远程服务调用
feign:client:config:default:connectTimeout: 10000  #连接超时配置readTimeout: 600000   #执行超时配置#    如果想要使用配置文件进行 榛子云配置 可以像下方这样
zhenziyun:sms:file:apiUrl: 你的apiUrlappId: 你的appIdappSecret: 你的appSecrettemplateId: 你的短信模版

4.创建启动类以及添加随机数生成工具类

@SpringBootApplication(exclude= {DataSourceAutoConfiguration.class})
@EnableFeignClients
@ComponentScan("com.ts")
public class SmsApplication {public static void main(String[] args) {SpringApplication.run(SmsApplication.class,args);}}
public class RandomUtils {private static final Random random = new Random();private static final DecimalFormat fourdf = new DecimalFormat("0000");private static final DecimalFormat sixdf = new DecimalFormat("000000");public static String getFourBitRandom() {return fourdf.format(random.nextInt(10000));}public static String getSixBitRandom() {return sixdf.format(random.nextInt(1000000));}/*** 给定数组,抽取n个数据* @param list* @param n* @return*/public static ArrayList getRandom(List list, int n) {Random random = new Random();HashMap<Object, Object> hashMap = new HashMap<Object, Object>();// 生成随机数字并存入HashMapfor (int i = 0; i < list.size(); i++) {int number = random.nextInt(100) + 1;hashMap.put(number, i);}// 从HashMap导入数组Object[] robjs = hashMap.values().toArray();ArrayList r = new ArrayList();// 遍历数组并打印数据for (int i = 0; i < n; i++) {r.add(list.get((int) robjs[i]));System.out.print(list.get((int) robjs[i]) + "\t");}System.out.print("\n");return r;}
}

5.Controller层

@RestController
@RequestMapping("/lxb/sms")
@Api(tags = "短信管理")
@CrossOrigin
public class ApiSmsController {@Resourceprivate SmsService smsService;@ResourceRedisTemplate redisTemplate;@ApiOperation("获取验证码")@GetMapping("/send/{mobile}")public Map<String,Object> SmsSend(@ApiParam(value = "手机号",required = true)@PathVariable String mobile){//判断手机号是否已经被注册//Map<String, Object> byMobile = smsClient.getByMobile(mobile);//boolean b= (boolean) byMobile.get("data");HashMap<String, Object> stringObjectHashMap = new HashMap<>();// if(!b){
//            1.生成随机数String fourBitRandom = RandomUtils.getFourBitRandom();smsService.sendMessage(mobile,fourBitRandom);redisTemplate.opsForValue().set("lxb:sms:code:"+mobile,fourBitRandom,5, TimeUnit.MINUTES);stringObjectHashMap.put("code",0);stringObjectHashMap.put("message","短信发送成功");// }// else// {//    stringObjectHashMap.put("code",404);//     stringObjectHashMap.put("message","短信发送失败");//该手机号已经被认证过// }return stringObjectHashMap;}}

6.Service层

public interface SmsService {void sendMessage(String mobile, String fourBitRandom);
}

7.Impl实现类以及从配置文件中获取Secret、Id、模版Id的工具类

@Service
public class SmsServiceImpl implements SmsService {@Overridepublic void sendMessage(String mobile, String fourBitRandom) {ZhenziSmsClient client=new ZhenziSmsClient(SmsUtils.API_URL,SmsUtils.APP_ID,SmsUtils.APP_SECRET);HashMap<String, Object> map = new HashMap<>();map.put("templateId","12812");map.put("number",mobile);String[] templateParams=new String[2];templateParams[0]=fourBitRandom;templateParams[1]="3";map.put("templateParams",templateParams);try {String result = client.send(map);System.out.println(result);} catch (Exception e) {e.printStackTrace();}}
}
package com.ts.oss.util;import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;@Component
public class SmsUtils implements InitializingBean {@Value("${zhenziyun.sms.file.apiUrl}")private String apiUrl;@Value("${zhenziyun.sms.file.appId}")private String appId;@Value("${zhenziyun.sms.file.appSecret}")private String appSecret;@Value("${zhenziyun.sms.file.templateId}")private String templateId;//定义公开静态常量 供其他方法使用public static String API_URL;public static String APP_ID;public static String APP_SECRET;public static String TEMPLATED_ID;@Overridepublic void afterPropertiesSet() throws Exception {API_URL=apiUrl;APP_ID=appId;APP_SECRET=appSecret;TEMPLATED_ID=templateId;}
}

提示:以下是本篇文章正文内容

二、Android 通过网络请求调用API实现验证码的发送?

1.权限的配置

<uses-permission android:name="android.permission.INTERNET" />

2.依赖的导入

implementation 'com.google.code.gson:gson:2.8.5'
implementation 'com.squareup.okhttp3:okhttp:4.4.1'

3.Xml文件的编写(UI界面的绘制)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".MainActivity"><EditText
android:hint="请输入手机号"android:id="@+id/mobile"android:layout_width="match_parent"android:layout_height="wrap_content"/><Buttonandroid:layout_gravity="center"android:id="@+id/sendMessage"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="发送验证码"tools:ignore="MissingConstraints" /></LinearLayout>

4.Activity方法的代码

public class MainActivity extends AppCompatActivity implements View.OnClickListener {private Button button;private EditText editText;@SuppressLint("MissingInflatedId")@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);editText=findViewById(R.id.mobile);button=findViewById(R.id.sendMessage);button.setOnClickListener(this);}@Overridepublic void onClick(View view) {switch (view.getId()){case R.id.sendMessage:String phonenumber=editText.getText().toString();//发送验证码OkHttpClient client= new OkHttpClient();//创建HTTP客户端String Url="http://你的IPv4地址:服务的端口号/lxb/sms/send"+"/"+phonenumber;Request request=new Request.Builder().url(Url).build();client.newCall(request).enqueue(new Callback() {@Overridepublic void onFailure(@NonNull Call call, @NonNull IOException e) {e.printStackTrace();}@Overridepublic void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {runOnUiThread(new Runnable() {@Overridepublic void run() {Toast.makeText(getBaseContext(),"验证码发送成功",Toast.LENGTH_LONG).show();}});}});}}

三、实现效果图

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python自动化之网易自动点歌

这个代码是是使用的pyautogui库和pyperclip库完成的&#xff0c;这个库是开源的地址如下&#xff1a;https://github.com/asweigart/pyautogui这里详细的用法想学习的可以到这看看 下面是代码&#xff1a; import pyautogui import subprocess import pyperclip import time i…

【大模型书籍分享】从零开始大模型开发与微调:基于PyTorch与ChatGLM

今天又来给大家推荐一本大模型方面的书籍<从零开始大模型开发与微调&#xff1a;基于PyTorch与ChatGLM>。 本书使用PyTorch 2.0作为学习大模型的基本框架&#xff0c;以ChatGLM为例详细讲解大模型的基本理论、算法、程序实现、应用实战以及微调技术&#xff0c;为读者揭…

【蓝桥杯2025备赛】素数判断:从O(n^2)到O(n)学习之路

素数判断:从O( n 2 n^2 n2)到O(n)学习之路 背景:每一个初学计算机的人肯定避免不了碰到素数&#xff0c;素数是什么&#xff0c;怎么判断&#xff1f; 素数的概念不难理解:素数即质数&#xff0c;指的是在大于1的自然数中&#xff0c;除了1和它本身不再有其他因数的自然数。 …

SPI接口的74HC595驱动数码管实现

摸鱼记录 Day_17 (((^-^))) review 前边已经学习了&#xff1a; 数码管显示原理&#xff1a;数码管动态扫描显示-CSDN博客 且挖了个SPI的坑坑 1. 今日份摸鱼任务 学习循环移位寄存器18 串行移位寄存器原理详解_哔哩哔哩_bilibili 学习SPI接口的74HC595驱动数码管19 SPI…

List实现(2)| LinkedList

参考&#xff1a;LinkedList 源码分析 在Java中&#xff0c;LinkedList是一个双向链表&#xff0c;实现了List和Deque接口&#xff0c;可以被当作列表&#xff08;List&#xff09;、队列&#xff08;Queue&#xff09;或者双端队列&#xff08;Deque&#xff09;使用。它允许…

简单3步制作纸质英语绘本的mp3英语朗读音频

孩子学英语&#xff0c;需要看很多英语绘本&#xff0c;而且要听配套的音频。但有些英语绘本是没有对应音频的&#xff0c;下面简单三步&#xff0c;就可以将任意英语绘本制作出对应的英语朗读音频。 第一步&#xff0c;手机拍照做成PDF文件&#xff1a; 绘本每一页拍照后&…

第三方软件测评报告测试内容详解

随着信息技术的迅猛发展&#xff0c;软件产品在各行各业的应用越来越广泛。为了确保软件产品的质量和性能&#xff0c;第三方软件测评报告成为了不可或缺的一环。那么&#xff0c;第三方软件测评报告测试内容究竟包括哪些呢&#xff1f;本文将从多个方面进行详细解析。 一、功…

解决IDEA https://start.spring.io/连接不上

1.换成下边这个地址试试 https://start.springboot.io/2.换成阿里云试试&#xff0c;绝对可行&#xff0c;但是版本有点低 https://start.aliyun.com

【C++]C/C++的内存管理

这篇博客将会带着大家解决以下几个问题 1. C/C内存分布 2. C语言中动态内存管理方式 3. C中动态内存管理 4. operator new与operator delete函数 5. new和delete的实现原理 6. 定位new表达式(placement-new) 1. C/C内存分布 我们先来看下面的一段代码和相关问题 int global…

Cesium实现加载离线地形数据(nginx发布数据,cesiumLab地形切片数据)

实现效果如图&#xff1a; 详细步骤 1 下载地形数据&#xff08;DEM&#xff09; 下载地址&#xff1a;地理空间数据云 (gscloud.cn) 操作步骤&#xff1a; 注意&#xff1a;第3步可以自主选择DEM的分辨率&#xff0c;然后下载。 下载结果解压后如下图&#xff1a; 2 使用…

excel里如何的科学计数法的数字转换成数值?

比如下图&#xff0c;要想把它们转换成3250跟1780&#xff0c;有什么快捷的办法吗&#xff1f; 科学计数法在excel里的格式&#xff0c;与我们常规在数学上写的有差异。这个转换可以这样做&#xff1a; 1.转换后的效果&#xff1a; 2.问题分析 题目中所附截图&#xff0c;单元…

vue3.0项目生成标签条形码(插件:jsbarcode)并打印(插件:Print.js)支持pda扫码枪扫描

文章目录 功能场景生成条形码设置打印功能踩坑 功能场景 功能场景&#xff1a;供应链中对一些货品根据赋码规则进行赋码&#xff0c;赋码之后生成根据赋码结果生成条形码&#xff0c;执行打印功能&#xff0c;贴在货品之上&#xff0c;打印之后可以用pda的手枪进行扫描&#x…

从AdTech转战Martech,驰骛科技的PaaS之路

中国最早的Adtech公司之一&#xff0c;在被全资收购后&#xff0c;其创始团队又创立了一家Martech公司。赛道的变更也从侧面反映出中国营销技术市场的发展轨迹。 驰骛科技创始团队来自易传媒核心团队&#xff0c;驰骛科技创始人程华奕是易传媒创始人兼CTO&#xff0c;是中国最早…

现在给政府机关医院学校部队供货的方式有哪些?

给政府机关、医院、学校和部队供货的方式主要包括以下几种&#xff1a; 直接采购&#xff1a;政府机关、医院、学校和部队通过招标或直接与供应商进行谈判&#xff0c;确定采购的产品和价格。这种方式常见于大宗或重要物资的采购&#xff0c;能够确保采购过程的透明度和公正性…

使用 Citavi 和 NVivo 简化您的文献综述和研究分析

NVivo 是一款支持定性研究方法和混合研究方法的软件。它可以帮助您收集、整理和分析访谈、焦点小组讨论、问卷调查、音频等内容。NVivo&#xff08;1.0版&#xff09;是Windows和Mac的主要版本。遵循最新的主要版本NVivo 12&#xff08;Windows和Mac&#xff09;。 NVivo 强大…

Linux服务器硬件及RAID配置

一、服务器硬件 塔式服务器&#xff1a;最初的服务器形态之一&#xff0c;类似于传统的台式电脑&#xff0c;但具有更强的处理能力和稳定性&#xff0c;适合小型企业或部门使用。 机架式服务器&#xff1a;设计为可安装在标准化机架内的模块化单元&#xff0c;可以有效地节省空…

jetson nx 外接按钮,实现开机功能

本文参考自https://blog.csdn.net/m0_59584375/article/details/128050175 首先第一步&#xff0c;要短接jetson nx背面的AUTO ON 和DISABLE引脚 可以用跳帽短接&#xff0c;也可以直接用一根杜邦线连接这两个针脚 AUTO ON 和DISABLE引如下图红色圈 跳帽的样子如下图 我是直…

Mabtech:与结核病相关的肽库

Mabtech 新研发出了三个涵盖结核蛋白&#xff08;EspC、ESAT-6、CFP-10&#xff09;的肽库&#xff0c;可以区分潜伏性结核病和活动性结核病的区别。所有肽库都经过验证&#xff0c;都可用于ELISpot、FluoroSpot实验。 1. EspC scanning pool ● EspC scanning pool包含来自结…

42-软件部署实战(下):IAM系统安全加固、水平扩缩容实战

IAM应用安全性加固 iam-apiserver、iam-authz-server、MariaDB、Redis和MongoDB这些服务&#xff0c;都提供了绑定监听网卡的功能。将服务绑定到内网网卡上。 我们也可以通过iptables来实现类似的功能&#xff0c;通过将安全问题统一收敛到iptables规则&#xff0c;可以使我…

速看!2024中国(厦门)国际康复医疗展览会

2024中国&#xff08;厦门&#xff09;国际康复医疗展览会 2024 China (Xiamen) International Rehabilitation Medical Exhibition 时 间&#xff1a;2024年8月13-15日 August 13-15, 2024 地 点&#xff1a;厦门国际会展中心 Xiamen International Conference & Exh…