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和它本身不再有其他因数的自然数。 …

执行 kubeadm join 报错

执行 kubeadm join 192.168.31.220:6443 --token 2fn4t4.syeegrav0nadt9mh --discovery-token-ca-cert-hash sha256:df5eee**********************************2e6e653aa83ea8c32 报如下错误 error execution phase preflight: [preflight] Some fatal errors occurred: …

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

Centos7 一键yum阿里云源脚本;一键安装docker docker-compse ;一键安装 GParted;

目录 安装docker和设置阿里源 安装docker-compose YUM 一键安装 GParted 可以通过以下一键 Shell 脚本 测试机型x86-64平台 安装docker和设置阿里源 install_docker.sh #!/bin/bash# 设置阿里云的YUM仓库 cat > /etc/yum.repos.d/docker-ce.repo <<EOF [docker-c…

使用kafka的几种场景

1.消息异步化 在一个分布式的微服务架构中&#xff0c;实现一个聊天的功能&#xff0c;小明和小红互相给对方发消息&#xff0c;如果有两个netty服务器&#xff0c;小明连的是netty服务器1&#xff0c;小红连的是netty服务器2&#xff0c;现在小明给小红发消息&#xff0c;但是…

【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 使用…

【php快速上手(八)】

目录 PHP快速上手&#xff08;八&#xff09;PHP 数组1. 数组的定义2. 数组的操作3. 多维数组4. 数组遍历 PHP数组排序1. 排序索引数组2. 排序关联数组3. 自然排序4. 自定义排序 PHP快速上手&#xff08;八&#xff09; PHP 数组 在 PHP 中&#xff0c;数组是一种数据结构&am…

Redis延迟双删

什么是延迟双删&#xff1f; 做法&#xff1a;先删除redis&#xff0c;再更新数据库&#xff0c;延迟N秒后再删除一次redis。 延迟双删策略是分布式系统中数据库存储和缓存数据保持最终一致性的常用策略&#xff0c;但它不是强一致。其实不管哪种方案&#xff0c;都避免不了Red…

生存分析机器学习

生存分析&#xff1a;时间背后的数据价值&#xff01; &#x1f4a1; 生存分析是一种研究现象或物体随时间推移而发生的变化的方法&#xff0c;可广泛应用于金融、医疗、保险、交通等领域&#xff0c;比如预测疾病复发风险、评估投资产品收益、估算保险赔付概率等。通过挖掘数…

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…

服务端渲染 --- 模板引擎

一、Apach 替换页面的内容 template.html <table><thead><tr><th onclick"javascript;sortTable(0);">名称</th><th class"detailsColumn" onclick"javascript:sortTable(1);">大小</th><th clas…

ROS 2边学边练(28)-- 将launch文件集合到ROS 2包中

前言 上一篇我们单独创建了文件夹&#xff08;可以任何路径&#xff09;&#xff0c;并在其中创建编写了一份launch文件&#xff0c;调用了小海龟例程&#xff0c;但通常情况下这并非是launch文件的典型应用场景&#xff0c;更多的是在ROS 2功能包中创建使用launch文件。 动动…