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

news/2024/9/24 11:23:40/

榛子云短信官网

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

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

我的应用中有后续开发要用到的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.创建启动类以及添加随机数生成工具类

java">@SpringBootApplication(exclude= {DataSourceAutoConfiguration.class})
@EnableFeignClients
@ComponentScan("com.ts")
public class SmsApplication {public static void main(String[] args) {SpringApplication.run(SmsApplication.class,args);}}
java">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层

java">@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层

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

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

java">@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();}}
}
java">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.权限的配置

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

2.依赖的导入

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

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

java"><?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方法的代码

java">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.ppmy.cn/news/1431433.html

相关文章

【深度学习】【机器学习】用神经网络进行入侵检测,NSL-KDD数据集,基于机器学习(深度学习)判断网络入侵,网络攻击,流量异常【3】

之前用NSL-KDD数据集做入侵检测的项目是&#xff1a; 【1】https://qq742971636.blog.csdn.net/article/details/137082925 【2】https://qq742971636.blog.csdn.net/article/details/137170933 有人问我是不是可以改代码&#xff0c;我说可以。 训练 我将NSL_KDD_Final_1.i…

【设计模式】享元模式

目录 什么是享元模式 代码实现 什么是享元模式 Java中的享元模式&#xff08;Flyweight Pattern&#xff09;是一种结构型设计模式&#xff0c;它用于减少系统中对象的数量&#xff0c;以节省内存和提高性能。享元模式通过共享相似对象之间的公共部分来最小化内存使用。 在享…

Python:腾讯云-轻量应用服务器-实现自动快照

Python&#xff1a;腾讯云-轻量应用服务器-实现自动快照 – WhiteNights Site 先说一下配置情况&#xff1a;轻量应用服务器一块系统盘。我没钱加盘&#xff0c;所以不知道多块盘的情况下这个脚本还能不能用。 官方文档给的代码已经很齐全了&#xff0c;只需要做点补充就能直…

安卓基础知识-跨进程通信IPC篇

目录 1. Intent简介和作用分类常见操作创建intent设置component目的组件&#xff08;显式intent&#xff09;设置action动作添加category类别设置data数据和type类型设置和读取扩展数据extras设置flags标志位常见用法 2. Messenger3. Binderbinder机制介绍binder面试题AIDL 4. …

C语言进阶课程学习记录- 函数与宏分析

C语言进阶课程学习记录- 函数与宏分析 实验-宏和函数实验-宏的副作用实验-宏的妙用小结 本文学习自狄泰软件学院 唐佐林老师的 C语言进阶课程&#xff0c;图片全部来源于课程PPT&#xff0c;仅用于个人学习记录 实验-宏和函数 #include <stdio.h>#define RESET(p, len) …

数字化革新:可视化墨水屏引领基板工艺MSAP贴膜阶段迈向无纸化高端制造应用背景

随着科技的飞速发展和环境保护意识的日益增强&#xff0c;制造印刷电路板&#xff08;PCB&#xff09;行业正面临着提升生产效率、降低资源消耗和推动绿色制造的迫切需求。 问题&#xff1a; PCB生产过程对洁净度要求高&#xff0c;传统打印的纸张会有粉尘&#xff0c;纸屑&am…

VMware虚拟机安装CentOS详细教程

前言 最近小白发现&#xff0c;有很多小伙伴在学习过程中都需要配置CentOS的系统&#xff0c;因此决定更新一篇在VMware虚拟机上安装CentOS的教程。 小白最近也去看了一下各种云的服务商出租的服务器&#xff0c;其中可选的系统中也有包括CentOS&#xff0c;所以在VMware配置…

220个常见的金融术语名词解释

标的&#xff08;Underlying&#xff09; 标的代表交易产品或交易工具所基于的单位证券。例如&#xff0c;IBM期权&#xff0c;该期权的标的即为IBM股权。 英文释义&#xff1a; Underlying refers to the security that is the base unit of a product or trading vehicle.…