文雅处置惩罚微信小顺序受权登录须要button触发
聊一聊近来的一个项目,这个项目是一个收书、售书的小顺序,有商城、专栏、信息宣布论坛等功用。虽然不是面向一切用户,但要求不管用户是不是受权都皆可运用,但同时也要求部份功用对不受权的用户限定开放。
题目总结以下
- 起首是小顺序不受权也能够运用,然则只要部份功用可用,比方阅读
- 第二题目是在用户想进一步运用小顺序时须要猎取用户受权
- 猎取到用户受权的时刻该怎样处置惩罚跳转
处置惩罚方案
1.起首用户进入小顺序的时刻会在app.js中的onLaunch
提议上岸
微信小顺序文档如许说
挪用 wx.login() 猎取 暂时登录凭据code ,并回传到开发者服务器。
挪用 code2Session 接口,调换 用户唯一标识 OpenID 和 会话密钥 session_key。
以后开发者服务器能够依据用户标识来天生自定义登录态,用于后续营业逻辑中前后端交互时辨认用户身份。
也就是说服务器能够返回一个自定义的session,缓存后用于后续营业逻辑中前后端交互时辨认用户身份
同时微信小顺序文档也说了
1.wx.login 挪用时,用户的 session_key 能够会被更新而以致旧 session_key 失效(革新机制存在最短周期,假如同一个用户短时间内屡次挪用 wx.login,并不是每次挪用都致使 session_key 革新)。开发者应该在明白须要从新登录时才挪用 wx.login,实时经由过程 code2Session 接口更新服务器存储的 session_key。
2.微信不会把 session_key 的有用期示知开发者。我们会依据用户运用小顺序的行动对 session_key 举行续期。用户越频仍运用小顺序,session_key 有用期越长。
3.开发者在 session_key 失效时,能够经由过程从新实行登录流程猎取有用的 session_key。运用接口 wx.checkSession能够校验 session_key 是不是有用,从而防备小顺序重复实行登录流程。
当开发者在完成自定义登录态时,能够斟酌以 session_key 有用期作为本身登录态有用期,也能够完成自定义的时效性战略。
意义说没必要每次启动小顺序都要登录,我这里运用的是每次启动都要登录
onLaunch: function () {
wx.login({
success: res => {
if (res.code) {
// 发送 res.code 到背景调换 openId, sessionKey
}else{
console.log('猎取用户登录态失利:' + res.errMsg)
}
}
})
2.然后再经由过程wx.getSetting
推断用户是不是已受权过了,假如受权过了则能够直接挪用 getUserInfo 猎取头像昵称,不会弹框,存入globalData,那末该用户能够举行一切的操纵。同时能够将 res 发送给背景解码出 unionId。
wx.getSetting({
success: res => {
if (res.authSetting['scope.userInfo']) {
// 已受权,能够直接挪用 getUserInfo 猎取头像昵称,不会弹框
wx.getUserInfo({
success: res => {
// 能够将 res 发送给背景解码出 unionId
this.globalData.userInfo = res.userInfo
// 由于 getUserInfo 是收集要求,能够会在 Page.onLoad 以后才返回
// 所以此处到场 callback 以防备这类状况
if (this.userInfoReadyCallback) {
this.userInfoReadyCallback(res)
}
}
})
}
}
})
3.当小顺序启动后,用户之前没有受权过的话,在运用宣布信息、购物车、我的、论坛等功用的时刻则跳转至提醒用户受权页面或许运用弹窗提醒用户受权,这个项目用的是页面。
注重: 由于用户受权以后要跳转到用户要运用的功用页面,所以要在重定向之前纪录好用户当前的途径信息、要运用的功用的页面的途径信息,存储在globalData中,在猎取受权后再重定向至该页面。 假如用户点击谢绝则返回本来页面
贴上部份代码
/**
* oldPath = getApp().globalData.oldPath
* 用户要用的功用页面
* newPath = getApp().globalData.goToPath
*/
const oldPath = getApp().globalData.oldPath
const newPath = getApp().globalData.goToPath
if (app.globalData.userInfo) {
goNewPath(newPath)
} else if (this.data.canIUse) {
// 由于 getUserInfo 是收集要求,能够会在 Page.onLoad 以后才返回
// 所以此处到场 callback 以防备这类状况
app.userInfoReadyCallback = res => {
if (e.detail.userInfo != void 0){
app.globalData.userInfo = res.userInfo
goNewPath(newPath)
}else{
goOldPath(oldPath)
}
}
} else {
// 在没有 open-type=getUserInfo 版本的兼容处置惩罚
wx.getUserInfo({
success: res => {
if (e.detail.userInfo != void 0){
app.globalData.userInfo = res.userInfo
goNewPath(newPath)
}else{
goOldPath(oldPath)
}
}
})
}
},
bindGetUserInfo: function (e) {
if (e.detail.userInfo != void 0){
app.globalData.userInfo = e.detail.userInfo
wx.switchTab({
url: '../bookcity/bookcity',
success: function (res) { },
fail: function (res) { },
complete: function (res) { },
})
}else{
// 受权失利
goOldPath(oldPath)
}
},
goNewPath: function(path){
// isTab()推断途径是不是是Tab
if(isTab(path)){
wx.switchTab({
url: path,
success: function(res) {},
fail: function(res) {},
complete: function(res) {},
})
}else{
wx.reLaunch({
url: path ,
})
}
},
goOldPath: function(path){
wx.navigateBack({
delta: 1,
})
},
isTab: function(path){
}