废话不说,直接上万无一失的办法。
wxml:
<!-- 今日已打卡 --> <button class="btn" open-type="getUserInfo" bindgetuserinfo="getUserInfo" style="margin-top: 40rpx" > {{ isset ? (isok ? '今天已打卡' : '进入个人打卡页') : '设置我的目标' }} </button>
js: 常见的错误,
① 用户点击按钮:此时获取到了 加密信息: iv,encryptedData
② 获取code
③ 利用code解密,点击按钮获取的 iv,encryptedData ,但是 此时的iv,encryptedData 是上一个code的加密信息。
如果用新的code,去解密旧的(iv和encryptedData ),微信那边必然是会报错的。
解决方法: 在获取code之后,再用 wx.getUserInfo获取新的 iv和encryptedData 然后再解密,就不会出问题了。
注意:一定要抛弃点击按钮拿到的 iv和encryptedData
getUserInfo(e) { let _this = this; getCodeLogin((res)=>{ wxgetUserInfo().then(userInfo=>{ app.globalData.code = res.code; let {iv,encryptedData} = userInfo // 解密 start request({'url': '/index/myauthor', data: { code: res.code, iv, encryptedData }, method: 'POST'}) .then(result=>{ if (result.data.No == 0) { let { openid } = result.data.Data wx.setStorageSync('openid', openid) wx.hideLoading({ success: (res) => { _this.getRank() _this.checkIt().then(()=>{ _this.toDaka() }) wx.showToast({ title: '授权成功', duration: 1500 }) }, }) resolve(openid) } }) // 解密 end }).catch(res=>{ wx.hideLoading(); }); }); },
const wxgetUserInfo = function() { return new Promise((resolve, reject) =>{ wx.getUserInfo({ lang: 'zh_CN', success(res) { resolve(res); }, fail(res){ reject(res); } }) }); } const getCodeLogin = function(successFn) { wx.login({ success(res){ successFn(res); } }) }