问题概述
前端传code、encryptedData、iv参数到后端获取微信小程序用户信息,大概率在请求3次node控制台会复现一次报错信息:SyntaxError: Unexpected token in JSON at position 0
node解密函数如下
经过排查解密代码无任何问题,报错是偶现性的。
问题原因
在获取用户信息时,需要先调用wx.login拿到code,再调用wx.getUserProfile获取密文(encryptedData、iv),如果先执行wx.getUserProfile再执行wx.login会导致登录态被刷新,导致后端出现SyntaxError: Unexpected token in JSON at position 0错误。
小程序完整例子
<button bindtap="loginFn">获取用户信息</button>
const app = getApp()
Page({
data: {
code: '',
encryptedData: '',
iv: ''
},
getCode() {
return new Promise((resolve, reject) => {
wx.login({
success: res => {
this.setData({
code: res.code
})
resolve()
}
})
})
},
getUserProfile() {
return new Promise((resolve, reject) => {
wx.getUserProfile({
desc: '展示用户信息', // 声明获取用户个人信息后的用途,后续会展示在弹窗中,请谨慎填写
success: (res) => {
this.setData({
encryptedData: res.encryptedData,
iv: res.iv,
})
resolve()
},
fail: (err) => {
console.log('err', err)
reject()
}
})
})
},
async loginFn() {
// 先获取code
await this.getCode()
wx.showModal({
title: '温馨提示',
content: '授权微信登录后才能正常使用小程序功能哦~',
success: async (modelRes) => {
if (modelRes) {
// 再获取密文
await this.getUserProfile()
// 发送code、encryptedData、iv换取用户信息
wx.request({
url: `http://localhost:3000/v1/wechat_mini_program_auth/wxLogin`,
method: 'post',
data: {
code: this.data.code,
encryptedData: this.data.encryptedData,
iv: this.data.iv
},
success: (result) => {
console.log('result', result)
}
})
}
}
})
}
})
已经可以正常获取用户信息啦~