详解手机注册验证码操作思路与流程
手机注册验证码操作思路与流程
1、前端传入手机号参数并做验证码倒计时
/*** 重新获取验证码倒计时* @returns*/reGetSMS : function () {var obj = $('#btn_getCode');// 重新发送倒计时var validCode = true;var time=60;if (validCode) {validCode = false;var t = setInterval(function () {time --;$(obj).html('重新获取('+time+'s)');if (time==0) {clearInterval(t);$(obj).html("重新获取");validCode = true;sms_flag = true;}},1000);}}
2、随机生成验证码
public static String getSMSCode() { return String.valueOf((int)(Math.random() * 9000) + 1000);}
3、将生成的验证码通过第三方接口已短信形式发送给手机
/***参数是手机号码和由验证码组成的字符串*/private static boolean send(String phone, String content) throws Exception {// 创建StringBuffer对象用来操作字符串StringBuffer sb = new StringBuffer("http://http.yunsms.cn/tx/?");// 向StringBuffer追加用户名sb.append("uid=56262");// 向StringBuffer追加密码(密码采用MD5 32位 小写)sb.append("&pwd=3019654cd7d57f8a8464e2b63f8c923c");// 向StringBuffer追加手机号码sb.append("&mobile=" + phone);// 向StringBuffer追加消息内容转URL标准码sb.append("&content=" + URLEncoder.encode(content,"gbk"));BufferedReader in = null;URL url = null;HttpURLConnection connection = null;int result = 0;try {url = new URL(sb.toString());connection = (HttpURLConnection) url.openConnection();connection.setRequestMethod("POST");in = new BufferedReader(new InputStreamReader(url.openStream()));result = Integer.parseInt(in.readLine());} catch (Exception e) {throw new Exception("发送短信失败",e);} finally {if (in != null) {in.close();}if (connection != null) {connection.disconnect();}}return result == SUCCESS_SMS;}
4、保存验证码到数据库
要点:
a、需要存的参数手机号、验证码、开始时间、结束时间
public class SMSDto {/** 手机号码 */ private String phone;/** 短信验证码 */ private String sms_code;/** 开始时间(当前秒数) */ private String begin_time;/** 到期时间(当前秒数 + 有效期) */ private String end_time;/*** 默认构造方法*/public SMSDto() {super();}/*** 生成验证码* @param phone 手机* @param sms_code 验证码*/public SMSDto(String phone, String sms_code) {super();this.phone = phone;this.sms_code = sms_code;int cur = (int) (System.currentTimeMillis() / 1000);this.begin_time = String.valueOf(cur);this.end_time = String.valueOf(cur + GlobalContract.TIME_SMS);}}
b、先验证手机号码是否存在,存在则修改
5、验证码验证
// 1.验证【验证码】
SMSDto smsDto = smsUserDao.getSMSCode(phone);
a、验证验证码是否正确
sms_code.equals(smsDto.getSms_code())
b、验证验证码是否过期
if (((long) (System.currentTimeMillis() / 1000)) < Long.parseLong(smsDto.getEnd_time())) {
//未过期
}else{
//已过期
}
实现层关键代码:
//准备验证码private ResultVO sendSmsCode(String phone) throws Exception{log.info(GlobalContract.LOG_BEGIN);ResultVO resultVO = null;// 1.生成验证码String random = SMSUtil.getSMSCode();// 2.发送验证码if(SMSUtil.sendSMS(phone, random)){// 3.保存验证码SMSDto sms = new SMSDto(phone, random);SMSDto smsDto = smsUserDao.getSMSCode(phone);if (smsDto == null) {// 新增验证码smsUserDao.addUserSMS(sms);} else {// 修改验证码smsUserDao.updateUserSMS(sms);}resultVO = new ResultVO();} else {resultVO = new ResultVO(GlobalMessage.MSG_07);}log.info(GlobalContract.LOG_END);return resultVO;}
SMSUtil类关键代码:
public class SMSUtil {/** 短信模板 */private static final String CONTENT_0 = "(验证码)感谢您的支持,祝您生活愉快!【xxx】";/** SMS发送成功 */public static final int SUCCESS_SMS = 100;// public static void main(String[] args) throws Exception {// System.out.println(sendSMS("18018025014", "123456"));// }/*** 发送验证码* @param phone 手机* @param random 验证码* @return*/public static boolean sendSMS(String phone, String random) throws Exception {return send(phone, random.concat(CONTENT_0));}/*** 生成验证码* @return*/public static String getSMSCode() {return String.valueOf((int)(Math.random() * 9000) + 1000);}/*** 发送短信* @param phone 手机号码* @param content 发送内容* @return*/private static boolean send(String phone, String content) throws Exception {// 创建StringBuffer对象用来操作字符串StringBuffer sb = new StringBuffer("http://http.yunsms.cn/tx/?");// 向StringBuffer追加用户名sb.append("uid=56262");// 向StringBuffer追加密码(密码采用MD5 32位 小写)sb.append("&pwd=3019654cd7d57f8a8464e2b63f8c923c");// 向StringBuffer追加手机号码sb.append("&mobile=" + phone);// 向StringBuffer追加消息内容转URL标准码sb.append("&content=" + URLEncoder.encode(content,"gbk"));BufferedReader in = null;URL url = null;HttpURLConnection connection = null;int result = 0;try {url = new URL(sb.toString());connection = (HttpURLConnection) url.openConnection();connection.setRequestMethod("POST");in = new BufferedReader(new InputStreamReader(url.openStream()));result = Integer.parseInt(in.readLine());} catch (Exception e) {throw new Exception("发送短信失败",e);} finally {if (in != null) {in.close();}if (connection != null) {connection.disconnect();}}return result == SUCCESS_SMS;}}
详解手机注册验证码操作思路与流程相关推荐
- Android中measure过程、WRAP_CONTENT详解以及xml布局文件解析流程浅析(下)
本文原创, 转载请注明出处:http://blog.csdn.net/qinjuning 上篇文章<<Android中measure过程.WRAP_CONTENT详解以及xml布局文 ...
- php推荐码生成,最新最全PHP生成制作验证码代码详解(推荐),验证码详解_PHP教程...
最新最全PHP生成制作验证码代码详解(推荐),验证码详解 1.0 首先先看代码 好,现在结合以上代码,来分析分析以上用到的几个函数: ① imagecreatetruecolor(); imagecr ...
- 第三节:带你详解Java的操作符,控制流程以及数组
前言 大家好,我是 Vic,今天给大家带来带你详解Java的操作符,控制流程以及数组的概述,希望你们喜欢 操作符 算数操作符 一般的 +,-,*,/,还有两个自增 自减 ,以及一个取模 % 操作符. ...
- android融合存储,科技瞭望台:8G真能变12G?详解手机内存融合技术
科技瞭望台:8G真能变12G?详解手机内存融合技术 2021年04月27日 12:55作者:陈沐梁编辑:陈沐梁文章出处:泡泡网原创 分享 近段时间,内存融合或者说内存拓展技术,经常在不少手机厂商的宣传 ...
- PackageManagerService启动详解(三)之开始初始化阶段流程分析
PKMS启动详解(三)之BOOT_PROGRESS_PMS_START阶段流程分析 Android PackageManagerService系列博客目录: PKMS启动详解系列博客概要 PKMS ...
- Android中measure过程、WRAP_CONTENT详解以及 xml布局文件解析流程浅析
转自:http://www.uml.org.cn/mobiledev/201211221.asp 今天,我着重讲解下如下三个内容: measure过程 WRAP_CONTENT.MATCH_PAREN ...
- UICC 之 USIM 详解全系列——USIM App关键流程介绍与命令详解
本人就职于国际知名终端厂商,负责modem芯片研发. 在5G早期负责终端数据业务层.核心网相关的开发工作,目前牵头6G算力网络技术标准研究. 文章目录 USIM App关键流程介绍与命令详解 USIM ...
- [Shopee虾皮网怎么注册开店]Shopee子母账号详解及注册教程
一.[Shopee虾皮网怎么注册开店]Shopee子母账号详解 子母账户即Shopee平台的Sub-account(子账号) 系统,主要的作用是方便卖家对多个店铺进行统一管理,并对店铺的运营团队成员在 ...
- 详解二手域名购买和交易流程
二手域名怎么样购买?二手域名如何进行交易?二手域名交易流程是怎样的?下面小聚就给大家详解下有关二手域名购买和交易流程的事项. 二手域名交易,简单来说就是域名持有人售出域名,投资人.机构或终端买入域名的 ...
- U-Boot 之五 详解 U-Boot 及 SPL 的启动流程
在之前的博文 Linux 之八 完整嵌入式 Linux 环境介绍及搭建过程详解 中我们说了要一步步搭建整个嵌入式 Linux 运行环境,今天继续介绍 U-Boot 相关的内容.我所使用的硬件平台及 ...
最新文章
- append从一个添加到另一_真特么激动第一个爬虫----爬取豆瓣电影top250
- php 检查图片重复度,php – 检测图片的“整体平均”颜色
- 软件调试学习笔记(二)—— 调试事件的采集
- zincrby redis python_【Redis数据结构 序】使用redispy操作Redis数据库
- C语言打印彩色字符——以(枚举法+字符串查找)为例展示
- 赞!卷积神经网络中十大拍案叫绝的操作
- Vue 进阶 (六)
- 分享5个经典的数据可视化大屏应用案例
- 写在2019年来临前的倒数0.5小时
- 硬盘安装工具cgi3.2_笔记本旧硬盘改造移动硬盘,满足媳妇办公存储需求
- 诚诚富众选择投资理财产品
- ERP软件触发器判断单身数据为什么状态,如何执行
- js实现chrome浏览器copy复制功能
- 傲慢与偏见之 - 防火墙与竞争力
- 电商系统:订单实体设计、数据库表设计
- 计算机三维仿真软件,3D One AI v2.0 人工智能三维仿真软件 32+64位 免费安装版
- 微信小程序销毁某一注册函数_教你如何删除、关闭、注销微信小程序
- 【vishwaCTF】misc题解wp
- 摄氏度的中文英文处理方式
- 记一次unas docker服务无法启动
热门文章
- 程序员申请加班调休被HR拒绝:996是行规,不想加班就滚?
- 《编程之美》中买书问题算法。空间复杂度O(n),时间复杂度O(n),求挑战
- 计算机重装后如何添加打印机,系统重装后,电脑无法连接打印机怎么办?
- GoogleAdMob 广告接入
- python复制excel图片_python批量导出excel区域图片
- 浅析硬件构造Tone mapping曲线
- 股票 - - 常用指标【下】
- 用自动控制理论分析电力电子中的基本斩波电路
- 完美收官!Fortinet Accelerate 2022中国站在北京落幕
- html怎么置顶导航栏,css怎么实现滚动页面导航栏固定在顶部