login.js 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. var utils = require('./utils');
  2. var constants = require('./constants');
  3. var Session = require('./session');
  4. /***
  5. * @class
  6. * 表示登录过程中发生的异常
  7. */
  8. var LoginError = (function () {
  9. function LoginError(type, message) {
  10. Error.call(this, message);
  11. this.type = type;
  12. this.message = message;
  13. }
  14. LoginError.prototype = new Error();
  15. LoginError.prototype.constructor = LoginError;
  16. return LoginError;
  17. })();
  18. /**
  19. * 微信登录,获取 code 和 encryptData
  20. */
  21. var getWxLoginResult = function getLoginCode(callback) {
  22. wx.login({
  23. success: function (loginResult) {
  24. wx.getUserInfo({
  25. success: function (userResult) {
  26. // console.log('成功了')
  27. callback(null, {
  28. code: loginResult.code,
  29. encryptedData: userResult.encryptedData,
  30. iv: userResult.iv,
  31. userInfo: userResult.userInfo,
  32. });
  33. },
  34. fail: function (userError) {
  35. // console.log('失败了')
  36. //jacksplwxy:用户拒绝授权后,打开设置,让用户进行授权
  37. wx.navigateTo({
  38. url: '../userInfos/userInfo'
  39. })
  40. // 暂时隐藏弹出设置框
  41. // wx.showModal({
  42. // title: '登录失败!',
  43. // content: '请选择允许获取您的公开信息',
  44. // success: (res) => {
  45. // wx.openSetting({
  46. // success: (res) => {
  47. // console.log(res);
  48. // if (res.authSetting['scope.userInfo']) {
  49. // wx.getUserInfo({
  50. // success: function (userResult) {
  51. // callback(null, {
  52. // code: loginResult.code,
  53. // encryptedData: userResult.encryptedData,
  54. // iv: userResult.iv,
  55. // userInfo: userResult.userInfo,
  56. // });
  57. // },
  58. // })
  59. // }
  60. // }
  61. // })
  62. // }
  63. // })
  64. },
  65. //源码:
  66. /*fail: function (userError) {
  67. var error = new LoginError(constants.ERR_WX_GET_USER_INFO, '获取微信用户信息失败,请检查网络状态');
  68. error.detail = userError;
  69. callback(error, null);
  70. },*/
  71. });
  72. },
  73. fail: function (loginError) {
  74. var error = new LoginError(constants.ERR_WX_LOGIN_FAILED, '微信登录失败,请检查网络状态');
  75. error.detail = loginError;
  76. callback(error, null);
  77. },
  78. });
  79. };
  80. var noop = function noop() {};
  81. var defaultOptions = {
  82. method: 'GET',
  83. success: noop,
  84. fail: noop,
  85. loginUrl: null,
  86. };
  87. /**
  88. * @method
  89. * 进行服务器登录,以获得登录会话
  90. *
  91. * @param {Object} options 登录配置
  92. * @param {string} options.loginUrl 登录使用的 URL,服务器应该在这个 URL 上处理登录请求
  93. * @param {string} [options.method] 请求使用的 HTTP 方法,默认为 "GET"
  94. * @param {Function} options.success(userInfo) 登录成功后的回调函数,参数 userInfo 微信用户信息
  95. * @param {Function} options.fail(error) 登录失败后的回调函数,参数 error 错误信息
  96. */
  97. var login = function login(options) {
  98. console.log('又走着了吗')
  99. options = utils.extend({}, defaultOptions, options);
  100. if (!defaultOptions.loginUrl) {
  101. options.fail(new LoginError(constants.ERR_INVALID_PARAMS, '登录错误:缺少登录地址,请通过 setLoginUrl() 方法设置登录地址'));
  102. return;
  103. }
  104. var doLogin = () => getWxLoginResult(function (wxLoginError, wxLoginResult) {
  105. if (wxLoginError) {
  106. options.fail(wxLoginError);
  107. return;
  108. }
  109. var userInfo = wxLoginResult.userInfo;
  110. // 构造请求头,包含 code、encryptedData 和 iv
  111. var code = wxLoginResult.code;
  112. var encryptedData = wxLoginResult.encryptedData;
  113. var iv = wxLoginResult.iv;
  114. var header = {};
  115. header[constants.WX_HEADER_CODE] = code;
  116. header[constants.WX_HEADER_ENCRYPTED_DATA] = encryptedData;
  117. header[constants.WX_HEADER_IV] = iv;
  118. // 请求服务器登录地址,获得会话信息
  119. wx.request({
  120. url: options.loginUrl,
  121. header: header,
  122. method: options.method,
  123. data: options.data,
  124. success: function (result) {
  125. var data = result.data;
  126. // 成功地响应会话信息
  127. if (data && data.code === 0 && data.data.skey) {
  128. var res = data.data
  129. if (res.userinfo) {
  130. Session.set(res.skey); //jacksplwxy:将skey缓存起来
  131. wx.setStorageSync('user_info_' + constants.WX_SESSION_MAGIC_ID, res.userinfo); //jacksplwxy:将用户信息存储起来
  132. options.success(userInfo);
  133. } else {
  134. var errorMessage = '登录失败(' + data.error + '):' + (data.message || '未知错误');
  135. var noSessionError = new LoginError(constants.ERR_LOGIN_SESSION_NOT_RECEIVED, errorMessage);
  136. options.fail(noSessionError);
  137. }
  138. // 没有正确响应会话信息
  139. } else {
  140. var noSessionError = new LoginError(constants.ERR_LOGIN_SESSION_NOT_RECEIVED, JSON.stringify(data));
  141. options.fail(noSessionError);
  142. }
  143. },
  144. // 响应错误
  145. fail: function (loginResponseError) {
  146. var error = new LoginError(constants.ERR_LOGIN_FAILED, '登录失败,可能是网络错误或者服务器发生异常');
  147. options.fail(error);
  148. },
  149. });
  150. });
  151. doLogin();
  152. };
  153. var setLoginUrl = function (loginUrl) {
  154. defaultOptions.loginUrl = loginUrl;
  155. };
  156. module.exports = {
  157. LoginError: LoginError,
  158. login: login,
  159. setLoginUrl: setLoginUrl,
  160. };