评论

wx.getUserProfile 修改方案

wx.getUserProfile 修改方案

最近微信关于用户头像、昵称授权又做了调整。
点击查看原文

解决方案思路如下:

1、在util.js里写一个通用函数,函数的功能是,用户授权成功,将头像昵称,存入服务器,同时,在本地缓存设置标记用户授权成功。

// util.js
function getUserProfile() {
  wx.getUserProfile({
    desc: '用于完善个人资料',
    success: function(res) {
      var userInfo = res.userInfo
      // console.log('userInfo==>', userInfo)
      wx.setStorageSync('storage_info', 1);//本地标记
      //下面将userInfo存入服务器中的用户个人资料
      //...
    },
    fail() {
      console.log("用户拒绝授权")
    }
  })
}

2、在需要用户授权时,做判断,如果本地已经授权,直接执行正常业务逻辑。如果未授权,则提示授权。

 chooseTap: function(e) {
 	//如果未授权,就提示授权,如果授权了,就执行正常的业务逻辑
    if (!wx.getStorageSync('storage_info')) {
      util.getUserProfile()
      return
    }
 	//下面是正常业务逻辑
 	//...
  }

3、在用户进入小程序时,从服务器获取用户信息(如果已授权,就有之前存入的头像,昵称),在页面展示用户信息。
完成以上3步,就全部完成了。

说明:把授权状态存入缓存的好处是:因为wx.getUserProfile每次都会弹授权框,如果每次都让用户授权,体验不好。如果只授权一次,存入服务器,以后都展示的是这个用户信息。在用户微信改名,改头像后,服务器储存的用户信息还是以前的。
所以,把授权状态存入缓存,起码在用户更换手机,或者删除过小程序,又进来时,会弹出授权提示,可以让用户重新授权,将服务器里用户的信息进行一次更新

最后一次编辑于  04-11  
点赞 8
收藏
评论

14 个评论

  • 小明
    小明
    04-24

    信息是存到数据库了,但用户登录用什么提取用户信息啊?


    04-24
    赞同 1
    回复 1
    • 安达
      安达
      04-25
      头像昵称存到数据库用户这个对象里了,用户登录,知道是哪个用户,用户信息就一起从数据库获取了啊。
      04-25
      回复
  • WANGHANMING
    WANGHANMING
    04-12

    还需要对以前版本的做适配,我们现在上去有些用户不支持getUserProfile直接不能用了

    04-12
    赞同 1
    回复 1
    • 安达
      安达
      04-13
      这个问题不大,如果你的用户非常非常多,才用考虑这个问题。也可以选低一点的版本号。参考版本号:2.10.4/2.11.2/2.12.3/2.14.1/2.15.0
      04-13
      回复
  • Cigarette or Wine
    Cigarette or Wine
    6小时前

    鸡肋了啊 每次都弹窗。 我tama的好奇 微信 一个用户的昵称和头像 性别 基本的信息你藏什么藏

    6小时前
    赞同
    回复
  • 🎫瀚🎼
    🎫瀚🎼
    2天前

    感谢楼主的分享. 这里我也遇到这个问题了. 我分享下我的做法, 供大家交流.

    因为我的情况和楼主不一样, 还要照顾老用户. 所以老用户是已经登录了的, 如果他们进入小程序, 则看到的是匿名昵称了(因为以前设计的是每次 服务器对服务器请求并解密拿到微信更新最新的昵称

    现在服务器解密也是匿名数据了, 也就是说所有的昵称都只能在客户端获取了.并且必须用户点击之后才能获取最新昵称...(这是我理解的...)


    根据上面的变动, 首先就要改服务器昵称修改接口的逻辑, 检测到"微信用户"就不要修改 "昵称,性别,省份, 城市, 头像, 国家, 语言" 就是getUserInfo.userInfo/getUserProfile.userInfo的7个数据.

    其次就是客户端里面的老的getUserInfo()函数内部改动下, 检测缓存里面有没有userInfo(假如用户授权了getUserProfile()那么那到数据之后把里面的userInfo属性缓存到本地LocalStorage里面), 有就发送资格的userInfo给服务器更新昵称等7个数据, 否则就只有发送匿名数据给服务器, 此刻服务器检测到是匿名则不会更新表的那7个字段.

    最后就是注意过滤那7个字段的字符串格式检测和sql注入防范

    不知道是否有更好的设计模式?

    2天前
    赞同
    回复
  • 🍟
    🍟
    04-22

    但是你存的是第一次授权所获取到的头像和名称, 如果要拿最新的头像和昵称怎么办?

    04-22
    赞同
    回复 1
    • 安达
      安达
      04-25
      所以简单地存了一下缓存,可以在缓存删除(换手机,删除小程序)的情况下,再请求一次。
      如果,用户更换了头像,你立马就要拿到最新的,那你每次都要请求。
      04-25
      回复
  • Bubble
    Bubble
    04-21

    666

    04-21
    赞同
    回复
  • Zane
    Zane
    04-21

    getUserProfile需要按钮触发的

    04-21
    赞同
    回复 1
    • 安达
      安达
      04-25
      但是不需要open-type组件了。
      04-25
      回复
  • cspEng
    cspEng
    04-17

    谢谢,帮我大忙了,感谢分享

    04-17
    赞同
    回复
  • 乐乐
    乐乐
    04-17

    用户从右上角主动去掉授权,本地标记还在咋办

    04-17
    赞同
    回复 2
    • 安达
      安达
      发表于小程序端
      04-17

      你已经把用户信息存到你的服务器了呀。

      04-17
      回复
    • ooh
      ooh
      04-23回复安达
      同问,用户点击三个点在设置那里关闭了授权,但这个时候你判断的还是用户已经授权,但其实用户关闭了。
      04-23
      回复
  • let
    let
    04-14

    存在缓存啊!

    04-14
    赞同
    回复

正在加载...

登录 后发表内容