shop-wx/src/pinia/stores/wx.ts

194 lines
6.5 KiB
TypeScript
Raw Normal View History

import { pinia } from "@/pinia"
import { getOpenIdApi, getBalanceApi, qyLogin, getBalanceByQyUserid, fakeQyLoginApi } from "@/api/shop"
import { ab98UserDTO, GetBalanceResponse } from "@/api/shop/types"
import { useAb98UserStore } from "./ab98-user"
import { defineStore } from "pinia"
export const useWxStore = defineStore("wx", () => {
// 微信授权 code
const code = ref<string>("")
// 防止 CSRF 攻击的 state 参数
const state = ref<string>("")
// 用户 openid
const openid = ref<string>("")
// 用户 userid
const userid = ref<string>("");
// 剩余借呗
const balance = ref<number>(0);
// 已用借呗
const useBalance = ref<number>(0);
// 借呗总额
const balanceLimit = ref<number>(0);
// 企业id
const corpid = ref<string>("");
// 是否企业微信登录
const corpidLogin = ref<boolean>(false);
// 是否是柜子管理员
const isCabinetAdmin = ref<boolean>(false);
// 企业微信用户姓名
const name = ref<string>("");
// 企业微信用户id
const qyUserId = ref<number>(0);
// 汇邦云用户信息
const ab98User = ref<ab98UserDTO | null>(null);
const isFakeQyLogin = ref<boolean>(false);
// handleWxCallback 是否完成
const isHandleWxCallbackComplete = ref<boolean>(false);
// 设置 openid
const setOpenid = (id: string) => {
openid.value = id
}
const setBalance = (amount: number) => {
balance.value = amount;
}
const setIsCabinetAdmin = (isAdmin: boolean) => {
isCabinetAdmin.value = isAdmin;
}
const setAb98User = (user: ab98UserDTO) => {
ab98User.value = user;
const ab98UserStore = useAb98UserStore();
ab98UserStore.setUserInfo({
face_img: ab98User.value.faceImg || "",
success: true,
sex: ab98User.value.sex || "",
name: ab98User.value.name || "",
userid: ab98User.value.userid || "",
registered: true,
tel: ab98User.value.tel || "",
});
}
const refreshBalance = async () => {
if (corpid.value && userid.value) {
const res = await getBalanceByQyUserid(corpid.value, userid.value);
if (res && res.code == 0) {
balance.value = res.data.balance;
useBalance.value = res.data.useBalance;
balanceLimit.value = res.data.balanceLimit;
if (res.data.ab98User) {
setAb98User(res.data.ab98User);
}
}
}
}
const handleWxCallback = async (params: { corpid?: string; code?: string; state?: string; }) => {
console.log('handleWxCallback:', params)
isHandleWxCallbackComplete.value = false; // 开始处理,标记为未完成
if (params.code) {
code.value = params.code
state.value = params.state || state.value
corpid.value = params.corpid || corpid.value
corpidLogin.value = !!corpid.value;
console.log('corpid:', corpid.value)
console.log('corpidLogin:', corpidLogin.value)
try {
if (!corpid.value) {
// 调用获取 openid 的接口
const res = await getOpenIdApi({ code: params.code });
if (res && res.code == 0) {
openid.value = res.data
}
} else {
// 企业微信登录
const res = await qyLogin({ corpid: corpid.value, code: params.code, state: params.state})
if (res && res.code == 0) {
userid.value = res.data.userid;
openid.value = res.data.openid;
isCabinetAdmin.value = res.data.isCabinetAdmin === 1;
name.value = res.data.name;
qyUserId.value = res.data.qyUserId;
setAb98User(res.data.ab98User);
}
}
if (openid.value) {
// 获取用户余额
let balanceRes: ApiResponseData<GetBalanceResponse> | null = null;
if(corpid.value) {
balanceRes = await getBalanceByQyUserid(corpid.value, userid.value);
} else {
corpid.value = "wpZ1ZrEgAA2QTxIRcB4cMtY7hQbTcPAw";
balanceRes = await getBalanceApi(corpid.value, openid.value)
}
console.log('获取余额成功:', balanceRes)
if (balanceRes && balanceRes.code == 0) {
balance.value = balanceRes.data.balance;
useBalance.value = balanceRes.data.useBalance;
balanceLimit.value = balanceRes.data.balanceLimit;
if (!userid.value) {
userid.value = balanceRes.data.userid;
}
if (!ab98User.value && balanceRes.data.ab98User) {
setAb98User(balanceRes.data.ab98User);
}
/* if (!corpid.value) {
corpid.value = balanceRes.data.corpid;
} */
}
}
} catch (err) {
console.error('获取 openid 失败:', err)
} finally {
isHandleWxCallbackComplete.value = true; // 处理完成,标记为已完成
}
} else {
isHandleWxCallbackComplete.value = true; // 没有code参数直接标记为已完成
}
}
const fakeQyLogin = async () => {
isFakeQyLogin.value = true;
corpid.value = "wpZ1ZrEgAA2QTxIRcB4cMtY7hQbTcPAw";
corpidLogin.value = true;
userid.value = "woZ1ZrEgAAV9AEdRt1MGQxSg-KDJrDlA";
const res = await fakeQyLoginApi({ corpid: corpid.value, userid: userid.value})
if (res && res.code == 0) {
userid.value = res.data.userid;
openid.value = "oMRxw6Eum0DB1IjI_pEX_yrawBHw";
isCabinetAdmin.value = res.data.isCabinetAdmin === 1;
name.value = res.data.name;
qyUserId.value = res.data.qyUserId;
if (res.data.ab98User) {
setAb98User(res.data.ab98User);
}
}
isHandleWxCallbackComplete.value = true
}
// 检测 handleWxCallback 是否完成的异步函数
const waitForHandleWxCallbackComplete = async (timeout = 30000): Promise<boolean> => {
const startTime = Date.now();
while (!isHandleWxCallbackComplete.value) {
if (Date.now() - startTime > timeout) {
console.warn('等待 handleWxCallback 完成超时');
return false;
}
await new Promise(resolve => setTimeout(resolve, 100)); // 每100ms检查一次
}
return true;
}
return { code, state, openid, corpid, userid, balance, useBalance,
balanceLimit, isCabinetAdmin, corpidLogin, name, ab98User, qyUserId, isFakeQyLogin,
isHandleWxCallbackComplete, setOpenid, setBalance, handleWxCallback, setIsCabinetAdmin,
refreshBalance, setAb98User, fakeQyLogin, waitForHandleWxCallbackComplete }
})
/**
* @description setup 使 store
*/
export function useWxStoreOutside() {
return useWxStore(pinia)
}