背景
- 公众号授权页面,前端采用的snsapi_userinfo,在用户尚未点击“获取完整性服务”的时候,服务端通过前端的code拿到了一个openid。
- 在用户点击了“获取完整性服务”之后,服务端通过前端的code拿到了另一个openid。
- 同一个用户在同一个公众号下两次获取的openid不一样。
原因
数据
如图,按微信官方说法,再未点击“获取完整性服务”前,获取到了一组虚拟账号数据。
解决方案
前端采用的snsapi_base进行无感知授权,后端用同样的手段,可以拿到用户信息。
第1步:获取code
https://open.weixin.qq.com/connect/oauth2/authorize?appid=${config.appid}&redirect_uri=${url}&response_type=code&scope=snsapi_base&state=123&connect_redirect=1#wechat_redirect
第2步:获取access_token和openid
https://api.weixin.qq.com/sns/oauth2/access_token?appid=xx&secret=xx&code=xx&grant_type=authorization_code
返回值:
//请求成功:{
// "access_token":"ACCESS_TOKEN",
// "expires_in":7200,
// "refresh_token":"REFRESH_TOKEN",
// "openid":"OPENID",
// "scope":"SCOPE"
//}
第3步:获取用户信息
https://api.weixin.qq.com/sns/userinfo?access_token=xx&openid=xx&lang=zh_CN
返回值:
//请求失败:{"errcode":40003,"errmsg":" invalid openid "}
//请求成功:{
// "openid": "OPENID",
// "nickname": NICKNAME,
// "sex": 1,
// "province":"PROVINCE",
// "city":"CITY",
// "country":"COUNTRY",
// "headimgurl":"https://thirdwx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/46",
// "privilege":[ "PRIVILEGE1" "PRIVILEGE2" ],
// "unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL"
//}
注意:以上步骤在用户关注和未关注该公众号的情况下,获取效果一致(亲测)。
总结
现在终于明白返回的快照字段是何意义了:
微信开放社区的问题
- 同一个公众号下的同一个用户,openid不一致?
- 为什么对于同样一个用户,openid会变啊
参考
- 微信开发详解scope—snsapi_base和snaspi_userinfo 区别
- 公众号非弹窗无感 获取微信昵称及头像,增加客户体验
- 微信网页授权能力调整公告
- 微信网页开发 /网页授权
以上信息仅供交流学习,如有错误请留言指正。