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 查询才可以。

2. 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;

 

你可能感兴趣的:(后端)