/** * 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 } }