手机注册验证码操作思路与流程

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;}}

详解手机注册验证码操作思路与流程相关推荐

  1. Android中measure过程、WRAP_CONTENT详解以及xml布局文件解析流程浅析(下)

       本文原创, 转载请注明出处:http://blog.csdn.net/qinjuning 上篇文章<<Android中measure过程.WRAP_CONTENT详解以及xml布局文 ...

  2. php推荐码生成,最新最全PHP生成制作验证码代码详解(推荐),验证码详解_PHP教程...

    最新最全PHP生成制作验证码代码详解(推荐),验证码详解 1.0 首先先看代码 好,现在结合以上代码,来分析分析以上用到的几个函数: ① imagecreatetruecolor(); imagecr ...

  3. 第三节:带你详解Java的操作符,控制流程以及数组

    前言 大家好,我是 Vic,今天给大家带来带你详解Java的操作符,控制流程以及数组的概述,希望你们喜欢 操作符 算数操作符 一般的 +,-,*,/,还有两个自增 自减 ,以及一个取模 % 操作符. ...

  4. android融合存储,科技瞭望台:8G真能变12G?详解手机内存融合技术

    科技瞭望台:8G真能变12G?详解手机内存融合技术 2021年04月27日 12:55作者:陈沐梁编辑:陈沐梁文章出处:泡泡网原创 分享 近段时间,内存融合或者说内存拓展技术,经常在不少手机厂商的宣传 ...

  5. PackageManagerService启动详解(三)之开始初始化阶段流程分析

      PKMS启动详解(三)之BOOT_PROGRESS_PMS_START阶段流程分析 Android PackageManagerService系列博客目录: PKMS启动详解系列博客概要 PKMS ...

  6. Android中measure过程、WRAP_CONTENT详解以及 xml布局文件解析流程浅析

    转自:http://www.uml.org.cn/mobiledev/201211221.asp 今天,我着重讲解下如下三个内容: measure过程 WRAP_CONTENT.MATCH_PAREN ...

  7. UICC 之 USIM 详解全系列——USIM App关键流程介绍与命令详解

    本人就职于国际知名终端厂商,负责modem芯片研发. 在5G早期负责终端数据业务层.核心网相关的开发工作,目前牵头6G算力网络技术标准研究. 文章目录 USIM App关键流程介绍与命令详解 USIM ...

  8. [Shopee虾皮网怎么注册开店]Shopee子母账号详解及注册教程

    一.[Shopee虾皮网怎么注册开店]Shopee子母账号详解 子母账户即Shopee平台的Sub-account(子账号) 系统,主要的作用是方便卖家对多个店铺进行统一管理,并对店铺的运营团队成员在 ...

  9. 详解二手域名购买和交易流程

    二手域名怎么样购买?二手域名如何进行交易?二手域名交易流程是怎样的?下面小聚就给大家详解下有关二手域名购买和交易流程的事项. 二手域名交易,简单来说就是域名持有人售出域名,投资人.机构或终端买入域名的 ...

  10. U-Boot 之五 详解 U-Boot 及 SPL 的启动流程

      在之前的博文 Linux 之八 完整嵌入式 Linux 环境介绍及搭建过程详解 中我们说了要一步步搭建整个嵌入式 Linux 运行环境,今天继续介绍 U-Boot 相关的内容.我所使用的硬件平台及 ...

最新文章

  1. append从一个添加到另一_真特么激动第一个爬虫----爬取豆瓣电影top250
  2. php 检查图片重复度,php – 检测图片的“整体平均”颜色
  3. 软件调试学习笔记(二)—— 调试事件的采集
  4. zincrby redis python_【Redis数据结构 序】使用redispy操作Redis数据库
  5. C语言打印彩色字符——以(枚举法+字符串查找)为例展示
  6. 赞!卷积神经网络中十大拍案叫绝的操作
  7. Vue 进阶 (六)
  8. 分享5个经典的数据可视化大屏应用案例
  9. 写在2019年来临前的倒数0.5小时
  10. 硬盘安装工具cgi3.2_笔记本旧硬盘改造移动硬盘,满足媳妇办公存储需求
  11. 诚诚富众选择投资理财产品
  12. ERP软件触发器判断单身数据为什么状态,如何执行
  13. js实现chrome浏览器copy复制功能
  14. 傲慢与偏见之 - 防火墙与竞争力
  15. 电商系统:订单实体设计、数据库表设计
  16. 计算机三维仿真软件,3D One AI v2.0 人工智能三维仿真软件 32+64位 免费安装版
  17. 微信小程序销毁某一注册函数_教你如何删除、关闭、注销微信小程序
  18. 【vishwaCTF】misc题解wp
  19. 摄氏度的中文英文处理方式
  20. 记一次unas docker服务无法启动

热门文章

  1. 程序员申请加班调休被HR拒绝:996是行规,不想加班就滚?
  2. 《编程之美》中买书问题算法。空间复杂度O(n),时间复杂度O(n),求挑战
  3. 计算机重装后如何添加打印机,系统重装后,电脑无法连接打印机怎么办?
  4. GoogleAdMob 广告接入
  5. python复制excel图片_python批量导出excel区域图片
  6. 浅析硬件构造Tone mapping曲线
  7. 股票 - - 常用指标【下】
  8. 用自动控制理论分析电力电子中的基本斩波电路
  9. 完美收官!Fortinet Accelerate 2022中国站在北京落幕
  10. html怎么置顶导航栏,css怎么实现滚动页面导航栏固定在顶部