微信网页受权实现方法

有关微信网页受权

let wechat = {
    getCode:function(appids){
        /**
         * 获取微信code
         */
        let appid = appids;
        let href = window.location.href;
        let redirect_uri = encodeURI(href.split("#")[0]);
        redirect_uri = redirect_uri.replace(/&/g, '%26');
        window.location.href = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + appid + "&redirect_uri=" + redirect_uri+"&response_type=code&scope=snsapi_userinfo&state=abcdefghigklmnopqrstuvwxyz#wechat_redirect";
    },
    getUrlStr : function(name){
        /**
         * 获取地址栏参数
         *
         *
         */
        let reg = new RegExp("(^|\\?|&)" + name + "=([^&]*)(\\s|&|$)","i");
        if(reg.test(window.location.href)){
            return unescape(RegExp.$2.replace(/\+/g," "))
        }
        return undefined
    }
}

export default wechat;

 

第一步:用户赞成受权,获取code:
  经过调用 wechat.getCode();方法 将微信公众号的appid 传入,引导用户进去微信受权页面,须要注意的是 redirect_uri 就是当前页面地址, scope 的参数有两种,官网写的很详细,我主要用的是 snsapi_base这种受权方式。须要注意的是 若是是用 vue 的 hash 模式会存着# 号,
微信在受权的时候回把#号干掉,因此须要注意一下。
第二步:经过code获取APPID:
  通过受权,微信会回跳到 redirect_uri 地址,这是连接上会增长code=“***”一串参数,经过 wechat.getUrlStr(code)就能够获取到微信传过来的code参数,而后将code传到后台,后台经过code 进行计算,会获得微信用户的APPID;而后再返回APPID给前端。
以上两步就完成微信的受权,而后拿到微信用户的APPID。
须要注意的是,code是有失效性的,只能用一次,第二次再用相同的code传给后台,后台是拿不到APPID的,因此,在进去入页面的时候须要判断是否经过了受权,而后再判断时候须要再次受权。

这是可能会用到存localStorage,如下函数能够给存储加一个时效,就和存cookie相似。
localStore: function (key, data, expires) {
        /**
         * 基于本地存储的缓存模块
         *
         * @param {String} key 键名
         * @param {any} data 数据
         * @param {Number} expires 有效期(秒), 0永久
         * @returns {any}
         *
         * 使用例子:
         * localStore('aaa', { a: 1 }); // 永久存储
         * localStore('bbb', { b: 2 }, 3); // 存储3秒
         *
         * setTimeout(function() {
         *     console.log(localStore('aaa'), localStore('bbb')); // {a: 1} {b: 2}
         * }, 1000);
         *
         * setTimeout(function() {
         *     console.log(localStore('aaa'), localStore('bbb')); // {a: 1} undefined
         * }, 4000);
         */
        const localStorage = window.localStorage;
        // 不兼容返回空
        if (!localStorage) {
            return undefined;
        }
        let now = +new Date(); // 当前时间戳
        // 有值则存储数据
        if (data) {
            let storeData = {
                data: data,
                expires: 0 // 有效期
            };
            if (expires) {
                storeData.expires = now + expires * 1000; // 到期时间戳
            }
            // 没法存入状况
            try {
                return localStorage.setItem(key, JSON.stringify(storeData));
            } catch (er) {
                // 不作处理统一返回
            }
        } else {
            // 获取数据
            try {
                let storeData = JSON.parse(localStorage.getItem(key));
                if (storeData.expires === 0 || now <= storeData.expires) {
                    return storeData.data;
                }
                return localStorage.removeItem(key); // 清理过时数据
            } catch (er) {
                // 不作处理统一返回
            }
        }
        return undefined;
    }

使用方法    localStore('bbb', { b: 2 }, 3);  这是存数据,前端

取数据  localStore(bbb“”) 若是在设置的时间内,那就直接返回的存的数据,若是过了时间就会直接返回 undefined ;vue

相关文章
相关标签/搜索