### [phpcms怎么实现微信登陆](https://www.prosaas.cn/article/432) **Published:** 2023-03-09T01:33:08 **Author:** 5201314 **Excerpt:** phpcms实现微信登录的方法:1、在根目录新建“wechat.php”;2、在“\phpcms\module… > phpcms实现微信登录的方法:1、在根目录新建“wechat.php”;2、在“\\phpcms\\modules\\member\\index.php”下增加“public function wechat() {...}”;3、在“foreground.class.php”文件中通过wechat函数判断用户是否登录即可。 ![](//zhiqipro.oss-cn-beijing.aliyuncs.com/2023/12/20231212114739121.jpg) 本教程操作环境:Windows10系统、phpcms v9版,DELL G3电脑 **phpcms怎么实现微信登陆?** phpcms实现微信登陆(无需注册,直接存入) 思路:回调参数,直接register (代码不够规范,自己整理) 在根目录新建wechat.php 访问: http://www.xxxxxx.cn/wechat.php 注意回调地址 phpcms实现微信登陆(无需注册,直接存入) wechat.php \\phpcms\\modules\\member\\index.php下增加 注:注册状态输出 $status, 可以返回错误信息 根据错误信息修改参数内容 用户名称和密码做了简单区别处理,根据实际情况修改,邮箱为必须字段,随便放了一个。 \_session\_start(); //获取用户siteid $siteid = isset($\_REQUEST\['siteid'\]) && trim($\_REQUEST\['siteid'\]) ? intval($\_REQUEST\['siteid'\]) : 1; //定义站点id常量 if (!defined('SITEID')) { define('SITEID', $siteid); } //加载用户模块配置 //加载用户模块配置 $member\_setting = getcache('member\_setting'); if(!$member\_setting\['allowregister'\]) { showmessage(L('deny\_register'), '/login.html'); } /\*----------------------微信获取用户信息------------------------\*/ //换成自己的接口信息 $code = $\_GET\['code'\]; $state = $\_GET\['state'\]; $appid = 'xxxxxxxx'; $appsecret = 'xxxxxxxx'; if (empty($code)) $this->error('授权失败'); $token\_url = 'https://api.weixin.qq.com/sns/oauth2/access\_token?appid='.$appid.'&secret='.$appsecret.'&code='.$code.'&grant\_type=authorization\_code'; $token = json\_decode(file\_get\_contents($token\_url)); if (isset($token->errcode)) { showmessage(L('

错误信息:

'.$token->errmsg), HTTP\_REFERER); exit; } $access\_token\_url = 'https://api.weixin.qq.com/sns/oauth2/refresh\_token?appid='.$appid.'&grant\_type=refresh\_token&refresh\_token='.$token->refresh\_token; //转成对象 $access\_token = json\_decode(file\_get\_contents($access\_token\_url)); if (isset($access\_token->errcode)) { showmessage(L('

错误信息:

'.$access\_token->errmsg), HTTP\_REFERER); exit; } $user\_info\_url = 'https://api.weixin.qq.com/sns/userinfo?access\_token='.$access\_token->access\_token.'&openid='.$access\_token->openid.'&lang=zh\_CN'; //转成对象 $user\_info = json\_decode(file\_get\_contents($user\_info\_url)); if (isset($user\_info->errcode)) { showmessage(L( '

错误信息:

'.$user\_info->errmsg), HTTP\_REFERER); exit; } $rs = json\_decode(json\_encode($user\_info),true);//转换成数组 /\*------------------------获取用户信息代码结束-----------------------\*/ header("Cache-control: private"); $checkname = trim($rs\['nickname'\])."\_".substr(md5($rs\['unionid'\]),0,5) ; $this->\_init\_phpsso(); $cstatus = $this->client->ps\_checkname($checkname); //如果存在用户 用户登陆 if($cstatus == -4 || $cstatus == -1) { $username = $rs\['nickname'\]."\_".substr(md5($rs\['unionid'\]),0,5) ; $password = substr(md5($rs\['unionid'\]),0,10); //is\_password($\_POST\['password'\]) && is\_badword($\_POST\['password'\])==false ? trim($\_POST\['password'\]) : showmessage(L('password\_format\_incorrect'), HTTP\_REFERER); $cookietime = intval($\_POST\['cookietime'\]); $synloginstr = ''; //同步登陆js代码 if(pc\_base::load\_config('system', 'phpsso')) { $this->\_init\_phpsso(); $status = $this->client->ps\_member\_login($username, $password); $memberinfo = unserialize($status); if(isset($memberinfo\['uid'\])) { //查询帐号 $r = $this->db->get\_one(array('phpssouid'=>$memberinfo\['uid'\])); if(!$r) { //插入会员详细信息,会员不存在 插入会员 $info = array( 'phpssouid'=>$memberinfo\['uid'\], 'username'=>$memberinfo\['username'\], 'password'=>$memberinfo\['password'\], 'encrypt'=>$memberinfo\['random'\], 'email'=>$memberinfo\['email'\], 'regip'=>$memberinfo\['regip'\], 'regdate'=>$memberinfo\['regdate'\], 'lastip'=>$memberinfo\['lastip'\], 'lastdate'=>$memberinfo\['lastdate'\], 'groupid'=>$this->\_get\_usergroup\_bypoint(), //会员默认组 'modelid'=>10, //普通会员 ); //如果是connect用户 if(!empty($\_SESSION\['connectid'\])) { $userinfo\['connectid'\] = $\_SESSION\['connectid'\]; } if(!empty($\_SESSION\['from'\])) { $userinfo\['from'\] = $\_SESSION\['from'\]; } unset($\_SESSION\['connectid'\], $\_SESSION\['from'\]); $this->db->insert($info); unset($info); $r = $this->db->get\_one(array('phpssouid'=>$memberinfo\['uid'\])); } $password = $r\['password'\]; $synloginstr = $this->client->ps\_member\_synlogin($r\['phpssouid'\]); } else { if($status == -1) { //用户不存在 showmessage(L('user\_not\_exist'), '/login.html'); } elseif($status == -2) { //密码错误 showmessage(L('password\_error'), '/login.html'); } else { showmessage(L('login\_failure'), '/login.html'); } } } else { //密码错误剩余重试次数 $this->times\_db = pc\_base::load\_model('times\_model'); $rtime = $this->times\_db->get\_one(array('username'=>$username)); if($rtime\['times'\] > 4) { $minute = 60 - floor((SYS\_TIME - $rtime\['logintime'\]) / 60); showmessage(L('wait\_1\_hour', array('minute'=>$minute))); } //查询帐号 $r = $this->db->get\_one(array('username'=>$username)); if(!$r) showmessage(L('user\_not\_exist'),'/login.html'); //验证用户密码 $password = md5(md5(trim($password)).$r\['encrypt'\]); if($r\['password'\] != $password) { $ip = ip(); if($rtime && $rtime\['times'\] < 5) { $times = 5 - intval($rtime\['times'\]); $this->times\_db->update(array('ip'=>$ip, 'times'=>'+=1'), array('username'=>$username)); } else { $this->times\_db->insert(array('username'=>$username, 'ip'=>$ip, 'logintime'=>SYS\_TIME, 'times'=>1)); $times = 5; } showmessage(L('password\_error', array('times'=>$times)), '/login.html', 3000); } $this->times\_db->delete(array('username'=>$username)); } //如果用户被锁定 if($r\['islock'\]) { showmessage(L('user\_is\_lock')); } $userid = $r\['userid'\]; $groupid = $r\['groupid'\]; $username = $r\['username'\]; $nickname = empty($r\['nickname'\]) ? $username : $r\['nickname'\]; $updatearr = array('lastip'=>ip(), 'lastdate'=>SYS\_TIME); //vip过期,更新vip和会员组 if($r\['overduedate'\] < SYS\_TIME) { $updatearr\['vip'\] = 0; } //检查用户积分,更新新用户组,除去邮箱认证、禁止访问、游客组用户、vip用户,如果该用户组不允许自助升级则不进行该操作 if($r\['point'\] >= 0 && !in\_array($r\['groupid'\], array('1', '7', '8')) && empty($r\[vip\])) { $grouplist = getcache('grouplist'); if(!empty($grouplist\[$r\['groupid'\]\]\['allowupgrade'\])) { $check\_groupid = $this->\_get\_usergroup\_bypoint($r\['point'\]); if($check\_groupid != $r\['groupid'\]) { $updatearr\['groupid'\] = $groupid = $check\_groupid; } } } //如果是connect用户 if(!empty($\_SESSION\['connectid'\])) { $updatearr\['connectid'\] = $\_SESSION\['connectid'\]; } if(!empty($\_SESSION\['from'\])) { $updatearr\['from'\] = $\_SESSION\['from'\]; } unset($\_SESSION\['connectid'\], $\_SESSION\['from'\]); $this->db->update($updatearr, array('userid'=>$userid)); if(!isset($cookietime)) { $get\_cookietime = param::get\_cookie('cookietime'); } $\_cookietime = $cookietime ? intval($cookietime) : ($get\_cookietime ? $get\_cookietime : 0); $cookietime = $\_cookietime ? SYS\_TIME + $\_cookietime : 0; $phpcms\_auth = sys\_auth($userid."\\t".$password, 'ENCODE', get\_auth\_key('login')); 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('\_nickname', $nickname, $cookietime); //print\_r($\_COOKIE); //exit; //param::set\_cookie('cookietime', $\_cookietime, $cookietime); //https 与 http 传递用户名 跨域跳转cooike $forward = isset($\_POST\['forward'\]) && !empty($\_POST\['forward'\]) ? urldecode($\_POST\['forward'\]) : 'index.php?m=member&c=index'; $url = "http://www.zhiliaoke.com.cn/set\_cookie\_www.php?nickname=".$\_COOKIE\['vuGYB\_\_nickname'\]."&username=".$\_COOKIE\['vuGYB\_\_username'\]."&userid=".$\_COOKIE\['vuGYB\_\_userid'\]."&groupid=".$\_COOKIE\['vuGYB\_\_groupid'\]; header("Location: ".$url.""); } //如果不存在用户注册 $userinfo = array(); $userinfo\['encrypt'\] = create\_randomstr(6); $userinfo\['username'\] = $rs\['nickname'\]."\_".substr(md5($rs\['unionid'\]),0,5) ; $userinfo\['nickname'\] = $rs\['nickname'\]."\_".substr(md5($rs\['unionid'\]),0,5) ; $userinfo\['email'\] = time().'@yangpeili.com'; $userinfo\['password'\] = substr(md5($rs\['unionid'\]),0,10); $userinfo\['modelid'\] = isset($\_POST\['modelid'\]) ? intval($\_POST\['modelid'\]) : 10; $userinfo\['regip'\] = ip(); $userinfo\['point'\] = $member\_setting\['defualtpoint'\] ? $member\_setting\['defualtpoint'\] : 0; $userinfo\['amount'\] = $member\_setting\['defualtamount'\] ? $member\_setting\['defualtamount'\] : 0; $userinfo\['regdate'\] = $userinfo\['lastdate'\] = SYS\_TIME; $userinfo\['siteid'\] = $siteid; $userinfo\['connectid'\] = isset($\_SESSION\['connectid'\]) ? $\_SESSION\['connectid'\] : ''; $userinfo\['from'\] = isset($\_SESSION\['from'\]) ? $\_SESSION\['from'\] : ''; //手机强制验证 //附表信息验证 通过模型获取会员信息 if($member\_setting\['choosemodel'\]) { require\_once CACHE\_MODEL\_PATH.'member\_input.class.php'; require\_once CACHE\_MODEL\_PATH.'member\_update.class.php'; $member\_input = new member\_input($userinfo\['modelid'\]); $\_POST\['info'\] = array\_map('new\_html\_special\_chars',$\_POST\['info'\]); $user\_model\_info = $member\_input->get($\_POST\['info'\]); } if(pc\_base::load\_config('system', 'phpsso')) { $this->\_init\_phpsso(); $status = $this->client->ps\_member\_register($userinfo\['username'\], $userinfo\['password'\], $userinfo\['email'\], $userinfo\['regip'\], $userinfo\['encrypt'\]); echo $status; if($status > 0) { $userinfo\['phpssouid'\] = $status; //传入phpsso为明文密码,加密后存入phpcms\_v9 $password = $userinfo\['password'\]; $userinfo\['password'\] = password($userinfo\['password'\], $userinfo\['encrypt'\]); $userid = $this->db->insert($userinfo, 1); if($member\_setting\['choosemodel'\]) { //如果开启选择模型 $user\_model\_info\['userid'\] = $userid; //插入会员模型数据 $this->db->set\_model($userinfo\['modelid'\]); $this->db->insert($user\_model\_info); } if($userid > 0) { //执行登陆操作 if(!$cookietime) $get\_cookietime = param::get\_cookie('cookietime'); $\_cookietime = $cookietime ? intval($cookietime) : ($get\_cookietime ? $get\_cookietime : 0); $cookietime = $\_cookietime ? TIME + $\_cookietime : 0; if($userinfo\['groupid'\] == 7) { param::set\_cookie('\_username', $userinfo\['username'\], $cookietime); param::set\_cookie('email', $userinfo\['email'\], $cookietime); } else { $phpcms\_auth = sys\_auth($userid."\\t".$userinfo\['password'\], 'ENCODE', get\_auth\_key('login')); //$this->db->update(array('groupid'=> "6"), array('userid'=>$userid)); $sql = "UPDATE \`v9\_member\` SET \`groupid\`='6' WHERE \`userid\` = $userid ";//修改用户级别为注册用户 mysql\_query($sql); param::set\_cookie('auth', $phpcms\_auth, $cookietime); param::set\_cookie('\_userid', $userid, $cookietime); param::set\_cookie('\_username', $userinfo\['username'\], $cookietime); param::set\_cookie('\_nickname', $userinfo\['nickname'\], $cookietime); param::set\_cookie('\_groupid', $userinfo\['groupid'\], $cookietime); param::set\_cookie('cookietime', $\_cookietime, $cookietime); $forward = isset($\_POST\['forward'\]) && !empty($\_POST\['forward'\]) ? urldecode($\_POST\['forward'\]) : 'index.php?m=member&c=index'; //https 与 http 传递用户名 跨域跳转cooike $url = "http://www.zhiliaoke.com.cn/set\_cookie\_www.php?nickname=".$\_COOKIE\['vuGYB\_\_nickname'\]."&username=".$\_COOKIE\['vuGYB\_\_username'\]."&userid=".$\_COOKIE\['vuGYB\_\_userid'\]."&groupid=".$\_COOKIE\['vuGYB\_\_groupid'\]; header("Location: ".$url.""); } } } } else { showmessage(L('enable\_register').L('enable\_phpsso'), '/login.html'); } showmessage(L('operation\_failure'), HTTP\_REFERER); } ?> 补充最后一步 很重要,也是最简单容易忽视的 !!! 有几个人都卡在这里了! 需要 在phpcms\\modules\\member\\classes\\foreground.class.php 文件 21行左右 判断用户是否登陆通过wechat 函数 ![](//zhiqipro.oss-cn-beijing.aliyuncs.com/2023/12/20231212114739413.jpg) PHP中文网,大量的免费PHPCMS教程,欢迎在线学习! 以上就是phpcms怎么实现微信登陆的详细内容,更多请关注知企PROSAAS其它相关文章! **Tags:** class, function, http, php, PHPCMS, public, register **Categories:** PHPCMS ---