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

2018-03-04  本文已影响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;
};
上一篇下一篇

猜你喜欢

热点阅读