pan-mini/utils/login.js

215 lines
5.2 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { PLATFORM,BASE_URL } from "./config";
const LOGIN_API = '/third-user/program/login';
function getLoginUrl() {
console.log("------login url------:",BASE_URL)
return BASE_URL+LOGIN_API
}
// 静默登录自动获取token
export const silentLogin = async () => {
try {
// 1. 检查本地token
const token = getLocalToken();
if (token) {
return token;
}
console.log("静默登录",token)
// 2. 执行平台静默登录
let data;
if (PLATFORM === 'mp-weixin') {
data = await wxSilentLogin();
} else if (PLATFORM === 'mp-kuaishou') {
data = await ksSilentLogin();
} else {
// 待处理
throw new Error("当前平台不支持")
}
// 3. 保存token
if (data) {
console.log("静默登录-----",data.token)
saveLocalToken(data.token);
saveUserInfo(data.user)
uni.$emit('LOGIN_SUCCESS', { token: data.token });
return data.token;
}
throw new Error('静默登录失败');
} catch (error) {
console.error('静默登录失败:', error);
throw error;
}
};
// 微信小程序静默登录
const wxSilentLogin = async () => {
try {
// 1. 获取微信code
const loginRes = await new Promise((resolve, reject) => {
uni.login({
provider: 'weixin',
success: resolve,
fail: reject
});
});
// 2. 获取小程序appId
const accountInfo = uni.getAccountInfoSync();
const appId = accountInfo.miniProgram.appId;
// 3. 发送登录请求并等待响应
const response = await new Promise((resolve, reject) => {
uni.request({
url: getLoginUrl(),
method: 'POST',
data: {
appid: appId,
code: loginRes.code,
},
success: (res) => {
if (res.statusCode === 200) {
console.log("login success",res)
resolve(res.data);
} else {
reject(new Error(`请求失败: ${res.statusCode}`));
}
},
fail: reject
});
});
// 4. 处理登录响应
if (response.code === 200) {
return response.data;
}
throw new Error(response.msg || '微信登录失败');
} catch (error) {
console.error('微信静默登录失败:', error);
throw error;
}
};
// 快手小程序静默登录
const ksSilentLogin = async () => {
try {
// 1. 获取快手code
const loginRes = await new Promise((resolve, reject) => {
uni.login({
provider: 'kuaishou',
success: resolve,
fail: reject
});
});
// 2. 发送登录请求
let url = getLoginUrl()
console.log("login:",url)
console.log("ksSilentLogin------",loginRes)
const accountInfo = uni.getAccountInfoSync();
const appId = accountInfo.miniProgram.appId;
console.log("appid:",appId)
// 2. 发送登录请求
const res = await new Promise((resolve, reject) => {
uni.request({
url: getLoginUrl(),
method: 'POST',
data: {
appid: appId,
code: loginRes.code,
},
success: (res) => {
if (res.statusCode === 200) {
console.log("login success",res)
resolve(res.data);
} else {
reject(new Error(`请求失败: ${res.statusCode}`));
}
},
fail: reject
});
});
// 3. 返回token
if (res.code === 0) {
return res.data;
}
throw new Error(res.msg || '快手登录失败');
} catch (error) {
console.error('快手静默登录失败:', error);
throw error;
}
};
// 获取本地token
const getLocalToken = () => {
const tokenKey = PLATFORM === 'mp-weixin' ? 'wx_token' : 'ks_token';
return uni.getStorageSync(tokenKey);
};
// 保存本地token
const saveLocalToken = (token) => {
const tokenKey = PLATFORM === 'mp-weixin' ? 'wx_token' : 'ks_token';
uni.setStorageSync(tokenKey, token);
};
// 保存用户信息
const saveUserInfo = (user) => {
uni.setStorageSync('user-info', user);
};
// 获取用户信息(需要授权)
export const getUserInfo = async () => {
try {
const res = await new Promise((resolve, reject) => {
uni.getUserInfo({
provider: PLATFORM === 'mp-weixin' ? 'weixin' : 'kuaishou',
success: resolve,
fail: reject
});
});
return res.userInfo;
} catch (error) {
console.error('获取用户信息失败:', error);
return null;
}
};
// 登出
export const logout = () => {
const tokenKey = PLATFORM === 'mp-weixin' ? 'wx_token' : 'ks_token';
uni.removeStorageSync(tokenKey);
};
// 检查登录状态
export const checkLoginStatus = async () => {
try {
const token = getLocalToken();
if (!token) return false;
console.log("tokenInfo:",token)
return true;
} catch (error) {
return false;
}
};
// 初始化登录状态
export const initLogin = async () => {
try {
console.log("初始化登录 开始。。。")
const isLoggedIn = await checkLoginStatus();
if (!isLoggedIn) {
await silentLogin();
}
return true;
} catch (error) {
console.error('初始化登录失败:', error);
return false;
}
};