微信网页授权实现方法

有关微信网页授权

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 ;

posted @ 2017-10-22 22:39  奔走_在路上  阅读(3773)  评论(0编辑  收藏  举报