openid.js
2.33 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
/**
* 微信授权(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
}