小程序开发(7)-之获取手机号、用户信息
#先說下獲取手機(jī)號的步驟,首先要調(diào)用wx.login拿到code,把code發(fā)送到我們的服務(wù)器(開發(fā)者服務(wù)器)上,后臺通過appid、appsecret(小程序后臺那里生成的)、code向微信接口服務(wù)拿到session_key、openid等信息,到這里其實(shí)我們已經(jīng)可以直接去獲取手機(jī)號了,自定義登錄態(tài),如果項(xiàng)目需要可以做
https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html
?
#獲取手機(jī)號和用戶信息的代碼如下面的permissions.js
#checkSession
主要方法是checkSession,這個(gè)呢是封裝了下wx.checkSession,首先是看走success區(qū)間呢還是fail區(qū)間,如果是success區(qū)間,先從本地拿code,如果這個(gè)code存在且未被使用過就直接返回這個(gè)code,否則重新wx.login獲取code(fail區(qū)間一樣的邏輯)
?
#getSessionKeyByCode
這個(gè)呢是調(diào)用后臺的接口,通過code換取seesion_key的,拿到數(shù)據(jù)后,重新set wx_code到本地中,并添加上use為true,代表這個(gè)code已經(jīng)被使用了
?
#getPhoneNumber
這個(gè)是獲取手機(jī)號的方法,獲取手機(jī)號需使用button組件,并添加上open-type="getPhoneNumber"屬性,并綁定上bindgetphonenumber="getPhoneNumber",點(diǎn)擊按鈕的時(shí)候會返回加密的數(shù)據(jù)encryptedData、iv,加密需要我們傳sessionKey(如果后臺有存那不必傳),這個(gè)sessionKey我們在上一步中已經(jīng)存在本地了,所以直接從本地拿wx_code里的session_key
?
#獲取用戶信息,相對獲取手機(jī)號簡單些,直接調(diào)即可,可以看getUserInfo方法
const api = require('./api.js'); const util = require('./util.js');function checkSession() {return new Promise((resolve, reject) => {wx.checkSession({success() {console.log('success:有效的');//session_key 未過期,并且在本生命周期一直有效let res = wx.getStorageSync('wx_code');// resolve(res);console.log(res);if (!res || res.use) {console.log('無效的code');wx.login({success: res => {// 發(fā)送 res.code 到后臺換取 openId, sessionKey, unionIdwx.setStorageSync('wx_code', res);resolve(res);},fail: res => {reject(res);}})} else {console.log('有效的code');resolve(res);}},fail() {console.log('fail:失敗了');// session_key 已經(jīng)失效,需要重新執(zhí)行登錄流程// 登錄wx.login({success: res => {// 發(fā)送 res.code 到后臺換取 openId, sessionKey, unionIdwx.setStorageSync('wx_code', res);resolve(res);},fail: res => {reject(res);}})}})}) }function checkSession_blank() {return new Promise((resolve, reject) => {wx.checkSession({success() {console.log('success:有效的');//session_key 未過期,并且在本生命周期一直有效let res = wx.getStorageSync('wx_code');// resolve(res);console.log(res);if (!res || res.use) {console.log('無效的code');wx.login({success: res => {// 發(fā)送 res.code 到后臺換取 openId, sessionKey, unionIdwx.setStorageSync('wx_code', res);resolve(res);},fail: res => {reject(res);}})} else {console.log('有效的code');resolve(res);}},fail() {console.log('fail:失敗了');// session_key 已經(jīng)失效,需要重新執(zhí)行登錄流程// 登錄wx.login({success: res => {// 發(fā)送 res.code 到后臺換取 openId, sessionKey, unionIdwx.setStorageSync('wx_code', res);resolve(res);},fail: res => {reject(res);}})}})}) }function getSessionKeyByCode(res) {return util.wxRequestGet({url: api.getSessionKeyByCode.url,data: {code: res.code}}).then(res => {let wxCode = wx.getStorageSync('wx_code');wx.setStorageSync('wx_code', {...res.data.data,...wxCode,use: true})}) }function getPhoneNumber(e) {console.log(e);// return checkSession().then(res => {let detail = e.detail;let wxCode = wx.getStorageSync('wx_code');// console.log('wx_code: ', res);return new Promise((resolve, reject) => {util.wxRequest({url: api.getUserDetails.url,data: {encryptedData: detail.encryptedData,iv: detail.iv,jsCode: wxCode.code,sessionKey: wxCode.session_key},method: 'POST',success: function (res) {console.log(res);// 把用戶信息和手機(jī)號信息等set在一起if (res.data.success) {let userInfo = wx.getStorageSync('wx_userinfo');wx.setStorageSync('wx_userinfo', {...userInfo,...res.data.data,openId: wxCode.openid});// wx.setStorageSync('wx_code', {// ...wxCode,// use: true// });return resolve(res);} else {wx.showToast({icon: 'none',title: res.data.msg})}reject(res);},fail: function (res) {reject(res);}})})// }) }function getUserInfo() {return new Promise((resolve, reject) => {const wxUserInfo = wx.getStorageSync('wx_userinfo') || {}if (wxUserInfo.nickName) {resolve(wxUserInfo)} else {wx.authorize({scope: 'userInfo',success() {wx.getUserInfo({success: (result) => {wx.setStorageSync({data: { ...wxUserInfo, ...result.userInfo },key: 'wx_userinfo',})resolve(result.userInfo)},// fail: (res) => reject(res),complete: () => resolve({})})}})}}) }function setUserInfo(data) {const userInfo = wx.getStorageSync('wx_userinfo');wx.setStorageSync('wx_userinfo', { ...userInfo, ...data }) }module.exports = {checkSession: checkSession,getPhoneNumber: getPhoneNumber,getUserInfo: getUserInfo,setUserInfo: setUserInfo,getSessionKeyByCode: getSessionKeyByCode }?
總結(jié)
以上是生活随笔為你收集整理的小程序开发(7)-之获取手机号、用户信息的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 设置网页右键点击,并阻止右键点击默认事件
- 下一篇: html-表格标签