基于:Laravel 5.8.*,以下代碼可能存在一些繼承函數(shù),詳情可訪問開源項(xiàng)目:Github、Gitee。
注意:公眾號(hào)必須已經(jīng)認(rèn)證,且必須擁有網(wǎng)頁授權(quán)獲取用戶基本信息的權(quán)限。
開發(fā)-基本配置-公眾號(hào)開發(fā)信息,獲取 app_id 和 app_secret 這兩個(gè)參數(shù)。
開發(fā)-基本配置-公眾號(hào)開發(fā)信息,IP白名單中設(shè)置你的服務(wù)器公網(wǎng)IP。
設(shè)置-公眾號(hào)設(shè)置-功能設(shè)置,業(yè)務(wù)域名中添加你的域名(主要用于防止微信中訪問網(wǎng)頁時(shí)進(jìn)行轉(zhuǎn)碼和風(fēng)險(xiǎn)提示)。
設(shè)置-公眾號(hào)設(shè)置-功能設(shè)置,網(wǎng)頁授權(quán)域名中添加你的域名。
安裝前請(qǐng)切換到項(xiàng)目的根目錄下。
composer require "overtrue/laravel-wechat:~5.0"
注意:安裝完成后 Laravel 默認(rèn)已經(jīng)把 EasyWeChat 做為服務(wù)嵌入到了框架中,所以在開發(fā)中使用的代碼和 EasyWeChat 官方幫助文檔中稍微有不同,當(dāng)然如果你不使用 Laravel 的服務(wù)特性或是原生方式,可以直接按官網(wǎng)的來,更具體可以查看 EasyWeChat 和 EasyWeChat Laravel 5 拓展包的使用文檔。
php artisan vendor:publish --provider="Overtrue\LaravelWeChat\ServiceProvider"
這里使用的是微信中登陸功能,因此需要將 app_id 和 secret 修改為你的公眾號(hào)參數(shù),其他默認(rèn)就好,可以在 /config/wechat.php 中修改,或者也可以在 .evn 中添加并賦值,兩個(gè)方式選其一,具體區(qū)別請(qǐng)閱讀官方文檔。
在 /config/wechat.php 中的 official_account 節(jié)點(diǎn)中修改:
/*
* 公眾號(hào)
*/
'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:公眾平臺(tái)(snsapi_userinfo / snsapi_base),開放平臺(tái):snsapi_login
* callback:OAuth授權(quán)完成后的回調(diào)頁地址(如果使用中間件,則隨便填寫。。。)
*/
'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 節(jié)點(diǎn)添加
'wechat.oauth' => \Overtrue\LaravelWeChat\Middleware\OAuthAuthenticate::class,
/routes/web.php 中添加:
Route::get('wechat/auth', function(){
$wechat = session('wechat.oauth_user.default'); //拿到授權(quán)用戶資料
dd($wechat); //打印出授權(quán)用戶資料
})->middleware('auth.wechat');
此時(shí),打開微信,在微信中訪 http://你的域名/wechat/auth 試試,點(diǎn)擊同意授權(quán)后,就會(huì)打印出你當(dāng)前微信的用戶資料。
注意:必須在微信中訪問,因?yàn)樵跒g覽器中訪問是需要微信開放平臺(tái)的接口,不在此教程范圍中。
此時(shí)可以注釋或者刪除掉剛才創(chuàng)建的路由信息,并添加正式的路由:
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中 中間件的方法進(jìn)行授權(quán),因此一句話搞定直接獲取授權(quán)用戶的信息如下:
$wechat = session('wechat.oauth_user.default');
//查詢用戶
$has = User::where('wechat_openid', $wechat->id)->first();
//校驗(yàn)用戶是否存在,不存在則創(chuàng)建新用戶
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;
}
//認(rèn)證登陸
Auth::login($result, true);
//獲取跳轉(zhuǎn)地址
$redirect_url = $request->redirect_url;
if($redirect_url == ''){
//如果跳轉(zhuǎn)地址不存在
return redirect('/user');
}else{
return redirect($redirect_url);
}
}
}
這個(gè)過程中存在的幾個(gè)坑:
1. 查詢用戶需要用到默認(rèn)的 User 類,如果使用 DB 類去查,例如:
Db::table('user')->where(['wechat_openid' => $wechat->id])->first();
返回的數(shù)據(jù)是無法通過 Auth:login 認(rèn)證的,因此需要引用 use App\User,再通過 User::where 查詢才可以。
需要到 /app/Http/User.php 中查看下 protected $fillable 節(jié)點(diǎn)中是否包含 User::create 中插入的字段,如果沒有則添加。例如:
protected $fillable = [
'username', 'password', 'email', 'phone', 'avatar', 'wechat_openid', 'logined_ip', 'logined', 'created', 'state',
];
3. 提示 create_at 或 update_at 字段不存在?
如果你的用戶數(shù)據(jù)包字段包含 create_at 和 update_at,不會(huì)存在此提示,如果沒有,就要在 User 類中關(guān)閉 Laravel 自帶的時(shí)間字段,依然在 /app/Http/User.php 中添加
public $timestamps = false;
聯(lián)系客服