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.
@@ -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
+ }