个人用户实现发送短信功能

news/2024/10/31 1:31:36/

准备工作

因为国家政策 ,阿里云和其他的大型短信调用网站审核严格所以我们用比较普通的榛子云来练习短信验证

了解阿里云短信码

登录阿里云,选择短信服务

在这里插入图片描述

首先要了解发送短信的四个步骤

在这里插入图片描述

进入申请签名,查看大致内容,可以看到这边需要用到很多证,点击下载委托书模板查看证件的大致内容。

在这里插入图片描述
下载完毕后可以看到,委托书大概内容如下:
在这里插入图片描述
申请签名之后需要在后台验证这个签名,由于我们申请不了,这边只做了解即可。其余的三个步骤点进去查看大概内容,在面试的时候能够说出一二即可。

榛子云短信系统

选择注册榛子云短信用户注册系统

在这里插入图片描述

注册之后进入如下页面

注意:榛子云只是一个测试系统,真实开发中还是使用阿里云短信服务,这边的榛子云发送短信需要先进行充值。

在这里插入图片描述

打开我的应用,查看这边的APPId,AppSecret,这边后续开发中会用到。

在这里插入图片描述

创建项目

创建一个SpringBoot项目,这边最好选择自定义的阿里云网址,防止创建项目失败的情况。

在这里插入图片描述

导入如下依赖

 <dependency><groupId>com.zhenzikj</groupId><artifactId>zhenzisms</artifactId><version>2.0.2</version></dependency>

创建完毕之后,使用阿里域名创建的项目会自动生成一个properties文件,只需要改动数据库连接地址,用户名和密码即可。

在这里插入图片描述

复制MessageDemo

package com.zb.utils;import com.zhenzi.sms.ZhenziSmsClient;import java.util.HashMap;
import java.util.Map;
import java.util.Random;public class MessageDemo {public static Map<String,Object> sendMessage(String phone){Map<String,Object> map = new HashMap<>();String apiUrl="https://sms_developer.zhenzikj.com";String appId="xxxx";//在控制台的 我的应用String appSecret="xxxx";//在控制台的 我的应用ZhenziSmsClient client = new ZhenziSmsClient(apiUrl, appId, appSecret);Map<String, Object> params = new HashMap<String, Object>();params.put("number", phone);//你要发送的手机号params.put("templateId", "10226");//短信模板里的String[] templateParams = new String[2];//模板int i = new Random().nextInt(9999 - 1000 + 1);int sjs=i+1000;String yzm = String.valueOf(sjs);templateParams[0] = yzm;templateParams[1] = "5分钟";params.put("templateParams", templateParams);String result = null;try {result = client.send(params);} catch (Exception e) {e.printStackTrace();}map.put("yzm",yzm);map.put("result",result);System.out.println(result);return map;}
}

粘贴自己应用的几个id

在这里插入图片描述

因为需要验签,所以验证码应该放在redis中,所以应该写一个redis的工具类。

package com.zb.utils;import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.cache.RedisCacheWriter;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.data.redis.serializer.StringRedisSerializer;@Configuration
public class RedisConfig extends CachingConfigurerSupport {@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {Jackson2JsonRedisSerializer<Object> serializer = new Jackson2JsonRedisSerializer<Object>(Object.class);ObjectMapper objectMapper = new ObjectMapper();objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);serializer.setObjectMapper(objectMapper);RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();redisTemplate.setConnectionFactory(redisConnectionFactory);redisTemplate.setKeySerializer(new StringRedisSerializer());redisTemplate.setValueSerializer(serializer);redisTemplate.setHashKeySerializer(new StringRedisSerializer());redisTemplate.setHashValueSerializer(serializer);redisTemplate.afterPropertiesSet();return redisTemplate;}@Beanpublic RedisCacheManager redisCacheManager(RedisTemplate redisTemplate) {RedisCacheWriter redisCacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(redisTemplate.getConnectionFactory());RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig().serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(redisTemplate.getValueSerializer()));return new RedisCacheManager(redisCacheWriter, redisCacheConfiguration);}
}

写一个简单的登录页面

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>验证码登录</title><script src="http://libs.baidu.com/jquery/1.9.1/jquery.min.js"></script></head>
<body>手机号:<input id="phone"/><br/>验证码:<input id="code"/><br/>
<button id="getCode">获取验证码</button>
<button id="login">登录</button></body><script>login();function login(){$("#getCode").click(function(){var phone = $("#phone").val();$.ajax({url:"/sendMessage",data:{'phone':phone},datatype:"json",type:"post",success:function(msg){alert(msg);if(msg=='{"code":0,"data":"发送成功"}'){alert("发送成功");}}})})$("#login").click(function () {var code = $("#code").val();$.ajax({url:"/verify",type:"post",data:{"code":code},dataType:"json",success:function (msg) {if(msg==true){alert("登录成功");}else{alert("登录失败")}},error:function () {alert("网络正忙");}})})}</script>
</html>

最后写一个controller控制器进行跳转,判断验证码以及发送短信的操作。

package com.zb.controller;import com.zb.utils.MessageDemo;
import com.zb.utils.RedisConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;import java.util.Map;
import java.util.concurrent.TimeUnit;@Controller
public class UserController {@Autowiredprivate RedisConnectionFactory redisConnectionFactory;@Autowired(required = false)private RedisConfig redisConfig;/*** 登录* @return*/@RequestMapping("toLogin")public String toLogin(){return "login";}/*** 发送信息* @return*/@RequestMapping("sendMessage")@ResponseBodypublic String sendMessage(@RequestParam String phone){System.out.println(phone);Map<String,Object> map = MessageDemo.sendMessage(phone);String yzm = (String) map.get("yzm");RedisTemplate<String, Object> redisTemplate = redisConfig.redisTemplate(redisConnectionFactory);redisTemplate.opsForValue().set("yzm",yzm,3000, TimeUnit.SECONDS);String result = (String) map.get("result");return result;}/*** 判断验证码*/@RequestMapping("/verify")@ResponseBodypublic Boolean verify(String code){RedisTemplate<String, Object> redisTemplate = redisConfig.redisTemplate(redisConnectionFactory);String yzm = (String) redisTemplate.opsForValue().get("yzm");Boolean flag = false;if(yzm.equals(code)){flag = true;}return flag;}}

操作页面如下:

在这里插入图片描述

在这里插入图片描述

到这边基本就完成了


http://www.ppmy.cn/news/312075.html

相关文章

项目开发经验

hadoop 1.namenode中有专门的工作线程池用于处理与datanode的心跳信号 dfs.namenode.handler.count20 * log2(Clust 2.编辑日志存储路径 dfs.namenode.edits.dir 设置与镜像文件存储路径 dfs.namenode分开存放&#xff0c;可以达到提高并发 3.yarn参数调优&#xff0c;单个服…

Django-可重用注册登录系统--项目搭建

文章目录 一、项目开始前的思考二、搭建项目环境三、设计数据库模型数据库模型文件设置数据库后端注册app生成迁移脚本并写入数据库测试是否成功数据库模型后台管理 路由与视图函数框架搭建路由配置视图函数的配置模板template的配置测试是否成功 前端界面设计与优化完善登录的…

码出高效(一) Java 编程风格规约

一.前言 本文为《码出高效》系列博文第一篇&#xff0c;主要目的是统一和规范代码编程风格&#xff0c;改善应用程序的可读性&#xff0c;提高开发效率。规约包括命名、定义、函数、异常、排版等不同的场景&#xff0c;结合个人的实习经验和业界开发手册总结归纳&#xff0c;参…

【工作中遇到的性能优化问题】

项目场景&#xff1a; 页面左侧有一列表数据&#xff0c;点击列表项会查对应的表格数据和表单信息&#xff08;表单是根据数据配置生成的&#xff09;&#xff0c;并在右侧展示。如果数据量大&#xff0c;则非常卡。 需要对此页面进行优化。 问题描述 问题一、加载左侧数据时…

据说加入9E技术员家园,装机设首页。月赚几千

做IT行业这么久&#xff01;技术员装机苦闷&#xff0c;加入9E技术员家园装机一个月可以额外赚个1000多块 我来告诉大家9E技术员家园好不好: 在做其他联盟的技术员请认真看看哟 1&#xff1a;超过10元即可申请领薪&#xff0c;全网装机实际收入最高。所有软件支持静默安装 2&…

Tableau 错误代码: 6EA18A9E,导入自定义地理时发生意外错误,无法完成操作

照教程学&#xff0c;在导入自定义定理编码时发现此问题。 无法完成操作 内部错误 - 发生意外错误&#xff0c;无法完成操作。 错误代码: 6EA18A9E tableau在7月30号修复了此问题 下载网址&#xff1a;https://www.tableau.com/zhcn/support/releases/desktop/2020.2.4#esdal…

关于9E+307

经常看到初学者会问&#xff0c;公式中出现的9E307是什么意思呀&#xff1f; 今天我就说说这个问题。 昨天的文章也说了&#xff0c;其实许多问题的解决方法就能在帮助文件中找到&#xff0c;这个问题也不例外。搜索“限制”&#xff0c;查看“Excel 规范与限制”一节&#x…

9E技术员家园注册码;a266

做IT行业这么久了&#xff01;技术员装机苦闷&#xff01;加入9E技术员家园装机一个月可以额外赚个1000多块挺高兴的 我来告诉大家9E技术员家园好不好: 在做其他联盟的技术员请认真看看哟 1&#xff1a;超过10元即可申请领薪&#xff0c;全网装机实际收入最高。所有软件支持…