V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
drymonfidelia
V2EX  ›  程序员

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

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

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

    你得先理解 OpenID 和 UnionID 。

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

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

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

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

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

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

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

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

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

    今晚就能写好,所有没有绑定手机号的用户弹窗绑定手机号,绑定之后关联余额,完事。
    weixind
        41
    weixind  
       2024-07-25 16:48:04 +08:00
    @laoertongzhi #10 和产品经理有啥关系?
    laoertongzhi
        42
    laoertongzhi  
       2024-07-25 17:04:19 +08:00
    @weixind

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

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

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

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