laravel5.6安裝laravel-wechat 實現微信授權登錄(公衆號)

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());
        }

    }
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章