zoukankan      html  css  js  c++  java
  • 微信网页授权实现方法

    有关微信网页授权

    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 ;

  • 相关阅读:
    java线程管理
    java进程间通信
    Possible multiple enumeration of IEnumerable
    Adding Search
    Working with SQL Server LocalDB
    ASP.NET Razor
    ASP.NET Razor
    modelstate.isvalid false
    Razor Intro
    open Command window here
  • 原文地址:https://www.cnblogs.com/DivHao/p/7712398.html
Copyright © 2011-2022 走看看