Skip to content
官方QQ交流群
技术交流1:87208295   点此加入
技术交流2:787747122   点此加入
官网
云控制台
开放平台
关注微信公众号
代码仓库: 码云

微信扫码登录

1、 创建 项目/extend/wxlogin-v3 文件夹

2、 创建 项目/pages/wxLogin.vue,内容如下

vue

<!--
    【整体思路流程】
    1. 先通过后端接口获取appid等敏感数据,保存到data中。
    2. 将获取到的数据传递给组件,如果正确无误扫码登录框就自动出来了。
    3. 用户扫码登录后,会自动跳转到重定向的回调域地址(解析code),也就是前端当前的页面。
    4. 解析成功或失败,前端就可以拿着code去找接口换数据了,进行您的逻辑即可。
    ———————————————————————————————————————————————————————————
    【注意事项】
    1. [非常重要] 前端和后端必须都在一个回调域下,比如前端是:www.abc.com/index,
    后端的是:www.abc.com/admin,这样就处于同一个【www.abc.com】回调域下。如果前端是abc,后端是def,则无法互通。
    2. 一定要等敏感数据(appid等)请求过来后,再传递给组件!我是用的if暂时不渲染!
    3. redirect_uri 是回调域,重定向的地址,必须是微信开放平台里设置好的回调域(找后端看),咱们测试默认的localhost,什么192.168.xx 统统不行,
    所以每次调试必须部署到线上进行测试,非常麻烦。
    如果想要解决,请访问:https://wangjiabin.blog.csdn.net/article/details/127787561
    ———————————————————————————————————————————————————————————
    这个扫码登录操作,必须要和后端进行协商,这些参数你不知道是什么、怎么做的时候,要去问后端!
-->

<template>
    <div>
        <!-- 微信扫码登录框 -->
        <!-- 配置说明请参考文章底部Props,或直接访问组件文档:https://github.com/toMatthew/vue-wxlogin -->
        <div v-if="sensitive != null">
            <wxlogin
            :appid="sensitive.appid"
            :scope="sensitive.scope"
            :redirect_uri="redirect_uri"
            state=""
            />
        </div>
        <!-- END -->

        <!-- 数据还未请求过来 -->
        <div v-else>二维码加载中...</div>
        <!-- END -->
    </div>
</template>

<script>
export default {
    data() {
        return {
            // 敏感数据(appid等)
            sensitive: null,

            // 重定向的路径
            redirect_uri: null,
        }
    },

    mounted() {
        // 获取要重定向的路径(本页面url)
        this.getRedirect()

        // 获取敏感数据(appid等)
        this.getSensitive()
    },

    methods: {

        /**
         * 获取要重定向的路径(本页面url)
         * @description 赋值到本地,传递给组件
         * @return void
         */
        getRedirect() {
            // 注意要仅在客户端执行此段代码
            if(process.client) {
                // 获取本页面的域名,也就是下面的代码(需要UrlEncode编码)
                this.redirect_uri = encodeURIComponent(window.location.href)
            }
        },

        /**
         * 获取敏感数据(appid等)
         * @description 赋值到本地,传递给组件
         * @return void
         */
        getSensitive() {
            // 请求接口
            this.$axios.post(`XXX`).then(res => {
                // console.log(res)
                this.sensitive = res.data.data
                // 检测是否扫码登录成功(因为用户扫码登录后,会刷新页面,必须进行检测)
                this.testing()
            })
        },

        /**
         * 检测是否扫码登录成功
         * @description 判断检测url上有没有code拼接
         * @return void
         */
        testing() {
            // 获取URL上code
	        const code = this.getUrlParam('code')
            // 判断是否存在code
            if(code == null || code == '' || code == undefined) {
                // code为空
                // 意味着没有扫码登录,您的逻辑...
            } else {
                // code存在,调用接口获取登录信息
                console.log('【当前code】', code)
                this.getInfo(code)
            }
        },

        /**
         * 获取登录信息
         * @description 通过拿到的code,去接口换登录信息
         * @param {String} code - code
         * @return 
         */
        getInfo(code) {
            // 请求接口
            this.$axios.post(`XXX`, { code: code }).then(res => {
                // 判断code码
                // 获取失败
                if(res.data.code == 0) {
                    // 要做的操作...
                    if(process.client) {
                        // 大部分是清空url上的code参数并跳转回本页面
                        this.delUrlParam(window.location.href)
                    }
                }
                
                // 获取成功
                else {
                    // 业务逻辑
                    console.log(res)
                    // 回跳到原页面(去掉URL上的code参数)
                    this.delUrlParam(window.location.href)
                }
            })
        },

        /**
         * 解析URL参数
         * @description 截取路由参数
         * @param {String} name - 要解析的路由参数
         * @return String
         */
        getUrlParam(name) {
            let reg = new RegExp('(^|&)'+ name + '=([^&]*)(&|$)')
            let r = window.location.search.substr(1).match(reg)
            if(r != null){// ok
                return unescape(r[2])
            }
            // false
            return null
        },

        /**
         * 删除url路径指定参数
         * @description 去除地址栏url上的code参数,回到原页面
         * @param {String} url - URL
         * @param {String} key - KEY
         * @return String
         */
        delUrlParam(url, key = 'code') {
            let baseUrl = url.split('?')[0] + '?';
            let query = url.split('?')[1];
            if (query.indexOf(key) > -1) {
                let obj = {};
                let arr = query.split('&');
                for (let i = 0; i < arr.length; i++) {
                    arr[i] = arr[i].split('=');
                    obj[arr[i][0]] = arr[i][1];
                }
                delete obj[key];
                let url =
                    baseUrl +
                    JSON.stringify(obj)
                        .replace(/[\"\{\}]/g, '')
                        .replace(/\:/g, '=')
                        .replace(/\,/g, '&');
                // return url;
                window.history.pushState({},0,url);//跳转页面
            } else {
                // return url;
                window.history.pushState({},0,url);//跳转页面
            }
        },
    }
}
</script>
<style scoped>
</style>

Copyright © 2017 10yun.com | 十云提供计算服务-IPV6 | ctocode组开发