Maison  >  Article  >  Tutoriel CMS  >  Comment implémenter la connexion WeChat dans phpcms

Comment implémenter la connexion WeChat dans phpcms

藏色散人
藏色散人original
2023-03-09 09:33:082113parcourir

Comment implémenter la connexion Wechat dans phpcms : 1. Créez un nouveau "wechat.php" dans le répertoire racine ; 2. Ajoutez "public function wechat() {...}" sous "phpcmsmodulesmemberindex.php" ; Fichier "foreground. class.php" pour déterminer si l'utilisateur est connecté via la fonction wechat.

Comment implémenter la connexion WeChat dans phpcms

L'environnement d'exploitation de ce tutoriel : système Windows 10, version phpcms v9, ordinateur DELL G3

Comment implémenter la connexion WeChat dans phpcms ?

phpcms implémente le login WeChat (aucune inscription requise, dépôt direct)

Idée : paramètres de rappel, inscrivez-vous directement (le code n'est pas assez standardisé, organisez-le vous-même)

Créez un nouveau wechat.php dans le répertoire racine

Visitez : http://www .xxxxxx.cn/wechat.php

Faites attention à l'adresse de rappel

phpcms implémente la connexion WeChat (aucune inscription requise, dépôt direct)

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);
?>

phpcmsmodulesmemberindex.php ajouté

Remarque : sortie du statut d'enregistrement $status, Vous pouvez renvoyer un message d'erreur et modifier le contenu du paramètre en fonction du message d'erreur

Le nom d'utilisateur et le mot de passe sont simplement distingués et modifiés en fonction de la situation réelle. L'adresse e-mail est un champ obligatoire. , alors mettez-en un.

<?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);
        }
?>

Ajout de la dernière étape

C'est très important, et c'est aussi la plus facile à ignorer ! ! !

Quelques personnes sont coincées ici !

Nécessite environ la ligne 21 du fichier phpcmsmodulesmemberclassesforeground.class.php pour déterminer si l'utilisateur est connecté via la fonction wechat

Comment implémenter la connexion WeChat dans phpcms

Site Web PHP chinois, un grand nombre de Tutoriels PHPCMS gratuits, bienvenue pour apprendre en ligne !

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn