- 我刚获取的sessionkey就会有解密失败的情况,是什么原因啊?
我点登陆时,先获取code,提交到我的服务器,然后拿到sessionkey,openid,生成临时的一个随机数返回客户端,然后紧接着又把getuserinfo加密数据传到我的服务器去解密,这么短时间竟然有什么无法填充,然后再试一次又好了。在网上看了资料说一般是sessionkey失效了会这样,我想不出来为什么会失效,或者有什么办法能规避呢?
2019-08-28 - 登录流程有点不清楚?
微信正常的登录流程,应该是点wx.login() 获得code,提交到我的服务器(http的不是https的)一个方法里,我根据自己的appid,密钥,cod 组装向微信发一个请求,返回来只是openid,sessionkey,还有个过期时间,没有拿到unnionid.不知道是不是因为我的服务请求是用的HTTP? 然后我就在调用wx.login的方法里把 code,加密数据,iv等一起提交上去。然后把加密数据解密就能得到unionid,但是我发现不是每次都能解密成功,也不知道是什么原因? 另外还有点逻辑上的不清晰,希望大神能帮忙理一下。我打算后台是建一个用户表,一个微信用户表,先检查微信用户表unnionid是否存在,如果不存在则新增一条,然后自动创建一个用户数据把微信用户表id作为用户表的关联。创建完用户数据后,生成一个guid 作为key,用户数据对象作为value暂时先存在静态字典里(这里暂时没有考虑过期的问题)。然后 把这个key返给前端,前端收到这个KEY后保存到storage e里,然后下面每次去取数据都带上这个key到后台拿数据,后台再根据KEY取用户,返回对应用户的数据给前端。 这个套路不知道有没有问题 吧? 希望大神们能解答一下。如果要有个过期时间问题,微信的返回的那个session_key这个字段不知道能起来什么作用? 我应该怎么做?
2019-08-28 - 体验版为什么和工具运行,真机运行效果不一样呢?
[代码]//index1.js[代码][代码]//获取应用实例[代码][代码]const app = getApp()[代码][代码]Page({[代码][代码] [代码][代码]data: {[代码][代码] [代码][代码]motto: [代码][代码]''[代码][代码],[代码][代码] [代码][代码]userInfo: {},[代码][代码] [代码][代码]projectName: app.globalData.projectName,[代码][代码] [代码][代码]domain:app.globalData.domain,[代码][代码] [代码][代码]hasUserInfo: [代码][代码]false[代码][代码],[代码][代码] [代码][代码]canIUse: wx.canIUse([代码][代码]'button.open-type.getUserInfo'[代码][代码])[代码][代码] [代码][代码]},[代码][代码] [代码][代码]//事件处理函数[代码][代码] [代码][代码]bindViewTap: [代码][代码]function[代码][代码]() {[代码][代码] [代码][代码]wx.navigateTo({[代码][代码] [代码][代码]url: [代码][代码]'../logs/logs'[代码][代码] [代码][代码]})[代码][代码] [代码][代码]},[代码][代码] [代码][代码]onLoad: [代码][代码]function[代码] [代码]() { [代码][代码] [代码][代码]if[代码] [代码](app.globalData.userInfo) {[代码][代码] [代码][代码]this[代码][代码].setData({[代码][代码] [代码][代码]userInfo: app.globalData.userInfo,[代码][代码] [代码][代码]hasUserInfo: [代码][代码]true[代码] [代码] [代码][代码]})[代码][代码] [代码][代码]console.log(app.globalData.userInfo+[代码][代码]"vvv"[代码][代码]);[代码][代码] [代码][代码]wx.switchTab({[代码][代码] [代码][代码]url: [代码][代码]"/pages/index/selectmeal"[代码][代码] [代码][代码]});[代码][代码] [代码][代码]} [代码][代码]else[代码] [代码]if[代码] [代码]([代码][代码]this[代码][代码].data.canIUse){[代码][代码] [代码][代码]console.log([代码][代码]this[代码][代码].data.canIUse + [代码][代码]"vqqq"[代码][代码])[代码][代码] [代码][代码]// 由于 getUserInfo 是网络请求,可能会在 Page.onLoad 之后才返回[代码][代码] [代码][代码]// 所以此处加入 callback 以防止这种情况[代码][代码] [代码][代码]app.userInfoReadyCallback = res => {[代码][代码] [代码][代码]this[代码][代码].setData({[代码][代码] [代码][代码]userInfo: res.userInfo,[代码][代码] [代码][代码]hasUserInfo: [代码][代码]true[代码][代码] [代码][代码]}); [代码][代码] [代码] [代码] [代码][代码]}[代码][代码] [代码] [代码] [代码][代码]} [代码][代码]else[代码] [代码]{[代码][代码] [代码][代码]// 在没有 open-type=getUserInfo 版本的兼容处理[代码][代码] [代码][代码]wx.getUserInfo({[代码][代码] [代码][代码]success: res => {[代码][代码] [代码][代码]app.globalData.userInfo = res.userInfo[代码][代码] [代码][代码]this[代码][代码].setData({[代码][代码] [代码][代码]userInfo: res.userInfo,[代码][代码] [代码][代码]hasUserInfo: [代码][代码]true[代码][代码] [代码][代码]})[代码][代码] [代码][代码]} [代码][代码] [代码][代码]})}[代码][代码] [代码][代码]},[代码][代码] [代码][代码]login:[代码][代码]function[代码][代码](e)[代码][代码] [代码][代码]{[代码][代码] [代码][代码]wx.login({[代码][代码] [代码][代码]success: res => {[代码][代码] [代码][代码]// 获取到用户的 code 之后:res.code[代码][代码] [代码][代码]console.log([代码][代码]"用户的code:"[代码] [代码]+ res.code);[代码][代码] [代码][代码]console.log([代码][代码]"用户的code:"[代码] [代码]+ e.detail);[代码][代码] [代码][代码]if[代码][代码](res.code)[代码][代码] [代码][代码]{[代码][代码]var[代码] [代码]encryptedData = e.detail.encryptedData;[代码][代码] [代码][代码]var[代码] [代码]iv = e.detail.iv;[代码][代码] [代码][代码]var[代码] [代码]signature = e.detail.signature;[代码][代码] [代码][代码]wx.request({[代码][代码] [代码][代码]url: [代码][代码]this[代码][代码].data.domain+[代码][代码]'/home/TestGetNick'[代码][代码],[代码][代码] [代码][代码]data: { code: res.code, encryptedData: encryptedData, iv: iv, signature: signature }, [代码][代码] [代码][代码]success:kes=>{[代码][代码] [代码][代码]if[代码][代码](kes.data.code==[代码][代码]"0"[代码][代码])[代码][代码] [代码][代码]{[代码][代码] [代码][代码]var[代码] [代码]_sessionKey = kes.data.dataObj;[代码][代码] [代码][代码]wx.setStorageSync([代码][代码]'_sessionKey'[代码][代码], _sessionKey);[代码][代码] [代码][代码]console.log([代码][代码]"loginsucess"[代码][代码]);[代码][代码] [代码][代码]wx.switchTab({[代码][代码] [代码][代码]url: [代码][代码]"/pages/index/selectmeal"[代码][代码] [代码][代码]});[代码][代码] [代码][代码]}[代码][代码] [代码][代码]else[代码][代码] [代码][代码]{[代码][代码] [代码][代码]wx.showToast({[代码][代码] [代码][代码]title: [代码][代码]'登陆失败请重新登录'[代码][代码],[代码][代码] [代码][代码]icon: [代码][代码]'succes'[代码][代码],[代码][代码] [代码][代码]duration: 2000,[代码][代码] [代码][代码]mask: [代码][代码]true[代码][代码] [代码][代码]})[代码][代码] [代码][代码]console.log(kes.code+[代码][代码]" "[代码][代码]+kes.msg);[代码][代码] [代码][代码]}[代码][代码] [代码] [代码] [代码][代码]}[代码][代码] [代码][代码]})[代码][代码] [代码][代码]}[代码][代码] [代码][代码]else[代码][代码] [代码][代码]{[代码][代码] [代码][代码]console.log(res);[代码][代码] [代码][代码]}[代码][代码] [代码][代码]}[代码][代码] [代码][代码]});[代码][代码] [代码][代码]},[代码][代码] [代码][代码]getUserInfo: [代码][代码]function[代码][代码](e) {[代码][代码] [代码][代码]console.log(e)[代码][代码] [代码][代码]app.globalData.userInfo = e.detail.userInfo[代码][代码] [代码][代码]this[代码][代码].setData({[代码][代码] [代码][代码]userInfo: e.detail.userInfo,[代码][代码] [代码][代码]hasUserInfo: [代码][代码]true[代码][代码] [代码][代码]})[代码][代码] [代码][代码]}[代码][代码]})[代码] [代码]<!--index1.wxml-->[代码] [代码]<[代码][代码]view[代码] [代码]class[代码][代码]=[代码][代码]"container"[代码][代码]>[代码] [代码] [代码][代码]<[代码][代码]view[代码] [代码]class[代码][代码]=[代码][代码]"userinfo"[代码][代码]>[代码][代码] [代码][代码]<[代码][代码]button[代码] [代码]wx:if[代码][代码]=[代码][代码]"{{!hasUserInfo && canIUse}}"[代码] [代码]open-type[代码][代码]=[代码][代码]"getUserInfo"[代码] [代码]bindgetuserinfo[代码][代码]=[代码][代码]"login"[代码][代码]> 登陆 </[代码][代码]button[代码][代码]>[代码][代码] [代码][代码]<[代码][代码]block[代码] [代码]wx:else>[代码][代码] [代码][代码]<[代码][代码]image[代码] [代码]bindtap[代码][代码]=[代码][代码]"bindViewTap"[代码] [代码]class[代码][代码]=[代码][代码]"userinfo-avatar"[代码] [代码]src[代码][代码]=[代码][代码]"{{userInfo.avatarUrl}}"[代码] [代码]mode[代码][代码]=[代码][代码]"cover"[代码][代码]></[代码][代码]image[代码][代码]>[代码][代码] [代码][代码]<[代码][代码]text[代码] [代码]class[代码][代码]=[代码][代码]"userinfo-nickname"[代码][代码]>{{userInfo.nickName}}</[代码][代码]text[代码][代码]>[代码][代码] [代码][代码]</[代码][代码]block[代码][代码]>[代码][代码] [代码][代码]</[代码][代码]view[代码][代码]>[代码][代码] [代码][代码]<[代码][代码]view[代码] [代码]class[代码][代码]=[代码][代码]"usermotto"[代码] [代码]>[代码] [代码] [代码][代码]<[代码][代码]text[代码] [代码]class[代码][代码]=[代码][代码]"user-motto"[代码][代码]>{{motto}}</[代码][代码]text[代码][代码]>[代码][代码] [代码] [代码] [代码][代码]</[代码][代码]view[代码][代码]>[代码] [代码] [代码] [代码] [代码][代码]</[代码][代码]view[代码][代码]>[代码][代码] [代码] 我的后台代码是在阿里云服务器上,没有绑定域名,只有IP,这就是我访问后台网站是通过ip的,在微信小程序工具,真机里运行都基本正常。上传为体验版后,扫描二维码运行,就发现不打开调试就不能看数据。这个应该是我写的是http:的原因吧? 另外用打开调试的方式不知道为什么每次点登陆进去后,再重新打开,又提示登陆。在工具运行可不是这样的,第一次进来会提示登录,第二次不清除缓存就直接进入了下一页了,不知道是什么原因。
2019-08-28