账户中心 退出系统
开发文档 资讯·分享 技术交流 会员登录
phpGrace GSCMS 公众号系统
微信扫码登录 [ web 端 ]

功能描述

微信扫码登录工具类,通过简单的配置即可完成复杂的登录功能。

申请开通微信开放平台

网址 : https://open.weixin.qq.com/
注册并登录微信开放平台(需要认证),认证后按照要求添加应用【网站应用】-> 通过审核。

数据表结构

CREATE TABLE `grace_members` (
  `u_id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
  `u_username` varchar(50) DEFAULT NULL COMMENT '用户名',
  `u_openid_qq` varchar(100) DEFAULT NULL COMMENT 'openid-qq',
  `u_unionid_qq` varchar(100) DEFAULT NULL COMMENT 'unionid-qq',
  `u_openid_wx` varchar(100) DEFAULT NULL COMMENT 'openid-wx',
  `u_unionid_wx` varchar(100) DEFAULT NULL COMMENT 'unionid-wx',
  `u_phone` varchar(20) DEFAULT NULL COMMENT '手机号',
  `u_pwd` varchar(50) DEFAULT NULL COMMENT '密码',
  `u_name` varchar(20) DEFAULT NULL COMMENT '称呼',
  `u_face` varchar(200) DEFAULT NULL COMMENT '头像地址',
  `u_gender` varchar(20) DEFAULT NULL COMMENT '性别',
  `u_status` tinyint(4) DEFAULT NULL COMMENT '状态',
  `u_regtime` bigint(13) DEFAULT NULL COMMENT '注册时间',
  `u_logintime` bigint(13) DEFAULT NULL COMMENT '登陆时间',
  `u_randnum` varchar(50) DEFAULT NULL COMMENT '随机码',
  `u_ip` varchar(20) DEFAULT NULL COMMENT '登陆IP',
  `u_msgcode` varchar(10) DEFAULT NULL COMMENT '短信验证码',
  PRIMARY KEY (`u_id`),
  UNIQUE KEY `u_unionid_qq` (`u_unionid_qq`),
  UNIQUE KEY `u_username` (`u_username`),
  UNIQUE KEY `u_phone` (`u_phone`) USING BTREE,
  UNIQUE KEY `u_openid_qq` (`u_openid_qq`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=100000 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;

演示代码

在视图中添加一个链接,链接到控制器 wxLogin,代码如下:

<?php
//核心登录 session 名称 graceUid,请根据项目需求自行修改。
class wxLoginController extends grace{

    private $loginer;

    public function __init(){
        parent::__init();
        //检查是否已经登录
        if(!empty($_SESSION['graceUid'])){header('/'); exit;}
        $wxLoginConfig = array(
            'APPID'        => '******',
            'APPKEY'       => '******',
            'redirectUri'  => 'https://域名/qqLogin/back'
        );
        $this->loginer = new phpGrace\tools\webWxLogin($wxLoginConfig);
    }

    public function index(){
        $this->loginer->login();
    }

    //扫描登录后返回处理
    public function back(){
        //检查参数
        if(empty($_GET['code']) || empty($_GET['state'])){exit('数据错误请返回重试');}
        if($_GET['state'] != $_SESSION['wxLoginState']){exit('数据错误请返回重试');}
        //获取用户信息
        $user = $this->loginer->getUserInfo();
        //连接数据比对用户
        $dbMember = db('members');
        $member   = $dbMember->where('u_openid_wx = ?', array($this->loginer->openId))->fetch();
        //用户数据不存在 [ 第一次登录 ]
        if(empty($member)){
            $preAddData = array();
            $preAddData['u_openid_wx'] = $this->loginer->openId;
            $preAddData['u_nickname']  = $user['nickname'];
            $preAddData['u_face']      = $user['headimgurl'];
            $preAddData['u_gender']    = $user['sex'];
            $preAddData['u_status']    = 1;
            $preAddData['u_regtime']   = time();
            $preAddData['u_logintime'] = time();
            $preAddData['u_ip']        = phpGrace\tools\ip::getIp();
            $uid = $dbMember->add($preAddData);
            if($uid){
                //记录 session
                setSession('graceUid', $uid);
                setSession('graceNickName', $user['nickname']);
            }else{
                exit('服务器忙,请返回重试');
            }
        }
        //用户已经存在
        else{
            $preUpdateData = array();
            $preUpdateData['u_logintime'] = time();
            $preUpdateData['u_ip']        = phpGrace\tools\ip::getIp();
            $dbMember->where('u_id = ?', array($member['u_id']))->update($preUpdateData);
            //记录 session
            setSession('graceUid', $member['u_id']);
            setSession('graceNickName', $user['nickname']);
        }
        //登录后跳转回首页,可以根据项目需求改写跳转
        header('location:/');
    }
}