Files
chengkong-huakaiwuye/huakai-app/pageSubPack/api/appLaunch.js
2026-07-25 16:30:00 +08:00

107 lines
2.8 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* App 跳转参数处理
* 花开物业 App 通过 launchMiniProgram 的 extraData 传入支付参数和登录凭证,
* 小程序通过 referrerInfo.extraData 接收(查询字符串格式)。
*
* extraData 示例:
* payAmount=10&acct=xxx&custId=xxx&token=xxx&userId=xxx&sign=xxx&...
*/
const STORAGE_KEY = 'app_launch_payment_data'
/**
* 解析查询字符串为对象
*/
function parseQueryString(str) {
if (!str || typeof str !== 'string') return null
const params = {}
str.split('&').forEach(item => {
const idx = item.indexOf('=')
if (idx === -1) return
const key = item.substring(0, idx)
const val = item.substring(idx + 1)
params[key] = decodeURIComponent(val || '')
})
return params
}
/**
* 从启动参数中获取 App 传入的全部数据(支付参数 + token + userId)
*/
export function captureAppLaunchData(onShowOptions) {
let data = null
const tryGetData = (options, label) => {
if (!options) return null
console.log(label, JSON.stringify(options))
// 优先从 query 获取
if (options.query && Object.keys(options.query).length > 0) {
return options.query
}
// referrerInfo.extraData:可能是对象也可能是查询字符串
const extraData = options?.referrerInfo?.extraData
console.log( ' extraData====',extraData)
if (extraData) {
if (typeof extraData === 'string') {
console.log(label + ' extraData 是查询字符串,解析中...')
return parseQueryString(extraData)
}
return extraData
}
return null
}
// 冷启动
try {
data = tryGetData(wx.getLaunchOptionsSync?.() || {}, '冷启动')
} catch (e) { console.error('getLaunchOptionsSync 失败:', e) }
// 热启动
if (!data) {
data = tryGetData(onShowOptions, '热启动')
}
if (data && (data.payAmount || data.acct || data.custId)) {
// 恢复登录态
if (data.token) {
uni.setStorageSync('token', data.token)
console.log('已恢复 token')
}
if (data.userId) {
uni.setStorageSync('userId', data.userId)
console.log('已恢复 userId')
}
uni.setStorageSync(STORAGE_KEY, data)
console.log('已存储 App 支付数据:', JSON.stringify(data))
return data
}
return null
}
/** 检查是否已登录(token 存在) */
export function isLoggedIn() {
return !!uni.getStorageSync('token')
}
/** 获取 App 传入的支付数据 */
export function getAppPaymentData() {
try { return uni.getStorageSync(STORAGE_KEY) || null } catch (e) { return null }
}
/** 清除 */
export function clearAppPaymentData() {
uni.removeStorageSync(STORAGE_KEY)
}
/** 组装 paymentItem */
export function buildPaymentItemFromApp(appData) {
if (!appData) return null
const amount = Number(appData.payAmount || 0).toFixed(2)
return { ...appData, type: '缴费', rechargeAmount: amount }
}