Laravel 微信小程序后端,用户登录
- 创建项目
- 配置多站点就不多说了
- 添加微信开放的字段
- 打开 config/app.php 修改时区、语言
- composer.json 导入拓展 添加如下三行
- 命令行执行
- 引入laravel-wechat 修改配置
- 打开app/Http/Kernel.php 接口设置次数
- 打开.env 文件,配置好数据库和小程序
- 执行 php artisan migrate 生成7张表
- 执行 php artisan passport:install
- 修改 config/auth.php,API 的 dirver 改成 passport
- 修改User模型
- 修改 api.php
- 打开UserController.php 新建wxLogin方法
- 打开小程序 修改app.json 新建页面
- 打开auth.js
- 打开auth.wxml
- 数据库插入数据并测试
- 若出现500的报错 运行
- 如有不足多多谅解
创建项目
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