请教一个关于微信登录的问题

需求:微信公众号或者微信小程序加入外链页面,访问该页面的时候,使用微信的 openid 进行用户注册(如果 openid 不存在的话),然后进行登录。现在获取微信用户信息,通过 openid 创建用户已经完成,就是进行登录的时候不知道怎么处理,以下是代码:

    // 微信外链页面
    public function weixin()
    {
        $appid = $this->weixin_app_id;
        $callback = $this->weixin_call_back;
        $url = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid='.$appid.'&redirect_uri='.$callback.'&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect';
        return redirect($url);
    }

    // 回调页面
    public function weixinCallback(Request $request)
    {
        // http://xxx/login/weixin/callback?code=001Y4lPA0ShYCk2N51MA0xkkPA0Y4lPh&state=STATE
        $code = $request->code;
        $appid = $this->weixin_app_id;
        $secret = $this->weixin_app_secret;

        // 获取 access_token
        $url = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid='.$appid.'&secret='.$secret.'&code='.$code.'&grant_type=authorization_code';
        $ret = json_decode(_curl_get($url));
        $access_token = isset($ret->access_token) ? $ret->access_token : '';
        $openid = isset($ret->openid) ? $ret->openid : '';

        if ( $openid == '' ) return;

        // 获取个人信息
        $url = 'https://api.weixin.qq.com/sns/userinfo?access_token='.$access_token.'&openid='.$openid.'&lang=zh_CN';
        // 获取微信用户信息
        $ret = json_decode(_curl_get($url));
        $user = User::where('weixin_openid', $openid)->first();

        // 没有用户,默认创建一个用户
        if (!$user) {
            $user = User::create([
                'name' => isset($ret->nickname) ? $ret->nickname : '',
                'email' => $openid . '@qq.com',
                'password' => bcrypt($openid),
                'weixin_openid' => $openid,
            ]);
        }
        // 本地登录(不知道怎么处理了)

        return redirect('/home');
    }

用户系统使用的是 Laravel 自带的用户认证功能:

php artisan ui:auth

我希望的是获取微信信息后,怎么实现用户的登录,而不需要通过这个页面输入邮箱、密码进行登录:

请教一个关于微信登录的问题

我尝试过以下的方式模拟登录,但是貌似都只是当前页面有效而已:

Auth::attempt(['email' => $email, 'password' => $password]);
Auth::loginUsingId($userid, $remember = false);

请问这个问题该如何解决呢?

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
最佳答案

大概这样:

  1. 为当前用户创建会话:
    $userInfo = $request->only(['name', 'password']);
    if ( Auth::attempt($userInfo)) {
    return '登录成功, 正在跳转...';
    }
    return '失败';
  2. 为自己的 route 加上中间件
    Route::middleware('auth')->group(function () {
     Route::get('/home', '....');
    }
3年前 评论
讨论数量: 6

自己定义的 Route 是不是忘记使用 Auth 中间件?

3年前 评论

@bigbug “自己定义的 Route”,什么意思呢?比如这个外链页面和回调页面肯定是没有使用的,然后需要登录权限的页面都使用了 Auth 中间件。

3年前 评论

大概这样:

  1. 为当前用户创建会话:
    $userInfo = $request->only(['name', 'password']);
    if ( Auth::attempt($userInfo)) {
    return '登录成功, 正在跳转...';
    }
    return '失败';
  2. 为自己的 route 加上中间件
    Route::middleware('auth')->group(function () {
     Route::get('/home', '....');
    }
3年前 评论

@bigbug 你这做法和我是一样的:

Auth::attempt(['email' => $email, 'password' => $password]);

返回的是 true,只是跳转到需要 auth 权限的页面就不行了,全部跳到登录页面了

3年前 评论
bigbug-gg 3年前

原来代码都没问题,唯一的问题是在使用 Auth::attempt 之前有使用 dump 函数输出。我之前一直没留意这点,我一直有疑虑的是 Auth::attempt 的作用域是不是仅在当前页面起作用(因为没使用过)。为此我还专门新建了一个 laravel 项目进行测试。可恨的是测试代码也是用到了 dump 函数,后来把输出屏蔽,就没问题了!!非常感谢 @bigbug :+1: :+1:的热心帮忙。

3年前 评论
bigbug-gg 3年前
夜游人 (作者) (楼主) 3年前
bigbug-gg 3年前
夜游人 (作者) (楼主) 3年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!