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" import { WxUserDTO } from "@/api/users/types" export const useWxStore = defineStore("wx", () => { // 微信授权 code const code = ref("") // 防止 CSRF 攻击的 state 参数 const state = ref("") // 用户 openid const openid = ref("") // 用户 userid const userid = ref(""); // 剩余借呗 const balance = ref(0); // 已用借呗 const useBalance = ref(0); // 借呗总额 const balanceLimit = ref(0); // 企业id const corpid = ref(""); // 是否企业微信登录 const corpidLogin = ref(false); // 是否是柜子管理员 const isCabinetAdmin = ref(false); // 企业微信用户姓名 const name = ref(""); // 企业微信用户id const qyUserId = ref(0); // 汇邦云用户信息 const ab98User = ref(null); const isFakeQyLogin = ref(false); // handleWxCallback 是否完成 const isHandleWxCallbackComplete = ref(false); const wxUserDTO = ref(null); // 设置 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 | 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 => { 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; } const setWxUserDTO = (userDTO: WxUserDTO | null) => { wxUserDTO.value = userDTO; } return { code, state, openid, corpid, userid, balance, useBalance, balanceLimit, isCabinetAdmin, corpidLogin, name, ab98User, qyUserId, isFakeQyLogin, isHandleWxCallbackComplete, wxUserDTO, setOpenid, setBalance, handleWxCallback, setIsCabinetAdmin, refreshBalance, setAb98User, fakeQyLogin, waitForHandleWxCallbackComplete, setWxUserDTO } }) /** * @description 用于在 setup 外使用 store */ export function useWxStoreOutside() { return useWxStore(pinia) }