//使用>>>先设置登录地址-再登录
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;
};