isHide
,判断是否实现登录,以确定展示 登录页 还是 手机获取页canIUse
,以判断 正常显示 ,还是 提醒微信版本更新canIUse: wx.canIUse('button.open-type.getUserInfo'),
,判断小程序的API,回调,参数,组件等是否在当前版本可用wx.getSetting()
判断是否授权,是否需要改变isHide
bindGetUserInfo()
,wx.login()
获取code
wx.request()
发送code
给后端,后端加密,返回程序段token
与是否成功状态token
通过wx.setStorage()
保存到本地token
,通过wx.setData()
保存在 页面的data
wx.setData()
是异步,当保存成功后,再获取用户信息(头像、昵称),并reques
发送getPhoneNumber()
,获取encryptedData
和iv
,request获取解密后的手机号希望首次登录的用户,跳出登录页面,之后每次登录,首页面为主页面
wx.setStorageSync('isFirst', 1);
,设置标志isFirst
,并放入storage,本地存储【B站讲解视频】https://www.bilibili.com/video/BV1cK4y1t75f?p=13
微信官方登录流程讲解
wx.login() 官方文档
→ wx.login 获取 临时登录凭证code (每个code只能使用一次,5分钟有效)
→ 后台根据code,获取 用户唯一标识 OpenID 和 会话密钥 session_key
说明:
每个用户对同一个小程序有相同的OpenID,对不同的小程序OpenID不同
具体可参考:https://www.jianshu.com/p/9ea1f27773b1
wxml:
<button class='bottom' type='primary' bindtap="bindGetUserInfo" >
微信登录
button>
js:
Page({
bindGetUserInfo(){
wx.login({
success (res) {
if (res.code) {
//发起网络请求
console.log(res.code)
// wx.request({
// url: 'https://test.com/onLogin',
// data: {
// code: res.code
// }
// })
} else {
console.log('登录失败!' + res.errMsg)
}
}
})
}
})
console.log(res.code)
Postman
或 Advanced REST client
GET https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code
<button class='bottom' type='primary' open-type="getUserInfo" lang="zh_CN" bindgetuserinfo="bindGetUserInfo">
微信授权登录
button>
var TeacherInfo = e_UserInfo.detail.userInfo;
console.log("用户的信息如下:");
console.log(TeacherInfo);
// 发送用户信息
wx.request({
url: 'https://api.test.com/info/',//已更改
method:'POST',
header:{
'content-type':"application/x-www-form-urlencoded"//使其收到为数据形式
},
data: {
api_token : that.data.LoginToken,
teacher_name : TeacherInfo.nickName,
teacher_logo : TeacherInfo.avatarUrl,
},
success(res){
console.log(res.data)
}
})
open-type="getUserInfo"
,提出用户公开信息的授权token
,对每个用户进行标记,以查找对该用户进行信息的存储与调取<button class='bottom' type='primary' open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber">确认授权button>
getPhoneNumber: function (e) {
var that = this;
console.log("手机解码")
console.log(e.detail.encryptedData);
console.log(e.detail.iv);
if (e.detail.errMsg == "getPhoneNumber:ok") {
wx.request({
url: 'https://api.test.com/phone/',
data: {
api_token : that.data.LoginToken,
encryptedData: e.detail.encryptedData,
iv: e.detail.iv,
},
method: "post",
success: function (res) {
console.log("手机解码结果")
console.log(res);
if(res.data.state==1)
{
wx.setStorageSync('isFirst', 1);
wx.redirectTo({
url:'../index/index'
})
}
}
})
wx.redirectTo({
url:'../index/index'
})
}
}
})
open-type="getPhoneNumber"
获取授权encryptedData
和iv
,以及该用户的标志token
,返回解密后的用户手机号参考
wx.request({
url: 'https://api.test.com/phone_get/',
data: {
api_token : that.data.LoginToken,
encryptedData: e.detail.encryptedData,
iv: e.detail.iv,
},
method: "post",
header:{
'content-type':"application/x-www-form-urlencoded"//使其收到为数据形式
},
success: function (res) {
console.log("手机解码结果")
console.log(res);
}
})
url
为后端的接口data
为向后端发送的信息method
可以为post或者get等方法head
为'content-type':"application/x-www-form-urlencoded"
使其收到为数据形式,不然默认是jsonbutton
,完成login()
和getUserInfo()
login()
中需要发送code
,然后把token
存入本地setStorage()
和存入页面的data{}
中if(res.data.state==0){//返回成功
并且if(ticket)//当ticket已经保存,即code返回成功
,再向后端发送用户(昵称、头像)信息参考:
【微信官方数据存储】getStorage
https://developers.weixin.qq.com/miniprogram/dev/api/storage/wx.getStorage.html
在完成获取手机号返回成功后,在执行 wx.setStorageSync('isFirst', 1);
app.js中
//读取缓存,判断是否首次登陆
var isFir=wx.getStorageSync('isFirst');
// console.log("是否已登陆");
// console.log(isFir);
if(!isFir){
wx.navigateTo({
url:"pages/login/login"
});
}
else
,再转到pages/index/index
了,因为这样添加编译模式时,就会跳到index页面,不会跳到特定编译模式了<view wx:if="{{isHide}}">
<view wx:if="{{canIUse}}" >
<view class='header'>
<image src='../../images/logo.png'>image>
view>
<view class='content'>
<text>您可以选择微信登录,\n 申请获得您的微信公开信息text>
view>
<button class='bottom' type='primary' opentype="getUserInfo" lang="zh_CN" bindgetuserinfo="bindGetUserInfo">
微信授权登录
button>
view>
<view wx:else>请升级微信版本view>
view>
<view wx:else>
<view class='header'>
<image src='../../images/logo.png'>image>
view>
<view class='content'>
<text>申请获得你的手机号码text>
view>
<button class='bottom' type='primary' opentype="getPhoneNumber" bindgetphonenumber="getPhoneNumber">确认授权button>
view>