model

数据入库

controller中调用

/**
*方法一
*需要调用时传入验证码
*@param $code string 验证码(自己设置)
*@param $type int 短信模板
*/
public function sendSDVCodeBySY($userTel, $code, $type, $content = ''){# 参数验证$type = trim($type);$code    = trim($code);$userTel = is_numeric($userTel) ? $userTel : '';# 赛邮短信模板$smsTempConf = array('1' => 'j3Njq3', # 参加验证码'2' => 'cz7Rq2', # 车企 留资);if (empty($userTel)) {return array('code' => 0, 'message' => '手机号不能为空');}if (empty($smsTempConf[$type])) {return array('code' => 0, 'message' => '参数有误,非法操作!');}# 手机号格式验证if (!preg_match("/^1[3456789]{1}\d{9}$/", $userTel)) {return array('code' => 2, 'message' => "该手机号填写有误!");}# 获取用户最新验证码$vCodeRow = $this->getLastVcodeByTel($userTel);$time = time();# 验证码重发限制if (!empty($vCodeRow) && $time < $vCodeRow['resend_expire']) {return array('code' => 3, 'message' => '短信已在1分钟内发出,请耐心等待!');}$insertData = array('user_tel' => $userTel,'vcode' => $code,'resend_expire' => $time + self::RESEND_SEC,'create_time' => $time);# 入库验证码$this->master('vivos12')->insert(self::Table_S12_Tel_Vcode, $insertData);$vCodeId = $this->master('vivos12')->insert_id();if (empty($vCodeId)) {return array('code' => 0, 'message' => '系统错误,请重新尝试!');}# 赛邮 发送短信$type = $smsTempConf[$type];$r = sendSmsBySaiYou($userTel, $type, $code, $content);#$r = TRUE;if ($r == FALSE) {return array('code' => 0, 'message' => '发送失败,请重新尝试!');}# 发送成功操作$updateData = array('resend_expire' => $time + self::RESEND_SEC,);# 更新验证码重发时限$this->master('vivos12')->where('vcode_id', $vCodeId)->update(self::Table_S12_Tel_Vcode, $updateData);return array('code' => 1, 'message' => '发送成功!');}/**
*方法二
*调用时不需要传入验证码
*@param $type int 短信模板
*/
public function sendVCodeBySY($userTel, $smsTemp){# 参数验证$smsTemp = trim($smsTemp);$userTel = is_numeric($userTel) ? $userTel : '';# 赛邮短信模板$smsTempConf = array('vivo_liyu'             => 'TuDGi1', # vivo 礼遇'qiche_liuzi'           => 'k3D954', # 车企 留资'yangshi_xinjiang'      => 'f98PB2', # 车企 留资'vivo_s9'               => 'aK7uP1','JiuLing'               => 'sh0t5', #玖聆'jingdong_wenjuan'      =>  '9i0oT3', #京东问卷'hongmo_phone'          =>  'Lk51d', #红魔手机'vivo_s12'              => 'FD0452', #vivo_s12活动);if (empty($userTel)) {return array('code' => 4001, 'message' => '手机号不能为空');}if (empty($smsTempConf[$smsTemp])) {return array('code' => 3000, 'message' => '参数有误,非法操作!');}# 手机号格式验证if (!preg_match("/^1[3456789]{1}\d{9}$/", $userTel)) {return array('code' => 4000, 'message' => "该手机号填写有误!");}# 获取用户最新验证码$vCodeRow = $this->getLastVcodeByTel($userTel);$time = time();# 验证码重发限制if (!empty($vCodeRow) && $time < $vCodeRow['resend_expire']) {return array('code' => 2020, 'message' => '短信已在1分钟内发出,请耐心等待!');}# 随机六位验证码$this->load->helper('string');$vCode = random_string($type = 'numeric', $len = 4);$phoneArr = ['13933520376', '18603368933', '15006690229'];if(in_array($userTel,$phoneArr)){$vCode = $userTel=='13933520376'? '9674':($userTel=='18603368933'? '0477':'1111');}$insertData = array('user_tel' => $userTel,'sms_temp' => $smsTemp,'vcode' => $vCode,'resend_expire' => $time + self::RESEND_SEC,'create_time' => $time);# 入库验证码$this->master('vivos12')->insert(self::Table_S12_Tel_Vcode, $insertData);$vCodeId = $this->master('vivos12')->insert_id();if (empty($vCodeId)) {return array('code' => 5000, 'message' => '系统错误,请重新尝试!');}# 赛邮 发送短信$smsTemp = $smsTempConf[$smsTemp];$r = sendSmsBySaiYou($userTel, $smsTemp, $vCode);#$r = TRUE;if ($r == FALSE) {return array('code' => 5000, 'message' => '发送失败,请重新尝试!');}# 发送成功操作$updateData = array('resend_expire' => $time + self::RESEND_SEC,);# 更新验证码重发时限$this->master('vivos12')->where('vcode_id', $vCodeId)->update(self::Table_S12_Tel_Vcode, $updateData);return array('code' => 2000, 'message' => '发送成功!');}

根据手机号获取最新验证码

发送时调用

    public function getLastVcodeByTel($userTel){# 参数验证$userTel = is_numeric($userTel) ? $userTel : 0;if (!empty($userTel)) {return $this->slave('vivos12')->select('*')->from(self::Table_S12_Tel_Vcode)->where('user_tel', $userTel)->order_by('vcode_id Desc')->limit(1)->get()->row_array();}return array();}

赛邮云通信

发送时调用

/**
*@param $smsTemplateCode int 发送的模板
*@param $content string 设置的内容,一般为空,模板中已设置好
*/
function sendSmsBySaiYou($telNum, $smsTemplateCode, $vCode, $content = '')
{include_once BASEPATH . '/global/SaiYouMess/messagexsend.php';$smsConf = array('appid' => '40300','appkey' => 'c36a696d7925ab37661d7e90e6643925','sign_type' => 'normal',);$sms = new MESSAGEXsend($smsConf);$sms->setTo($telNum);$sms->SetProject($smsTemplateCode);$sms->AddVar('code', $vCode);if(!empty($content)) {$sms->AddVar('content', $content);}// 此处可能会抛出异常,注意catchtry{$result = $sms->xsend();if(isset($result['status']) && $result['status'] == 'success') {return TRUE;}}catch(Exception $e) {}return FALSE;
}

随机生成验证码

底层函数

function random_string($type = 'alnum', $len = 8){switch ($type){case 'basic':return mt_rand();case 'alnum':case 'numeric':case 'nozero':case 'alpha':switch ($type){case 'alpha':$pool = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';break;case 'alnum':$pool = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';break;case 'numeric':$pool = '0123456789';break;case 'nozero':$pool = '123456789';break;}return substr(str_shuffle(str_repeat($pool, ceil($len / strlen($pool)))), 0, $len);case 'unique': // todo: remove in 3.1+case 'md5':return md5(uniqid(mt_rand()));case 'encrypt': // todo: remove in 3.1+case 'sha1':return sha1(uniqid(mt_rand(), TRUE));}}

验证短信验证码

controller中调用(一般在注册方法中获取信息后调用)

//调用下面的checkVCode方法
$checkCode = $this->sms_data->checkVCode($userTel, $vcode);
if ($checkCode['code'] != 1) {resultInfo(5, $checkCode['message']);
}public function checkVCode($userTel, $vCode){# 参数验证$userTel = is_numeric($userTel) ? $userTel : 0;$vCode = trim($vCode);if (empty($userTel)) {return array('code' => 4000, 'message' => '手机号为空');}if (empty($vCode)) {return array('code' => 4001, 'message' => '请输入验证码');}# 验证手机号if (!empty($userTel) && !preg_match("/^1[3456789]{1}\d{9}$/", $userTel)) {return array('code' => 4002, 'message' => '请输入正确的手机号');}# 获取用户最新验证码$vCodeRow = $this->getLastVcodeByTel($userTel);$vCodeId = $vCodeRow['vcode_id'] ?? 0;if ($vCodeRow['check_num'] >= 5 && (time() - $vCodeRow['check_time']) <= 300) {return array('code' => 3005, 'message' => '验证码错误次数太多,请5分钟后重试');}if (empty($vCodeRow) || $vCodeRow['vcode'] != $vCode) {$this->master('vivos12')->where('vcode_id', $vCodeId)->set('check_num', 'check_num +1', false)->set('check_time', time())->update(self::Table_S12_Tel_Vcode);return array('code' => 4040, 'message' => '验证码错误!');}if ($vCodeRow['create_time'] + self::EXPIRE_SEC < time()) {return array('code' => 3000, 'message' => '验证码已过期!');}return array('code' => 2000, 'message' => '验证成功!');}

controller

发送短信验证码

public function send_sms(){$userTel = p('user_tel');$smsRes = $this->vivo_sms_data->sendVCodeBySY($userTel, 'vivo_s12');$this->displayJson($smsRes);}

数据库设计

PHP 实现发送短信验证码(CI框架)相关推荐

  1. html5实现短信验证修改密码,thinkphp5如何调用云片接口实现发送短信验证码找回密码功能...

    下面由thinkphp框架教程栏目给大家介绍thinkphp5如何调用云片接口实现发送短信验证码找回密码功能,希望对需要的朋友有所帮助! 思路: 1.用户输入手机号,请求获取短信验证码. 2.thin ...

  2. JAVA实现利用第三方平台发送短信验证码

    前段时间自己做的一个小项目中,涉及到用短信验证码登录.注册的问题,之前没涉及过这一块,看了别人的博客其实也是似懂非懂的,现在就将自己做的利用第三方短信平台来发送验证码这个功能记下来. 本文以注册为例, ...

  3. JAVA利用第三方平台发送短信验证码

    本文以注册为例,在SpringMVC+Spring+Mybatis框架的基础上完成该短信验证码功能. 发送短信验证码的原理是:随机生成一个6位数字,将该6位数字保存到session当中,客户端通过se ...

  4. 程序君带你畅聊发送短信验证码

    现在不管是网站,还是app等互联网和移动互联网产品,绝大部分注册都是直接用手机号注册登录的,方式就是给手机发送短信验证码,然后把验证码填入,后台程序去匹配判断用户填入的验证码和发送的是否一致. 我最近 ...

  5. 手机异步发送短信验证码解决方案-Celery+redis

    Celery介绍和使用 一.Celery介绍: 一个简单.灵活且可靠.处理大量消息的分布式系统,可以在一台或者多台机器上运行. Celery是一个功能完备即插即用的任务队列 单个 Celery 进程每 ...

  6. Go语言初识应用--容联云发送短信验证码、手机号注册

    使用gin框架.gorm映射 所使用的连接容联云参考容联云官方文档,放置到utils中, gin项目结构根据自身需要,大题如下设置: utils--sms.go package main import ...

  7. JAVA利用第三方平台发送短信验证码。

    前段时间自己做的一个小项目中,涉及到用短信验证码登录.注册的问题,之前没涉及过这一块,看了别人的博客其实也是似懂非懂的,现在就将自己做的利用第三方短信平台来发送验证码这个功能记下来. 本文以注册为例, ...

  8. go 实现发送短信验证码登录

    现在大多数app或wap都实现了通过手机号获取验证码进行验证登录,下面来看下用go来实现手机号发送短信验证码登录的过程,基于的框架是gin . 首先是短信服务商的申请,比如腾讯云.阿里云.网易易盾等, ...

  9. TP6 腾讯云发送短信验证码配置详解

    一.发送注册验证码代码实现 参考腾讯云文档 https://cloud.tencent.com/document/product/382/56058 1.通过composer安装 composer r ...

  10. 发送短信验证码的原理

    本文以注册为例,在SpringMVC+Spring+Mybatis框架的基础上完成该短信验证码功能. 发送短信验证码的原理是:随机生成一个6位数字,将该6位数字保存到session当中,客户端通过se ...

最新文章

  1. ASP.NET ListView控件基本操作
  2. chrome 插件安装:无法添加来自此网站的应用,解决办法。安装本地crx插件方法
  3. 高度平衡二叉树的构建_平衡二叉树建立及其增删改查(JAVA)
  4. .dat文件写入byte类型数组_文件字节流、文件字符流、缓冲字节流、缓冲字符流字节数组流、数据流、转换流、对象流...
  5. Windows Containers 大冒险: 加速
  6. 【Spark Summit EU 2016】摆脱传统ETL,让我们走向Spark吧!
  7. java递归分苹果_递归较难题——分苹果问题
  8. android中实现“再按一次退出”功能
  9. Odoo10参考系列--QWeb报表
  10. java 判断是否是昨天_java判断日期是否是今天
  11. BSOD 又见BSOD。。。。
  12. 无法定位程序输入点WSAPoll于动态链接库WS2-32.DLL
  13. php 修改 wordpress,wordpress如何修改php.ini
  14. 批量获取中国所有行政区域经边界纬度坐标(到县区级别)
  15. 借鸡生蛋术–砍价小程序的推广变现教学
  16. NOI2014起床困难综合症
  17. java反射获取一个对象中属性(field)的值
  18. python有限元传热求解_用python实现简单的有限元方法(一)
  19. Flash CS4网页中Flash背景透明
  20. pdf转json_pdf转长图工具

热门文章

  1. [web前端] 去哪儿网前端架构师司徒正美:如何挑选适合的前端框架?
  2. twaver html5 2d demo,TWaver 2D+GIS+3D的试用和在线Demo
  3. 计算机二进制转十进制怎么yun,二进制 十进制 十六进制
  4. 2022华为春招面试经历
  5. Nessus下载及安装
  6. win下安装nessus
  7. DNS协议及Bind应用
  8. Moment js 计算时间差
  9. Darklabel多目标跟踪标注工具
  10. opencv基于MultiTracker的多目标跟踪