摘要:
需求扫码关注公众号,获取验证码,填入验证码登录现在有很多不愿意花钱验证实现扫码登录 有多种...
描述:
需求
扫码关注公众号,获取验证码,填入验证码登录
现在有很多不愿意花钱验证实现扫码登录 有多种原因
实现的门槛高以及不想花钱,想白嫖 其实或一个逻辑去思考
如果要求不是太高,可以实现扫码关注获取验证码
逻辑分析(YZMCMS为例)
一,官方自带公众号模块,但是大部分功能需要认证,可以不管 主要实现获取验证码
二,关注自动回复验证码,可以用自带的验证码功能来做 找到微信模块index.class文件
在文本回复哪里,写入一句判断列如:
if($arr['content'] == '登录'){ return $this->_replytext($this->check_code()); }
如果用户回复登录关键词则执行 回复验证码PHP代码
执行的PHP代码可以这样写 加载系统类 调用系统类代码 并输出
$code = yzm_ ::load_sys_class('code'); $code->get_code() return $wxConfig;
所以打开公众号就有现在的效果 列如:
三,因为验证的输出与验证是需要开启$_SESSION而且要在页面上才能实现
会出现发出的验证码一直提示为错误 那么我们就需要一个临时存储的数据表
字段就需要id code token inputime status
四,微信模块index.class文件写 回复验证码并插入
$data['code'] = $code->get_code(); $data['status'] = 1; $data['inputtime'] = SYS_TIME; $data['token'] = $this->msgobj->FromUserName; D('code')->insert($data);
五,现在验证时间都存在临时表里面了 那怎么用呢 我们需要绑定公众号 分析逻辑
需要获取用户ID 以及微信模块插入储存的token
PHP语句可以这样写 查找刚刚插入的验证码 并重新插入member_authorization
$arr['token'] = $data['token']; $arr['userid'] = intval(get_cookie('_userid')); $arr['inputtime'] = SYS_TIME; $arr['authname'] = 'wx'; D('member_authorization')->insert($arr, true, false);
现在数据都有了 用户ID 用户的token 都有了
六,判断是否绑定公众号,查询 member_authorization 表 条件是查询userid
如果有数据则绑定了,如果没有那就是没有绑定 写一个函数判断一下
function get_authorization($userid,$authname) { $data = D('member_authorization')->where(array('userid' => $userid,'authname'=>$authname))->find(); if($data){ return $data['userid']; } else{ return''; } }
七,现在验证码 绑定我们都有了 接下来判断验证那码
通过前端传来的验证码 我们查询是否有此验证码 如果没有验证码就是错的 如果查询不到那也是错的
就不能执行 注意格式化大小写
if(empty($data['code']) || strtolower($code)!=$data['code'])
八,判断时间是否过期 官方自带的验证码没有过期一说,只有正确或者错误 所以我们在上一步中插入了
验证码时间 如果验证码大于现在的时间 那就是没有过期 如果小于 就是过期了
if($starttimedelete(array('inputtime'=>$data['inputtime'])); return_json(array('status'=>1,'message'=>'验证码已过期!')); }
验证码过期或者不正确都不能留着表里 所以在PHP执行完以后删除该验证码
九,都验证完成后 通过提交的token 查询当前的用户ID 没错 现在又可以往后查询
$member_authorization = D('member_authorization')->where(array('token'=>$data['token']))->find();
查询不到 那就是没有绑定公众号或者没有该用户
$member = D('member')->where(array('userid'=>$member_authorization['userid']))->find();
如果查询到了 那么就设置 缓存在本地
$_SESSION['_userid'] = $member['userid']; $_SESSION['_username'] = $member['username']; set_cookie('_userid', $member['userid'], 0, true); set_cookie('_username', $member['username'], 0, true); set_cookie('_groupid', $member['groupid'], 0, true); set_cookie('_nickname', $member['username']);
缓存设置完成后 就直接提示成功,并删除该验证码 提示如果缓存没有设置成功 那么你需要设置
new_session_start();
最后通过书写html代码以及js的交互把功能设置到前台即可
十,解绑 通过删除绑定的数据则解绑成功
if(!$_GET['authname']) return_json(array('status'=>1,'message'=>'解除绑定的类型不能为空!')); D('member_authorization')->delete(array('userid'=>$userid,'authname'=>$_GET['authname'])); return_json(array('status'=>0,'message'=>'解除绑定成功!'));
总结
跳过了公众号的验证码独立的思路来实现登录
如果你有好的思路可以和我一起探讨交流
请登录后发表评论