美文网首页
微信小程序登录 客户端 wafer2-client-sdk

微信小程序登录 客户端 wafer2-client-sdk

作者: 路口师傅 | 来源:发表于2018-03-04 11:36 被阅读0次
    //使用>>>先设置登录地址-再登录
    var qcloud = require('./vendor/wafer2-client-sdk/index')
    var config = require('./config')
    
    qcloud.setLoginUrl(config.service.loginUrl)/*`${host}/weapp/login`*/
    qcloud.login(options)//option = {succ:function(){},fail:function(){}}
    
    

    client\vendor\wafer2-client-sdk\index.js

    qcloud = require('./vendor/wafer2-client-sdk/index')
      //var constants = require('./lib/constants');
      //var login = require('./lib/login');//++++++++++++++++++++
      //var Session = require('./lib/session');
      //var request = require('./lib/request');
      //var Tunnel = require('./lib/tunnel');
    {
        login: login.login,//++++++++++++++++++++
        setLoginUrl: login.setLoginUrl,
        LoginError: login.LoginError,
        clearSession: Session.clear,
        request: request.request,
        RequestError: request.RequestError,
        Tunnel: Tunnel,
    
        constants_key: constants[key]
        ......
    }
    

    client\vendor\wafer2-client-sdk\lib\login.js

    ###模块输出
    module.exports = {
        setLoginUrl: setLoginUrl,//function
        login: login,//function
        LoginError: LoginError,//{}
    };
    
    ###默认对象用于临时缓存登录地址
    var noop = function noop() {};
    var defaultOptions = {
        method: 'GET',
        success: noop,
        fail: noop,
        loginUrl: null,
    };
    
    ###setLoginUrl用于设置登录地址
    var setLoginUrl = function (loginUrl) {
        defaultOptions.loginUrl = loginUrl;
    };
    
    ###login调用登录方法,先判断登录地址是否存在
    /**
     * @method
     * 进行服务器登录,以获得登录会话
     *
     * @param {Object} options 登录配置
     * @param {string} options.loginUrl 登录使用的 URL,服务器应该在这个 URL 上处理登录请求
     * @param {string} [options.method] 请求使用的 HTTP 方法,默认为 "GET"
     * @param {Function} options.success(userInfo) 登录成功后的回调函数,参数 userInfo 微信用户信息
     * @param {Function} options.fail(error) 登录失败后的回调函数,参数 error 错误信息
     */
    var login = function login(options) { 
        options = utils.extend({}, defaultOptions, options);
        
        if (!defaultOptions.loginUrl) {
            options.fail(new LoginError(constants.ERR_INVALID_PARAMS, '登录错误:缺少登录地址,请通过 setLoginUrl() 方法设置登录地址'));
            return;
        }
        (登录地址存在,顺序执行下面代码)
     }
    
    Session = require('./session')
    ###检查SESSION_KEY=== wx.getStorageSync('weapp_session_' + constants.WX_SESSION_MAGIC_ID;)
    var session = Session.get();//得到SESSION_KEY
        if (session) {
            wx.checkSession({
                success: function () {
                    options.success(session.userInfo);
                },
    
                fail: function () {
                    Session.clear();
                    doLogin();=======检查是否在线,重新登陆
                },
            });
        } else {
            doLogin();===============检查是没有session,登陆
        }
    
    var doLogin = () =>{
        //执行函数(代码在下面),传入回调,获取 code 和 encryptData等到后台验证
        getWxLoginResult(function (wxLoginError, wxLoginResult) {
             if (wxLoginError) {
                  options.fail(wxLoginError);
                  return;
             }
    
            var userInfo = wxLoginResult.userInfo;
    
            // 构造请求头,包含 code、encryptedData 和 iv
            var code = wxLoginResult.code;
            var encryptedData = wxLoginResult.encryptedData;
            var iv = wxLoginResult.iv;
            var header = {};
    
            header[constants.WX_HEADER_CODE] = code;
            header[constants.WX_HEADER_ENCRYPTED_DATA] = encryptedData;
            header[constants.WX_HEADER_IV] = iv;
    
            // 请求服务器登录地址,获得会话信息
            wx.request({
                url: options.loginUrl,
                header: header,
                method: options.method,
                data: options.data,
    ------------------------------------------服务器端代码待续(node)
                success: function (result) {
                    var data = result.data;
    
                    // 成功地响应会话信息
                    if (data && data.code === 0 && data.data.skey) {
                        var res = data.data
                        if (res.userinfo) {
                            //wx.setStorageSync(SESSION_KEY, res.skey);
                            Session.set(res.skey);//服务器返回的3rd_session
                            options.success(userInfo);
                        } else {
                            var errorMessage = '登录失败(' + data.error + '):' + (data.message || '未知错误');
                            var noSessionError = new LoginError(constants.ERR_LOGIN_SESSION_NOT_RECEIVED, errorMessage);
                            options.fail(noSessionError);
                        }
                    // 没有正确响应会话信息
                    } else {
                        var noSessionError = new LoginError(constants.ERR_LOGIN_SESSION_NOT_RECEIVED, JSON.stringify(data));
                        options.fail(noSessionError);
                    }
                },
    
                // 响应错误
                fail: function (loginResponseError) {
                    var error = new LoginError(constants.ERR_LOGIN_FAILED, '登录失败,可能是网络错误或者服务器发生异常');
                    options.fail(error);
                },
    ---------------------------------------------------
            })
        }
    }
    
    /**
     * 微信登录,获取 code 和 encryptData
     */
    var getWxLoginResult = function getLoginCode(callback) {
        wx.login({
            success: function (loginResult) {
              console.log(loginResult)
              //{errMsg: "login:ok", code: "003f7qXh1wIXjAessLUg1sXmXh1f7pXr"}
            
                wx.getUserInfo({
                    success: function (userResult) {
                        console.log(userResult)
                        callback(null, {
                            code: loginResult.code,
                            encryptedData: userResult.encryptedData,
                            iv: userResult.iv,
                            userInfo: userResult.userInfo,
                        });
                    },
    
                    fail: function (userError) {
                        var error = new LoginError(constants.ERR_WX_GET_USER_INFO, '获取微信用户信息失败,请检查网络状态');
                        error.detail = userError;
                        callback(error, null);
                    },
                });
            },
    
            fail: function (loginError) {
                var error = new LoginError(constants.ERR_WX_LOGIN_FAILED, '微信登录失败,请检查网络状态');
                error.detail = loginError;
                callback(error, null);
            },
        });
    };
    

    其它

    ###登录错误构造函数
    /***
     * @class
     * 表示登录过程中发生的异常
     */
    var LoginError = (function () {
        function LoginError(type, message) {
            Error.call(this, message);
            this.type = type;
            this.message = message;
        }
    
        LoginError.prototype = new Error();
        LoginError.prototype.constructor = LoginError;
    
        return LoginError;
    })();
    -----
    utils = require('./utils');
    /**
     * 拓展对象 == utils.extend({}, {a:1}, {b:2}) = {a:1,b:2}
     */
    exports.extend = function extend(target) {
        var sources = Array.prototype.slice.call(arguments, 1);
    
        for (var i = 0; i < sources.length; i += 1) {
            var source = sources[i];
            for (var key in source) {
                if (source.hasOwnProperty(key)) {
                    target[key] = source[key];
                }
            }
        }
    
        return target;
    };
    

    相关文章

      网友评论

          本文标题:微信小程序登录 客户端 wafer2-client-sdk

          本文链接:https://www.haomeiwen.com/subject/ywsffftx.html