scanCheckin.js
1.85 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
/**
* @description 从扫码结果中提取打卡接口所需参数
* @param {string} rawScanResult - 微信扫码返回的原始结果,可能是完整URL,也可能是纯查询串
* @returns {{activityId:string, detailId:string, rawParams:Object}}
*/
export const parseScanCheckinParams = (rawScanResult = '') => {
const normalized = String(rawScanResult || '').trim()
if (!normalized) {
return {
activityId: '',
detailId: '',
rawParams: {},
}
}
const querySource = extractQuerySource(normalized)
const rawParams = parseQueryString(querySource)
return {
activityId: pickFirstAvailableValue(rawParams, ['activity_id', 'activityId', 'id']),
detailId: pickFirstAvailableValue(rawParams, ['detail_id', 'detailId', 'stage_id', 'stageId']),
rawParams,
}
}
const extractQuerySource = input => {
const questionMarkIndex = input.indexOf('?')
if (questionMarkIndex >= 0) {
return input.slice(questionMarkIndex + 1)
}
return input
}
const parseQueryString = (queryString = '') => {
const hashRemoved = String(queryString || '').split('#')[0]
const pairs = hashRemoved.split('&').filter(Boolean)
return pairs.reduce((result, pair) => {
const [rawKey, ...rest] = pair.split('=')
const rawValue = rest.join('=')
const key = safeDecodeURIComponent(rawKey)
const value = safeDecodeURIComponent(rawValue)
if (key) {
result[key] = value
}
return result
}, {})
}
const pickFirstAvailableValue = (params, keys = []) => {
for (const key of keys) {
const value = params?.[key]
if (value !== '' && value !== undefined && value !== null) {
return String(value)
}
}
return ''
}
const safeDecodeURIComponent = (value = '') => {
try {
return decodeURIComponent(String(value || '').replace(/\+/g, '%20'))
} catch (error) {
return String(value || '')
}
}