- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Laravel 微信小程序后端实现用户登录的示例代码由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
接上篇微信小程序后端搭建:分享:Laravel 微信小程序后端搭建 。
后端搭建好后第一件事就是用户登录认证,简单实现微信小程序登录认证 。
1.user 模型 。
use Laravel\Passport\HasApiTokens; 新增 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
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. 新增一条路由 。
1
2
3
4
|
//前端小程序拿到的地址:https://域名/api/v1/自己写的接口
Route::group([
'prefix'
=>
'/v1'
],
function
() {
Route::post(
'/user/login'
,
'UserController@weappLogin'
);
});
|
3. 在 UserController 控制器里新建 function weappLogin (),别忘了 use 这些 。
1
2
3
4
|
use
App\User;
use
Carbon\Carbon;
use
Illuminate\Http\Request;
use
Illuminate\Support\Facades\Storage;
|
写两个 function weappLogin (),avatarUpyun () 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
|
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".
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
{
"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 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
|
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 。
1
2
3
4
|
<
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
>
|
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我.
原文链接:https://learnku.com/weapp/t/28680 。
最后此篇关于Laravel 微信小程序后端实现用户登录的示例代码的文章就讲到这里了,如果你想了解更多关于Laravel 微信小程序后端实现用户登录的示例代码的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我是 C 语言新手,我编写了这个 C 程序,让用户输入一年中的某一天,作为返回,程序将输出月份以及该月的哪一天。该程序运行良好,但我现在想简化该程序。我知道我需要一个循环,但我不知道如何去做。这是程序
我一直在努力找出我的代码有什么问题。这个想法是创建一个小的画图程序,并有红色、绿色、蓝色和清除按钮。我有我能想到的一切让它工作,但无法弄清楚代码有什么问题。程序打开,然后立即关闭。 import ja
我想安装screen,但是接下来我应该做什么? $ brew search screen imgur-screenshot screen
我有一个在服务器端工作的 UDP 套接字应用程序。为了测试服务器端,我编写了一个简单的 python 客户端程序,它发送消息“hello world how are you”。服务器随后应接收消息,将
我有一个 shell 脚本,它运行一个 Python 程序来预处理一些数据,然后运行一个 R 程序来执行一些长时间运行的任务。我正在学习使用 Docker 并且我一直在运行 FROM r-base:l
在 Linux 中。我有一个 c 程序,它读取一个 2048 字节的文本文件作为输入。我想从 Python 脚本启动 c 程序。我希望 Python 脚本将文本字符串作为参数传递给 c 程序,而不是将
对于一个类,我被要求编写一个 VHDL 程序,该程序接受两个整数输入 A 和 B,并用 A+B 替换 A,用 A-B 替换 B。我编写了以下程序和测试平台。它完成了实现和行为语法检查,但它不会模拟。尽
module Algorithm where import System.Random import Data.Maybe import Data.List type Atom = String ty
我想找到两个以上数字的最小公倍数 求给定N个数的最小公倍数的C++程序 最佳答案 int lcm(int a, int b) { return (a/gcd(a,b))*b; } 对于gcd,请查看
这个程序有错误。谁能解决这个问题? Error is :TempRecord already defines a member called 'this' with the same paramete
当我运行下面的程序时,我在 str1 和 str2 中得到了垃圾值。所以 #include #include #include using namespace std; int main() {
这是我的作业: 一对刚出生的兔子(一公一母)被放在田里。兔子在一个月大时可以交配,因此在第二个月的月底,每对兔子都会生出两对新兔子,然后死去。 注:在第0个月,有0对兔子。第 1 个月,有 1 对兔子
我编写了一个程序,通过对字母使用 switch 命令将十进制字符串转换为十六进制,但是如果我使用 char,该程序无法正常工作!没有 switch 我无法处理 9 以上的数字。我希望你能理解我,因为我
我是 C++ 新手(虽然我有一些 C 语言经验)和 MySQL,我正在尝试制作一个从 MySQL 读取数据库的程序,我一直在关注这个 tutorial但当我尝试“构建”解决方案时出现错误。 (我正在使
仍然是一个初学者,只是尝试使用 swift 中的一些基本函数。 有人能告诉我这段代码有什么问题吗? import UIKit var guessInt: Int var randomNum = arc
我正在用 C++11 编写一个函数,它采用 constant1 + constant2 形式的表达式并将它们折叠起来。 constant1 和 constant2 存储在 std::string 中,
我用 C++ 编写了这段代码,使用运算符重载对 2 个矩阵进行加法和乘法运算。当我执行代码时,它会在第 57 行和第 59 行产生错误,非法结构操作(两行都出现相同的错误)。请解释我的错误。提前致谢:
我是 C++ 的初学者,我想编写一个简单的程序来交换字符串中的两个字符。 例如;我们输入这个字符串:“EXAMPLE”,我们给它交换这两个字符:“E”和“A”,输出应该类似于“AXEMPLA”。 我在
我需要以下代码的帮助: 声明 3 个 double 类型变量,每个代表三角形的三个边中的一个。 提示用户为第一面输入一个值,然后 将用户的输入设置为您创建的代表三角形第一条边的变量。 将最后 2 个步
我是新来的,如果问题不好请见谅 任务:将给定矩阵旋转180度 输入: 1 4 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 输出: 16 15 14 13 12 11
我是一名优秀的程序员,十分优秀!