Laravel + EasyWeChat 微信登陆功能
基于:Laravel 5.8.*,以下代码可能存在一些继承函数,详情可访问开源项目:Github、Gitee。
第一步:去微信公众号中设置和获取信息
注意:公众号必须已经认证,且必须拥有网页授权获取用户基本信息的权限。
开发-基本配置-公众号开发信息,获取 app_id 和 app_secret 这两个参数。
开发-基本配置-公众号开发信息,IP白名单中设置你的服务器公网IP。
设置-公众号设置-功能设置,业务域名中添加你的域名(主要用于防止微信中访问网页时进行转码和风险提示)。
设置-公众号设置-功能设置,网页授权域名中添加你的域名。
第二步:安装 EasyWeChat 的 Laravel 5 拓展包
安装前请切换到项目的根目录下。
composer require "overtrue/laravel-wechat:~5.0"
注意:安装完成后 Laravel 默认已经把 EasyWeChat 做为服务嵌入到了框架中,所以在开发中使用的代码和 EasyWeChat 官方帮助文档中稍微有不同,当然如果你不使用 Laravel 的服务特性或是原生方式,可以直接按官网的来,更具体可以查看 EasyWeChat 和 EasyWeChat Laravel 5 拓展包的使用文档。
第三步:创建配置文件
php artisan vendor:publish --provider="Overtrue\LaravelWeChat\ServiceProvider"
第四步:修改配置参数
这里使用的是微信中登陆功能,因此需要将 app_id 和 secret 修改为你的公众号参数,其他默认就好,可以在 /config/wechat.php 中修改,或者也可以在 .evn 中添加并赋值,两个方式选其一,具体区别请阅读官方文档。
在 /config/wechat.php 中的 official_account 节点中修改:
/*
* 公众号
*/
'official_account' => [
'default' => [
'app_id' => env('WECHAT_OFFICIAL_ACCOUNT_APPID', 'your-app-id'), // AppID
'secret' => env('WECHAT_OFFICIAL_ACCOUNT_SECRET', 'your-app-secret'), // AppSecret
'token' => env('WECHAT_OFFICIAL_ACCOUNT_TOKEN', 'your-token'), // Token
'aes_key' => env('WECHAT_OFFICIAL_ACCOUNT_AES_KEY', ''), // EncodingAESKey
/*
* OAuth 配置
*
* scopes:公众平台(snsapi_userinfo / snsapi_base),开放平台:snsapi_login
* callback:OAuth授权完成后的回调页地址(如果使用中间件,则随便填写。。。)
*/
'oauth' => [
'scopes' => array_map('trim', explode(',', env('WECHAT_OFFICIAL_ACCOUNT_OAUTH_SCOPES', 'snsapi_userinfo'))),
'callback' => env('WECHAT_OFFICIAL_ACCOUNT_OAUTH_CALLBACK', '/examples/oauth_callback.php'),
],
],
],
在 .evn 中添加并赋值:
WECHAT_OFFICIAL_ACCOUNT_APPID = your-app-id
WECHAT_OFFICIAL_ACCOUNT_SECRET = your-app-secret
第五步:注册中间件
/app/Http/Kernel.php 中的 protected $routeMiddleware 节点添加
'wechat.oauth' => \Overtrue\LaravelWeChat\Middleware\OAuthAuthenticate::class,
第六步:创建测试路由,添加中间件
/routes/web.php 中添加:
Route::get('wechat/auth', function(){
$wechat = session('wechat.oauth_user.default'); //拿到授权用户资料
dd($wechat); //打印出授权用户资料
})->middleware('auth.wechat');
第七步:访问测试路由
此时,打开微信,在微信中访 http://你的域名/wechat/auth 试试,点击同意授权后,就会打印出你当前微信的用户资料。
注意:必须在微信中访问,因为在浏览器中访问是需要微信开放平台的接口,不在此教程范围中。
第八步:创建正式路由,添加中间件
此时可以注释或者删除掉刚才创建的路由信息,并添加正式的路由:
Route::any('wechat/auth', 'Wechat@auth')->middleware(['auth.wechat']);
第九步:创建控制器
/app/Http/Controllers/Wechat.php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\DB;
use App\User;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Str;
class Wechat extends Controller
{
public function auth(Request $request)
{
//由于使用了easyWechat中 中间件的方法进行授权,因此一句话搞定直接获取授权用户的信息如下:
$wechat = session('wechat.oauth_user.default');
//查询用户
$has = User::where('wechat_openid', $wechat->id)->first();
//校验用户是否存在,不存在则创建新用户
if(!$has){
$result = User::create([
'username' => $wechat->name,
'password' => bcrypt(Str::random(60)),
'wechat_openid' => $wechat->id,
'logined_ip' => $request->getClientIp(),
'logined' => time(),
'created' => time(),
'state' => 1,
]);
}else{
$result = $has;
}
//认证登陆
Auth::login($result, true);
//获取跳转地址
$redirect_url = $request->redirect_url;
if($redirect_url == ''){
//如果跳转地址不存在
return redirect('/user');
}else{
return redirect($redirect_url);
}
}
}
这个过程中存在的几个坑:
1. 查询用户需要用到默认的 User 类,如果使用 DB 类去查,例如:
Db::table('user')->where(['wechat_openid' => $wechat->id])->first();
返回的数据是无法通过 Auth:login 认证的,因此需要引用 use App\User,再通过 User::where 查询才可以。
- User::create 新插入到数据库到的字段数据为空?
需要到 /app/Http/User.php 中查看下 protected $fillable 节点中是否包含 User::create 中插入的字段,如果没有则添加。例如:
protected $fillable = [
'username', 'password', 'email', 'phone', 'avatar', 'wechat_openid', 'logined_ip', 'logined', 'created', 'state',
];
3. 提示 create_at 或 update_at 字段不存在?
如果你的用户数据包字段包含 create_at 和 update_at,不会存在此提示,如果没有,就要在 User 类中关闭 Laravel 自带的时间字段,依然在 /app/Http/User.php 中添加
public $timestamps = false;