QQ现在是非常普及的东西,想让用户可以通过QQ 一键登录到 phpcms V9 v9.3.1版本 现在还有点困难。
在经过一上午的折腾,看完各位大虾的分析之后,才发现,这个版本中的问题 都不是 改phpcmsV9 源代码能搞定的。
现象描述:
1,在phpcmsV9后台 设置 > 相关设置 > connect > 按照提示 填写 QQ号码登录的API ID 和APP key 木有的童鞋 点击后面的链接 去申请一个,免费滴。。
如图
登陆成功后 提示注册, 当再次点击登录时仍然 提示要完善注册信息。QQ一键登录的效果并没达到。
为此:百度了好久没有找到合适的答案。
于是翻看phpcmsV9源码
文件地址: phpcms\modules\member\index.php 1417行 方法名如下:
//QQ登录功能 public function public_qq_login2(){ .... if(!empty($_SESSION['openid'])){ $r = $this->db->get_one(array('connectid'=>$_SESSION['openid'],'from'=>'qq')); if(!empty($r)){ //登陆 $password = $r['password']; $this->_init_phpsso(); $synloginstr = $this->client->ps_member_synlogin($r['phpssouid']); $userid = $r['userid']; $groupid = $r['groupid']; $username = $r['username']; $nickname = empty($r['nickname']) ? $username : $r['nickname']; $this->db->update(array('lastip'=>ip(), 'lastdate'=>SYS_TIME, 'nickname'=>$me['name']), array('userid'=>$userid)); if(!$cookietime) $get_cookietime = param::get_cookie('cookietime'); $_cookietime = $cookietime ? intval($cookietime) : ($get_cookietime ? $get_cookietime: 0); $cookietime = $_cookietime ? TIME + $_cookietime : 0; $phpcms_auth_key = md5(pc_base::load_config('system', 'auth_key').$this->http_user_agent); $phpcms_auth = sys_auth($userid."\t".$password, 'ENCODE', $phpcms_auth_key); param::set_cookie('auth', $phpcms_auth, $cookietime); param::set_cookie('_userid', $userid, $cookietime); param::set_cookie('_username', $username, $cookietime); param::set_cookie('_groupid', $groupid, $cookietime); param::set_cookie('cookietime', $_cookietime, $cookietime); param::set_cookie('_nickname', $nickname, $cookietime); $forward = isset($_GET['forward']) && !empty($_GET['forward']) ? $_GET['forward'] : 'index.php?m=member&c=index'; showmessage(L('login_success').$synloginstr, $forward); }else{ $user = $info->get_user_info(); $_SESSION['connectid'] = $_SESSION['openid']; $_SESSION['from'] = 'qq'; $connect_username = $user['nickname']; include template('member', 'connect'); } }
——————————————————————————————–
推敲一下可以看到 红色部分的代码是关键,最主要的是这一句:
$r = $this->db->get_one(array(‘connectid’=>$_SESSION[‘openid’],’from’=>’qq’));
说明在用户表里面没有找到 腾讯传过来的openid相关联并且form(注册方式)为qq的记录,因为识别为没有注册过,跳转到继续完善资料页面。
一头扎到数据库查询 v9_member 表,果然connectid字段的数据只有腾讯传过来openid(32位的长度)的前15个字符,
一个看表结构发现这个字段的定义是
`connectid` CHAR(15) NOT NULL DEFAULT ”
问题找到了: 字段长度不够,执行以下SQL 更新字段长度
ALTER TABLE v9_member MODIFY `connectid` CHAR(32) NOT NULL DEFAULT ”;
清除刚才注册的数据(v9_member和`v9_sso_members`表的记录) 或者换个qq再注册,因为QQ不能重复注册。
再次注册 发现问题解决,注册之后的用户,再次登录之后直接点击 QQ登录 即可一键登录。