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

微信小程序接入登录获得用户 OpenID 和公众号不一样,查资料后发现需要 UnionID,但我们公众号网页登录没有用 snsapi scope,拿不到 UnionID,导致很多用户重复注册,有解吗?被用户投诉了好几次几万元余额没了

  •  1
     
  •   drymonfidelia · 127 天前 · 5190 次点击
    这是一个创建于 127 天前的主题,其中的信息可能已经有所发展或是发生改变。
    原本这个公众号是纯面向批发商的客服公众号,扫码关注就完成绑定,零售和网页是后加的,所以大量存量用户都没有获取 UnionID 的权限。最近新上了一个小程序(网页套壳),领导说必须要小程序这个流量入口。非常多用户重复注册导致登录错误账号,之前的余额没了。提示用户如果已有账号必须先绑定不现实,99% 用户不懂什么意思。
    60 条回复    2024-07-26 12:39:52 +08:00
    laoertongzhi
        1
    laoertongzhi  
       127 天前
    微信小程序和公众号 都挂在 一个开发者账号下。
    drymonfidelia
        2
    drymonfidelia  
    OP
       127 天前
    @laoertongzhi 都挂在一个开发者账号下获取到的 OpenID 也是不一致。主体都是同一个公司的
    gmyxds
        4
    gmyxds  
       127 天前
    1.在机制上,然后用户手动绑定,比如小程序和公众号授权之后,都要求用户绑定手机号,以手机号为账号判定一个用户。或者想办法把小程序和微信公众号关联起来。比如小程序登录之后生成一个 hashkey ,然后让用户把这个 hash-key 发给公众号,然后公众号接受 key 去绑定用户

    2.花钱,在微信开放平台开认证,然后创建一个应用,把你的小程序和公众号关联起来。就能拿到统一的 unionid 了。不是网页拿不拿到 unionid 问题,你没绑定就是拿不到的
    BeforeTooLate
        5
    BeforeTooLate  
       127 天前
    用户存量多吗,不多那就改方案用 UnionID 。
    应该没有通过 OpenID 获取 UnionID 方式吧,如果有倒是简单了转化下即可。
    存量用户先用手机号当作用户唯一标识,后期用户用 UnionID ,存量用户再登录的时候也存入 UnionID 。
    被用户投诉了好几次几万元余额没了,这个是什么意思?
    laoertongzhi
        6
    laoertongzhi  
       127 天前
    @drymonfidelia

    你得先理解 OpenID 和 UnionID 。

    用户在不同的公众号、小程序(不管是不是同一个主体)下,其 OpenID 就是不一样的。

    但如果公众号、小程序 都是挂在一个微信开发平台账号下,那么同一个用户,其 UnionID 就是一样的。
    gmyxds
        7
    gmyxds  
       127 天前
    @drymonfidelia 不同产品的 OpenID 不可能一样,一样的只可能是 UnionID
    drymonfidelia
        8
    drymonfidelia  
    OP
       127 天前
    @BeforeTooLate 因为用户进入小程序又创建了一个用户,登录了新用户导致看不到余额。我们平台为了用户操作方便,绑定了微信就不要求绑定手机号
    laoertongzhi
        9
    laoertongzhi  
       127 天前
    @gmyxds #7

    嗯嗯,我的本意是让他用 UnionID 。
    laoertongzhi
        10
    laoertongzhi  
       127 天前
    这种问题找你们的产品经理啊
    BeforeTooLate
        11
    BeforeTooLate  
       127 天前
    @drymonfidelia
    #7 那麻烦了,这种情况下你们拿的 openid 已经不具备用户标识属性了。
    drymonfidelia
        12
    drymonfidelia  
    OP
       127 天前
    @laoertongzhi 我尝试过这个接口,不知道为什么很多用户没有 unionid 字段
    @gmyxds 是的,我已经查到要用 unionid 了,来提问是因为获取不到
    drymonfidelia
        13
    drymonfidelia  
    OP
       127 天前
    @drymonfidelia 不知道是不是因为没有 snsapi 的权限的问题
    BeforeTooLate
        14
    BeforeTooLate  
       127 天前
    @drymonfidelia 把小程序和公众号都绑定再一个开发平台了吗?
    laoertongzhi
        15
    laoertongzhi  
       127 天前
    @drymonfidelia #12

    看官方的接口啊
    yiqiao
        16
    yiqiao  
       127 天前
    @BeforeTooLate 用户多也可以用 unionID
    #3 楼贴出的方法可以根据用户的 openid 获取 UnionID ,再通过小程序在注册的过程中合并账号。除非,他当时没有把 UnionID 合并起来。
    顺便问下,出现这种问题算谁的?产品?测试?还是开发?
    BeforeTooLate
        17
    BeforeTooLate  
       127 天前
    @yiqiao 看情况前面存量用户压根没有考虑到 UnionID ,现在改用 UnionID 方案,除非保证存量用户在登录小程序前,能在公众号网页页面再登录一次不然获取不到 UnionID 并存入,进而导致这部分直接去小程序登录的人无法判断是否已经注册了。
    blessyou
        18
    blessyou  
       127 天前
    @drymonfidelia #12 印象中用户没有实名认证绑定银行卡是没有 UnionID 的
    RandomJoke
        19
    RandomJoke  
       127 天前
    微信保证主体下唯一的办法就是 unionId ,要么就自己用手机号。有余额之类的东西,竟然不用手机号做唯一标识啊。。你要是只保存了 openid ,就很麻烦了,赶紧想办法把 unionId 补全,要么就让用户通过手机号关联,不然你的账户体系一定是通不了的,重复注册我理解问题不大,你只要做好唯一关联后,让他的 unionId 能关联上正确的自己的账号那么下次登录就对了
    BeforeTooLate
        20
    BeforeTooLate  
       127 天前
    @drymonfidelia
    >我尝试过这个接口,不知道为什么很多用户没有 unionid 字段
    需要这些用户重新进入授权页面获取的吧,是不是存在缓存。不可能部分用户获取不到 unionid 字段
    jstony
        21
    jstony  
       127 天前   ❤️ 3
    你可以把你的公众号和小程序都绑定在开放平台上,打通 openid 和 unionid ,你现在就有个三个 id ,一个是公众号 openid ,一个是小程序 openid ,一个是 unionid 。

    原来的公众号用户如果通过小程序登录,识别不到公众号账户下的资产是正常的,因为他们没有关联上。

    你可以在小程序上嵌入一个 webview ,将公众号登录页面放在里面,通过公众号登录拿到公众号的 openid ,而小程序的 openid 和 unionid 在小程序里获取,这样就把三个 id 串起来了。

    说白了也就是小程序的用户登录逻辑是通过 webview 嵌入的公众号页面实现的。后期如果发现用户二次打开的时候已经做过 id 打通,也可以直接做无感登录。
    icloudguizhou
        22
    icloudguizhou  
       127 天前
    @drymonfidelia #8 投诉就能退钱吗?之前小程序买东西不发货投诉也不退款,就是诈骗
    drymonfidelia
        23
    drymonfidelia  
    OP
       127 天前
    @laoertongzhi 官方文档我确实看过了,这个接口有很多用户的 union id 都获取不到,不知道是不是因为 #18 说的用户没有绑定银行卡的原因(感觉这个原因的话不太可能导致这么多用户出问题,已经让客服那边帮忙联系一部分用户核实了)还是#17 说的必须授权 snsapi 的原因(感觉更有可能是这个)
    @yiqiao
    drymonfidelia
        24
    drymonfidelia  
    OP
       127 天前
    @jstony 这个点子我也想到并尝试过了,问题是小程序 webview 嵌入公众号的登录页面没办法弹出 snsapi 那个授权窗口,授权不了 unionid
    LeoSpeaker
        25
    LeoSpeaker  
       127 天前   ❤️ 2
    静默登录拿不到 unionid 。
    你这个情况可以直接使用小程序嵌入 webview ,使用静默登录,然后通过小程序里面的 webview 的跳转到登录成功页面将登录后的参数发送给小程序作为储存即可。
    放弃小程序的登录接口。
    RandomJoke
        26
    RandomJoke  
       127 天前
    @drymonfidelia 理论上这个方法你不用 unionId 也可以,就是拿到公众号的 openId 查询是否有老用户,有就直接登录,没有就用两个 openId 一起注册,相当于两个 openId 做唯一标识。。
    Nitsuya
        27
    Nitsuya  
       127 天前   ❤️ 1
    小程序已获取到 小程序 OpenId + UnionId.
    前提下
    小程序里面套个网页做公众号静默授权,
    此时就有 公众号 OpenId + UnionId.
    在此时 UnionId 肯定是一致的, 公众号 OpenId 就能补全 UnionId 了并关联上小程序 OpenId.
    仅限微信, 支付宝不支持小程序做网页授权.

    现在你们数据已经乱套了 十分头痛的~
    drymonfidelia
        28
    drymonfidelia  
    OP
       127 天前
    @Nitsuya 现在确实问题很大,还有很多人又在通过小程序创建的新用户里面充值,导致不能先下线小程序避免进一步混乱,只能暂停小程序注册
    drymonfidelia
        29
    drymonfidelia  
    OP
       127 天前   ❤️ 1
    #25 #27 楼的思路我理解了,用静默登录拿到的 openid 和 unionid 绑定好像确实可以,非常感谢
    Nitsuya
        30
    Nitsuya  
       127 天前
    @drymonfidelia #28 你可以先把 小程序创建的用户全部 剔除来... 改完逻辑. 重新授权 的时候, 再把钱加回去... 唯一的办法了~.
    bestie
        31
    bestie  
       127 天前
    1. 首先,公众号那边修改原来的授权回调页面,使用 snsapi_userinfo ,以确保之后从公众号这边进来的都能拿到 unionid
    2. 新建一个授权回调页面,使用 snsapi_base 静默授权,这个页面嵌入到小程序里,参照#25 说的,用这个 webview 里返回的 openid ,再加上你从小程序这边获取的 unionid 做绑定,这样小程序这边进来的用户和公众号的通了,当然你还要处理两边数据合并的问题
    Nitsuya
        32
    Nitsuya  
       127 天前   ❤️ 1
    @drymonfidelia #29 还要提醒一下, 只要 AppId 一样, 不管是 OpenId 还是 UnionId, 前 6 位一定是一样的... 记得授权的时候 校验一下前 6 位. 防止别人骚操作 公众号或开放平台, 导致数据错乱进了数据库 是无法纠正的噩耗!
    markgor
        33
    markgor  
       127 天前
    1 、先去开放平台 注册+认证+绑定对应的小程序和公众号;
    2 、小程序的直接获取 unionId 即可。公众号的通过获取用户基本信息接口,传递 openId 过去,换取 unionId 回来。
    3 、此时 unionId 均一致了,用户侧做个账户选择就好了
    wOuv7i4e7XxsSOR1
        34
    wOuv7i4e7XxsSOR1  
       127 天前
    这是不测试就上线?但凡懂一点微信开发,多看一点文档,都能知道这个问题吧
    bestie
        35
    bestie  
       127 天前
    @markgor 如果授权的时候是 snsapi_base ,是拿不到 unionid 的,2 走不通
    markgor
        36
    markgor  
       127 天前
    @bestie 为什么走不通?获取用户基本信息(UnionID 机制)就是通过提供 openID 换取 unionID 的啊
    ixwen
        37
    ixwen  
       127 天前
    小程序注册的时候用 webview 获取公众号的 openid 然后将小程序的 openid 跟公众号的 openid 关联一下
    dream7758522
        38
    dream7758522  
       127 天前 via Android
    你这个用户数据已经全乱了,我觉得只能公众号和小程序绑定同一手机号,打通数据了。
    vacuitym
        39
    vacuitym  
       127 天前
    要注册一个微信开放平台账号,然后小程序和公众号绑定到同一个开放平台,这样才能拿到统一的 unionId
    hlwjia
        40
    hlwjia  
       127 天前   ❤️ 5
    以目前团队对微信生态的了解程度,不管你现在的数据是乱还是没乱,都直接用手机号作为 ID 来关联用户吧

    这是最快、最完善的解决方案,不用想什么 union id 了,又得搞权限,又得梳理逻辑。

    今晚就能写好,所有没有绑定手机号的用户弹窗绑定手机号,绑定之后关联余额,完事。
    weixind
        41
    weixind  
       127 天前
    @laoertongzhi #10 和产品经理有啥关系?
    laoertongzhi
        42
    laoertongzhi  
       127 天前
    @weixind

    我是产品经理,从我的岗位角色出发,我觉得应该找产品经理。

    账号体系出问题了,产品经理不介入进来,不给解决方案,我自己过不了自己这关。
    kucy
        43
    kucy  
       127 天前
    要求绑定手机号。通过手机号识别用户
    linhongjun
        44
    linhongjun  
       127 天前
    最好还是以手机号绑定 作为用户识别吧
    yancyzhao
        45
    yancyzhao  
       127 天前   ❤️ 1
    微信的生态很好,设计的用户体系也很好,但是一定不要想不开图省事依赖它的机制。尤其是用户标识,用身份证号、手机号甚至自己生成一个吧。万一哪天拓展业务跑去支付宝开小程序、抖音小程序、XX 、XXX ,你可咋整。
    sampeng
        46
    sampeng  
       127 天前
    先不说锅的问题。。。这是一开始就偷懒了。看到个 openid 就当唯一标识了。。结果发现还有一个 id 。。
    leoskey
        47
    leoskey  
       127 天前
    3 楼提醒的接口可尝试。
    1. 公众号新用户都保存 unionid
    2. 通过 3 楼提醒的接口批量更新老用户 unionid
    3. 小程序用户判断 unionid 是否在公众号系统存在
    AIGC2D
        48
    AIGC2D  
       126 天前
    不同公众号,小程序的 openid 都不一致,只有绑定了开发者平台的 unionid 才是一致的
    samnya
        49
    samnya  
       126 天前
    就如上所说,首先做好账号合并的逻辑,能够把两个账号的资产合并或者绑定。
    然后可以用公众号批量获取用户资料的接口,先把已关注公众号的这部分用户 UnionID 获取回来做静默绑定。
    https://developers.weixin.qq.com/doc/offiaccount/User_Management/Get_users_basic_information_UnionID.html#UinonId
    对于没有关注公众号的,只能在小程序里面做一个老用户资产绑定的按钮或者弹窗,跳转进 webview ,然后再把登录信息传给小程序做绑定了。
    hwb
        50
    hwb  
       126 天前
    要是不想折腾又不想影响用户体验。用手机号做一次绑定,分别记录公众号和小程序的 openId ,直接用手机号来判定唯一账号,后续登录还是用公众号和小程序的 openID 去查手机号(或者 userId) 。这个方案只徐亚每个平台用手机号登录一次,后续还是直接拿 openID 。
    注意区号
    chanChristin
        51
    chanChristin  
       126 天前
    直接强制绑定手机号,不绑定不让用,现在到处都是手机号验证,因为这玩意好用啊。
    rookie8
        52
    rookie8  
       126 天前
    注意啊,是用户,用户,用户必须在微信开放平台( open.weixin.qq.com )绑定公众号后,才会有 UnionID 的,用户不绑定,没有 UnionID 。
    ShotaconXD
        53
    ShotaconXD  
       126 天前   ❤️ 2
    不是很理解为什么非要重度依赖微信, 回头你要加入个支付宝小程序怎么办, 抖音小程序呢?
    唯一标识你要从用户身上找啊, 你从平台上找, 那不是给自己找麻烦.
    demoplayer88
        54
    demoplayer88  
       126 天前
    做好账号合并吧 几年前第一次做微信小程序的时候也被这个 openid 坑过 还好是开发的时候就发现了 这个机制从微信小程序刚出来的时候就是这样的了 好几年了 只能说产品没有做好调研 测试开发也不知道 这个线上事故挺严重的
    hlwjia
        55
    hlwjia  
       126 天前
    这是不是产品的锅,可能还不那么简单判断。

    首先产品经理未必需要知道同一个用户在不同平台的 open_id 是不一样,这个问题应该是技术调研出来的,至于调研出来后谁负责提方案解决,可能每个公司不一样,但一般都是产品和技术商量着来。
    webszy
        56
    webszy  
       126 天前
    @ShotaconXD 我觉得你说的很对,别的平台的 id 只能作为辅助信息,根本还是得让用户用自己平台的 id ,这样才能捆绑住用户,增加留存
    Felldeadbird
        58
    Felldeadbird  
       126 天前
    没有 UnionID 也没关系,做一个数据绑定就好了。找手机号用绑定衔接。

    如果要把账号数据合并,需要做一些特殊处理,具体要看你们公司业务。
    zhw2590582
        59
    zhw2590582  
       126 天前
    做过相关微信开发的都知道 openid 是不一样的,这么大的问题,你们居然不测试
    pcdoggy
        60
    pcdoggy  
       126 天前
    不要重度依赖微信,自己系统的用户 ID 呢?
    手机号也是重点(虽然手机号也可能换),现在手机号都是要实名的,之后的唯一性有保证。
    小程序的 webview 功能交互挺坑的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2663 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 15:32 · PVG 23:32 · LAX 07:32 · JFK 10:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.