Files
Wechat/utils/login.js
T

105 lines
3.0 KiB
JavaScript

// utils/login.js
import {
applyWechatLoginData,
backfillUserProfileCache,
getSessionToken,
isWechatLoginSuccess,
} from './role-tab-bar';
import { restoreStaffContextAfterAuth } from './staff-api.js';
import { CLUB_API, getClubId, setClubId, buildClubHeaders } from './club-context';
const app = getApp();
/** 有 token 时静默刷新当前小程序 openid 绑定(支付 AppID 对齐) */
function silentRefreshWxBind(app) {
const token = getSessionToken(app);
if (!token) return;
wx.login({
success: (loginRes) => {
if (!loginRes.code || !app.globalData.apiBaseUrl) return;
wx.request({
url: app.globalData.apiBaseUrl + CLUB_API.refreshWxBind,
method: 'POST',
data: {
code: loginRes.code,
club_id: getClubId(app),
app_id: app.globalData.appId || '',
},
header: buildClubHeaders({
'content-type': 'application/json',
Authorization: 'Bearer ' + token,
}),
});
},
});
}
export function ensureLogin(options = {}) {
const silent = options.silent !== false;
const page = options.page || null;
const token = getSessionToken(app);
if (token) {
backfillUserProfileCache(app);
restoreStaffContextAfterAuth();
silentRefreshWxBind(app);
return Promise.resolve(true);
}
if (app.globalData.loginPromise) {
return app.globalData.loginPromise;
}
const loginPromise = new Promise(async (resolve, reject) => {
if (silent) {
wx.showLoading({ title: '自动登录中...', mask: true });
}
try {
const loginRes = await wx.login();
if (!loginRes.code) throw new Error('获取微信登录码失败');
const apiBaseUrl = app.globalData.apiBaseUrl;
if (!apiBaseUrl) throw new Error('服务器配置错误');
const clubId = getClubId(app);
const appId = app.globalData.appId || '';
const res = await new Promise((resolve, reject) => {
wx.request({
url: apiBaseUrl + CLUB_API.wechatLogin,
method: 'POST',
data: { code: loginRes.code, club_id: clubId, app_id: appId },
header: buildClubHeaders({ 'content-type': 'application/json' }),
success: resolve,
fail: reject,
});
});
const userData = res.data && (res.data.data || res.data);
if (res.statusCode === 200 && isWechatLoginSuccess(res.data) && userData) {
if (userData.club_id) {
setClubId(userData.club_id, app);
}
applyWechatLoginData(userData, page);
restoreStaffContextAfterAuth();
resolve(true);
} else {
const msg = res.data?.msg || '登录失败';
wx.showToast({ title: msg, icon: 'none' });
reject(new Error(msg));
}
} catch (error) {
wx.showToast({ title: error.message || '登录失败', icon: 'none' });
reject(error);
} finally {
if (silent) wx.hideLoading();
}
});
app.globalData.loginPromise = loginPromise;
loginPromise.finally(() => {
app.globalData.loginPromise = null;
});
return loginPromise;
}