榛子云短信验证平台与springboot集成的短信验证

news2024/9/25 17:21:32

登录 - 榛子云短信用户系统 (zhenzikj.com)

上面是登录榛子云短信验证平台的入口,此平台的短信大概为3.1分一条短信

如何与spring boot进行集成呢,我以注册为例来慢慢讲解

1.注册号榛子云账号并充值可发送短信

2.在项目pom.xml导入jar包


        <!-- 榛子短信-->
        <dependency>
            <groupId>com.zhenzikj</groupId>
            <artifactId>zhenzisms</artifactId>
            <version>2.0.2</version>
        </dependency>
        <!--转换json数据-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.47</version>
        </dependency>

 3.编写一个contorller,用与调用榛子云短信验证平台发送短信

package com.huamei.trade.controller;

import com.alibaba.fastjson.JSONObject;
import com.zhenzi.sms.ZhenziSmsClient;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ThreadLocalRandom;

@Controller
public class SendCodeController {
    //短信平台相关参数
    //这个不用改
    private String apiUrl = "https://sms_developer.zhenzikj.com";
    //榛子云系统上获取
    //AppId
    private String appId = "112617";
    //AppSecret
    private String appSecret = "53846b68-f624-4d67-807a-4be3279612b3";

    @ResponseBody//这个注解是mvc的拦截器的应该通过注解,可不要
    @RequestMapping("/sendCode")
    public String sendCode(String memPhone) {
        try {
            //短信发送需要的参数是json类型
            JSONObject json;
            //随机6位生成验证码
            String code = String.valueOf(ThreadLocalRandom.current().nextInt(100000, 1000000));
            //将验证码通过榛子云接口发送至手机
            ZhenziSmsClient client = new ZhenziSmsClient(apiUrl, appId, appSecret);
            //参数类型
            Map<String, Object> params = new HashMap<>();
            //前台输入的手机号
            params.put("number", memPhone);
            //这个模板id对应的是榛子云个人中心的模板id
            params.put("templateId", 10777);
            //参数占位符,不同的模板有不同的参数个数 目前用的模板有两个参数
            String[] templateParams = new String[2];
            //第一个参数 随机生成的六位验证码
            templateParams[0] = code;
            //第二个参数 x分钟
            templateParams[1] = "5";
            //把参数占位符放在整体参数中
            params.put("templateParams", templateParams);
            //执行发送短信
            String result = client.send(params);
            System.out.println(result);
            json = JSONObject.parseObject(result);
//            发送短信失败
            if (json.getIntValue("code") != 0) {
                return null;
            }
            return code;
        } catch (Exception e) {
            e.printStackTrace();
            return "code not found";
        }
    }

    /**
     * 跳转发送短信页面
     *
     * @return java.lang.String
     **/
    @RequestMapping("/goSendCode")
    public String goSendCode() {
        return "/sendCode";
    }

}

4.编写前台,调用contorller发送验证码

<!DOCTYPE html>
<html>
<head>
	<#include "common/head.html">
	<link rel="stylesheet" type="text/css" href="css/public.css"/>
	<link rel="stylesheet" type="text/css" href="css/login.css"/>
	<script type="text/javascript" src="js/jquery-1.12.4.min.js"></script>
	<script type="text/javascript" src="js/md5.js"></script>
	<script>
		// 获取后台传输过来的验证码
		let codeNumber = "";
		$(function () {
			$("#reg").click(function () {
				//获取表单的值
				let mobile = $("#mobile").val();
				let password1 = $("#pwd1").val();
				let password2 = $("#pwd2").val();
				let nickname = $("#name").val();
				let code = $("#code").val();

				//密码一致判断
				if (password1 !== password2) {
					alert("密码不一致,重新输入");
					return;
				}
				//加密盐 加密
				let salt = 'f1g2h3j4';
				let temp = salt.charAt(1) + "" + salt.charAt(5) + password1 + salt.charAt(0) + "" + salt.charAt(3);
				//使用md5加密
				let pwd = md5(temp);

				// 验证码判断
				if (code != codeNumber) {
					alert('验证有误');
					return;
				}
				//掉用contorller的userReg注册
				$.ajax({
					url: '/user/userReg',
					data: {
						id: mobile,
						nickname: nickname,
						password: pwd
					},
					type: 'post',
					dataType: 'json',
					success: function (resp) {
						if (resp.code != 200) {
							alert(resp.msg);
						} else {
							location.href = "/page/login.html";
						}
					}
				})

			})
		});

		//	-----------------------

		//发送验证码按钮
		function sendCode() {
			//获取手机号 判断手机号是否输入
			let memPhone = $("#mobile").val();
			if (memPhone == '' || memPhone.length != 11) {
				alert("请输入正确的手机号!");
				return;
			} else {
				timer();
				//手机号输入,调用contorller/sendcode方法发送验证码
				$.ajax({
					type: 'get',
					url: '/sendCode',
					data: {
						memPhone: memPhone,
					},
					dataType: 'json',
					success: function (data) {
						//获取后台验证码
						codeNumber = data;
						if (data) {
						} else {
							alert("获取验证码失败");
						}
					},
					error: function (data) {
						alert('连接超时!');
					},
				});
			}
		}

		let wait = 60;

		//倒计时 设置按钮样式
		function timer() {
			if (wait == 0) {
				$("#sendBtn").val("获取验证码");
				$("#sendBtn").removeAttr("disabled");
				$("#sendBtn").css("border-color", "1e9fff").css("background", "#ffffff").css("cursor", "pointer");
				wait = 60;
			} else {
				$("#sendBtn").attr("disabled", "true");
				$("#sendBtn").css("border-color", "fbfbfb").css("background", "#ccc").css("cursor", "not-allowed");
				$("#sendBtn").val(wait + "秒后重发");
				wait--;
				//等待一秒
				setTimeout(function () {
					timer()
				}, 1000);
			}
		}

		//	------------------------------
	</script>

	<style>
		#sendBtn {
			height: 40px;
			width: 100px;
			margin-left: 12px;
			margin-top: 10px;
			font-size: 14px;
		}
	</style>

</head>
<body>
<!-------------------reg-------------------------->
<div class="reg">
	<form  method="post">
		<h1><a href="${ctx}/"><img src="img/temp/pingpai.png" width="160px" height="70px" ></a></h1>
		<p style="font-size:14px;" > 用户注册</p>
		<p><input style="font-size:14px;" type="text" id="mobile"  name="mobile" placeholder="请输入电话"></p>
		<p><input style="font-size:14px;" type="text" id="name"  name="name" placeholder="请输入昵称"></p>
		<p><input style="font-size:14px;" type="password" id="pwd1" name="pwd1" placeholder="请输入密码"></p>
		<p><input style="font-size:14px;" type="password" id="pwd2" name="pwd2" placeholder="请确认密码"></p>
		<p class="txtL txt">
			<input style="font-size:14px;" class="code" type="text" id="code" placeholder="验证码">
			<input type="button"  value="获取验证码" id="sendBtn" onclick="sendCode()" >
		</p>
		<p><input type="button"  id="reg" value="注册"></p>
		<p class="txtL txt">完成此注册,即表明您同意了我们的<a href="/page/tiaoli.html"><使用条款和隐私策略></a></p>
		<p class="txt"><a href="${ctx}/page/login.html"><span></span>已有账号</a></p>
		<!--<a href="#" class="off"><img src="img/temp/off.png"></a>-->
	</form>
</div>
</body>
</html>

前台我采用的是free marker,如果有语法不懂得可去我博客看free marker讲解

free make详解icon-default.png?t=M85Bhttps://blog.csdn.net/weixin_67150631/article/details/127840284?spm=1001.2014.3001.5501

 

效果演示 

 

 注意:

要看清出自己得appid和appseret,还有自己得模板id,短信呢挺贵得,注意测试得时候慢慢来

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

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

相关文章

HTML+CSS+JS我的班级网页设计期末课程大作业 web前端开发技术 web课程设计 网页规划与设计

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

位运算介绍、图解位运算相关题目【一个数字出现了K次,其他数字出现了M次,M > 1 K < M 找到出现了K次的数】【找到出现奇数次的数】等题目

位运算 常见的位运算 >>、>>>、<<、|、&、^、||、&&、~等 原码、反码、补码 原码 将一个整数转换成二进制形式&#xff0c;就是其原码。例如 6 原码就是……0000 0000 0000 0110 反码 对于正数&#xff0c;它的反码就是其原码&#xff08;…

节省50%带宽,这款媒体处理产品了解下!

视频处理技术想必大家都有所了解&#xff0c;现在每天都会涌现出大量新的视频处理模型&#xff0c;它们有的能够超分、降噪&#xff0c;有的能够做目标检测、跟踪、识别&#xff0c;加上一些前端技术就能实现很多炫酷的功能。但是现在大多数模型都是单任务模型&#xff0c;想要…

【POJ No. 2777】 颜色统计 Count Color

【POJ No. 2777】 颜色统计 Count Color 北大OJ 题目地址 【题意】 有一个长L 厘米的电路板&#xff0c;可以将板均分为L 段&#xff08;1&#xff5e;L &#xff09;&#xff0c;每段长1厘米。现在给电路板上色&#xff0c;每段只有一种颜色。可以在电路板上执行两种操作&am…

Qt扫盲-Assistant 助手使用总结

Qt Assistant助手 使用记录预备一、顶部菜单栏1. 快捷栏2. 文件、前往、帮助3. 查看-工具栏4. 编辑-首选项5. 书签二、侧边菜单栏1. 修改显示功能Bar2. 内容3. 索引4. 书签三、内容主体1. 结构总览 Content2. Properties3. Public Functions4. Reimplemented Public Functions5…

【JUC】并发编程学习笔记(三)

JUC并发编程八、ReentrantReadWriteLock 读写锁8.1、概述8.2、案例8.3、读写锁的降级九、BlockingQueue阻塞队列9.1、阻塞队列概述9.2、阻塞队列分类9.2.1、ArrayBlockingQueue(常用)9.2.2、LinkedBlockingQueue(常用)9.2.3、 DelayQueue9.2.4、 PriorityBlockingQueue9.2.5、 …

混合馈能悬架的设计与仿真(MATLAB)

目 录 摘 要 I Abstract II 第一章 绪论 1 1.1课题研究背景和意义 1 1.2国内外研究现状 2 1.3本文的主要研究内容 4 第二章 混合馈能悬架系统的工作原理 5 2.1混合馈能悬架系统的设计理念 5 2.2馈能系统的原理 6 2.3馈能系统的类型 6 2.4混合馈能悬架系统结构选型 8 2.5本章小结…

技术分享 | 如何确保API 的稳定性与正确性?你只需要这一招

现在&#xff0c;越来越多的 Web 应用转向了RESTful的架构&#xff0c;很多产品和应用暴露给用户的往往就是一组 REST API&#xff0c;这样有一个好处&#xff0c;用户可以根据需要&#xff0c;调用不同的 API&#xff0c;整合出自己的应用出来。从这个角度来讲&#xff0c;Web…

前端字体压缩(免费简单易上手)

场景&#xff1a;前端在开发过程中有时候要用到特殊字体&#xff0c;但如果引用网上下载好的字体&#xff0c;它们都是一个全的字体文件&#xff0c;这种字体文件里往往包含了大量你用不到的文字字符&#xff0c;从而导致你引入的字体文件大小高达1M以上&#xff0c;这会严重影…

C++08函数模板

1.自动推导类型 在C语言和C98中&#xff0c;auto 关键字用于修饰变量(自动存储的局部变量)。 在C11中&#xff0c;赋予了auto 全新的含义&#xff0c;不再用于修饰的变量&#xff0c;而是作为一个类型指示符&#xff0c;指示编译器在编译时推导auto声明的变量的数据类型。 在…

SpirngBoot<读完包你更上一层楼>

目录 一、SpringBoot概念 1.1 什么是SpringBoot 1.2 为什么要学习SpringBoot 1.3 SpringBoot的特点 1.4 总结 二、入门案例 2.1 创建工程 2.1.1 创建一个空工程 2.1.2 工程名为project_test&#xff1a; 2.1.3 设置jdk版本为1.8 2.1.4 新建一个module 2.1.5 填写项…

入职字节外包一个月,我离职了

有一种打工人的羡慕&#xff0c;叫做“大厂”。 真是年少不知大厂香&#xff0c;错把青春插稻秧。 但是&#xff0c;在深圳有一群比大厂员工更庞大的群体&#xff0c;他们顶着大厂的“名”&#xff0c;做着大厂的工作&#xff0c;还可以享受大厂的伙食&#xff0c;却没有大厂…

[附源码]计算机毕业设计springboot吾悦商城管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

老司机带带你,教你学会Java中又骚又暴力的“反射”技术

在Java中有这么一个很骚的技术&#xff0c;几乎贯穿了所有主流的框架&#xff0c;在所有主流框架的底层中你都可以看见它的身影&#xff0c;这个技术就是反射。关于反射&#xff0c;有很多小白会觉得很难&#xff0c;搞不清楚到底是怎么回事&#xff0c;也不知道该怎么用&#…

VS Code快速实现Git PR操作

注意&#xff1a;建议先学习git的基本操作。 安装插件 下图中红圈标记的插件都安装好。 Fork上游仓库 在网页上点击你想要fork的仓库&#xff0c;点击fork 然后该仓库就会fork到你的github账户下面&#xff0c;如下图。 现在可以在你账户下面的repo&#xff08;我们称为下…

[附源码]Python计算机毕业设计Django和vue的茶文化交流平台的设计与实现

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

Global Mapper 导出图层功能的妙用(重采样、设置文件类型、切片、按掩膜提取or裁剪……)

许多GIS软件都有导出的功能&#xff0c;但其中大部分的导出功能比较单一直接&#xff0c;仅仅是导出而已&#xff0c;或者最多可以改个导出的格式&#xff0c;改个坐标。但是Global Mapper 不一样&#xff0c;导出功能非常非常多&#xff0c;比如重采样&#xff08;可以设置重采…

Vue3框架的创建的两种种方案(第十二课)

1 VueCLi脚手架的安装 Home | Vue CLI (vuejs.org) 使用方法 | Yarn 中文文档 (bootcss.com) 3 Vite脚手架的安装 Vite | 下一代的前端工具链 4 使用的软件 Visual Studio Code webstorm64.exe IntelliJ IDEA 2022.2.3 HBuilder X 方案一 VueCLi脚手架的安装 1 创…

[附源码]计算机毕业设计在线招聘网站Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

MobileViT

还是vit系列啊 只不过这次是Apple团队出的轻量级、通用且移动友好的网络框架 论文地址&#xff1a;https://arxiv.org/pdf/2110.02178.pdf 轻量级卷积神经网络 (CNN) 是移动视觉任务的事实。他们的空间归纳偏差使他们能够在不同的视觉任务中以较少的参数学习表示。 轻量级卷积…