评论

登录接口又双叕变了,三行代码挑战全网最少修改工作量

小程序登录接口改变后,还有多少修改工作量在等着你?

小程序登录、用户信息样关接口又双叕变了。

https://developers.weixin.qq.com/community/develop/doc/000cacfa20ce88df04cb468bc52801

几家悲伤几家愁。。。

微信的一小步,人猿的一大步。。。

没办法,改吧。。。

翻出以前小程序这部分的代码,惊喜地发现,只需要三行代码,就能平滑过渡;

感谢我以前看似丑陋却很省事的登录代码逻辑!!!

登录逻辑如下:

1、判断库里有用户的信息没有,没有,则wx.navigateTo一个专门的授权页面:auth

2、授权成功后获得userInfo,保存到库里;

auth页代码修改如下:

auth.wxml:

修改一行代码

<button style='margin:15px;font-size:16px' type='primary' size="mini" bindtap='getUserProfile'>授权微信头像和昵称</button>


auth.js:

修改两行代码

  //原wx.getUserInfo接口
  getUserInfo: function (e) {
    let userInfo = e.detail.userInfo
    if (userInfo) this.onSaveUserInfo(userInfo)
  },


  //新增wx.getUserProfile接口
  getUserProfile: function (e) {
    wx.getUserProfile({
      desc: '业务需要',
      success: res => this.onSaveUserInfo(res.userInfo)
    })
  },


  //保存userInfo到DB
  onSaveUserInfo:function(userInfo){
    console.log(app.globalData.userInfo = userInfo)
    db.collection('user')
      .where({ _id: this.openid })
      .count()
      .then(res => {
        if (res.total > 0) {
          //doc.update
          db.collection('user').doc(this.openid).update({
            data: userInfo
          }).then(res => console.log(res))
        } else {
          //doc.add
          db.collection('user').doc(this.openid).add({
            data: userInfo
          }).then(res => console.log(res))
        }
      })
    wx.navigateBack()
  },


以下是判断用户信息是否存在的代码:

xxxx.js:

  onSubmit:async function () {
    if (await app.hasUserInfo()) { } else return
    //其他代码
  },


app.js:

  hasUserInfo: async function () {
    if (this.globalData.userInfo && this.globalData.userInfo.nickName && this.globalData.userInfo.avatarUrl) return true
    let res = await wx.cloud.database().collection('user').doc(this.openid).get().catch(err => console.log(err))
    if (res && res.data && res.data.nickName && res.data.avatarUrl) {
      this.globalData.userInfo = res.data
      return true
    } else {
      wx.navigateTo({ url: '/base/auth/auth' })
      return false
    }
  },


关于用户信息自动更新:

我们一直以来的方法如下:

1、留给用户手动授权的入口,用户更换头像后,发现自己的头像不显示,则需要手动授权刷新userInfo;

2、一般会在这个页面:我的--个人信息--授权微信头像和昵称,用户点击后,wx.navigateTo到授权页。


笔者团队认为:用户信息自动更新其实是个伪需求。理由如下:

假设某用户修改了头像:

1、用户自己打开小程序,发现头像和昵称怎么没有改过来,那么手动更新一下。用户体验没毛病,没必要非要自动更新;

2、用户如果后来不再进入小程序,别人看到的都是一张碎的头像,那么此时,自动更新也毫无作用,因为该用户都不打开小程序。

3、微信团队肯定考虑过自动更新这种要求,但他们宁愿千夫所指,也依然坚持推出新的登录接口,那就肯定是已经经过了中国最牛逼团队的全面考衡了。


补充:

登录和授权其实是两码事,可以毫无关系这么说,以上的内容主要都是关于授权微信用户信息的,下面补充一下登录的内容:

登录其实就是获取用户的openid,我们一直采用云函数来获取openid。方案如下:

在每个页面:page.js:

  onLoad: async function (options) {
    this.openid = await app.getOpenid()
  },


在app.js:

  getOpenid: async function () {
    if (this.openid) return this.openid
    let res = await this.globalData.cloud.callFunction({ name: 'login' })
    console.log(res)
    return this.openid = res.result.FROM_OPENID||res.result.OPENID
  },
最后一次编辑于  04-07  
点赞 13
收藏
评论

19 个评论

  • lyxhris
    lyxhris
    03-11

    wx.getUserProfile 接口是有最低基础库版本要求的哟,余下的用户不用 wx.getUserInfo 兼容么?

    PS:自动更新可以判断数据库用户信息的更新时间,一定周期重新授权用户信息

    03-11
    赞同 2
    回复 7
    • 跨商通
      跨商通
      03-11
      我们没有兼容这样的需求。老用户都不会再需要授权,新用户才需要授权,然后新用户如果版本不高,某些环节就过不去罢了,新用户自己选择是升级微信还是离开。
      03-11
      回复
    • 跨商通
      跨商通
      03-11
      另,我们团队认为自动更新用户信息是伪需求或者㳀需求,理由已补充到文章中。
      03-11
      回复
    • lyxhris
      lyxhris
      03-11回复跨商通
      好的,我这就去和产品对线~(手动滑稽)
      03-11
      回复
    • 杜发明
      杜发明
      04-07回复跨商通
      你这样的逻辑是对的,老用户信息已经绑定了直接拉取,新用户就用新的api,如果新用户的微信版本低,在小程序里面加一个公告就行(年轻的微信用户早早就更新了,年纪大的微信用户关注自己头像的又很少)
      04-07
      回复
    • 跨商通
      跨商通
      04-08回复杜发明
      明白人。
      04-08
      回复
    查看更多(2)
  • 白小明
    白小明
    星期四 03:38

    特别认同您的这个观点:「用户信息自动更新其实是个伪需求」👍

    星期四 03:38
    赞同 1
    回复
  • Dyer-blac
    Dyer-blac
    03-10

    那我是使用login+getuserinfo、让小程序无需二次登录的、

    岂不是只能记录缓存、getUserProfiled 的时候缓存信息、让用户无需二次登录

    03-10
    赞同 1
    回复 3
    • 跨商通
      跨商通
      03-10
      我们把login和授权用户信息是分开的,是两码事,没有什么必然联系。
      03-10
      回复
    • Dyer-blac
      Dyer-blac
      03-11回复跨商通
      我知道、你们是分开来的、那估计我这边也要分开来获取了😭
      03-11
      回复
    • 杜发明
      杜发明
      04-07回复Dyer-blac
      这次更新后看样子其实就是分开成两个步骤来实现(但是你可以先login,然后拉取用户之前的信息,如果拉不到,就授权获取一下用户信息就好了。另外可以在边上加一个更新微信信息的一个按钮就可以了)
      04-07
      回复
  • 安达
    安达
    04-13

    我采用的 简单有效 的修改方法

    https://developers.weixin.qq.com/community/develop/article/doc/00000cc422c12844b4fb644d056813

    04-13
    赞同
    回复 2
    • 跨商通
      跨商通
      04-13
      挺好。看不出毛病。
      04-13
      回复
    • 跨商通
      跨商通
      04-13
      是简单了,不过没打算改成这样。因为幸亏我们以前一直是自己的逻辑,所以这次接口调整我们的修改工作量最少。要改成你这样的,谁知道下次微信再调整接口,修改量还少不了。反正我们的逻辑已经够完美了。
      04-13
      回复
  • 总之是咸鱼的陶天理
    总之是咸鱼的陶天理
    04-09

    不知道是不是我个人的问题,使用新的getuserprofile方法获取到的信息和getUserInfo获取的都是一样的?昵称等统一都是“微信用户”,快被坑死了,以为过两天正式更新,开始没注意,新用户一注册就出问题,好死不死刚更新了一个小版本上线,线上业务逻辑直接蹦了,涉及到后台业务功能更新,小版本都没办法还原,进退两难

    04-09
    赞同
    回复 1
    • 跨商通
      跨商通
      04-10
      听上去属于粗心问题,不能怪接口了。
      04-10
      回复
  • 鱼翔涌底
    鱼翔涌底
    04-09

    我个人觉得getsetting很有必要返回scope.userinfo,用于判断用户是否已授权信息,未授权调用新的API,授权调用旧的API,像你把用户信息保存在本地这种方式不是很好,但是也是解决问题的方式,但不是最好。

    04-09
    赞同
    回复 1
    • 跨商通
      跨商通
      04-09
      去写一篇呗。如果你觉得自己的方式最好的话。把文章链接附过来这里。
      04-09
      回复
  • Flash
    Flash
    04-09

    谢谢楼主的分享,我是一名初学者,想请教一下,我在编写用户授权的时候逻辑如下,用户授权成功后,将userInfo对象写入app.js中的globalData里,后续其他操作通过判断app.js中的globalData内存储的userinfo来判断当前用户是否授权。

    由于app.js中的globalData每次刷新都要清空,因此在app.js中我通过在wx.getsetting函数中判断scope.userInfo是否为true来判断当前用户是否已授权,若已授权,则重新将userInfo写入globalData中。

    目前问题出在,使用getUserProfile授权成功后,已授权用户重新进入小程序时app.js中调用getsetting判断出的scope.userinfo是undefined。这就导致已授权用户每次进入小程序都需要再次进入授权页面进行授权

    求问大佬,如何保存用户已授权的信息从而使已授权用户再次进入小程序时不需要重复授权。谢谢您


    04-09
    赞同
    回复 1
    • 跨商通
      跨商通
      04-09
      你好象没有看懂我的文章。对你的问题,都是解决的。通过hasUserInfo来判断,你先看懂文章里的代码吧。
      04-09
      回复
  • 苑博林
    苑博林
    04-07

    大佬,我可以理解为新用户我可以直接wx.login了是吗,然后再判断是否存储过用户信息来判断是否授权?

    04-07
    赞同
    回复 1
    • 跨商通
      跨商通
      04-07
      目测可以。你自己走一遍吧。毕竟我们从来不用wx.login
      04-07
      回复
  • 🇱 🇴 🇻 🇪 จุ๊บ
    🇱 🇴 🇻 🇪 จุ๊บ
    04-07

    open-type='getUserInfo'

    岂不是也废了

    04-07
    赞同
    回复 1
    • 跨商通
      跨商通
      04-07
      别害怕,大胆点说。就是废了。
      04-07
      1
      回复
  • 另一种开始
    另一种开始
    03-26

    大佬这部分能不能解释一下,是获取openid后放入云数据库然后用hasUserInfo去获取解析吗?

    03-26
    赞同
    回复 6
    • 跨商通
      跨商通
      03-27
      在你的代码里,你将this.openid改成this.globalData.openid就行了。
      03-27
      回复
    • 跨商通
      跨商通
      03-27
      我没有把openid放在globalData里,而是放在app.openid。
      03-27
      回复
    • 另一种开始
      另一种开始
      03-27回复跨商通
      没听说过app.openid,app.js唯一能传递的全局变量不就是globaldata吗;

      另外一直没法把openid存进云数据库,反复显示上图的错误:parameter.data should be obiect instead of undefined;
      能帮忙看下吗https://developers.weixin.qq.com/s/WfJoo7mT7Dpf
      03-27
      回复
    • 跨商通
      跨商通
      03-28回复另一种开始
      app.globalData可能传递参数,app本身就不可以吗?你们是这样传递:app.globalData.openid='xxx',我是这样传递:app.openid='xxx'。这是js的基本知识。
      03-28
      回复
    • 另一种开始
      另一种开始
      03-28回复跨商通
      忘了app也是个方法...但是想在auth的界面调app.js的openid()一直掉不了,好像js总是等不到网络请求到的结果返回就执行下一步了,怎么搞异步都没用。
      03-28
      回复
    查看更多(1)

正在加载...

登录 后发表内容