//app.js
App({
setConfig: { //一些配置資料
url: '', //配置請求地址的baseUrl
requestConfig:{ //自己封裝了個request 處理一些共用的拋錯toast ,requestConfig是app.request裡的引數,配置些預設引數
data:{},
token:"", //在小程式授權後,本教程基於token處理使用者登入憑證
type:"POST",
callback:function(){},
failCb:function(){}
}
},
globalData: { // 小程式推薦全域性共用的資料,存在 globalData裡
userInfo: null,
token:''
},
onLaunch: function () {
this.userLogin(); // 呼叫登入方法,處理登入
},
//登入
userLogin: function(callback){ //callback是使用者授權登入後的一些回撥函式
var that = this;
//獲取登入code
wx.login({ // 小程式登入介面,成功後拿到code 到後臺換取 openId, sessionKey, unionId
success: function (res) {
if (res.code) {
var codes = res.code;
//獲取使用者資訊 // 因為 我們程式 要收集使用者頭像,暱稱等,有一套使用者體系
wx.getSetting({ //先呼叫getSetting 拿到使用者已經授權的一些列表,如果已經授權 再後面程式碼 就無需再wx.authorize 授權
success: res => {
if (res.authSetting['scope.userInfo']) { // 使用者資訊已經授權過,
// 已經授權,可以直接呼叫 getUserInfo 獲取頭像暱稱,不會彈框
callback?(that.getUserInfoHandle(codes,callback)): (that.getUserInfoHandle(codes)); //getUserInfoHandle 方法是處理使用者資訊,提取出來
}else{
wx.authorize({ // 如果在那使用者授權資訊的時候 沒有拿到,則呼叫wx.authorize 授權,拿使用者userInfo
scope: 'scope.userInfo',
success: res => {
//使用者已經同意小程式授權
callback?(that.getUserInfoHandle(codes,callback)): (that.getUserInfoHandle(codes)); //同上
},
fail: (e) =>{ //如果使用者點選拒絕授權,則呼叫wx.openSetting 調起客戶端小程式設定介面,返回使用者設定的操作結果。在這邊做了個封裝
that.openSetting()
}
})
}
}
});
} else {
that.userLogin(); //登入失敗的話 ,重新呼叫 登入方法
return false;
}
}
})
},
//getUserInfo
getUserInfoHandle: function (codes,callback){ // codes是wx.login 後拿到的code,callback是登入成功的回撥函式
var that = this;
wx.getUserInfo({ // 獲取使用者資訊
success: res => {
// 可以將 res 傳送給後臺解碼出 unionId
that.globalData.userInfo = res.userInfo; // 存在全域性 之後供各個page拿資料
// 所以此處加入 callback 以防止這種情況
if (that.userInfoReadyCallback) { // userInfoReadyCallback是個回撥函式 由於wx.getUserInfo 是非同步的,當各個page需要userInfo資訊時,先判斷全域性userInfo是否有資訊,沒有則定義個回撥app.userInfoReadyCallback 自己傳個回撥函式,才能拿到userInfo資料
that.userInfoReadyCallback(res)
}
//使用者資訊入庫
var url = that.setConfig.url + '/login'; // 拿到資訊後 ,呼叫登入介面
var data = { // 登入介面 需要的資料
code: codes,
encryptedData: res.encryptedData, // 這個引數和下面那個引數 我們沒有直接將使用者頭像,暱稱傳遞,防止資料篡改,採用加密的方式 ,後端再解密拿到使用者資訊 詳情請看官方文件
iv: res.iv
}
callback?that.request({url, data},callback):that.request({url, data}); //登入請求
}
})
},
//openSetting
openSetting:function(){
var that = this;
wx.showModal({ // modal 提示使用者
title: '提示',
content: '小程式需要獲取使用者資訊許可權,點選確認。前往設定或退出程式?',
showCancel:false,
success: function(res) {
wx.openSetting({ // 調起客戶端小程式設定介面
success: (res) => {
var userInfoFlag = res.authSetting['scope.userInfo']; //拿到使用者操作結果
if(!userInfoFlag){ // 如果使用者沒有點開同意使用者授權 ,則再呼叫openSetting 彈框提示,總之 同意了 才會關閉modal 進入我們小程式
that.openSetting();
}else{
that.userLogin(); // 使用者成功設定授權後,再呼叫登入方法 ,給到後臺 拿使用者資訊 等操作
}
}
})
}
})
},
//資料互動
request: function (opts,loginCb){
let {url,data,token,callback,type,failCb}= {...this.setConfig.requestConfig,...opts}
var that = this;
//發起網路請求
wx.request({
url: url,
data: data,
method:type,
header: {
'content-type': 'application/x-www-form-urlencoded',
'token':token||that.globalData.token //每次請求都帶token,進行使用者認證
},
success:function(res){
//根據全域性做處理
var status = ''+res.statusCode;
var firstStatus = status[0];
switch (firstStatus){
case '2':
case '3':
if(res.data.err_code){
wx.hideLoading();
wx.showToast({
title: res.data.err_msg,
icon:'none',
mask: true,
duration: 1500
})
if(res.data.err_code == '1'){ //沒有登陸的錯誤碼 重新登陸
that.userLogin();
}
return false;
}
if(url.indexOf('/login')>-1){ //登陸介面 返回token,存在全域性globalData中
if (res.data.result){
that.globalData.token = res.data.result.token;
}
}
callback(res); // 成功後大回撥函式
break;
case '4':
wx.showToast({
title:'客戶端錯哦~',
mask:true,
icon:'none',
duration:1500
})
break;
case '5':
wx.showToast({
title:'服務端錯誤哦~',
mask:true,
icon:'none',
duration:1500
})
break;
default:
break;
}
},
fail:function(e){
wx.showToast({
title:'當前網路狀態不佳,請稍後再試',
mask:true,
icon:'none',
duration:1500
})
failCb&&failCb(e);
}
})
}
})
複製程式碼
#聊聊微信小程式使用者授權登入,無感知登入,強制授權~~~
#直接貼程式碼,複製可用哦。。。上乾貨
相關文章
- 微信小程式的授權登入微信小程式
- 微信授權登入
- Java微信授權登入小程式介面Java
- uni-app 微信小程式授權登入APP微信小程式
- 微信小程式授權登入最佳實踐微信小程式
- 微信小程式授權登入獲取使用者資訊微信小程式
- 小程式登入、微信網頁授權(Java版)網頁Java
- java 微信授權登入配置Java
- <span>小程式授權登入彈框</span>
- ThinkPHP5-微信小程式獲取使用者授權登入資訊PHP微信小程式
- 基於Taro框架的微信小程式JWT授權登入方案框架微信小程式JWT
- ajax 實現微信網頁授權登入網頁
- 微信網頁授權登入(c# Webform)網頁C#WebORM
- 微信小程式授權登入以及使用者資訊相關介面調整導致授權框不彈出微信小程式
- 微信小程式結合php後臺實現登入授權機制詳解微信小程式PHP
- 關於QQ授權登入
- 微信小程式版部落格——授權登入的修改(wx.getUserInfo)微信小程式
- 微信開發之小程式獲取手機號授權登入
- .NET Core企業微信網頁授權登入網頁
- C#微信網頁授權登入(NET MVC)C#網頁MVC
- laravel使用EasyWeChat 授權登入Laravel
- 微信小程式——授權微信小程式
- Vue微信專案按需授權登入策略實踐Vue
- 微信授權註冊或微信登陸 微信授權登陸 基於若依vue 實現Vue
- 小程式授權登入前後端對接及使用者資訊完善後端
- 「新手上路」Go 微博授權登入Go
- 第三方微信登入 | 靜默授權與網頁授權的實現網頁
- IDEA支付寶小程式開發流程——授權登入Idea
- 微信開發筆記——微信網頁登入授權,獲取使用者資訊筆記網頁
- 原生微信網頁授權登入(藉助natapp穿牆)網頁APP
- Android社交登入授權、分享SDK,支援微信、微博和QQAndroid
- 客服系統配置抖音開放平臺,實現授權登入回覆私信和評論 實現授權登入,為授權使用者管理回覆私信和評論
- Blazor OIDC 單點登入授權例項7 - Blazor hybird app 端授權BlazorAPP
- 微信小程式授權過程微信小程式
- Android 第三方登入之新浪微博授權登入Android
- golang 基於 jwt 實現的登入授權GolangJWT
- 企業微信-自建H5應用授權登入獲取使用者資訊H5
- 認證授權:IdentityServer4 - 單點登入IDEServer