laravel5.6安裝laravel-wechat 實現微信授權登錄
一.下載laravel-wechat
https://packagist.org/packages/overtrue/laravel-wechat
二. 使用composer安裝laravel-wechat
composer require "overtrue/laravel-wechat:~4.0"
php>=7.2
laravel <5.8
如果php版本不高,可以升級php,參考我的另一篇博客
升級php版本步驟
三.配置
在 config/app.php 註冊 ServiceProvider 和 Facade (Laravel 5.5 + 無需手動註冊)
'providers' => [
// ...
Overtrue\LaravelWeChat\ServiceProvider::class,
],
'aliases' => [
// ...
'EasyWeChat' => Overtrue\LaravelWeChat\Facade::class,
],
創建配置文件:
php artisan vendor:publish --provider="Overtrue\LaravelWeChat\ServiceProvider
1.修改應用根目錄下的 config/wechat.php 中對應的參數即可。
WECHAT_LOG_LEVEL=info //日誌級別 最好和laravel同級
WECHAT_LOG_FILE=/var/log/coupon/report.log //日誌保存文件 最好和laravel 統一
WECHAT_OFFICIAL_ACCOUNT_APPID=申請的appid
WECHAT_OFFICIAL_ACCOUNT_SECRET=申請的appsecret
WECHAT_OFFICIAL_ACCOUNT_TOKEN=
WECHAT_OFFICIAL_ACCOUNT_AES_KEY=
2.每個模塊基本都支持多賬號,默認爲 default。
四.使用
在中間件 App\Http\Middleware\VerifyCsrfToken 排除微信相關的路由,如:
protected $except = [
// ...
'wechat',
];
下面以接收普通消息爲例寫一個例子:
假設您的域名爲 overtrue.me 那麼請登錄微信公衆平臺 “開發者中心” 修改 “URL(服務器配置)” 爲: http://overtrue.me/wechat。
路由:
Route::any('/wechat', 'WeChatController@serve');
注意:一定是 Route::any, 因爲微信服務端認證的時候是 GET, 接收用戶消息時是 POST !
然後創建控制器 WeChatController:
<?php
/**
* Created by PhpStorm.
* User: clj * Date: 2020/4/9
* Time: 下午5:47
*/
namespace App\Http\Controllers\Home;
use Illuminate\Support\Facades\Log;
use App\Http\Controllers\Controller as BaseController;
class WeChatController extends BaseController
{
public function serve(){
Log::info('request arrived');
$app = app('wechat.official_account');
$app->server->push(function($message){
return "歡迎關注 overtrue!";
});
return $app->server->serve();
}
}
上面例子裏的 Log 是 Laravel 組件,所以它的日誌不會寫到 EasyWeChat 裏的,建議把 wechat 的日誌配置到 Laravel 同一個日誌文件,便於調試。
我們有一下方式獲取SDK的服務實例
1.使用外觀
$officialAccount = \EasyWeChat::officialAccount();//公衆號
1.定義路由
Route::get('/user','WeChatController@user');
2.在WeChatController控制器中添加user方法
public function user(){
$officialAccount = \EasyWeChat::officialAccount();
var_dump($officialAccount);
}
OAuth中間件
使用中間件的情況下 app/config/wechat.php中的auth.callback就隨便填寫吧(因爲用不着了).
1.在app/Http/Kernel.php中添加路由中間件
protected $routeMiddleware = [
//...
'wechat.oauth' => \Overtrue\LaravelWeChat\Middleware\OAuthAuthenticate::class,
]
2.在路由中添加中間件
routes/web.php
Route::group(['middleware' => ['wechat.oauth']],function (){
Route::get('/user','WeChatController@user');
});
WeChatController.php
public function user(){
$user = session('wechat.oauth_user.default');
dd($user);
}
登錄微信公衆平臺,進行如下配置
打開微信,輸入你的路由地址 xxx.cn/home/user
實現用戶授權登錄
1.判斷用戶是否在數據庫中,如果不在寫如數據庫,並保存Session (一天)
2.用戶在數據庫中,判斷用戶是否在Session中,不在從數據庫中取出來保存session (一天)
WeChatController.php
<?php
/**
* Created by PhpStorm.
* User: clj * Date: 2020/4/9
* Time: 下午5:47
*/
namespace App\Http\Controllers\Home;
use Illuminate\Support\Facades\Log;
use App\Http\Controllers\Controller as BaseController;
use Illuminate\Support\Arr;
use Overtrue\Socialite\User as SocialiteUser;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Session;
use App\Traits\getServiceTrait;
use App\Tools\Response;
class WeChatController extends BaseController
{
use getServiceTrait;
private $request;
public function __construct(Request $request)
{
$this->request = $request;
}
/**
* 處理微信的請求消息
* User: clj * Date: 2020/4/10
* Time: 上午9:06
* @return mixed
*/
public function serve(){
Log::info('request arrived');
$app = app('wechat.official_account');
$app->server->push(function($message){
return "success!";
});
return $app->server->serve();
}
/**
* User: clj * Date: 2020/4/11
* Time: 上午11:53
* @return array
*/
public function user(){
$result = [];
$user = $this->request->session()->get('wechat.oauth_user.default')->original;
if( !isset($user['openid']) ){
$result['message'] = "未獲取到openid,請稍後再試!";
return Response::returnFalse($result);
}
$userInfoData = [
'nickname' => $user['nickname'],
'avatar' => $user['headimgurl'],
'province' => $user['province'],
'city' => $user['city'],
];
$userData = [
'openid' => $user['openid'],
'invited_code' => $this->getRandom(6),
];
$userInfo = $this->getUserService()->findUserService($user['openid']);
if( true === empty($userInfo) ){
$register = $this->getUserService()->insertUserInfoService($userInfoData,$userData);
if( true === $register ){
$result['message'] = '授權成功';
return Response::returnSuccess($result);
}else{
$result['message'] = '授權失敗';
return Response::returnFalse($result);
}
}else{
$userSession['user'] = $this->request->session()->get('user');
$userSession['userInfo'] = $this->request->session()->get('userInfo');
if( empty( $userSession['user'] ) && empty( $userSession['userInfo'] ) ){
$resUser = $this->getUserService()->findUserService($user['openid']);
$resUserInfo = $this->getUserService()->findUserIinfoService($user['nickname']);
$this->request->session()->put('userInfo',$resUserInfo);
$this->request->session()->put('user',$resUser);
}
$result['message'] = '授權成功';
return Response::returnSuccess($result);
}
}
/**
* User: clj * Date: 2020/4/11
* Time: 上午10:06
* @param $length
* @return string|null
*/
public function getRandom($param){
$str="123456789ABCDEFGHJKLMNPQRSTUVWXYZ";
$key = '';
for($i=0;$i<$param;$i++)
{
$key .= $str[mt_rand(0,32)];
}
return $key;
}
}
UserService.php
<?php
/**
* Created by PhpStorm.
* User: clj * Date: 2020/4/10
* Time: 下午5:42
*/
namespace App\Services;
use App\Traits\getRepoTrait;
class UserService
{
use getRepoTrait;
/**
* User: clj * Date: 2020/4/10
* Time: 下午5:50
* @param $openid
* @return mixed
*/
public function findUserService(string $openid){
return $this->getUserRepo()->findUserTory($openid);
}
/**
* User: clj * Date: 2020/4/10
* Time: 下午6:12
* @param array $userData
* @return mixed
*/
public function insertUserInfoService(array $userInfoData, array $userData){
return $this->getUserRepo()->insertUserInfoDataTory($userInfoData,$userData);
}
/**
* User: clj * Date: 2020/4/11
* Time: 上午11:48
* @param $nickname
* @return mixed
*/
public function findUserIinfoService(string $nickname){
return $this->getUserRepo()->findUserInfoTory($nickname);
}
}
UserRepo.php
<?php
/**
* Created by PhpStorm.
* User: clj * Date: 2020/4/10
* Time: 下午5:42
*/
namespace App\Reposities;
use App\Models\User;
use App\Models\UserInfo;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Session;
class UserRepo
{
private $request;
public function __construct(Request $request)
{
$this->request = $request;
}
/**
* User: clj * Date: 2020/4/10
* Time: 下午5:49
* @param $openid
* @return mixed
*/
public function findUserTory(string $openid){
if( !isset( $openid ) ){
return false;
}
return User::where('openid',$openid)->get()->toArray();
}
/**
* User: clj * Date: 2020/4/11
* Time: 上午11:46
* @param $nickname
*/
public function findUserInfoTory(string $nickname ){
if( !isset( $nickname ) ){
return false;
}
return UserInfo::where('nickname',$nickname)->get()->toArray();
}
/**
* User: clj * Date: 2020/4/10
* Time: 下午6:13
* @param array $userData
* @return mixed
*/
public function insertUserInfoDataTory(array $userInfoData, array $userData){
if( empty( $userInfoData) && empty( $userData ) ) {
return false;
}
DB::beginTransaction();
try {
//DB::connection()->enableQueryLog();
$insertUserInfoResult = UserInfo::create($userInfoData);
$insertUserResult = User::create($userData);
//dd(DB::getQueryLog());exit();
Log::info('用戶註冊詳情信息--:'.json_encode($userInfoData,256));
Log::info('用戶註冊信息--:'.json_encode($userData,256));
DB::commit();
if( empty( $insertUserInfoResult->toArray() ) || empty( $insertUserResult->toArray() )){
return false;
}else{
$userInfo = UserInfo::where('nickname',$userInfoData['nickname'])->get()->toArray();
$userData = User::where('openid',$userData['openid'])->get()->toArray();
$this->request->session()->put('userInfo',$userInfo);
$this->request->session()->put('user',$userData);
return true;
}
} catch (\Exception $e){
DB::rollback();
Log::info('提示信息:'.$e->getMessage());
Log::info('狀態碼:'.$e->getCode());
}
}
}