微信小程序授权信息报错:pad block corrupted

接手的老代码中,授权用户信息和授权手机号之前每次都会调用wx.login 导致新用户第一次授权用户信息一定报错
之后后端打印日志发现报错pad block corrupted,经过看网上的解决办法后发现是因为session_key不正确导致的

解决思路:

1.在授权之前调用可以理解为一进页面或者一进入小程序就调用wx.login
2.通过wx.checkSession判断当前session_key是否过期,如果过期重新调用wx.login以获取最新的session_key,如果没有过期正常走授权逻辑即可

代码:

<template>
	<view class="page">
		//	具体代码根据需求来 仅展示
		<button open-type="getUserInfo" @getuserinfo="wxGetUserInfo"
		 withCredentials="true">使用微信绑定手机号一键登录</button>
		<button open-type="getPhoneNumber" @getphonenumber="getPhoneNumber">手机号授权</button>
	</view>
</template>
data() {
	return{
		jsCode: null
	}
},
onLoad() {
	//	刚进入页面就获取code
	this.getCode()
},
methods: {
	async getCode(){
		await uni.login({
			provider: 'weixin',
			success: ({code}) => {
				this.jsCode = code
			}
		})
	},
	// 用户手机号授权加密数据
	getPhoneNumber(res) {
		this.getInfo(res)
	},
	// 微信 用户信息授权 加密数据
	wxGetUserInfo(res) {
		this.getInfo(res)
	},
	// 获取用户信息
	getInfo(res){
		// 判断session_key是否过期
		wx.checkSession({
			success: ()=> {
				//session_key 未过期,并且在本生命周期一直有效
				// 获取session_key存入本地
				// 通过session_key拿到openid unionId
				if(uni.getStorageSync('session_key')){
					// 本地有session_key
					//	解密数据
					this.miniprogramMiniAuth({
						encryptedData: res.detail.encryptedData,
						iv: res.detail.iv,
						unionid: uni.getStorageSync('unionId'),
						openId: uni.getStorageSync('openId'),
						sessionKey: uni.getStorageSync('session_key')
					},res.detail)
				}else{
					// 本地没有session_key 重新获取
					this.getSessionKey(res.detail)
				}
			},
			fail: async ()=> {
				// session_key 已经失效,需要重新获取code
				await this.getCode()
				this.getSessionKey(res.detail)
			}
		})
	},
	// 获取session_key
	getSessionKey(detail){
		// 通过后端接口 传入code获取unionId、openId、session_key存入本地
		this.$request.post(API.miniprogramSessionKey, {
			data:{jsCode: this.jsCode}
		}).then(keyRes => {
			if(keyRes.code == 0){
				uni.setStorageSync('unionId', keyRes.data.unionid)
				uni.setStorageSync('openId', keyRes.data.openId)
				uni.setStorageSync('session_key', keyRes.data.sessionKey)
				// 通过sessionKey获取信息
				this.miniprogramMiniAuth({
					encryptedData: detail.encryptedData,
					iv: detail.iv,
					unionid: keyRes.data.unionid,
					openId: keyRes.data.openId,
					sessionKey: keyRes.data.sessionKey
				}, detail)
			}else{
				uni.showToast({
					title:keyRes.message,
					icon: 'none'
				})
			}
		})
	},
	// 通过session_key获取用户信息
	miniprogramMiniAuth(data, detail){
		//	后端接口  解密用户数据
		this.$request.post(API.miniprogramMiniAuth, {
			data
		}).then(authRes => {
			if(authRes.code == 0){
				uni.showToast({
					title: '获取信息成功',
					icon: "none"
				})
			}else{
				uni.showToast({
					title:authRes.message,
					icon: 'none'
				})
			}
		})
	},
}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值