前言:微信小程序的app.js里面,最少有2個接口,一個wx.login;一個是wx.getUserInfo; 前者得到騰訊給我們的微信用戶唯一的code,通過code獲取openid,這個不需要用戶授權,我們肯定能得到;
但是,后者是需要用戶授權,我們才能通過騰訊得到用戶的其他信息,比如nickname、avatarUrl、encryptedData、iv等,如果你只需要openid,下面的代碼你可以不用看了,下面重點講解如何
多次調用wx.getUserInfo或者app.getUserInfo接口獲取用戶的nickname、avatarUrl等信息。
3、比如說,我們可以在小程序>個人中心頁面,用戶點擊【我】的時候,在onload或者onReady時候,調用下面這個方法,執行:再次確認是否授權->用戶授權->獲取userInfo(包含:nickname、avatarUrl等)->自定義操作(比如注冊、或者 將獲得的用戶nickname和avatarUrl 現實在頁面上)->其他操作
4、方法代碼和使用Demo:其中【私人訂制】這里是自己進行php后台注冊的一個過程,你們根據自己需求進行開發
var app = getApp()
var loginStatus = true;//默認授權成功 var getPromission = function (that) { if (!loginStatus) { // 顯示提示彈窗 wx.showModal({ title: '溫馨提示', content: '您確定不授權[西廂房鄉居生活]小程序嗎?部分功能可能會收到影響', success: function (res) { if (res.confirm) { console.info("1授權失敗返回數據"); wx.showToast({ title: '授權失敗,您可能有部分功能無法使用', icon: 'success', duration: 5000 }) } else if (res.cancel) { wx.openSetting({ success: function (data) { if (data) { if (data.authSetting["scope.userInfo"] == true) { loginStatus = true; wx.getUserInfo({ withCredentials: false, success: function (data) { console.info("1成功獲取用戶返回數據"); that.setData({ userInfo: data.userInfo, }) console.info(data.userInfo); // --------- 4、發起后台注冊請求(私人定制) ------------------ wx.request({ url: 'https://m.*****.com/index.php/Home/Xiaoxxf/register', data: { 'nickName': data.userInfo.nickName, 'openid': wx.getStorageSync('openid') }, header: { "Content-Type": "application/x-www-form-urlencoded" }, method: 'POST', dataType: 'JSON', success: function (res) { console.log(0); console.log(res.data); }, fail: function (res) { console.log(1); }, complete: function (res) { console.log(2); }, }) app.globalData.userInfo = that.data.userInfo; //用戶所有信息放在globalData wx.setStorageSync('userInfo', that.data.userInfo);//存儲userInfo }, fail: function () { console.info("2授權失敗返回數據"); wx.showToast({ title: '授權失敗,您可能有部分功能無法使用', icon: 'success', duration: 5000 }) } }); } } }, fail: function () { console.info("設置失敗返回數據"); } }) } } }) } else { wx.login({ success: function (res) { if (res.code) { wx.getUserInfo({ withCredentials: false, success: function (data) { console.info("2成功獲取用戶返回數據"); that.setData({ userInfo: data.userInfo, }) }, fail: function () { console.info("3授權失敗返回數據"); loginStatus = false; // 顯示提示彈窗 wx.showModal({ title: '溫馨提示', content: '您確定不授權[西廂房鄉居生活]小程序嗎?部分功能可能會收到影響', success: function (res) { if (res.confirm) { console.info("4授權失敗返回數據"); wx.showToast({ title: '授權失敗,您可能有部分功能無法使用', icon: 'success', duration: 5000 }) } else if (res.cancel) { wx.openSetting({ success: function (data) { if (data) { if (data.authSetting["scope.userInfo"] == true) { loginStatus = true; wx.getUserInfo({ withCredentials: false, success: function (data) { console.info("3成功獲取用戶返回數據"); console.info(data.userInfo); //更新數據 that.setData({ userInfo: data.userInfo, }) // --------- 4、發起后台注冊請求(私人定制) ------------------ wx.request({ url: 'https://m.****.com/index.php/Home/Xiaoxxf/register', data: { 'nickName': data.userInfo.nickName, 'openid': wx.getStorageSync('openid') }, header: { "Content-Type": "application/x-www-form-urlencoded" }, method: 'POST', dataType: 'JSON', success: function (res) { console.log(0); console.log(res.data); }, fail: function (res) { console.log(1); }, complete: function (res) { console.log(2); }, }) app.globalData.userInfo = that.data.userInfo; //用戶所有信息放在globalData wx.setStorageSync('userInfo', that.data.userInfo);//存儲userInfo }, fail: function () { console.info("5授權失敗返回數據"); wx.showToast({ title: '授權失敗,您可能有部分功能無法使用', icon: 'success', duration: 5000 }) } }); } } }, fail: function () { console.info("設置失敗返回數據"); } }); } } }); } }); } }, fail: function () { console.info("登錄失敗返回數據"); } }); } } Page({ data: { }, onLoad: function () { }, onShow:function(){ var that = this //調用應用實例的方法獲取全局數據 app.getUserInfo(function (userInfo) { console.log(userInfo); if (userInfo == null) { console.log('ccc'); getPromission(that); } }) } })
重點:getPromission放置的位置很重要,到底是放在onload還是onshow呢?其實看情況區分的。
Answer:1)放在onshow頁面:如果你是在tarBar頁面(主頁面),請將getPromission放在onshow方法里面,因為進入小程序的主頁面總共只加載一次onload和onReady,而onshow卻每次都加載,實際環境中,我們肯定是希望未授權的用戶每次進入該頁面都詢問一次是否授權。
2)放在onload頁面:如果你是在內置頁(各種詳情頁、非tarbar頁),請將getPromission放在onload頁面,因為每次進入詳情頁都會加載一次onload。
6、代碼效果圖: