业务需求场景:登录用户 — 微信分享H5页面URL — 好友(非登录用户)打开分享页面时,要求获取用户授权,拿到非登录用户的微信相关信息才可以继续访问
问题描述:有部分用户反馈,页面访问不正常即,打开分享页面,进入了微信快照页,并且右下角有提示,需要用户点击【使用完整服务】后,才能正常拉取授权进入分享页
官方描述:快照页将会默认对用户屏蔽网页授权弹窗,用户在快照页中仅可进行滑动浏览操作,其他交互将被限制,并提示用户 “该网页需获取个人信息才可使用完整服务,当前仅可浏览部分内容”。用户如需要使用完整网页服务,可轻触右下角 “使用完整服务” 按钮触发授权弹窗,用户确认后进入原网页。
微信网页授权能力调整公告https://developers.weixin.qq.com/community/minihome/doc/000c2c34068880629ced91a2f56001
授权流程:(vue项目为例)
解决方案:
首先要明白为什么会进入快照页,客观看这里:
现有的业务代码逻辑正好命中不规范中第一条: 访问网页时就去拉取授权
猜想,如果在拉取授权前跳转一个过渡页,过渡页明确告知用户要去拉取微信授权获取个人信息,且由用户点击确定按钮操作后,再执行网页授权逻辑,这样就符合微信授权规范了吧?修改授权逻辑,增加过渡页:
测试,ok,完美解决分享页面拉取授权进入快照页问题 ~
授权过渡页逻辑代码:(供参考)
- <div>
- <h2 class="double-pd14">正在获取授权,请耐心等待...h2>
-
-
- <confirm-dialog
- :is-show-dialog="showDialog"
- :show-cancel-btn="false"
- dialog-title="授权确认提示xxxxxx"
- dialog-message="是否允许获取您的微信授权xxxxxxx"
- @confirmEvents="onSetWxAuthHandle"
- />
- div>
-
- <script>
- export default {
- name: 'wx-auth-page',
- components: {
- confirmDialog
- },
- data () {
- return {
- showDialog: false
- }
- },
- created () {
- this.onCheckWxRedirect()
- },
- methods: {
- async onCheckWxRedirect () {
- const {
- code,
- state
- } = this.$route.query
-
- // 判断是否授权重定向
- if (code && state === 'shareLogin') {
- // 重定向回来,业务逻辑
- // 请求接口续签token,跳转分享页
- } else {
- // 非重定向,唤起授权提示
- this.showDialog = true
- }
- },
-
- // 发起微信授权
- async onSetWxAuthHandle () {
- const {
- origin,
- pathname
- } = this.onReturnWindowOpt()
- this.showDialog = false
- // 接口逻辑略
- await setWxOpenAuth({
- state: 'shareLogin',
- redirectUrl: encodeURIComponent(origin + pathname)
- })
- },
-
- // 失败跳转登录,错误补偿机制
- wxAuthErrorEffect () {
- this.$toast('授权失败')
- const { origin } = this.onReturnWindowOpt()
- window.location.replace(`${origin}${PRODUCT_NAME}login`)
- },
-
- onReturnWindowOpt () {
- const {
- origin,
- pathname
- } = window.location
- return {
- origin,
- pathname
- }
- }
- }
- }
- script>