mydal

怕光阴流逝 让一切都作废

0%

微信小程序登录

11.png

微信小程序登录流程

一张图了解微信小程序登录流程

11.png

微信小程序发送请求(wx.login())

通过wx.login()获取临时凭证code 并传回到后台

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
getUserInfo: function (res) {  //获取用户对象信息
var userInfo = res.detail.userInfo;
wx.setStorageSync("userInfo", userInfo); //设置缓存
this.setData({
userInfo: userInfo,
})
wx.login({
success(res) {
if (res.code) {
wx.request({
url: config.baseUrl + "/token", //发送到后台
data: {
code: res.code, //临时凭证code
nickName: userInfo.nickName, //用户对象昵称
avatarUrl: userInfo.avatarUrl //用户对象头像
},
method: 'POST',
dataType: 'json',
success: function (res) {
var token = res.data.token;
wx.setStorageSync('token', token); //设置缓存
}
})
}
}
})
},

tp5后台处理

  • 接收到code 通过curl调用小程序接口 发送请求 将code appid secret 发送过去 请求成功 拿到 session_key 和openid
  • 将openid和用户的名称头像存到数据表中
  • 生成令牌做为自定义登录态 返回给前台 前台存到缓存中 自定义登录态与openid关联
  • 微信小程序发起业务请求时从缓存中拿到token令牌 验证是否登录
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
78
79
80
81
82
83
84
85
public function token(){
$code=input('post.code'); //接收微信小程序发送过来的code
//初始化curl 通过curl向微信小程序接口服务 发送请求
$ch=curl_init();
//设置选项
$appid="wxad72f080afae7980";
$secret="ebf7abfded334145e4de09d7ec2c3969";
//登录凭证校验
$url="https://api.weixin.qq.com/sns/jscode2session?appid=$appid&secret=$secret&js_code=$code&grant_type=authorization_code"; //需要发送appid secret code

/**
* curl_init() 和 curl_close() 分别是初始化CURL连接和关闭CURL连接,
* curl_exec() 执行CURL请求,如果没有错误发生,该函数的返回是对应URL返回的数据,json字符串的格式;如果发生错误,该函数返回 FALSE。需要注意的是,判断输出是否为FALSE用的是全等号,这是为了区分返回空串和出错的情况。
* CURL函数库里最重要的函数是curl_setopt(),它可以通过设定CURL函数库定义的选项来定制HTTP请求。上述代码片段中使用了三个重要的选项:
* CURLOPT_URL 指定请求的URL;
* CURLOPT_RETURNTRANSFER 设置为1表示稍后执行的curl_exec函数的返回是URL的返回字符串,而不是把返回字符串定向到标准输出并返回TRUE;
* CURLLOPT_HEADER设置为0表示不返回HTTP头部信息。
*/
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_HEADER,0);
//设置为不是https也可以访问
/**
* CURLOPT_SSL_VERIFYHOST
* 设置为 1 是检查服务器SSL证书中是否存在一个公用名(common name)。译者注:公用名(Common Name)
* 一般来讲就是填写你将要申请SSL证书的域名 (domain)或子域名(sub domain)。
* 设置成 2,会检查公用名是否存在,并且是否与提供的主机名匹配。
* 0 为不检查名称。 在生产环境中,这个值应该是 2(默认值)。
* 值 1 的支持在 cURL 7.28.1 中被删除了。
*/
// curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,0);
// curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);

//执行curl获取HTML文档内容
$output=curl_exec($ch);
if($output===false){
echo "CURL Error:".curl_error($ch);
}
//释放curl句柄
curl_close($ch);
// return $output;

//将json解码转换为数组
$curl_result=json_decode($output,true); //assoc 值为TRUE时返回数组,FALSE时返回对象;

//判断错误信息
if(isset($curl_result['errcode'])){
return json([
'status'=>0,
'msg'=>' Invalid parameter' //无效的参数
],400);
}
$model=User::get(['openid'=>$curl_result['openid']]); //请求成功之后拿到openid 进行比对

if($model){
$userid=$model->id;
}else{
$data=array( //插入到数据表中
'openid'=>$curl_result['openid'],
'nickName'=>input('post.nickName'),
'avatarUrl'=>input('post.avatarUrl')
);
$model=User::create($data);
$userid=$model->id;
}
//生成令牌
$token=$this->generalToken(32);
User::where('id',$userid)->update(['token'=>$token]);
return[
'token'=>$token
];

}
//生成令牌 做为自定义登录态 返回到微信小程序前台 前台存到缓存中
public function generalToken($length){
//令牌就是生成一系列的随机字符串
$str="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz";
$result="";
for($i=0;$i<$length;$i++){
$result.=$str[rand(0,61)]; //rand() 函数返回随机整数。
}
//获取当前时间戳
$time=$_SERVER['REQUEST_TIME'];
return md5($result.$time);
}

微信小程序验证是否登录

1
2
3
4
5
6
7
8
9
    //验证用户登录
var token = wx.getStorageSync('token');
if (!token) {
​ wx.showToast({
​ title: '请先登录',
​ icon: 'none'
​ })
return false;
​ } //登录成功发送业务请求