(1)获取openid==>先调用wxLogin获取code==>再将ocde作为参数获取openid
思路:用户进入小程序==>本地储存中没有openid=>调用获取code==>获取openid==>调用保存接口
用户进入小程序==>本地有储存的openid==>先要验证session_key==>调用获取code==>获取openid==>调用保存接口
App.vue
<script>
import {getCacheData} from './utils/auth.js'
export default {
globalData: {
isSignIn: ''
},
onLaunch: function() {
if(!getCacheData('openid')) {
this.$store.dispatch('wxLogin')
} else {
//session_key有时效性,验证session_key
this.$store.dispatch('checkSession')
}
// console.log('App Launch')
},
onShow: function() {
// console.log('App Show')
},
onHide: function() {
// console.log('App Hide')
}
}
</script>
状态管理封装的接口代码:
import {
saveLoginInfo,
getAccessToken,
getOpenid
} from '../../api/common.js'
import {
setCacheData,
getCacheData,
removeCacheData
} from '../../utils/auth.js'
const state = {
openid: getCacheData('openid') || '',
phoneNumber: ''
}
const mutations = {
SET_OPPENID: (state, openid) => {
state.openid = openid
},
SET_PHONE: (state, phoneNumber) => {
state.phoneNumber = phoneNumber
}
}
const actions = {
//获取openid
getWxOpenid({dispatch,commit}, payload) {
const code = payload
getOpenid({
jscode: code
}).then(res => {
commit('SET_OPPENID', res.data.openid)
setCacheData('openid', res.data.openid)
//调用保存接口进行保存
dispatch('saveUserInfo')
}).catch(err => {
console.log(err);
})
},
// 微信获取code
wxLogin({dispatch,commit}, payload) {
return new Promise((resolve, reject) => {
uni.login({
provider: 'weixin',
success: (res) => {
if (res.code) {
//获取openid
dispatch('getWxOpenid', res.code)
resolve(res.code)
}
},
fail: (err) => {
reject(err)
}
})
})
},
//检查微信session
checkSession({dispatch,commit}, payload) {
uni.checkSession({
success: (res) => {
// 状态未过期,再调用查询保存接口
dispatch('saveUserInfo')
},
fail: (err) => {
// 状态已过期
dispatch('wxLogin')
}
})
},
// 保存数据isSignIn:1是已授权手机号
saveUserInfo({commit},payload) {
return new Promise((resolve, reject) => {
let params = {
openpid: getCacheData('openid'),
tel: payload || ''
}
saveLoginInfo(params).then(res => {
setCacheData('isSignIn',Number(res.isSignIn))
getApp().globalData.isSignIn = Number(res.isSignIn)
if (getApp().isSignInCallback){
getApp().isSignInCallback(Number(res.isSignIn));
}
resolve(Number(res.isSignIn))
}).catch(err => {
reject(err)
})
})
}
}
const getters = {
}
export default {
state,
mutations,
actions,
getters
}
(2)授权手机号要确保公众平台已认证button按钮的getPhoneNumber方法
// 手机号授权
getPhoneNumber(e) {
this.commitLoging = true
if (e.detail.errMsg !== 'getPhoneNumber:ok') {
uni.showToast({
title: '手机授权失败',
icon: 'none',
duration: 2000
})
this.commitLoging = false
return
}
let params = {
code: e.detail.code
}
getMobile(params).then(res => {
this.$store.commit('SET_PHONE', res.data.phoneNumber)
this.$store.dispatch('saveUserInfo',res.data.phoneNumber).then(res => {
this.isSignIn = res
this.handleSaveStudentInfo()
})
}).catch(err => {
console.log(err);
}).finally(() => {
this.commitLoging = false
})
},
问题:在已经手机号授权后,第二次进入小程序立刻获取本地存储的是否授权手机号的字段,获取不到。
分析:调用的接口还未将是否授权手机号储存到本地
解决:利用全局getApp的回调函数
- App.vue页面
- 状态管理封账的获取保存记录信息接口:
- 首页调用全局的回调函数: