V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
insub
V2EX  ›  微信

真是被微信气吐了

  •  
  •   insub · 2017-12-12 03:41:36 +08:00 · 3402 次点击
    这是一个创建于 2530 天前的主题,其中的信息可能已经有所发展或是发生改变。

    微信 PC 端扫码登录,只能选 snsapi_login 的 scope,而这个权限只能获得扫码用户的 openid,是不能获得用户的头像昵称之类公开信息的,然后扫码登录根本不能选其他 scope。也就是说,PC 上扫码用微信账号登录,事实上是根本没有途径去获取用户的昵称和头像的。

    然而微信的开放平台网站应用文档会列出来好几个可以获取用户昵称和头像的接口,虽然开放平台网站应用根本就不能去调用这些接口。

    玛德各种文档反复看,各种 google,终于崩溃了,气吐了,吐你丫微信一脸

    谁能想到一个 oauth 连头像和昵称都不给。

    第 1 条附言  ·  2017-12-12 11:17:35 +08:00
    各位,大家好,我错了
    是我代码写错了,漏了一步 JSON.parse()
    实际上,snsapi_login 这个 scope,是包含了 snsapi_userinfo 的作用域的

    删不了贴了,微信我对不起你,对不起各位,我错了,我一定好好反省,以后不乱发帖了
    20 条回复    2017-12-12 11:16:47 +08:00
    qiayue
        1
    qiayue  
       2017-12-12 03:58:59 +08:00
    第一步,用户扫码,你得到 code
    第二步,你拿 code 换取 access_token,同时也能得到 openid 和 scope
    第三步,通过 access_token 和 openid 获取用户详细信息

    其中第三步,文档已经说得很清楚了:
    1. access_token 有效且未超时;
    2. 微信用户已授权给第三方应用帐号相应接口作用域( scope )。
    insub
        2
    insub  
    OP
       2017-12-12 04:08:18 +08:00
    @qiayue thk

    主要是你说的第二点,实际上,PC 是根本无法请求用户授权相应接口作用域的( scope ),这就是恶心的地方
    insub
        3
    insub  
    OP
       2017-12-12 04:10:04 +08:00
    @qiayue 我说的再明白一点,如果我没理解错的话,网站应用文档里面写的接口作用域,在网站应用里根本就是无法向用户请求授权的
    rogwan
        4
    rogwan  
       2017-12-12 07:45:53 +08:00 via Android   ❤️ 1
    微信 DNA 是拒绝 PC 生态的,是不想给。
    lestat
        5
    lestat  
       2017-12-12 07:52:11 +08:00 via Android
    微信本来就恶心
    des
        6
    des  
       2017-12-12 09:03:23 +08:00 via Android
    @rogwan 应该是为了避免和 qq 造成竞争吧
    mydns
        7
    mydns  
       2017-12-12 09:07:34 +08:00
    我用公众平台做的扫码登录 获取用户头像等信息正常
    开放平台还得单独再认证一遍麻烦
    lelouchyang
        8
    lelouchyang  
       2017-12-12 09:13:01 +08:00
    楼主刚入行?
    lxrmido
        9
    lxrmido  
       2017-12-12 09:20:11 +08:00
    ……一楼所说的第二、三步是可用的并且我已经在许多个应用上用了好久,你是卡在哪一步了,网站应用的域名跟你申请网站应用时填写的域名不同?还是说你是在前端去获取?
    hanzhao
        10
    hanzhao  
       2017-12-12 09:30:09 +08:00
    楼主,snsapi_login 是可以获取到用户信息的,再试试吧。
    justfindu
        11
    justfindu  
       2017-12-12 09:39:31 +08:00
    我觉得你是没有权限获取哪些信息吧, 因为不是服务号?
    insub
        12
    insub  
    OP
       2017-12-12 10:06:22 +08:00
    @mydns 是 PC 上的扫码登录么?是的话大概怎么个流程呢?
    @lelouchyang 不是刚入行
    @lxrmido 不是的,access_token 我是可以拿到的,一切正常,但是这个 access_token 是在 snsapi_login 的 scope 下的,@hanzhao 从文档来看,snsapi_login 的 scope 是拿不到用户的头像或昵称信息的,文档里写的返回也是没有的
    @justfindu 是服务号权限,开放平台开发者认证正常,也绑定了相关公众号(服务号)

    我怀疑之前这个 snsapi_login 是可以获取用户公开信息的,但是微信后来改了,也没说明,因为之前许多应用的截图,在微信内授权那个界面是有“获取用户昵称等公开信息”的勾选项的,现在变成只有“是否登录该网站”的勾选项了
    mokeyjay
        13
    mokeyjay  
       2017-12-12 10:09:14 +08:00
    PHP 的话,大可无脑上 https://www.easywechat.com/
    mydns
        14
    mydns  
       2017-12-12 10:17:38 +08:00   ❤️ 1
    @insub 是 PC 上的扫码登录 口才不好 过程描述大致如下
    1.生成一个带参数的二维码 同时记录二维码参数到数据库
    2.用户扫码之后 微信发起对话 服务器接收对话并对比参数 更新数据库
    3.生成参数的页面每 1-3 秒查一次数据库中的二维码参数表某个字段是否更新,更新了 就开始登录 获取头像 用户名等信息
    insub
        15
    insub  
    OP
       2017-12-12 10:23:10 +08:00
    我打听一下,有没有哪位的应用,是在 PC 端能够获取到用户的头像和昵称的?
    目前看一号店,沪江是可以在 PC 端扫码登录后能够获取到微信用户的头像和昵称的,要么是他们大店权限不一样,要么就是他们申请得早,早期的开放平台登录接口有这个权限
    查了一大圈,没法确认
    insub
        16
    insub  
    OP
       2017-12-12 10:27:50 +08:00
    @mydns 明白了,谢谢。我昨天想的也是这个办法,不过我准备就不用扫码登录接口了,直接把公众平台的网页授权接口转成二维码+自定义参数在 PC 端显示让用户扫,这样还能少发几次请求
    insub
        17
    insub  
    OP
       2017-12-12 10:38:59 +08:00
    @hanzhao snsapi_login 确定能拿到用户公开信息么?在那个接口去拿呢?
    pubby
        18
    pubby  
       2017-12-12 11:09:26 +08:00
    能拿到啊

    就第一步拿 code 的过程有些不同,
    1. 微信内浏览器的情况(服务号 APPID )
    https://open.weixin.qq.com/connect/oauth2/authorize?appid=<APPID>&redirect_uri=<RETURN_URL>&response_type=code&scope=snsapi_userinfo&state=myapp_wx#wechat_redirect

    2. pc 浏览器的情况(开放平台上 web 应用的 APPID, 并且绑定服务号)
    https://open.weixin.qq.com/connect/qrconnect?appid=<APPID>&redirect_uri=<RETURN_URL>&response_type=code&scope=snsapi_login&state=myapp_web#wechat_redirect


    剩下的过程相同:


    https://api.weixin.qq.com/sns/oauth2/access_token?appid=<APPID>&secret=<SECRET>&code=<CODE>&grant_type=authorization_code
    拿到 access_token

    https://api.weixin.qq.com/sns/userinfo?access_token=<ACCESS_TOKEN>&openid=<OPENID>
    得到 userinfo 数据
    insub
        19
    insub  
    OP
       2017-12-12 11:16:45 +08:00
    @pubby @hanzhao @mydns @qiayue
    各位,大家好,我错了
    现在确认,是我代码写错了,漏了一步 JSON.parse()
    实际上,snsapi_login 这个 scope,是包含了 snsapi_userinfo 的作用域的

    删不了贴了,微信我对不起你,对不起各位,我错了,我一定好好反省,以后不乱发帖了
    pubby
        20
    pubby  
       2017-12-12 11:16:47 +08:00
    我们有三个服务号一直都是用这样的方案,没问题。

    至于你怀疑最近微信是不是改权限了,这个不知道,最新的一个服务号是去年 4 月开通的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2653 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 15:28 · PVG 23:28 · LAX 07:28 · JFK 10:28
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.