【PHP】一个邮箱点击验证的完整示例

目录

1.效果展示

2.发送验证码

3.进行验证


以绑定邮箱为例,注册验证的话修改判断逻辑

1.效果展示


2.发送验证码


    /*** 发点击验证* 参数 email*/public function sendClick(){$param = $this->request->post();// 邮箱email的validate规则验证,略...$user = $this->auth->getUser();// 防抖$key = md5('send_click'.json_encode($param));$lock = Cache::get($key);if ($lock){$this->error('请勿频繁请求');}Cache::set($key, 1, 60);// 邮箱是否已被占用$find = User::where(['email' => $param['email']])->where('id', '<>', $user['id'])->find();if($find){$this->error('该邮箱已被其他账号绑定');}// 发送邮件$from = '我的name';$arr['subject'] = '【'.$from.'】请查收你的验证信息';$url = request()->domain();$content = json_encode(['url' => $url,'user_id' => $user->id,'email' => $param['email'],'time' => time(),]);// url中的+号需要转义为%2B,否则无法正确识别,并进行常规的AES加解密$params = urlencode(Aes::encrypt($content));$url = $url.'/xxx/click_verify/check/?params='.$params;// 格式化邮箱的确认页面$arr['message'] = $this->clickHtml($url);$obj = new Email();$result = $obj->from('自己的邮箱地址', $from)->to($param['email'])->subject($arr['subject'])->message($arr['message'])->send();if (!$result) {return false;}if ($ret) {$this->success(__('发送成功'));} else {$this->error(__('发送失败,请检查短信配置是否正确'));}}/*** @param $url* @return string* 点击验证*/public function clickHtml($url){return <<<HTML
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>电子邮件验证</title><style>body {font-family: Arial, sans-serif;background-color: #f7f7f7;padding: 20px;text-align: center;}h1 {text-align: center;margin-bottom: 30px;}p {line-height: 1.5;color: #4a4a4a;text-align: center;}a {display: inline-block;padding: 10px 15px;border-radius: 5px;color: blue;text-decoration: none;margin-top: 30px;text-align: center;}a:hover {text-decoration: underline;}</style>
</head><body><h1>电子邮件验证</h1><p>感谢您在我们的网站上注册认证!请单击以下链接验证您的电子邮件地址:</p><p style="color: blue">{$url}</p>
</body></html>
HTML;}
  • aes加密参考:【PHP】openssl_encrypt、openssl_decrypt对称加密解密-CSDN博客

3.进行验证


    public function check(){$param = $this->request->get('params');// 对参数进行验证$ret = $this->encry($param);if($ret['code'] == 0){$this->error($ret['msg']);}$array = $ret['array'];Db::startTrans();try {$user = User::where(['id' => $array['user_id']])->find();if($user['is_auth_email'] == 1){throw new \Exception('该账号已经认证邮箱,无需重复操作');}$user->is_auth_email = 1;$user->email = $array['email'];Creditscorelog::package($user, 'email_auth');$user->save();Db::commit();} catch (\Exception $e) {$this->error('验证失败:'.$e->getMessage());}$url = request()->domain();$this->success('验证成功', $url);}// 以下是验证的方法protected $noNeedUrl = ['www.taskpublish.com', 'www.52qzl.com'];/*** 验证*/public function encry($param= []){if(empty($param)){return ['code' => 0,'msg' => '参数错误,验证失败'];}$domain = $_SERVER['HTTP_HOST'];if(!in_array($domain, $this->noNeedUrl)){return ['code' => 0,'msg' => '域名不在白名单中,验证失败'];}try {$ret = Aes::decrypt($param);} catch (\Exception $e) {return ['code' => 0,'msg' => $e->getMessage()];}$array = json_decode($ret, true);if(empty($array)){return ['code' => 0,'msg' => '参数错误,验证失败'];}if(time() - $array['time'] > 120){return ['code' => 0,'msg' => '验证超时,请重新发送'];}// 邮箱唯一性验证$find = User::where(['email' => $array['email']])->where('id', '<>', $array['user_id'])->find();if($find){return ['code' => 0,'msg' => '该邮箱已被其他账号绑定'];}return ['code' => 1,'array' => $array];}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/283665.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Xcode编写基于C++的动态连接库(dylib)且用node-ffi-napi测试

创建一个dylib工程示例 在 Xcode 中创建一个动态链接库&#xff08;.dylib 文件&#xff09;的步骤如下&#xff1a; 打开 Xcode&#xff1a; 打开 Xcode 应用程序。 创建新的工程&#xff1a; 选择 "Create a new Xcode project"&#xff0c;或者使用菜单 File &g…

【咕咕送书 | 第7期】深入探索Spring Batch:大规模批处理的领航者

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏:《linux深造日志》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! ⛳️ 写在前面参与规则 ✅参与方式&#xff1a;关注博主、点赞、收藏、评论&#xff0c;任意评论&#xff08;每人最多评论…

记录 | Visual Studio报错:const char*类型的值不能用于初始化char*类型

Visual Studio 报错&#xff1a; const char *”类型的值不能用于初始化“char *”类型的实体错误 解决办法&#xff1a; 1&#xff0c;强制类型转换&#xff0c;例如&#xff1a; char * Singer::pv[] {(char*)"other", (char*)"alto", (char*)"c…

【物联网】EMQX(二)——docker快速搭建EMQX 和 MQTTX客户端使用

一、前言 在上一篇文章中&#xff0c;小编向大家介绍了物联网必然会用到的消息服务器EMQ&#xff0c;相信大家也对EMQ有了一定的了解&#xff0c;那么接下来&#xff0c;小编从这篇文章正式开始展开对EMQ的学习教程&#xff0c;本章节来记录一下如何对EMQ进行安装。 二、使用…

能在电脑同时控制苹果和安卓的软件,找到了!

开门见山&#xff0c;既能远程控制安卓手机又能控制iPhone或iPad的软件是AirDroid Cast。 AirDroid Cast是一款专业、强大且易于使用的投屏&控制工具。不仅可以将安卓手机&#xff08;安卓7.0及以上版本&#xff09;、iPhone、iPad的屏幕画面投射到电脑上&#xff0c;还支持…

QT-CAD-3D显示操作工具

QT-CAD-3D显示操作工具 一、效果展示二、核心程序三、程序链接 一、效果展示 二、核心程序 TDF_LabelSequence DxfReader::transfer(DocumentPtr doc, TaskProgress* progress) {TDF_LabelSequence seqLabel;Handle_XCAFDoc_ShapeTool shapeTool doc->xcaf().shapeTool();…

20V升26V 600mA升压型LED驱动芯片,PWM调光芯片-AH1160

AH1160是一个功能强大的升压型LED驱动芯片&#xff0c;专为需要精确控制LED亮度的PWM调光应用而设计。它可将20V输入电压升压至26V&#xff0c;同时提供稳定的600mA电流输出&#xff0c;适用于各种LED照明设备。 芯片特点&#xff1a; 1. 输入电压范围&#xff1a;AH1160可在…

SLAM算法与工程实践——相机篇:RealSense T265相机使用(1)

SLAM算法与工程实践系列文章 下面是SLAM算法与工程实践系列文章的总链接&#xff0c;本人发表这个系列的文章链接均收录于此 SLAM算法与工程实践系列文章链接 下面是专栏地址&#xff1a; SLAM算法与工程实践系列专栏 文章目录 SLAM算法与工程实践系列文章SLAM算法与工程实践…

数据安全问题困扰您吗?Zoho CRM帮您解决

很多企业在想到在线CRM管理系统时&#xff0c;第一个想到的就是数据安全问题。确实&#xff0c;企业数据十分宝贵&#xff0c;数据都储存在CRM供应商的服务器上很难不会担心。但如果您选择Zoho CRM&#xff0c;就无需这些顾虑啦。下面说说&#xff0c;使用Zoho CRM为什么不用担…

快速处理EDI数据映射:知行EDI Profiler 操作指南

一个完整的EDI项目通常由建立传输通道&#xff0c;处理数据映射以及集成内部业务系统三部分组成。对用户而言&#xff0c;基于知行之桥EDI系统进行自主实施最大的挑战便是处理数据映射。EDI报文读不懂&#xff0c;映射关系太复杂……这些问题给企业造成困扰的同时也阻挡了自主实…

echarts仪表效果

option {series: [{type: gauge,radius:90%,center: [50%, 57%],splitNumber: 5, //仪表盘刻度的分割段数itemStyle: {color: #6EBEFF, //颜色},progress: {show: true,roundCap: true, //是否在两端显示成圆形width: 3 //表盘原型环阴影宽度},axisLine: {roundCap: true, //…

猫头虎分享已解决Bug || Vue3报错: Failed to fetch dynamically imported module

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页: &#x1f405;&#x1f43e;猫头虎的博客&#x1f390;《面试题大全专栏》 &#x1f995; 文章图文并茂&#x1f996…