af-mobile-client-vue3 1.4.2 → 1.4.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +115 -115
- package/src/api/user/index.ts +45 -45
- package/src/components/data/XCellList/index.vue +8 -0
- package/src/components/data/XCellListFilter/index.vue +8 -0
- package/src/components/data/XFormItem/index.vue +1602 -1581
- package/src/router/guards.ts +131 -131
- package/src/router/routes.ts +1 -1
- package/src/services/api/Login.ts +6 -6
- package/src/services/v3Api.ts +170 -170
- package/src/stores/modules/user.ts +362 -362
- package/src/styles/login.less +109 -109
- package/src/types/platform.ts +194 -194
- package/src/utils/platform-auth.ts +150 -150
- package/src/utils/queryFormDefaultRangePicker.ts +57 -57
- package/src/utils/wechat.ts +297 -297
- package/src/views/component/XCellListView/index.vue +138 -107
- package/src/views/component/XFormGroupView/index.vue +82 -78
- package/src/views/component/XFormView/index.vue +46 -41
- package/src/views/external/index.vue +158 -158
- package/src/views/loading/AuthLoading.vue +395 -395
- package/src/views/user/register/index.vue +958 -958
- package/vite.config.ts +115 -115
- package/certs/127.0.0.1+2-key.pem +0 -28
- package/certs/127.0.0.1+2.pem +0 -27
- package/mock/modules/prose.mock.ts.timestamp-1758877157774.mjs +0 -53
- package/mock/modules/user.mock.ts.timestamp-1758877157774.mjs +0 -97
package/src/utils/wechat.ts
CHANGED
|
@@ -1,297 +1,297 @@
|
|
|
1
|
-
import { get } from '@af-mobile-client-vue3/services/restTools'
|
|
2
|
-
import { detectEnvironment } from '@af-mobile-client-vue3/utils/environment'
|
|
3
|
-
import wx from 'weixin-js-sdk'
|
|
4
|
-
// 微信JS-SDK配置接口
|
|
5
|
-
export interface WechatConfig {
|
|
6
|
-
debug: boolean
|
|
7
|
-
appId: string
|
|
8
|
-
timestamp: string
|
|
9
|
-
nonceStr: string
|
|
10
|
-
signature: string
|
|
11
|
-
jsApiList: string[]
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
// 微信扫码配置
|
|
15
|
-
export interface WechatScanConfig {
|
|
16
|
-
needResult: 0 | 1
|
|
17
|
-
scanType: string[]
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
// 微信扫码结果
|
|
21
|
-
export interface WechatScanResult {
|
|
22
|
-
resultStr: string
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
// 检查是否在微信环境中
|
|
26
|
-
export function isWechatBrowser(): boolean {
|
|
27
|
-
const env = detectEnvironment()
|
|
28
|
-
return env.isWechat
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
// 检查是否在小程序环境中
|
|
32
|
-
export function isMiniprogram(): boolean {
|
|
33
|
-
const env = detectEnvironment()
|
|
34
|
-
return env.isMiniprogram
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
// 配置微信JS-SDK
|
|
38
|
-
export function configWechatSDK(config: WechatConfig): Promise<void> {
|
|
39
|
-
return new Promise((resolve, reject) => {
|
|
40
|
-
if (!isWechatBrowser()) {
|
|
41
|
-
reject(new Error('非微信环境,无法使用微信JS-SDK'))
|
|
42
|
-
return
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
wx.config({
|
|
46
|
-
debug: config.debug,
|
|
47
|
-
appId: config.appId,
|
|
48
|
-
timestamp: config.timestamp,
|
|
49
|
-
nonceStr: config.nonceStr,
|
|
50
|
-
signature: config.signature,
|
|
51
|
-
jsApiList: config.jsApiList,
|
|
52
|
-
})
|
|
53
|
-
|
|
54
|
-
wx.ready(() => {
|
|
55
|
-
console.log('微信JS-SDK配置成功')
|
|
56
|
-
resolve()
|
|
57
|
-
})
|
|
58
|
-
|
|
59
|
-
wx.error((res: any) => {
|
|
60
|
-
console.error('微信JS-SDK配置失败:', res)
|
|
61
|
-
reject(new Error(`微信JS-SDK配置失败: ${res.errMsg}`))
|
|
62
|
-
})
|
|
63
|
-
})
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
// 微信扫码
|
|
67
|
-
export function scanQRCode(config: WechatScanConfig): Promise<WechatScanResult> {
|
|
68
|
-
return new Promise((resolve, reject) => {
|
|
69
|
-
if (!isWechatBrowser()) {
|
|
70
|
-
reject(new Error('非微信环境,无法使用微信扫码'))
|
|
71
|
-
return
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
wx.scanQRCode({
|
|
75
|
-
needResult: config.needResult,
|
|
76
|
-
scanType: config.scanType,
|
|
77
|
-
success: (res: WechatScanResult) => {
|
|
78
|
-
console.log('微信扫码成功:', res)
|
|
79
|
-
resolve(res)
|
|
80
|
-
},
|
|
81
|
-
fail: (res: any) => {
|
|
82
|
-
console.error('微信扫码失败:', res)
|
|
83
|
-
reject(new Error(`微信扫码失败: ${res.errMsg}`))
|
|
84
|
-
},
|
|
85
|
-
cancel: () => {
|
|
86
|
-
reject(new Error('用户取消扫码'))
|
|
87
|
-
},
|
|
88
|
-
})
|
|
89
|
-
})
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
// 获取微信签名(模拟)
|
|
93
|
-
export async function getWechatSignature(url: string): Promise<{
|
|
94
|
-
appId: string
|
|
95
|
-
timestamp: string
|
|
96
|
-
nonceStr: string
|
|
97
|
-
signature: string
|
|
98
|
-
}> {
|
|
99
|
-
// 这里应该调用后端接口获取微信签名
|
|
100
|
-
// 现在使用模拟数据
|
|
101
|
-
return new Promise((resolve) => {
|
|
102
|
-
get(`/af-wechat/weixin/getJsSdk?path=${url}`).then((res) => {
|
|
103
|
-
resolve({
|
|
104
|
-
appId: res.appId,
|
|
105
|
-
timestamp: res.timeStamp,
|
|
106
|
-
nonceStr: res.nonceStr,
|
|
107
|
-
signature: res.sign,
|
|
108
|
-
})
|
|
109
|
-
})
|
|
110
|
-
})
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
// 初始化微信环境
|
|
114
|
-
export async function initWechatEnvironment(): Promise<void> {
|
|
115
|
-
if (!isWechatBrowser()) {
|
|
116
|
-
console.log('非微信环境,跳过微信初始化')
|
|
117
|
-
return
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
try {
|
|
121
|
-
const currentUrl = window.location.href.split('#')[0]
|
|
122
|
-
const signatureData = await getWechatSignature(currentUrl)
|
|
123
|
-
|
|
124
|
-
await configWechatSDK({
|
|
125
|
-
debug: false,
|
|
126
|
-
appId: signatureData.appId,
|
|
127
|
-
timestamp: signatureData.timestamp,
|
|
128
|
-
nonceStr: signatureData.nonceStr,
|
|
129
|
-
signature: signatureData.signature,
|
|
130
|
-
jsApiList: [
|
|
131
|
-
'onMenuShareTimeline',
|
|
132
|
-
'onMenuShareAppMessage',
|
|
133
|
-
'onMenuShareQQ',
|
|
134
|
-
'onMenuShareWeibo',
|
|
135
|
-
'onMenuShareQZone',
|
|
136
|
-
'startRecord',
|
|
137
|
-
'stopRecord',
|
|
138
|
-
'onVoiceRecordEnd',
|
|
139
|
-
'playVoice',
|
|
140
|
-
'pauseVoice',
|
|
141
|
-
'stopVoice',
|
|
142
|
-
'onVoicePlayEnd',
|
|
143
|
-
'uploadVoice',
|
|
144
|
-
'downloadVoice',
|
|
145
|
-
'chooseImage',
|
|
146
|
-
'previewImage',
|
|
147
|
-
'uploadImage',
|
|
148
|
-
'downloadImage',
|
|
149
|
-
'translateVoice',
|
|
150
|
-
'getNetworkType',
|
|
151
|
-
'openLocation',
|
|
152
|
-
'getLocation',
|
|
153
|
-
'hideOptionMenu',
|
|
154
|
-
'showOptionMenu',
|
|
155
|
-
'hideMenuItems',
|
|
156
|
-
'showMenuItems',
|
|
157
|
-
'hideAllNonBaseMenuItem',
|
|
158
|
-
'showAllNonBaseMenuItem',
|
|
159
|
-
'closeWindow',
|
|
160
|
-
'scanQRCode',
|
|
161
|
-
'chooseWXPay',
|
|
162
|
-
'openProductSpecificView',
|
|
163
|
-
'addCard',
|
|
164
|
-
'chooseCard',
|
|
165
|
-
'openCard',
|
|
166
|
-
],
|
|
167
|
-
})
|
|
168
|
-
|
|
169
|
-
console.log('微信环境初始化成功')
|
|
170
|
-
}
|
|
171
|
-
catch (error) {
|
|
172
|
-
console.error('微信环境初始化失败:', error)
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
// 小程序扫码(在小程序环境中)
|
|
177
|
-
export function miniprogramScanCode(): Promise<string> {
|
|
178
|
-
return new Promise((resolve, reject) => {
|
|
179
|
-
if (!isMiniprogram()) {
|
|
180
|
-
reject(new Error('非小程序环境,无法使用小程序扫码'))
|
|
181
|
-
return
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
// 在小程序环境中,通过 postMessage 与小程序通信
|
|
185
|
-
const mp = (window as any).wx && (window as any).wx.miniProgram
|
|
186
|
-
const sendMessage = (payload: any) => {
|
|
187
|
-
if (mp && typeof mp.postMessage === 'function') {
|
|
188
|
-
mp.postMessage({ data: payload })
|
|
189
|
-
}
|
|
190
|
-
else if (window.parent && window.parent !== window) {
|
|
191
|
-
window.parent.postMessage(payload, '*')
|
|
192
|
-
}
|
|
193
|
-
else {
|
|
194
|
-
throw new Error('无法与小程序通信')
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
try {
|
|
199
|
-
sendMessage({ type: 'scanCode', data: {} })
|
|
200
|
-
|
|
201
|
-
// 监听小程序返回的扫码结果
|
|
202
|
-
const handleMessage = (event: MessageEvent) => {
|
|
203
|
-
const raw = (event as any).data
|
|
204
|
-
const msg = raw && typeof raw === 'object' && 'data' in raw ? (raw as any).data : raw
|
|
205
|
-
if (msg && msg.type === 'scanCodeResult') {
|
|
206
|
-
window.removeEventListener('message', handleMessage)
|
|
207
|
-
if (msg.success) {
|
|
208
|
-
resolve(msg.result)
|
|
209
|
-
}
|
|
210
|
-
else {
|
|
211
|
-
reject(new Error(msg.error || '扫码失败'))
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
window.addEventListener('message', handleMessage)
|
|
217
|
-
|
|
218
|
-
// 设置超时
|
|
219
|
-
setTimeout(() => {
|
|
220
|
-
window.removeEventListener('message', handleMessage)
|
|
221
|
-
reject(new Error('扫码超时'))
|
|
222
|
-
}, 30000)
|
|
223
|
-
}
|
|
224
|
-
catch (err) {
|
|
225
|
-
reject(err)
|
|
226
|
-
}
|
|
227
|
-
})
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
// 小程序NFC读取(在小程序环境中)
|
|
231
|
-
export function miniprogramNfcRead(): Promise<string> {
|
|
232
|
-
return new Promise((resolve, reject) => {
|
|
233
|
-
if (!isMiniprogram()) {
|
|
234
|
-
reject(new Error('非小程序环境,无法使用小程序NFC'))
|
|
235
|
-
return
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
const mp = (window as any).wx && (window as any).wx.miniProgram
|
|
239
|
-
const sendMessage = (payload: any) => {
|
|
240
|
-
if (mp && typeof mp.postMessage === 'function') {
|
|
241
|
-
mp.postMessage({ data: payload })
|
|
242
|
-
}
|
|
243
|
-
else if (window.parent && window.parent !== window) {
|
|
244
|
-
window.parent.postMessage(payload, '*')
|
|
245
|
-
}
|
|
246
|
-
else {
|
|
247
|
-
throw new Error('无法与小程序通信')
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
try {
|
|
252
|
-
sendMessage({ type: 'nfcRead', data: {} })
|
|
253
|
-
|
|
254
|
-
const handleMessage = (event: MessageEvent) => {
|
|
255
|
-
const raw = (event as any).data
|
|
256
|
-
const msg = raw && typeof raw === 'object' && 'data' in raw ? (raw as any).data : raw
|
|
257
|
-
if (msg && msg.type === 'nfcResult') {
|
|
258
|
-
window.removeEventListener('message', handleMessage)
|
|
259
|
-
if (msg.success) {
|
|
260
|
-
resolve(msg.result || '')
|
|
261
|
-
}
|
|
262
|
-
else {
|
|
263
|
-
reject(new Error(msg.error || 'NFC读取失败'))
|
|
264
|
-
}
|
|
265
|
-
}
|
|
266
|
-
}
|
|
267
|
-
|
|
268
|
-
window.addEventListener('message', handleMessage)
|
|
269
|
-
|
|
270
|
-
setTimeout(() => {
|
|
271
|
-
window.removeEventListener('message', handleMessage)
|
|
272
|
-
reject(new Error('NFC读取超时'))
|
|
273
|
-
}, 30000)
|
|
274
|
-
}
|
|
275
|
-
catch (err) {
|
|
276
|
-
reject(err)
|
|
277
|
-
}
|
|
278
|
-
})
|
|
279
|
-
}
|
|
280
|
-
// H5:仅监听小程序主动回传
|
|
281
|
-
export function waitAuthFromMiniProgram(timeout = 15000) {
|
|
282
|
-
return new Promise<{ token: string, resources?: any, expireTime?: number }>((resolve, reject) => {
|
|
283
|
-
const handle = (event: MessageEvent) => {
|
|
284
|
-
const raw = (event as any).data
|
|
285
|
-
const msg = raw && typeof raw === 'object' && 'data' in raw ? (raw as any).data : raw
|
|
286
|
-
if (msg && msg.type === 'auth') {
|
|
287
|
-
window.removeEventListener('message', handle)
|
|
288
|
-
return msg ? resolve(msg) : reject(new Error('未获取到授权信息'))
|
|
289
|
-
}
|
|
290
|
-
}
|
|
291
|
-
window.addEventListener('message', handle)
|
|
292
|
-
setTimeout(() => {
|
|
293
|
-
window.removeEventListener('message', handle)
|
|
294
|
-
reject(new Error('获取授权信息超时'))
|
|
295
|
-
}, timeout)
|
|
296
|
-
})
|
|
297
|
-
}
|
|
1
|
+
import { get } from '@af-mobile-client-vue3/services/restTools'
|
|
2
|
+
import { detectEnvironment } from '@af-mobile-client-vue3/utils/environment'
|
|
3
|
+
import wx from 'weixin-js-sdk'
|
|
4
|
+
// 微信JS-SDK配置接口
|
|
5
|
+
export interface WechatConfig {
|
|
6
|
+
debug: boolean
|
|
7
|
+
appId: string
|
|
8
|
+
timestamp: string
|
|
9
|
+
nonceStr: string
|
|
10
|
+
signature: string
|
|
11
|
+
jsApiList: string[]
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
// 微信扫码配置
|
|
15
|
+
export interface WechatScanConfig {
|
|
16
|
+
needResult: 0 | 1
|
|
17
|
+
scanType: string[]
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
// 微信扫码结果
|
|
21
|
+
export interface WechatScanResult {
|
|
22
|
+
resultStr: string
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// 检查是否在微信环境中
|
|
26
|
+
export function isWechatBrowser(): boolean {
|
|
27
|
+
const env = detectEnvironment()
|
|
28
|
+
return env.isWechat
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// 检查是否在小程序环境中
|
|
32
|
+
export function isMiniprogram(): boolean {
|
|
33
|
+
const env = detectEnvironment()
|
|
34
|
+
return env.isMiniprogram
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// 配置微信JS-SDK
|
|
38
|
+
export function configWechatSDK(config: WechatConfig): Promise<void> {
|
|
39
|
+
return new Promise((resolve, reject) => {
|
|
40
|
+
if (!isWechatBrowser()) {
|
|
41
|
+
reject(new Error('非微信环境,无法使用微信JS-SDK'))
|
|
42
|
+
return
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
wx.config({
|
|
46
|
+
debug: config.debug,
|
|
47
|
+
appId: config.appId,
|
|
48
|
+
timestamp: config.timestamp,
|
|
49
|
+
nonceStr: config.nonceStr,
|
|
50
|
+
signature: config.signature,
|
|
51
|
+
jsApiList: config.jsApiList,
|
|
52
|
+
})
|
|
53
|
+
|
|
54
|
+
wx.ready(() => {
|
|
55
|
+
console.log('微信JS-SDK配置成功')
|
|
56
|
+
resolve()
|
|
57
|
+
})
|
|
58
|
+
|
|
59
|
+
wx.error((res: any) => {
|
|
60
|
+
console.error('微信JS-SDK配置失败:', res)
|
|
61
|
+
reject(new Error(`微信JS-SDK配置失败: ${res.errMsg}`))
|
|
62
|
+
})
|
|
63
|
+
})
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// 微信扫码
|
|
67
|
+
export function scanQRCode(config: WechatScanConfig): Promise<WechatScanResult> {
|
|
68
|
+
return new Promise((resolve, reject) => {
|
|
69
|
+
if (!isWechatBrowser()) {
|
|
70
|
+
reject(new Error('非微信环境,无法使用微信扫码'))
|
|
71
|
+
return
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
wx.scanQRCode({
|
|
75
|
+
needResult: config.needResult,
|
|
76
|
+
scanType: config.scanType,
|
|
77
|
+
success: (res: WechatScanResult) => {
|
|
78
|
+
console.log('微信扫码成功:', res)
|
|
79
|
+
resolve(res)
|
|
80
|
+
},
|
|
81
|
+
fail: (res: any) => {
|
|
82
|
+
console.error('微信扫码失败:', res)
|
|
83
|
+
reject(new Error(`微信扫码失败: ${res.errMsg}`))
|
|
84
|
+
},
|
|
85
|
+
cancel: () => {
|
|
86
|
+
reject(new Error('用户取消扫码'))
|
|
87
|
+
},
|
|
88
|
+
})
|
|
89
|
+
})
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// 获取微信签名(模拟)
|
|
93
|
+
export async function getWechatSignature(url: string): Promise<{
|
|
94
|
+
appId: string
|
|
95
|
+
timestamp: string
|
|
96
|
+
nonceStr: string
|
|
97
|
+
signature: string
|
|
98
|
+
}> {
|
|
99
|
+
// 这里应该调用后端接口获取微信签名
|
|
100
|
+
// 现在使用模拟数据
|
|
101
|
+
return new Promise((resolve) => {
|
|
102
|
+
get(`/af-wechat/weixin/getJsSdk?path=${url}`).then((res) => {
|
|
103
|
+
resolve({
|
|
104
|
+
appId: res.appId,
|
|
105
|
+
timestamp: res.timeStamp,
|
|
106
|
+
nonceStr: res.nonceStr,
|
|
107
|
+
signature: res.sign,
|
|
108
|
+
})
|
|
109
|
+
})
|
|
110
|
+
})
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// 初始化微信环境
|
|
114
|
+
export async function initWechatEnvironment(): Promise<void> {
|
|
115
|
+
if (!isWechatBrowser()) {
|
|
116
|
+
console.log('非微信环境,跳过微信初始化')
|
|
117
|
+
return
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
try {
|
|
121
|
+
const currentUrl = window.location.href.split('#')[0]
|
|
122
|
+
const signatureData = await getWechatSignature(currentUrl)
|
|
123
|
+
|
|
124
|
+
await configWechatSDK({
|
|
125
|
+
debug: false,
|
|
126
|
+
appId: signatureData.appId,
|
|
127
|
+
timestamp: signatureData.timestamp,
|
|
128
|
+
nonceStr: signatureData.nonceStr,
|
|
129
|
+
signature: signatureData.signature,
|
|
130
|
+
jsApiList: [
|
|
131
|
+
'onMenuShareTimeline',
|
|
132
|
+
'onMenuShareAppMessage',
|
|
133
|
+
'onMenuShareQQ',
|
|
134
|
+
'onMenuShareWeibo',
|
|
135
|
+
'onMenuShareQZone',
|
|
136
|
+
'startRecord',
|
|
137
|
+
'stopRecord',
|
|
138
|
+
'onVoiceRecordEnd',
|
|
139
|
+
'playVoice',
|
|
140
|
+
'pauseVoice',
|
|
141
|
+
'stopVoice',
|
|
142
|
+
'onVoicePlayEnd',
|
|
143
|
+
'uploadVoice',
|
|
144
|
+
'downloadVoice',
|
|
145
|
+
'chooseImage',
|
|
146
|
+
'previewImage',
|
|
147
|
+
'uploadImage',
|
|
148
|
+
'downloadImage',
|
|
149
|
+
'translateVoice',
|
|
150
|
+
'getNetworkType',
|
|
151
|
+
'openLocation',
|
|
152
|
+
'getLocation',
|
|
153
|
+
'hideOptionMenu',
|
|
154
|
+
'showOptionMenu',
|
|
155
|
+
'hideMenuItems',
|
|
156
|
+
'showMenuItems',
|
|
157
|
+
'hideAllNonBaseMenuItem',
|
|
158
|
+
'showAllNonBaseMenuItem',
|
|
159
|
+
'closeWindow',
|
|
160
|
+
'scanQRCode',
|
|
161
|
+
'chooseWXPay',
|
|
162
|
+
'openProductSpecificView',
|
|
163
|
+
'addCard',
|
|
164
|
+
'chooseCard',
|
|
165
|
+
'openCard',
|
|
166
|
+
],
|
|
167
|
+
})
|
|
168
|
+
|
|
169
|
+
console.log('微信环境初始化成功')
|
|
170
|
+
}
|
|
171
|
+
catch (error) {
|
|
172
|
+
console.error('微信环境初始化失败:', error)
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// 小程序扫码(在小程序环境中)
|
|
177
|
+
export function miniprogramScanCode(): Promise<string> {
|
|
178
|
+
return new Promise((resolve, reject) => {
|
|
179
|
+
if (!isMiniprogram()) {
|
|
180
|
+
reject(new Error('非小程序环境,无法使用小程序扫码'))
|
|
181
|
+
return
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
// 在小程序环境中,通过 postMessage 与小程序通信
|
|
185
|
+
const mp = (window as any).wx && (window as any).wx.miniProgram
|
|
186
|
+
const sendMessage = (payload: any) => {
|
|
187
|
+
if (mp && typeof mp.postMessage === 'function') {
|
|
188
|
+
mp.postMessage({ data: payload })
|
|
189
|
+
}
|
|
190
|
+
else if (window.parent && window.parent !== window) {
|
|
191
|
+
window.parent.postMessage(payload, '*')
|
|
192
|
+
}
|
|
193
|
+
else {
|
|
194
|
+
throw new Error('无法与小程序通信')
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
try {
|
|
199
|
+
sendMessage({ type: 'scanCode', data: {} })
|
|
200
|
+
|
|
201
|
+
// 监听小程序返回的扫码结果
|
|
202
|
+
const handleMessage = (event: MessageEvent) => {
|
|
203
|
+
const raw = (event as any).data
|
|
204
|
+
const msg = raw && typeof raw === 'object' && 'data' in raw ? (raw as any).data : raw
|
|
205
|
+
if (msg && msg.type === 'scanCodeResult') {
|
|
206
|
+
window.removeEventListener('message', handleMessage)
|
|
207
|
+
if (msg.success) {
|
|
208
|
+
resolve(msg.result)
|
|
209
|
+
}
|
|
210
|
+
else {
|
|
211
|
+
reject(new Error(msg.error || '扫码失败'))
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
window.addEventListener('message', handleMessage)
|
|
217
|
+
|
|
218
|
+
// 设置超时
|
|
219
|
+
setTimeout(() => {
|
|
220
|
+
window.removeEventListener('message', handleMessage)
|
|
221
|
+
reject(new Error('扫码超时'))
|
|
222
|
+
}, 30000)
|
|
223
|
+
}
|
|
224
|
+
catch (err) {
|
|
225
|
+
reject(err)
|
|
226
|
+
}
|
|
227
|
+
})
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
// 小程序NFC读取(在小程序环境中)
|
|
231
|
+
export function miniprogramNfcRead(): Promise<string> {
|
|
232
|
+
return new Promise((resolve, reject) => {
|
|
233
|
+
if (!isMiniprogram()) {
|
|
234
|
+
reject(new Error('非小程序环境,无法使用小程序NFC'))
|
|
235
|
+
return
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
const mp = (window as any).wx && (window as any).wx.miniProgram
|
|
239
|
+
const sendMessage = (payload: any) => {
|
|
240
|
+
if (mp && typeof mp.postMessage === 'function') {
|
|
241
|
+
mp.postMessage({ data: payload })
|
|
242
|
+
}
|
|
243
|
+
else if (window.parent && window.parent !== window) {
|
|
244
|
+
window.parent.postMessage(payload, '*')
|
|
245
|
+
}
|
|
246
|
+
else {
|
|
247
|
+
throw new Error('无法与小程序通信')
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
try {
|
|
252
|
+
sendMessage({ type: 'nfcRead', data: {} })
|
|
253
|
+
|
|
254
|
+
const handleMessage = (event: MessageEvent) => {
|
|
255
|
+
const raw = (event as any).data
|
|
256
|
+
const msg = raw && typeof raw === 'object' && 'data' in raw ? (raw as any).data : raw
|
|
257
|
+
if (msg && msg.type === 'nfcResult') {
|
|
258
|
+
window.removeEventListener('message', handleMessage)
|
|
259
|
+
if (msg.success) {
|
|
260
|
+
resolve(msg.result || '')
|
|
261
|
+
}
|
|
262
|
+
else {
|
|
263
|
+
reject(new Error(msg.error || 'NFC读取失败'))
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
window.addEventListener('message', handleMessage)
|
|
269
|
+
|
|
270
|
+
setTimeout(() => {
|
|
271
|
+
window.removeEventListener('message', handleMessage)
|
|
272
|
+
reject(new Error('NFC读取超时'))
|
|
273
|
+
}, 30000)
|
|
274
|
+
}
|
|
275
|
+
catch (err) {
|
|
276
|
+
reject(err)
|
|
277
|
+
}
|
|
278
|
+
})
|
|
279
|
+
}
|
|
280
|
+
// H5:仅监听小程序主动回传
|
|
281
|
+
export function waitAuthFromMiniProgram(timeout = 15000) {
|
|
282
|
+
return new Promise<{ token: string, resources?: any, expireTime?: number }>((resolve, reject) => {
|
|
283
|
+
const handle = (event: MessageEvent) => {
|
|
284
|
+
const raw = (event as any).data
|
|
285
|
+
const msg = raw && typeof raw === 'object' && 'data' in raw ? (raw as any).data : raw
|
|
286
|
+
if (msg && msg.type === 'auth') {
|
|
287
|
+
window.removeEventListener('message', handle)
|
|
288
|
+
return msg ? resolve(msg) : reject(new Error('未获取到授权信息'))
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
window.addEventListener('message', handle)
|
|
292
|
+
setTimeout(() => {
|
|
293
|
+
window.removeEventListener('message', handle)
|
|
294
|
+
reject(new Error('获取授权信息超时'))
|
|
295
|
+
}, timeout)
|
|
296
|
+
})
|
|
297
|
+
}
|