openid.js 2.33 KB
/**
 * 微信授权(openid)管理
 *
 * @description 处理小程序授权逻辑,包括 wx.login 和 miniProgramAuthAPI 调用
 * @module utils/openid
 */

import Taro from '@tarojs/taro'
import { miniProgramAuthAPI } from '@/api/wechat'
import { loginStatusAPI } from '@/api/user'

/**
 * 小程序授权
 * @description 调用 wx.login 获取 code,由后端授权获取 openid
 * @returns {Promise<{user: Object|null}>} 返回用户信息(如果已自动登录)
 *
 * @example
 * const user = await miniProgramAuth()
 * if (user) {
 *   console.log('已自动登录', user)
 * } else {
 *   console.log('需要手动登录')
 * }
 */
export async function miniProgramAuth() {
  try {
    // 1. 调用 wx.login 获取 code
    const { code } = await Taro.login()

    if (!code) {
      throw new Error('获取微信 code 失败')
    }

    // 2. 调用后端授权接口
    const res = await miniProgramAuthAPI({ code })

    if (res.code === 1) {
      return res.data.user || null
    } else {
      throw new Error(res.msg || '小程序授权失败')
    }
  } catch (err) {
    console.error('小程序授权失败:', err)
    throw err
  }
}

/**
 * 检查 openid 状态
 * @description 调用 loginStatusAPI 检查 is_openid
 * @returns {Promise<boolean>} 是否已授权
 *
 * @example
 * const isOpenid = await checkOpenidStatus()
 * if (!isOpenid) {
 *   await miniProgramAuth()
 * }
 */
export async function checkOpenidStatus() {
  try {
    const res = await loginStatusAPI()

    if (res.code === 1) {
      return res.data.is_openid
    } else {
      return false
    }
  } catch (err) {
    console.error('检查 openid 状态失败:', err)
    return false
  }
}

/**
 * 确保 openid 已授权并尝试自动登录
 * @description 如果未授权,则调用 wx.login 授权
 * @returns {Promise<{user: Object|null}>} 返回用户信息(如果已自动登录)
 *
 * @example
 * const user = await ensureOpenidAuthorized()
 * if (user) {
 *   console.log('已自动登录', user)
 * } else {
 *   console.log('已授权但未登录,需要检查登录状态')
 * }
 */
export async function ensureOpenidAuthorized() {
  const isOpenid = await checkOpenidStatus()

  if (!isOpenid) {
    // 未授权,调用 wx.login 授权
    return await miniProgramAuth()
  }

  // 已授权,返回 null(需要检查登录状态)
  return null
}