Laravel 微信小程序后端实现用户登录的示例代码
时间:2022-07-27
本文章向大家介绍Laravel 微信小程序后端实现用户登录的示例代码,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
接上篇微信小程序后端搭建:分享:Laravel 微信小程序后端搭建
后端搭建好后第一件事就是用户登录认证,简单实现微信小程序登录认证
1.user 模型
use LaravelPassportHasApiTokens; 新增
use HasApiTokens, Notifiable;
protected $fillable = [
'id',
'name',
'email',
'email_verified_at',
'username',
'phone',
'avatar',//我用来把微信头像的/0清晰图片,存到又拍云上
'weapp_openid',
'nickname',
'weapp_avatar',
'country',
'province',
'city',
'language',
'location',
'gender',
'level',//用户等级
'is_admin',//is管理员
];
2. 新增一条路由
//前端小程序拿到的地址:https://域名/api/v1/自己写的接口
Route::group(['prefix' = '/v1'], function () {
Route::post('/user/login', 'UserController@weappLogin');
});
3. 在 UserController 控制器里新建 function weappLogin (),别忘了 use 这些
use AppUser;
use CarbonCarbon;
use IlluminateHttpRequest;
use IlluminateSupportFacadesStorage;
写两个 function weappLogin (),avatarUpyun ()
public function weappLogin(Request $request)
{
$code = $request- code;
// 根据 code 获取微信 openid 和 session_key
$miniProgram = EasyWeChat::miniProgram();
$data = $miniProgram- auth- session($code);
if (isset($data['errcode'])) {
return $this- response- errorUnauthorized('code已过期或不正确');
}
$weappOpenid = $data['openid'];
$weixinSessionKey = $data['session_key'];
$nickname = $request- nickname;
$avatar = str_replace('/132', '/0', $request- avatar);//拿到分辨率高点的头像
$country = $request- country?$request- country:'';
$province = $request- province?$request- province:'';
$city = $request- city?$request- city:'';
$gender = $request- gender == '1' ? '1' : '2';//没传过性别的就默认女的吧,体验好些
$language = $request- language?$request- language:'';
//找到 openid 对应的用户
$user = User::where('weapp_openid', $weappOpenid)- first();
//没有,就注册一个用户
if (!$user) {
$user = User::create([
'weapp_openid' = $weappOpenid,
'weapp_session_key' = $weixinSessionKey,
'password' = $weixinSessionKey,
'avatar' = $request- avatar?$this- avatarUpyun($avatar):'',
'weapp_avatar' = $avatar,
'nickname' = $nickname,
'country' = $country,
'province' = $province,
'city' = $city,
'gender' = $gender,
'language' = $language,
]);
}
//如果注册过的,就更新下下面的信息
$attributes['updated_at'] = now();
$attributes['weixin_session_key'] = $weixinSessionKey;
$attributes['weapp_avatar'] = $avatar;
if ($nickname) {
$attributes['nickname'] = $nickname;
}
if ($request- gender) {
$attributes['gender'] = $gender;
}
// 更新用户数据
$user- update($attributes);
// 直接创建token并设置有效期
$createToken = $user- createToken($user- weapp_openid);
$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);
}
//我保存到又拍云了,版权归腾讯所有。。。头条闹的
private function avatarUpyun($avatar)
{
$avatarfile = file_get_contents($avatar);
$filename = 'avatars/' . uniqid() . '.png';//微信的头像链接我也不知道怎么获取后缀,直接保存成png的了
Storage::disk('upyun')- write($filename, $avatarfile);
$wexinavatar = config('filesystems.disks.upyun.protocol') . '://' . config('filesystems.disks.upyun.domain') . '/' . $filename;
return $wexinavatar;//返回链接地址
}
微信的头像 / 0
小头像默认 / 132
4. 后端上面就写好了,再看下小程序端怎么做的哈,打开小程序的 app.json,添加 “pages/auth/auth”,
{
"pages": [
"pages/index/index",
"pages/auth/auth",//做一个登录页面
"pages/logs/logs"
],
"window": {
"backgroundTextStyle": "light",
"navigationBarBackgroundColor": "#fff",
"navigationBarTitleText": "WeChat",
"navigationBarTextStyle": "black"
},
"sitemapLocation": "sitemap.json",
"permission": {
"scope.userLocation": {
"desc": "你的位置信息将用于小程序位置接口的效果展示"
}
}
}
5. 打开 auth.js
const app = getApp();
Page({
/**
* 页面的初始数据
*/
data: {
UserData: [],
isClick: false,
},
/**
* 生命周期函数--监听页面加载
*/
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 = {
code:res.code,
nickname: response.userInfo.nickName,
avatar: response.userInfo.avatarUrl,
country: response.userInfo.country ? response.userInfo.country : '',
province: response.userInfo.province ? response.userInfo.province : '',
city: response.userInfo.city ? response.userInfo.city : '',
gender: response.userInfo.gender ? response.userInfo.gender : '',
language: response.userInfo.language ? response.userInfo.language : '',
}
console.log(data)
app.globalData.userInfo = data;
wx.request({
url: '你的后端地址',//我用的valet,http://ak.name/api/v1/user/login
method: 'POST',
data: data,
header: {
'Content-Type': 'application/x-www-form-urlencoded'
},
success: function (res) {
console.log(res)
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
})
},
})
}
})
6. 打开 auth.wxml
<view class='padding-xl'
<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
以上就是本文的全部内容,希望对大家的学习有所帮助。
- Python加圣诞帽
- 多次grep 没有看到输出
- java多线程 基础demo
- 详细解读Jquery各Ajax函数:$.get(),$.post(),$.ajax(),$.getJSON()
- mybatis 使用tips - 使用多个参数
- 从高的角度看自动化测试
- Django中请求的生命周期
- 程序猿python学习AIphaZero,TensorFlow强化学习AI游戏,100行代码运行看看!
- awk中NF的使用
- tar.gz 解压
- Python&机器学习之项目实践
- JAVA CDI 学习(5) - 如何向RESTFul Service中注入EJB实例
- mysql5.7 column cannot be null
- 区块链大热 价值近20万的Matrix.io被启用
- php概述
- php教程
- php环境搭建
- PHP书写格式
- php变量
- php常量
- PHP注释
- php数组
- php字符串 string
- PHP整型 integer
- PHP浮点型 float
- php布尔型
- php数据类型之数组
- php数据类型之对象
- php数据类型之null
- php数据类型之间的转换
- php运算符
- php表达式
- PHP循环控制
- PHP流程控制
- php函数
- php全局变量
- PHP魔术变量
- php命名空间
- php 日期
- PHP包含文件
- php文件
- PHP 文件上传
- php Cookies
- php Sessions
- php email
- php安全email
- php错误处理
- PHP异常处理
- php过滤器
- PHP 高级过滤器
- php json
- php 表单
- PHP MySQL 简介
- PHP 连接 MySQL
- php创建数据库
- php 创建表
- php mysq 插入数据
- PHP MySQL 插入多条数据
- PHP MySQL 预处理语句
- php mysql 读取数据
- php mysql where
- PHP MySQL Order By
- PHP MySQL Update
- PHP MySQL Delete
- php ODBC
- 手把手教你,嘴对嘴传达------深入介绍Nginx的rewrite模块(理论加实验)
- jQuery实现点击图片弹出视频并自动播放
- 机器学习之决策树一-ID3原理与代码实现
- jQuery点击返回顶部
- 手把手教你,嘴对嘴传达------Nginx实现动静分离的两种方式
- Vue实现push数组并删除方法
- 机器学习之决策树二-C4.5原理与代码实现
- Vue Router懒加载
- 手把手教你,嘴对嘴传达------Tomcat部署和优化以及虚拟主机配置
- 微信小程序使用scroll-view做导航栏
- java解析XML的方法
- 听说Mysql你很豪横?-------------各种数据库介绍(为什么Mysql数据库能这么火热)
- Vuex的简单入门
- 听说Mysql你很豪横?-------------管理MySQL数据库基本操作命令
- Axios安装封装api接口