登录  /  注册
首页 > CMS教程 > PHPCMS > 正文

phpcms怎么实现微信登陆

藏色散人
发布: 2023-03-09 09:33:08
原创
1916人浏览过

phpcms实现微信登录的方法:1、在根目录新建“wechat.php”;2、在“\phpcms\modules\member\index.php”下增加“public function wechat() {...}”;3、在“foreground.class.php”文件中通过wechat函数判断用户是否登录即可。

phpcms怎么实现微信登陆

本教程操作环境:Windows10系统、phpcms v9版,DELL G3电脑

phpcms怎么实现微信登陆?

phpcms实现微信登陆(无需注册,直接存入) 

思路:回调参数,直接register (代码不够规范,自己整理)

在根目录新建wechat.php 

访问: http://www.xxxxxx.cn/wechat.php

注意回调地址 

phpcms实现微信登陆(无需注册,直接存入)

wechat.php

<?php
if(!empty( $_GET[&#39;code&#39;]) && !empty( $_GET[&#39;state&#39;])){
    $code = $_GET[&#39;code&#39;];
    $state = $_GET[&#39;state&#39;];
    $url = "http://www.xxxxxx.cn/index.php?m=member&c=index&a=wechat&code=$code&state=$state";
    header(&#39;location:&#39;.$url);
    exit;
}
$appid = &#39;wx5a3878682fa32bd5&#39;;
$url = "https://open.weixin.qq.com/connect/qrconnect?appid=$appid&redirect_uri=http://www.xxxxxx.cn/wechat.php&response_type=code&scope=snsapi_login&state=1&connect_redirect=1#wechat_redirect";
header(&#39;location:&#39;.$url);
?>
登录后复制

\phpcms\modules\member\index.php下增加

注:注册状态输出 $status, 可以返回错误信息 根据错误信息修改参数内容

用户名称和密码做了简单区别处理,根据实际情况修改,邮箱为必须字段,随便放了一个。

<?php
public function wechat() {
        $this->_session_start();
        //获取用户siteid
        $siteid = isset($_REQUEST[&#39;siteid&#39;]) && trim($_REQUEST[&#39;siteid&#39;]) ? intval($_REQUEST[&#39;siteid&#39;]) : 1;
        //定义站点id常量
        if (!defined(&#39;SITEID&#39;)) {
           define(&#39;SITEID&#39;, $siteid);
        }
        //加载用户模块配置
        //加载用户模块配置
        $member_setting = getcache(&#39;member_setting&#39;);
        if(!$member_setting[&#39;allowregister&#39;]) {
            showmessage(L(&#39;deny_register&#39;), &#39;/login.html&#39;);
        }
        /*----------------------微信获取用户信息------------------------*/
        //换成自己的接口信息
        $code = $_GET[&#39;code&#39;];
        $state = $_GET[&#39;state&#39;];
        $appid = &#39;xxxxxxxx&#39;;
        $appsecret = &#39;xxxxxxxx&#39;;
        if (empty($code)) $this->error(&#39;授权失败&#39;);
        $token_url = &#39;https://api.weixin.qq.com/sns/oauth2/access_token?appid=&#39;.$appid.&#39;&secret=&#39;.$appsecret.&#39;&code=&#39;.$code.&#39;&grant_type=authorization_code&#39;;
        $token = json_decode(file_get_contents($token_url));
        if (isset($token->errcode)) {
            showmessage(L(&#39;<br/><h2>错误信息:</h2>&#39;.$token->errmsg), HTTP_REFERER);
            exit;
        }
        $access_token_url = &#39;https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=&#39;.$appid.&#39;&grant_type=refresh_token&refresh_token=&#39;.$token->refresh_token;
        //转成对象
        $access_token = json_decode(file_get_contents($access_token_url));
        if (isset($access_token->errcode)) {
            showmessage(L(&#39;<br/><h2>错误信息:</h2>&#39;.$access_token->errmsg), HTTP_REFERER);
            exit;
        }
        $user_info_url = &#39;https://api.weixin.qq.com/sns/userinfo?access_token=&#39;.$access_token->access_token.&#39;&openid=&#39;.$access_token->openid.&#39;&lang=zh_CN&#39;;
        //转成对象
        $user_info = json_decode(file_get_contents($user_info_url));
        if (isset($user_info->errcode)) {
            showmessage(L( &#39;<br/><h2>错误信息:</h2>&#39;.$user_info->errmsg), HTTP_REFERER);
            exit;
        }
        $rs =  json_decode(json_encode($user_info),true);//转换成数组
        /*------------------------获取用户信息代码结束-----------------------*/
        header("Cache-control: private");
        $checkname = trim($rs[&#39;nickname&#39;])."_".substr(md5($rs[&#39;unionid&#39;]),0,5) ;
        $this->_init_phpsso();
        $cstatus = $this->client->ps_checkname($checkname);
        //如果存在用户 用户登陆   
        if($cstatus == -4 || $cstatus == -1) {
            $username = $rs[&#39;nickname&#39;]."_".substr(md5($rs[&#39;unionid&#39;]),0,5) ;
            $password = substr(md5($rs[&#39;unionid&#39;]),0,10);
            //is_password($_POST[&#39;password&#39;]) && is_badword($_POST[&#39;password&#39;])==false ? trim($_POST[&#39;password&#39;]) : showmessage(L(&#39;password_format_incorrect&#39;), HTTP_REFERER);
            $cookietime = intval($_POST[&#39;cookietime&#39;]);
            $synloginstr = &#39;&#39;; //同步登陆js代码
            if(pc_base::load_config(&#39;system&#39;, &#39;phpsso&#39;)) {
                $this->_init_phpsso();
                $status = $this->client->ps_member_login($username, $password);
                $memberinfo = unserialize($status);
                if(isset($memberinfo[&#39;uid&#39;])) {
                    //查询帐号
                    $r = $this->db->get_one(array(&#39;phpssouid&#39;=>$memberinfo[&#39;uid&#39;]));
                    if(!$r) {
                        //插入会员详细信息,会员不存在 插入会员
                        $info = array(
                                    &#39;phpssouid&#39;=>$memberinfo[&#39;uid&#39;],
                                    &#39;username&#39;=>$memberinfo[&#39;username&#39;],
                                    &#39;password&#39;=>$memberinfo[&#39;password&#39;],
                                    &#39;encrypt&#39;=>$memberinfo[&#39;random&#39;],
                                    &#39;email&#39;=>$memberinfo[&#39;email&#39;],
                                    &#39;regip&#39;=>$memberinfo[&#39;regip&#39;],
                                    &#39;regdate&#39;=>$memberinfo[&#39;regdate&#39;],
                                    &#39;lastip&#39;=>$memberinfo[&#39;lastip&#39;],
                                    &#39;lastdate&#39;=>$memberinfo[&#39;lastdate&#39;],
                                    &#39;groupid&#39;=>$this->_get_usergroup_bypoint(),    //会员默认组
                                    &#39;modelid&#39;=>10,  //普通会员
                                    );
                        //如果是connect用户
                        if(!empty($_SESSION[&#39;connectid&#39;])) {
                            $userinfo[&#39;connectid&#39;] = $_SESSION[&#39;connectid&#39;];
                        }
                        if(!empty($_SESSION[&#39;from&#39;])) {
                            $userinfo[&#39;from&#39;] = $_SESSION[&#39;from&#39;];
                        }
                        unset($_SESSION[&#39;connectid&#39;], $_SESSION[&#39;from&#39;]);
                        $this->db->insert($info);
                        unset($info);
                        $r = $this->db->get_one(array(&#39;phpssouid&#39;=>$memberinfo[&#39;uid&#39;]));
                    }
                    $password = $r[&#39;password&#39;];
                    $synloginstr = $this->client->ps_member_synlogin($r[&#39;phpssouid&#39;]);
                } else {
                    if($status == -1) {    //用户不存在
                        showmessage(L(&#39;user_not_exist&#39;), &#39;/login.html&#39;);
                    } elseif($status == -2) { //密码错误
                        showmessage(L(&#39;password_error&#39;), &#39;/login.html&#39;);
                    } else {
                        showmessage(L(&#39;login_failure&#39;), &#39;/login.html&#39;);
                    }
                }
            } else {
                //密码错误剩余重试次数
                $this->times_db = pc_base::load_model(&#39;times_model&#39;);
                $rtime = $this->times_db->get_one(array(&#39;username&#39;=>$username));
                if($rtime[&#39;times&#39;] > 4) {
                    $minute = 60 - floor((SYS_TIME - $rtime[&#39;logintime&#39;]) / 60);
                    showmessage(L(&#39;wait_1_hour&#39;, array(&#39;minute&#39;=>$minute)));
                }
                //查询帐号
                $r = $this->db->get_one(array(&#39;username&#39;=>$username));
                if(!$r) showmessage(L(&#39;user_not_exist&#39;),&#39;/login.html&#39;);
                //验证用户密码
                $password = md5(md5(trim($password)).$r[&#39;encrypt&#39;]);
                if($r[&#39;password&#39;] != $password) {                
                    $ip = ip();
                    if($rtime && $rtime[&#39;times&#39;] < 5) {
                        $times = 5 - intval($rtime[&#39;times&#39;]);
                        $this->times_db->update(array(&#39;ip&#39;=>$ip, &#39;times&#39;=>&#39;+=1&#39;), array(&#39;username&#39;=>$username));
                    } else {
                        $this->times_db->insert(array(&#39;username&#39;=>$username, &#39;ip&#39;=>$ip, &#39;logintime&#39;=>SYS_TIME, &#39;times&#39;=>1));
                        $times = 5;
                    }
                    showmessage(L(&#39;password_error&#39;, array(&#39;times&#39;=>$times)), &#39;/login.html&#39;, 3000);
                }
                $this->times_db->delete(array(&#39;username&#39;=>$username));
            }
            //如果用户被锁定
            if($r[&#39;islock&#39;]) {
                showmessage(L(&#39;user_is_lock&#39;));
            }
            $userid = $r[&#39;userid&#39;];
            $groupid = $r[&#39;groupid&#39;];
            $username = $r[&#39;username&#39;];
            $nickname = empty($r[&#39;nickname&#39;]) ? $username : $r[&#39;nickname&#39;];
            $updatearr = array(&#39;lastip&#39;=>ip(), &#39;lastdate&#39;=>SYS_TIME);
            //vip过期,更新vip和会员组
            if($r[&#39;overduedate&#39;] < SYS_TIME) {
                $updatearr[&#39;vip&#39;] = 0;
            }       
            //检查用户积分,更新新用户组,除去邮箱认证、禁止访问、游客组用户、vip用户,如果该用户组不允许自助升级则不进行该操作        
            if($r[&#39;point&#39;] >= 0 && !in_array($r[&#39;groupid&#39;], array(&#39;1&#39;, &#39;7&#39;, &#39;8&#39;)) && empty($r[vip])) {
                $grouplist = getcache(&#39;grouplist&#39;);
                if(!empty($grouplist[$r[&#39;groupid&#39;]][&#39;allowupgrade&#39;])) {   
                    $check_groupid = $this->_get_usergroup_bypoint($r[&#39;point&#39;]);
                    if($check_groupid != $r[&#39;groupid&#39;]) {
                        $updatearr[&#39;groupid&#39;] = $groupid = $check_groupid;
                    }
                }
            }
            //如果是connect用户
            if(!empty($_SESSION[&#39;connectid&#39;])) {
                $updatearr[&#39;connectid&#39;] = $_SESSION[&#39;connectid&#39;];
            }
            if(!empty($_SESSION[&#39;from&#39;])) {
                $updatearr[&#39;from&#39;] = $_SESSION[&#39;from&#39;];
            }
            unset($_SESSION[&#39;connectid&#39;], $_SESSION[&#39;from&#39;]);
            $this->db->update($updatearr, array(&#39;userid&#39;=>$userid));
            if(!isset($cookietime)) {
                $get_cookietime = param::get_cookie(&#39;cookietime&#39;);
            }
            $_cookietime = $cookietime ? intval($cookietime) : ($get_cookietime ? $get_cookietime : 0);
            $cookietime = $_cookietime ? SYS_TIME + $_cookietime : 0;
            $phpcms_auth = sys_auth($userid."\t".$password, &#39;ENCODE&#39;, get_auth_key(&#39;login&#39;));
            param::set_cookie(&#39;auth&#39;, $phpcms_auth, $cookietime);
            param::set_cookie(&#39;_userid&#39;, $userid, $cookietime);
            param::set_cookie(&#39;_username&#39;, $username, $cookietime);
            param::set_cookie(&#39;_groupid&#39;, $groupid, $cookietime);
            param::set_cookie(&#39;_nickname&#39;, $nickname, $cookietime);
            //print_r($_COOKIE);
            //exit;
            //param::set_cookie(&#39;cookietime&#39;, $_cookietime, $cookietime); 
            //https 与 http 传递用户名   跨域跳转cooike
            $forward = isset($_POST[&#39;forward&#39;]) && !empty($_POST[&#39;forward&#39;]) ? urldecode($_POST[&#39;forward&#39;]) : &#39;index.php?m=member&c=index&#39;;
            $url = "http://www.zhiliaoke.com.cn/set_cookie_www.php?nickname=".$_COOKIE[&#39;vuGYB__nickname&#39;]."&username=".$_COOKIE[&#39;vuGYB__username&#39;]."&userid=".$_COOKIE[&#39;vuGYB__userid&#39;]."&groupid=".$_COOKIE[&#39;vuGYB__groupid&#39;];
            header("Location: ".$url.""); 
        } 
        //如果不存在用户注册
            $userinfo = array();
            $userinfo[&#39;encrypt&#39;] = create_randomstr(6);
            $userinfo[&#39;username&#39;] = $rs[&#39;nickname&#39;]."_".substr(md5($rs[&#39;unionid&#39;]),0,5) ;
            $userinfo[&#39;nickname&#39;] = $rs[&#39;nickname&#39;]."_".substr(md5($rs[&#39;unionid&#39;]),0,5) ;
            $userinfo[&#39;email&#39;] = time().&#39;@yangpeili.com&#39;;
            $userinfo[&#39;password&#39;] = substr(md5($rs[&#39;unionid&#39;]),0,10);
            $userinfo[&#39;modelid&#39;] = isset($_POST[&#39;modelid&#39;]) ? intval($_POST[&#39;modelid&#39;]) : 10;
            $userinfo[&#39;regip&#39;] = ip();
            $userinfo[&#39;point&#39;] = $member_setting[&#39;defualtpoint&#39;] ? $member_setting[&#39;defualtpoint&#39;] : 0;
            $userinfo[&#39;amount&#39;] = $member_setting[&#39;defualtamount&#39;] ? $member_setting[&#39;defualtamount&#39;] : 0;
            $userinfo[&#39;regdate&#39;] = $userinfo[&#39;lastdate&#39;] = SYS_TIME;
            $userinfo[&#39;siteid&#39;] = $siteid;
            $userinfo[&#39;connectid&#39;] = isset($_SESSION[&#39;connectid&#39;]) ? $_SESSION[&#39;connectid&#39;] : &#39;&#39;;
            $userinfo[&#39;from&#39;] = isset($_SESSION[&#39;from&#39;]) ? $_SESSION[&#39;from&#39;] : &#39;&#39;;
            //手机强制验证
            //附表信息验证 通过模型获取会员信息
            if($member_setting[&#39;choosemodel&#39;]) {
                require_once CACHE_MODEL_PATH.&#39;member_input.class.php&#39;;
                require_once CACHE_MODEL_PATH.&#39;member_update.class.php&#39;;
                $member_input = new member_input($userinfo[&#39;modelid&#39;]);     
                $_POST[&#39;info&#39;] = array_map(&#39;new_html_special_chars&#39;,$_POST[&#39;info&#39;]);
                $user_model_info = $member_input->get($_POST[&#39;info&#39;]);                                       
            }
            if(pc_base::load_config(&#39;system&#39;, &#39;phpsso&#39;)) {
                $this->_init_phpsso();
                $status = $this->client->ps_member_register($userinfo[&#39;username&#39;], $userinfo[&#39;password&#39;], $userinfo[&#39;email&#39;], $userinfo[&#39;regip&#39;], $userinfo[&#39;encrypt&#39;]);
                echo $status;
                if($status > 0) {
                    $userinfo[&#39;phpssouid&#39;] = $status;
                    //传入phpsso为明文密码,加密后存入phpcms_v9
                    $password = $userinfo[&#39;password&#39;];
                    $userinfo[&#39;password&#39;] = password($userinfo[&#39;password&#39;], $userinfo[&#39;encrypt&#39;]); 
                    $userid = $this->db->insert($userinfo, 1);
                    if($member_setting[&#39;choosemodel&#39;]) {   //如果开启选择模型
                        $user_model_info[&#39;userid&#39;] = $userid;
                        //插入会员模型数据
                        $this->db->set_model($userinfo[&#39;modelid&#39;]);
                        $this->db->insert($user_model_info);
                    }
                    if($userid > 0) {
                        //执行登陆操作
                        if(!$cookietime) $get_cookietime = param::get_cookie(&#39;cookietime&#39;);
                        $_cookietime = $cookietime ? intval($cookietime) : ($get_cookietime ? $get_cookietime : 0);
                        $cookietime = $_cookietime ? TIME + $_cookietime : 0;
                        if($userinfo[&#39;groupid&#39;] == 7) {
                            param::set_cookie(&#39;_username&#39;, $userinfo[&#39;username&#39;], $cookietime);
                            param::set_cookie(&#39;email&#39;, $userinfo[&#39;email&#39;], $cookietime);                           
                        } else {
                            $phpcms_auth = sys_auth($userid."\t".$userinfo[&#39;password&#39;], &#39;ENCODE&#39;, get_auth_key(&#39;login&#39;));
                            //$this->db->update(array(&#39;groupid&#39;=> "6"), array(&#39;userid&#39;=>$userid));
                            $sql = "UPDATE `v9_member` SET `groupid`=&#39;6&#39; WHERE `userid` = $userid ";//修改用户级别为注册用户
                            mysql_query($sql);
                            param::set_cookie(&#39;auth&#39;, $phpcms_auth, $cookietime);
                            param::set_cookie(&#39;_userid&#39;, $userid, $cookietime);
                            param::set_cookie(&#39;_username&#39;, $userinfo[&#39;username&#39;], $cookietime);
                            param::set_cookie(&#39;_nickname&#39;, $userinfo[&#39;nickname&#39;], $cookietime);
                            param::set_cookie(&#39;_groupid&#39;, $userinfo[&#39;groupid&#39;], $cookietime);
                            param::set_cookie(&#39;cookietime&#39;, $_cookietime, $cookietime);
                            $forward = isset($_POST[&#39;forward&#39;]) && !empty($_POST[&#39;forward&#39;]) ? urldecode($_POST[&#39;forward&#39;]) : &#39;index.php?m=member&c=index&#39;;
                            //https 与 http 传递用户名   跨域跳转cooike
                            $url = "http://www.zhiliaoke.com.cn/set_cookie_www.php?nickname=".$_COOKIE[&#39;vuGYB__nickname&#39;]."&username=".$_COOKIE[&#39;vuGYB__username&#39;]."&userid=".$_COOKIE[&#39;vuGYB__userid&#39;]."&groupid=".$_COOKIE[&#39;vuGYB__groupid&#39;];
                            header("Location: ".$url.""); 
                        }
                    }
                }
            } else {
                showmessage(L(&#39;enable_register&#39;).L(&#39;enable_phpsso&#39;), &#39;/login.html&#39;);
            }
            showmessage(L(&#39;operation_failure&#39;), HTTP_REFERER);
        }
?>
登录后复制

补充最后一步 

很重要,也是最简单容易忽视的 !!! 

有几个人都卡在这里了!

需要 在phpcms\modules\member\classes\foreground.class.php 文件 21行左右 判断用户是否登陆通过wechat 函数

83500957f849487dd7ef20c66bddd41.jpg

PHP中文网,大量的免费PHPCMS教程,欢迎在线学习!

以上就是phpcms怎么实现微信登陆的详细内容,更多请关注php中文网其它相关文章!

智能AI问答
PHP中文网智能助手能迅速回答你的编程问题,提供实时的代码和解决方案,帮助你解决各种难题。不仅如此,它还能提供编程资源和学习指导,帮助你快速提升编程技能。无论你是初学者还是专业人士,AI智能助手都能成为你的可靠助手,助力你在编程领域取得更大的成就。
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
最新问题
关于CSS思维导图的课件在哪? 课件
凡人来自于2024-04-16 10:10:18
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2024 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号