做过一个需求:广告主后台发起调查活动,普通用户参加此调查后跳转值某个网址领取1Q点(1角钱);上线一段时间以后,广告主反馈得到的很多手机号都是伪造的(我们开始只用正则匹配判断手机号正确与否),然后产品让我们加上手机短信验证,就变成了下面的样子.

刚开始的思路应该很正常的那种,用rand生成随机码,然后存在redis里边,设置expire为60秒;后来考虑考虑,用户为了1角钱不至于如此,需要验证码的时候也不会瞎填写,系统还限制某ID用户明天每天只能参加5次这种活动,也为了不浪费系统资源的原则,公司发的短信已经需要2分钱一条,决定不用redis,用下面的思路:

用用户帐号+活动ID+手机号进行处理生成一个固定的数字,然后驾驶时间戳进行干扰生成4位数的数字,干扰以后只保证4位数对应的二进制的1、5、6、7、8、9位不被干扰,这样对应会生出pow(2,6)个不一样的4位数字,随机发送给用户一个。

用户验证验证码时候也只验证验证码的1、5、6、7、8、9位是否正确,为用户帐号+活动ID+手机号进行处理生成,这样就不用存储验证码,达到验证手机号的号码。

具体的测试例子在下面,为啥说是测试例子呢,因为最后还没有用,我就去封闭开发其他项目去了,下面代码也是偶尔翻到,看代码竟然是我工作一周年的时候写的   ,测试的代码生成的验证码散列的不是很好,也没有时间进行改善,主要介绍一下上面的思路。


<?php
/**
*
* User: shikiliu
* Date: 13-7-11
*/
class TelephoneCheck
{
/**
* 取得某个用户某次活动的手机验证码
* @param $uin 用户ID 小于10000系统保留
* @param $actId 活动ID  小于1000系统保留
* @param $telephone 用户手机号
* @return bool|int 4位数的验证码
*/
public function getTelephoneCode($uin, $actId, $telephone)
{
if ($uin < 10000 || $actId < 1000 || empty($telephone)) {
return false;
}
$time = time();
$timeFeature = hexdec(substr(md5($time), 0, 3)) & 0x1F1;
$telephoneFeature = hexdec(substr(md5($telephone), 8, 4));
$actIdFeature = hexdec(substr(md5($actId), 16, 4));
$uinFeature = hexdec(substr(md5($uin), 24, 4));
$sumFeature = $telephoneFeature + $actIdFeature + $uinFeature;
$sumFeature = $sumFeature % 10000;
if ($sumFeature < 1000) {
$sumFeature = 5145;
}
$result = $sumFeature | $timeFeature;
return $result;
}
/**
* 验证用户的手机验证码
* @param $uin 用户ID 小于10000系统保留
* @param $actId 活动ID  小于1000系统保留
* @param $telephone 用户手机号
* @param $code getTelephoneCode生成的验证码
* @return bool 是否正确
*/
public function  checkTelephoneCode($uin, $actId, $telephone, $code)
{
if ($uin < 10000 || $actId < 1000 || empty($telephone) || empty($code)) {
return false;
}
$telephoneFeature = hexdec(substr(md5($telephone), 8, 4));
$actIdFeature = hexdec(substr(md5($actId), 16, 4));
$uinFeature = hexdec(substr(md5($uin), 24, 4));
$sumFeature = $telephoneFeature + $actIdFeature + $uinFeature;
$sumFeature = $sumFeature % 10000;
if ($sumFeature < 1000) {
$sumFeature = 5145;
}
$sumFeature = $sumFeature & 0xE0E;
$code = $code & 0xE0E;
if ($sumFeature == $code) {
return true;
}
return false;
}
}
$actId = 10001;
$telephone = 13797025562;
$uin = 514540767;
$telCode = new TelephoneCheck();
$code = $telCode->getTelephoneCode($uin, $actId, $telephone);
var_dump($code);
var_dump($telCode->checkTelephoneCode($uin, $actId, $telephone, $code));
var_dump($telCode->checkTelephoneCode($uin, $actId, $telephone, $code+10));
  • 大小: 7.4 KB
  • 查看图片附件

PHP简单的手机验证码验证过程相关推荐

  1. Kaggle手机验证码验证,亲测有效

    对于Kaggle手机验证码无效问题,作者之前也遇到过同样的问题,问题在于需要梯子,关于梯子怎么弄请自行百度.下面就简要说明一下梯子准备好以后的具体步骤. 在验证码验证界面,进行验证时候,要进行人机验证 ...

  2. 项目开发过程中如何使用免费开发手机验证码验证功能(详细教程)

    一群热爱技术并且向往优秀的程序猿同学,不喜欢水文,不喜欢贩卖焦虑,只喜欢谈技术,分享的都是技术干货.Talk is cheap. Show me the code 首先声明一下,这个Demo仅限用于开 ...

  3. Spring Cloud OAuth2 扩展登录方式:帐户密码登录、 手机验证码登录、 二维码扫码登录

    本文扩展了spring security 的登录方式,增长手机验证码登录.二维码登录. 主要实现方式为使用自定义filter. AuthenticationProvider. AbstractAuth ...

  4. SpringSecurityOAuth2(7) 账号密码登录、手机验证码登录

    GitHub地址 码云地址 SpringSecurity 调用流程: 首先会进入UsernamePasswordAuthenticationFilter并且设置权限为null和是否授权为false,然 ...

  5. 如何使用阿里云短信服务实现登录页面,手机验证码登录?

    1:个人如何使用阿里云短信服务? 2022如何使用个人阿里云短信服务?_linxiMY的博客-CSDN博客添加完成之后,等待审核!一般2个小时就会出来审核结果了,这里我因为注册申请时填写规则有误,足足 ...

  6. 安卓注册手机短信验证码验证的案例-01

    为了实现注册手机验证验证码 在网上百度了许久的注册手机验证码发送验证的案例要么是太过时要么就是不能用了 在此把我最近几天研究的成果发到这里希望 能够给遇到相同问题的人给予帮助 首先看看运行的效果图: ...

  7. 使用TensorFlow 来实现一个简单的验证码识别过程

    本文我们来用 TensorFlow 来实现一个深度学习模型,用来实现验证码识别的过程,这里识别的验证码是图形验证码,首先我们会用标注好的数据来训练一个模型,然后再用模型来实现这个验证码的识别. 1.验 ...

  8. 关于手机验证码的获取与验证方法

    1.设计一个简单的手机验证界面: 2.为获取验证码设置点击事件,并将值发送到send()方法: $(document).on('click','#aaa',function () {var a = $ ...

  9. [IOS]SMS获取验证手机验证码

    [IOS]SMS获取&验证手机验证码 DEMO:http://download.csdn.net/detail/u012881779/9311645 短信SDK无UI集成文档: http:// ...

最新文章

  1. 阻带窗函数[数字信号处理]使用窗函数设计FIR滤波器
  2. C#各种加密算法的研究
  3. 【Android工具】Cx文件管理器,Cx File Explorer安卓samba客户端
  4. 流媒体服务器之rtp协议,rtcp协议,rtsp协议,sdp协议,sip协议简析
  5. 让你的JXTA应用更加安全.建立真正你自己的私有的组!
  6. 【题意+分析】1043 Is It a Binary Search Tree (25 分)
  7. java的math类_Java之Math类使用小结
  8. 读入10个数,显示互不相同的数的数目,并以输人的顺序输出
  9. SSM : 环境搭建
  10. Java游戏小李飞镖,安全工程与虚拟技术部双节活动
  11. iOS笔记之UIKit_UIButton
  12. 用python模拟《流浪地球》的木星引力弹弓效应
  13. R语言自然语言处理:中文分词
  14. python替换所有标点符号_python 把标点符号替换为空
  15. html的progress 怎么改变默认样式
  16. python中除法带小数点_python 除法保留两位小数点的方法
  17. 网易Airtest安装
  18. 神气的 iOS 打包
  19. linux使用usb转ttl,USB转TTL转换器 USB V2.0 - 宇泰(UTEK) - 全球领先智能通讯解决方案提供商!...
  20. hp计算机如何进入启动界面,BIOS使用之HP BIOS篇-惠普电脑怎么进入bios

热门文章

  1. 30行,金额转人民币大写的代码
  2. 陪玩源码,根据用户需求和功能开发搭建
  3. WPS:WPS的论文使用技巧之如何对不同章节设置不同的页眉(图文教程)
  4. 华为27asph是什么型号_华为官宣新增P40 Pro+等27款机型支持换原装电池,有你的手机吗?...
  5. 国内外有哪些比较好的电子技术的网站类似github?
  6. 降噪蓝牙耳机排行榜10强,通话质量好的降噪蓝牙耳机推荐
  7. formate在python_python的format方法
  8. flutter中App签名
  9. 【渝粤教育】广东开放大学 广东开放大学学习指引 形成性考核 (28)
  10. 雷电模拟器连接android studio教程