uniapp登录获取openid,授权手机号

(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的回调函数

  1. App.vue页面
    在这里插入图片描述
  2. 状态管理封账的获取保存记录信息接口:
    在这里插入图片描述
  3. 首页调用全局的回调函数:
    在这里插入图片描述
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值