微信登录如何同时保存openId和unionId

来源:5-6 处理注册逻辑

Jaye4347439

2019-04-11

老师您好!
如果同一个微信账号,在同一个网站上,要使用以下两种登录方式:
1.PC端的微信扫码登录。
2.手机微信浏览器中的微信服务号授权登录。
这两种方式,不属于同一种第三方登录,会有不同provideId和appId,同时他们获取的openId也不同,不过他们会有一个相同的unionId进行关联,样例代码WeixinUserInfo类里面也有unionId字段。
目前我遇到的问题是,在保存userconnection的时候,同时需要保存openId和unionId。查询用户的时候也同时查询openId和unionId。如果我只需要考虑登录,可以只记录unionId,但是一些其他业务,可能需要使用到openId。我研究了一下代码,需要重写JdbcUsersConnectionRepository 和 JdbcConnectionRepository。但是仅仅重写这两个类还不行。在微信用户注册之前,需要把openID等信息记录在session中,即在SocialAuthenticationFilter中下面这一行。

sessionStrategy.setAttribute(new ServletWebRequest(request), 
ProviderSignInAttempt.SESSION_ATTRIBUTE, new ProviderSignInAttempt(token.getConnection()));

记录到session里面的数据就没有unionId。我大致的看了一下,如果要同时记录openId,unionId需要重写的类很多,包括有 ConnectionData,ProviderSignInAttempt,SocialAuthenticationFilter,JdbcUsersConnectionRepository,JdbcConnectionRepository等等。这样是不是太麻烦了。有没有什么比较简单一点的办法,同时记录openId和unionId。

写回答

1回答

JoJo

2019-04-28

暂时想不到,因为unionId是微信特有的东西,并不是OAuth协议里的标准字段。。。

0
1
Jaye4347439
我取消了依赖 spring social 项目,模范手机验证码登陆的方式,重新写了整个社交登陆的代码
2019-05-09
共1条回复

Spring Security技术栈开发企业级认证与授权

Spring Security技术栈,REST风格开发常见接口,独立开发认证授权模块保证REST服务安全

2662 学习 · 1561 问题

查看课程