收藏
回答

教程问题反馈:第4章 场景应用微信登录

问题模块
教程反馈


- 需求的场景描述(希望解决的问题)

我们暂时只要关注前两个字段即可,openid就是前文一直提到的微信用户id,可以用这个id来区分不同的微信用户。session_key则是微信服务器给开发者服务器颁发的身份凭证,开发者可以用session_key请求微信服务器其他接口来获取一些其他信息,由此可以看到,session_key不应该泄露或者下发到小程序前端。


对于有多个小程序业务,需要相同的账号体系的公司来说,openId对于不同的appId不一样,一般都需要获取到unionId保证用户的ID一致,但是unionId的返回需要满足一些条件


  1. 调用接口wx.getUserInfo,从解密数据中获取UnionID。注意本接口需要用户授权,请开发者妥善处理用户拒绝授权后的情况。

  2. 如果开发者帐号下存在同主体的公众号,并且该用户已经关注了该公众号。开发者可以直接通过wx.login获取到该用户UnionID,无须用户再次授权。

  3. 如果开发者帐号下存在同主体的公众号或移动应用,并且该用户已经授权登录过该公众号或移动应用。开发者也可以直接通过wx.login获取到该用户UnionID,无须用户再次授权。

对于开发者来说,根本无法获取用户是否已经授权过公众号或移动应用,在wx.login中并不能获取到所有用户的UnionId,所以后两条只是锦上添花,根本不能覆盖所有的用户,不管怎样都需要第一条来实现登录获取到unionId。


- 希望提供的能力


目前出现了需要用户主动触发才可以调用wx.getUserInfo,目的是为了把这两者区分开来,但是你因为上面三条中的后两条不能覆盖全部用户,所以还是需要把这两者结合才可以获取到unionId


调用wx.getUserInfo,从解密数据中获取UnionId,说明只要授权后业务的后端就可以获取到unionId,那为什么不能在wx.getUserInfo被用户同意授权后,调用wx.login就直接返回给业务后端unionId呢?


这样才是真正的解耦了,而且都是后端之间的调用,也不存在把隐私数据下发在前端的问题,为什么不能返回unionId



另外测试发现,一个刚注册的微信账号,

1.关注同一开发者下的公众号,小程序马上可以获取到unionId

2.只在web页微信授权登录之后,满足所有条件的情况下依然获取不到unionId【请关注】

最后一次编辑于  2018-05-30  (未经腾讯允许,不得转载)
回答关注问题邀请回答
收藏

2 个回答

  • 社区技术&运营专员-Ltt
    社区技术&运营专员-Ltt
    2018-05-30

    已反馈。有消息同步。

    2018-05-30
    赞同
    回复
  • 阿楚Eva🎐
    阿楚Eva🎐
    2018-05-30

    @官方@官方,求解


    另外:

    主要的疑问就在于:wx.getUserInfo的授权弹窗既然包含有这些encryptedData,里面有unionId,为啥不能和条件2,3一样同等享有同意授权后返回unionId的权利?


    如果真的想要按照小程序小故事:登录能力优化里实现最佳实现,请考虑一下大厂的需要返回unionId的需求。https://developers.weixin.qq.com/blogdetail?action=get_post_info&lang=zh_CN&token=&docid=000e2aac1ac838e29aa6c4eaf56409


    万分感谢

    2018-05-30
    赞同
    回复 4
    • Link
      Link
      2018-06-01

      调用wx.getUserInfo,从解密数据中获取UnionId,说明只要授权后业务的后端就可以获取到unionId,那为什么不能在wx.getUserInfo被用户同意授权后,调用wx.login就直接返回给业务后端unionId呢?


      由于 openId 和 unionId 的映射关系不会变化,因此只要拿到过一次 unionId,开发者可以将其存储起来,后续仅需调用 wx.login 接口或得 openId,即可找到对应的 unionId。

      2018-06-01
      回复
    • 阿楚Eva🎐
      阿楚Eva🎐
      2018-06-04

      非常感谢回复。对于有一个主体下有很多公众号、移动应用、小程序的公司来说,需要统一的帐号体系,unionId要比openId更重要。

      为啥不能在wx.getUserInfo被用户同意授权后,调用wx.login就直接返回给业务后端unionId呢?

      2018-06-04
      回复
    • 阿楚Eva🎐
      阿楚Eva🎐
      2018-06-04回复Link

      您的回复算是一个方案,但是还是需要“获取一次unionId”,为啥不能在一个主体多个应用的情况下直接返回unionId呢

      2018-06-04
      回复
    • Link
      Link
      2018-06-04回复阿楚Eva🎐

      为啥 不能在wx.getUserInfo被用户同意授权后,调用wx.login就直接返回给业务后端unionId呢

      通过第一次的用户授权同意 wx.getUserInfo,可以“获取一次 unionId”。在此之后,可以用我上述的方式(openId->unionId 映射),或者再调用 wx.getUserInfo 获取 unionId。这两种方式,虽然不是 wx.login 直接返回,但对用户来说都是静默的。

      2018-06-04
      回复