[功能外掛] 基於 Laravel 開發的小程式登陸功能

jmluang發表於2018-03-23

不知道有沒有人在做小程式方面的程式,官方只提供了一個基於CI的Demo ,我把其中的功能提取了出來,適用於 Laravel 。

其中包含了資料庫的操作,表結構(需手動匯入表到資料庫),包括第一次登入寫入資料庫,第二次登入從資料庫中讀取使用者記錄的邏輯。專案還包含了 Js-sdk 檔案,開箱即用。

希望各位大佬給點意見~~ github 倉庫:https://github.com/jmluang/weappLogin-for-...
建議 Laravel版本>=5.5 ,低版本未測試~


以下是詳細說明

本倉庫從 wafer2開發套件 中提取並封裝了微信小程式的登陸邏輯並轉移到Laravel中,不僅降低開發者的學習成本,而且能快速完成小程式的登陸功能 甚至連資料庫都不需要擔心,因為外掛已經包裝好資料庫的操作了。您只需要匯入相關的到資料庫中即可。
若需要使用自己的資料庫和使用者的邏輯操作,只需要繼承相應的介面和提供 Facade 類就可以了。詳情可以檢視使用自己的資料庫和邏輯

  • 使用了 Guzzlehttp 來傳送請求。Guzzlehttp包含在Laravel框架中,不需要額外安裝
  • 使用了 Laravel 的 Eloquent ORM 封裝了資料庫操作,只需要匯入表到資料庫中即可。當然了,您也可以使用您自己的邏輯,詳情請看文件

只需要五步即可完成安裝部署。

  1. 通過 composer 安裝:
    composer require jmluang/weapp

  2. 新增 Provider 到config/app.php

    'providers' =>[
     // Laravel Framework Service Providers
     // ...
     jmluang\\weapp\\WeappLoginServiceProvider::class,
    ]
  3. 釋出配置檔案

    php artisan vendor:publish --provider="jmluang\weapp\WeappLoginServiceProvider"
    引數如下: 引數 說明
    appid 你的 AppID 必須
    secret 你的 AppSecret 必須
    code2session_url 預設url 不用改變
    WxLoginExpires 7200(秒) 選填,填寫前先取消備註
    NetworkTimeout 3000(毫秒) 選填,填寫前先取消備註

配置引數有兩種方法,一種是直接寫到weapp.php檔案中,另一種是寫到.env檔案中,使用哪種方法都可以。但是有一點需要注意,若你的專案會發布到開源社群,則不推薦使用第一種方法,因為這樣做存在洩露資訊的風險。

WxLoginExpiresNetworkTimeout 都使用了預設的引數,如果你有特殊的需求需要改這兩個引數,只要取消備註並填寫即可。

  1. 新增資料庫 Facade 到config/app.php
    'aliases' => [
    // Laravel Framework Facades
    // ...
    'UserRepository' => jmluang\weapp\Facades\UserRepository::class,
    ]

    若重寫了資料庫邏輯,則這裡應該使用你自己的 Facade 類:

    'aliases' => [
    // Laravel Framework Facades
    // ...
    'UserRepository' => path\to\your\FacadeClass::class,
  2. 匯入表cSessionInfo到你的資料庫
    表欄位詳情請檢視資料庫檔案
    若重寫了資料庫邏輯,則可以忽略這一步
  1. Laravel 配置
    安裝完成後,下面建立一個控制器和路由規則
    路由檔案:
    // filepath routes/web.php
    <?php 
    Route::get('/weapp/login',"LoginController@login");
    Route::get('/weapp/user',"LoginController@user");

控制器:

<?php

namespace App\Http\Controllers;
use jmluang\weapp\Constants;
use jmluang\weapp\LoginInterface;

class LoginController extends Controller
{
    /**
     * 首次登陸
     * @param LoginInterface $login
     * @return array
     */
    public function login(LoginInterface $login)
    {
        $result = $login::login();

        if ($result['loginState'] === Constants::S_AUTH) {
            return [
                'code' => 0,
                'data' => $result['userinfo']
            ];
        } else {
            return [
                'code' => -1,
                'error' => $result['error']
            ];
        }
    }

    /**
     * 登陸過就使用這個介面
     * @param LoginInterface $login
     * @return array
     */
    public function user(LoginInterface $login)
    {
        $result = $login::check();

        if ($result['loginState'] === Constants::S_AUTH) {
            return [
                'code' => 0,
                'data' => $result['userinfo']
            ];
        } else {
            return [
                'code' => -1,
                'data' => []
            ];
        }
    }

}
  1. 微信小程式中
    首先在小程式中引入 js-skd,然後就可以寫相關的邏輯了
    project
    ├── app.js
    ├── app.json
    ├── app.wxss
    ├── ...
    └── vendor
    └── weapp-login
    ├── lib
    │ ├── constants.js
    │ ├── login.js
    │ ├── request.js
    │ ├── session.js
    │ └── utils.js
    └── weapp.js
// filepath app.js
var login = require('./vendor/weapp-login/weapp')

App({
    onLaunch: function(){
        // 設定登陸url,對應上面Controll的Login方法
        login.setLoginUrl("https://127.0.0.1:8000/weapp/login")
        login.login({
            success(result) {
                if (result) {
                  // 首次登陸
                  console.log("登陸成功", result)
                } else {
                  // 二次登陸,請求Controller的User方法
                  login.request({
                    url: "https://localhost/weapp/user",
                    login: true,
                    success(result) {
                      console.log("登陸成功", result.data.data)
                    },
                    fail(error) {
                      console.log("登入失敗", error)
                    }
                  })
                }
            },
            fail(error) { console.log("登入失敗", error) }
        })
    }
})

要使用自己的資料庫邏輯,只需要簡單的三步操作

  1. 繼承介面類jmluang\weapp\database\UserInterface 並實現storeUserInfofindUserBySKey方法
  2. 建立Facade類
  3. config\app.phpaliases陣列中使用您的Facade類覆蓋jmluang\\weapp\\Facades\\UserRepository::class
    'aliases' => [
    // Laravel Framework Facades
    // ...
    // 'UserRepository' => jmluang\weapp\Facades\UserRepository::class,
    'UserRepository' => path\to\your\FacadeClass::class,
    ]

    Done!


若本倉庫對您有所幫助,歡迎Start

若發現問題或需要幫助,歡迎提交Issue

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章