Laravel+小程序用户登录认证

1 篇文章 0 订阅
1 篇文章 0 订阅

创建项目

laravel new wxtest

配置多站点就不多说了

修改hosts文件 修改Homestead.yaml文件

添加微信开放的字段

改下 database/migrations 目录下的 **users_table.php 文件

public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name')->nullable();
            $table->string('email')->unique()->nullable();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('user_id')->unique()->nullable()->comment('工号');
            $table->string('open_id')->nullable()->comment('微信开放id');
            $table->string('password')->nullable();
            $table->string('session_key')->nullable()->comment('微信session_key');
            $table->string('nickname')->nullable()->comment('昵称');
            $table->string('role')->nullable()->comment('身份');
            $table->rememberToken();
            $table->timestamps();
        });
    }

打开 config/app.php 修改时区、语言

'timezone' => 'Asia/Shanghai',
'locale' => 'zh-CN',
'fallback_locale' => 'zh-CN',
'faker_locale' => 'zh-CN',

composer.json 导入拓展 添加如下三行

“require”: {
    "fideloper/proxy": "^4.0",
    "laravel/tinker": "^1.0",
    "laravel/passport": "^7.2",
},

命令行执行

composer update

引入laravel-wechat 修改配置

laravel-wechat<–点他!!!!!

打开app/Http/Kernel.php 接口设置次数

'api' => [
    'throttle:60000,1',
    'bindings',
],

打开.env 文件,配置好数据库和小程序

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=数据库名
DB_USERNAME=用户名
DB_PASSWORD=密码

WECHAT_MINI_PROGRAM_APPID=小程序APPID
WECHAT_MINI_PROGRAM_SECRET=小程序SECRET

执行 php artisan migrate 生成7张表

Migration table created successfully.
Migrated:  2014_10_12_000000_create_users_table
Migrated:  2014_10_12_100000_create_password_resets_table
Migrated:  2016_06_01_000001_create_oauth_auth_codes_table
Migrated:  2016_06_01_000002_create_oauth_access_tokens_table
Migrated:  2016_06_01_000003_create_oauth_refresh_tokens_table
Migrated:  2016_06_01_000004_create_oauth_clients_table
Migrated:  000005_create_oauth_personal_access_clients_table

执行 php artisan passport:install

Personal access client created successfully.
Client ID: 1
Client secret: 
Password grant client created successfully.
Client ID: 2
Client secret:

修改 config/auth.php,API 的 dirver 改成 passport

'api' => [
            'driver' => 'passport',
            'provider' => 'users',
            'hash' => false,
        ],

修改User模型

use Laravel\Passport\HasApiTokens;

class User extends Authenticatable
{
	use HasApiTokens, Notifiable;
	
	protected $guarded=[]; //为了方便先使用这个吧,也可以使用protected $fillable=['字段','字段'];
	
	//以下省略
}

修改 api.php

//前端小程序拿到的地址:https://域名/api/v1/自己写的接口
Route::group(['prefix' => '/v1'], function () {
    Route::any('/user/login', 'UserController@wxLogin');
});

打开UserController.php 新建wxLogin方法

//先use这些
use App\User;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;
class UserController extends Controller
{
    public function weappLogin(Request $request)
    {
        $code = $request->code;
        $miniProgram = \EasyWeChat::miniProgram();
        //获取openid session_key
        $data = $miniProgram->auth->session($code);
        //判断code是否过期
        if (isset($data['errcode'])) {
            return $this->response->errorUnauthorized('code已过期或不正确');
        }
        //获取小程序信息 当前只获取了个昵称及输入的工号密码
        $userid = $request->userid;
        $userPwd = $request->userpwd;
        $nickname = $request->nickname;
        $openId = $data['openid'];
        $sessionKey = $data['session_key'];
      
        //判断是否存在工号
        $user = User::where('user_id', $userid)->first();
        if (!$user) {
            return response()->json(['status' => '401']);
        } else {
            //工号存在则判断密码是否正确
            if (!Hash::check($userPwd, $user->password)) {
                return response()->json(['status' => '401']);
            } else {
                //密码正确 覆盖用户之前登录信息
                $user->open_id = $openId;
                $user->session_key = $sessionKey;
                $user->nickname = $nickname;
                $user->save();
                //创建token 设置有效期
                $createToken = $user->createToken($user->open_id);
                $createToken->token->expires_at = Carbon::now()->addDays(30);
                $createToken->token->save();
                $token = $createToken->accessToken;

                return response()->json([
                    'access_token' => $token,
                    'token_type' => "Bearer",
                    'expires_in' => Carbon::now()->addDays(30),
                    'data' => $user,
                ],200);
            }
        }

    }
}

打开小程序 修改app.json 新建页面

  "pages": [
    "pages/auth/auth",
    "pages/index/index"
  ],

打开auth.js

const app = getApp();
Page({

  data: {
    UserData: [],
    isClick: false,
  },

  userIdInput: function (e) {
    this.setData({
      userId: e.detail.value
    })
  },
  userPwdInput: function (e) {
    this.setData({
      userPwd: e.detail.value
    })
  },
  onLoad: function (options) {

  },
  login: function (e) {
    let that = this
    that.setData({
      isClick: true
    })
    wx.getUserInfo({
      lang: "zh_CN",
      success: response => {
        wx.login({
          success: res => {
            let data = {
              userid: this.data.userId,
              userpwd: this.data.userPwd,
              code: res.code,
              nickname: response.userInfo.nickName,
            }
            console.log(data)
            app.globalData.userInfo = data;
            wx.request({
              url: 'http://saftylab.test/api/v1/user/login',
              method: 'POST',
              data: data,
              header: {
                'content-type': 'application/x-www-form-urlencoded'
              },
              success: function (res) {
                console.log(res.data)
                if (res.statusCode != '200') {
                  return false;
                }
                wx.setStorageSync('access_token', res.data.access_token)
                wx.setStorageSync('UserData', res.data.data ? res.data.data : '')
                wx.redirectTo({
                  url: '/pages/index/index',
                })
              },
              fail: function (e) {
                wx.showToast({
                  title: '服务器错误',
                  duration: 2000
                });
                that.setData({
                  isClick: false
                })
              },
            });
          }
        })
      },
      fail: function (e) {
        that.setData({
          isClick: false
        })
      },
    })

  }
})

打开auth.wxml

<view class='padding-xl'>
<input class="input" name="userId" placeholder="请输入用户名"
    bindinput ="userIdInput"/>
<input class="input" name="userPwd" placeholder="请输入密码"
     bindinput="userPwdInput" />
  <button class='cu-btn margin-top bg-green shadow lg block' open-type="getUserInfo" bindgetuserinfo="login" disabled="{{isClick}}" type='success'>
    <text wx:if="{{isClick}}" class='cuIcon-loading2 iconfont-spin'></text> 登录</button>
</view>

数据库插入数据并测试

输入工号密码 数据库如果存在工号且密码正确 将会在users表记录openid和session_key
并将session_key及用户数据 加入到缓存当中
即可保持用户登录状态

若出现500的报错 运行

php artisan passport:install  --force

如有不足多多谅解

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值