我的意思是,我第一次在显示登陆按钮时,点一下,这时解密就会有失败的情况,这个拿code到解密也不超过20秒啊
我刚获取的sessionkey就会有解密失败的情况,是什么原因啊?我点登陆时,先获取code,提交到我的服务器,然后拿到sessionkey,openid,生成临时的一个随机数返回客户端,然后紧接着又把getuserinfo加密数据传到我的服务器去解密,这么短时间竟然有什么无法填充,然后再试一次又好了。在网上看了资料说一般是sessionkey失效了会这样,我想不出来为什么会失效,或者有什么办法能规避呢?
2019-08-29你好,我第一次写,感觉对登陆流程清楚了,但代码写哪里还有时机对不对这个还没搞懂。想请教一下。新建一个项目时,app.js里有写了wx.login() 上面说用这个code去获取sessionkey,openid. 我调试看了这个wx.login()是不管理你登不登它 每次都会调用,都会生成新的code. 然后app.js里还有个appsetting 方法,在授过权登录后,我点ctrl+s 后重新进来,我看他会执行这里面的。 if (res.authSetting['scope.userInfo']) { // 可以将 res 发送给后台解码出 unionId 那官方的提示说,那每次都要执行app.js 里wx.login里去写wx.request({url:'我的服务器'},data:{code=code}) 去拿code换session_key,openid? 但这时是拿不到用户的信息对吧? 官方也说了将res发送给后能解码,unionid. 这样我就不知道这个代码该怎么写了,后台又该怎么去写了!我自己app.js里wx.login() 给删了,再登 陆页封装了一个方法Login, 在登陆按扭绑定这个方法,然后在点按钮时就把code,加密数据,iv等一起传上去了,后然返回一个KEY给前端保存,前端就用这个key去交互,有点纠结。 你能帮我写个前端,后端的伪代码吗?让我看看,你们是怎么做的?
登录流程有点不清楚?微信正常的登录流程,应该是点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我在工具里设置了不校验域名。另外我还发现有个问题,在工具里我看代码的执行逻辑:第一次加载也就是没有缓存的情况下,登陆页执行onload 里面的会走[图片]点完登陆后进入下一页,我在页面上按一下ctrl+s,页面重新启动,发现走的是这段,和想象 一样,进入下一页。[图片]可是上传体验版用微信扫描二维码后发现出现登陆按钮,我点一下,可以正常进入下一页,我退出再入体验版,打开调试看到他竟然还是走的[图片] 这一段,这一段因为没有写wx.switchTab({url:})这个代码,页面等于还停在这里,你知道是什么原因吗?
体验版为什么和工具运行,真机运行效果不一样呢?[代码]//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