Laravel 微信页面授权登陆

Laravel 微信页面授权登陆

安装依赖

1
$ composer require overtrue/wechat:~4.0

app\Http\Middleware\WechatMiddleware.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
<?php

namespace App\Http\Middleware;

use EasyWeChat\Factory;
use App\User;
use Closure;

class WechatMiddleware
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
// https://www.easywechat.com/docs/master/official-account/configuration
$wechat_config = [
'app_id' => 'app_id',
'secret' => 'secret',
'oauth' => [
'scopes' => ['snsapi_userinfo'],
'callback' => '/',
]
];

$app = Factory::officialAccount($wechat_config);

$request->app = $app;

// 通过 UA 来判断是否为微信内置浏览器访问,如果不是的话则返回一个测试号信息
if(isset($_SERVER['HTTP_USER_AGENT'])
&& strpos($_SERVER['HTTP_USER_AGENT'], 'MicroMessenger') === false
) {
// 测试号 ID
// $test_uid = 1;

// session([
// 'wechat_user' => User::find($test_uid)->toArray()
// ]);

// session()->save();

return $next($request);
}

// $request->session()->flush();

// 判断是否存在可以验证用户信息的 session
if(session()->has('wechat_user')) {
return $next($request);
}

$oauth = $app->oauth;

// 通过 code state 这两个参数来判断是否为成功授权后跳转回来,也可以通过判断来源
if(!$request->has(['code', 'state'])) {
// 跳转到授权页面
return $oauth->setRequest($request)
->redirect();
}

// 获取当前用户信息
$user = $oauth->user();

// 获取当前用户 openid
$openid = $user->getId();

$model = User::where('openid', $openid)
->first();

if(!$model) {
// 用户不存在需要注册
$model = new User;
$model->nickname = $user->getNickname();
$model->openid = $openid;
$model->save();
}

session([
'wechat_user' => $model->toArray()
]);

session()->save();

return redirect('/');
}
}

app\Http\Kernel.php

1
2
3
4
protected $routeMiddleware = [
...
'wechat' => \App\Http\Middleware\WechatMiddleware::class,
];

routes\web.php

1
2
3
Route::get('/', function () {
return view('welcome');
})->middleware('wechat');
往上