微信网页授权登录demo

小编 2026-06-18 阅读:861 评论:0
class weixin { private $token = \'\'; private $appid = \'\'; private $appkey = \'\';...
class weixin {

    private $token = \'\';
    private $appid = \'\';
    private $appkey = \'\';
    private $weObj = \'\';

    /**
     * 构造函数
     *
     * @param unknown $app            
     * @param string $access_token            
     */
    public function __construct($conf) {
        $this->token = $conf[\'token\'];
        $this->appid = $conf[\'app_id\'];
        $this->appsecret = $conf[\'app_secret\'];

        $config[\'token\'] = $this->token;
        $config[\'appid\'] = $this->appid;
        $config[\'appsecret\'] = $this->appsecret;

        $this->weObj = new Wechat($config);
    }

    /**
     * 授权登录地址
     */
    public function act_login($info, $url){
        // 微信浏览器浏览
        if (is_wechat_browser() && ($_SESSION[\'user_id\'] === 0 || empty($_SESSION[\'openid\']))) {
            return $this->weObj->getOauthRedirect($url, 1);
        }
        else{
            show_message(\"请在微信内访问或者已经登录。\", L(\'relogin_lnk\'), url(\'login\', array(
                \'referer\' => urlencode($this->back_act)
                    )), \'error\');
        }
    }

    /**
     * 登录处理
     */
    public function call_back($info, $url, $code, $type){
        if (!empty($code)) {
            $token = $this->weObj->getOauthAccessToken();
            $userinfo = $this->weObj->getOauthUserinfo($token[\'access_token\'], $token[\'openid\']);
            $_SESSION[\'wechat_user\'] = empty($userinfo) ? array() : $userinfo;
			if(!empty($userinfo)){
				//公众号信息
				$wechat = model(\'Base\')->model->table(\'wechat\')->field(\'id, oauth_status\')->where(array(\'type\'=>2, \'status\'=>1, \'default_wx\'=>1))->find();
				$this->update_weixin_user($userinfo, $wechat[\'id\'], $this->weObj);
			}else{
				return false;
			}
            if(!empty($_SESSION[\'redirect_url\'])){
                return array(\'url\'=>$_SESSION[\'redirect_url\']);
            }
            return true;
        } else {
            return false;
        }
    }

    /**
     * 更新微信用户信息
     *
     * @param unknown $userinfo          
     * @param unknown $weObj            
     */
    public function update_weixin_user($userinfo, $wechat_id = 0, $weObj)
    {
        $time = time();
        $ret = model(\'Base\')->model->table(\'wechat_user\')->field(\'openid, ect_uid\')->where(\'openid = \"\' . $userinfo[\'openid\'] . \'\"\')->find();
        if (empty($ret)) {
            //微信用户绑定会员id
            $ect_uid = 0;
            //查看公众号是否绑定
            if($userinfo[\'unionid\']){
                $ect_uid = model(\'Base\')->model->table(\'wechat_user\')->field(\'ect_uid\')->where(array(\'unionid\'=>$userinfo[\'unionid\']))->getOne();
            }

            //未绑定
            if(empty($ect_uid)){
                // 设置的用户注册信息
                $register = model(\'Base\')->model->table(\'wechat_extend\')
                    ->field(\'config\')
                    ->where(\'enable = 1 and command = \"register_remind\" and wechat_id = \'.$wechat_id)
                    ->find();
                if (! empty($register)) {
                    $reg_config = unserialize($register[\'config\']);
                    $username = msubstr($reg_config[\'user_pre\'], 3, 0, \'utf-8\', false) . time().mt_rand(1, 99);
                    // 密码随机数
                    $rs = array();
                    $arr = range(0, 9);
                    $reg_config[\'pwd_rand\'] = $reg_config[\'pwd_rand\'] ? $reg_config[\'pwd_rand\'] : 3;
                    for ($i = 0; $i < $reg_config[\'pwd_rand\']; $i ++) {
                        $rs[] = array_rand($arr);
                    }
                    $pwd_rand = implode(\'\', $rs);
                    // 密码
                    $password = $reg_config[\'pwd_pre\'] . $pwd_rand;
                    // 通知模版
                    $template = str_replace(array(
                        \'[$username]\',
                        \'[$password]\'
                    ), array(
                        $username,
                        $password
                    ), $reg_config[\'template\']);
                } else {
                    $username = \'wx_\' . time().mt_rand(1, 99);
                    $password = \'ecmoban\';
                    // 通知模版
                    $template = \'默认用户名:\' . $username . \"\\r\\n\" . \'默认密码:\' . $password;
                }
                // 会员注册
                $domain = get_top_domain();
                if (model(\'Users\')->register($username, $password, $username . \'@\' . $domain, array(\'parent_id\'=>intval($_GET[\'u\']))) !== false) {
                    model(\'Users\')->update_user_info();
                } else {
                    die(\'授权失败,如重试一次还未解决问题请联系管理员\');
                }
                $data1[\'ect_uid\'] = $_SESSION[\'user_id\'];
            }
            else{
                //已绑定
                $username = model(\'Base\')->model->table(\'users\')->field(\'user_name\')->where(array(\'user_id\'=>$ect_uid))->getOne();
                $template = \'您已拥有帐号,用户名为\'.$username;
                $data1[\'ect_uid\'] = $ect_uid;
            }
            
            // 获取用户所在分组ID
            $group_id = $weObj->getUserGroup($userinfo[\'openid\']);
            $group_id = $group_id ? $group_id : 0;

            $data1[\'wechat_id\'] = $wechat_id;
            $data1[\'subscribe\'] = 0;
            $data1[\'openid\'] = $userinfo[\'openid\'];
            $data1[\'nickname\'] = $userinfo[\'nickname\'];
            $data1[\'sex\'] = $userinfo[\'sex\'];
            $data1[\'city\'] = $userinfo[\'city\'];
            $data1[\'country\'] = $userinfo[\'country\'];
            $data1[\'province\'] = $userinfo[\'province\'];
            $data1[\'language\'] = $userinfo[\'country\'];
            $data1[\'headimgurl\'] = $userinfo[\'headimgurl\'];
            $data1[\'subscribe_time\'] = $time;
            $data1[\'group_id\'] = $group_id;
            $data1[\'unionid\'] = $userinfo[\'unionid\'];
            
            model(\'Base\')->model->table(\'wechat_user\')->data($data1)->insert();
        } else {
            //开放平台有privilege字段,公众平台没有
            unset($userinfo[\'privilege\']);
            model(\'Base\')->model->table(\'wechat_user\')->data($userinfo)->where(array(\'openid\'=> $userinfo[\'openid\']))->update();
            $new_user_name = model(\'Base\')->model->table(\'users\')->field(\'user_name\')->where(array(\'user_id\'=>$ret[\'ect_uid\']))->getOne();
            ECTouch::user()->set_session($new_user_name);
            ECTouch::user()->set_cookie($new_user_name);
            model(\'Users\')->update_user_info();
        }
        $_SESSION[\'openid\'] = $userinfo[\'openid\'];
        setcookie(\'openid\', $userinfo[\'openid\'], gmtime() + 86400 * 7);
    }

}

 

版权声明

本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。

热门文章
  • 机房智能化温湿度解决方式之POE供电以太网温湿度传感器

    机房智能化温湿度解决方式之POE供电以太网温湿度传感器
    机房智能化温湿度解决方式之POE供电以太网温湿度传感器 北京盈创力和电子科技有限公司 智能型TCP网口温湿度记录仪 北京IP网络温湿度记录仪厂家,北京盈创力和 北京智能型TCP网口温湿度记录仪IP网络温湿度记录仪是一种新型的基于TCP/IP协议双绞线以太网标准温湿度采集模块,利用它可以实现现场温度值、相对湿度值的采集,同时利用其自身的RJ45通信接口可以方便地和机房监控主机或交换机集线器进行联网。 工作于-40℃~85℃工业级带...
  • Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering

    Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering
    Problem Statement 我们考虑一个具有马尔可夫性质、非线性、非高斯的状态空间模型(State Space Model):对于一个时间序列上的观测结果{yt,t∈N}\\{ y_t , t \\in N \\}{yt​,t∈N},我们认为每个观测结果yty_tyt​的生成依赖于一个无法直接观察的隐变量xt∈{xt,t∈N}x_t \\in \\{x_t , t \\in N \\}xt​∈{xt​,t∈N},即:p(...
  • HTTP状态保持的原理

    HTTP状态保持的原理
    a)在用户登录之后,浏览器返回响应的时候会在响应中添加上cookieb)浏览器接收到cookie之后会自动保存c)当用户再次请求同一服务器中的其他网页的时候,浏览器会自动带上之前保存的cookied)服务接收到请求之后可以请 request 对象中取到cookie 判断当前用户是否登录  Http是无状态的,就是连接时数据互通,关闭后...
  • Hive 系统函数及示例

    Hive 系统函数及示例
    查看所有系统函数 show functions; 函数分类 内置函数【系统函数】 数学函数: floor、round、ceil、cos、log2等 字符串函数: length、reverse、trim、lower、get_json_object、repeat等 收集函数: size 转换函数: cast 日期函数: year、month、datediff、date、date_add等 条件函数: coalesce、case…w...
  • CSRF的原理和防范措施

    CSRF的原理和防范措施
    a)攻击原理:i.用户C访问正常网站A时进行登录,浏览器保存A的cookieii.用户C再访问攻击网站B,网站B上有某个隐藏的链接或者图片标签会自动请求网站A的URL地址,例如表单提交,传指定的参数iii.而攻击网站B在访问网站A的时候,浏览器会自动带上网站A的cookieiv.所以网站A在接收到请求之后可判断当前用户是登录状态,所以...
标签列表