uniapp支付宝 H5 开发踩坑,hash模式下取参要规范!
一、背景在 uni-app 开发支付宝内嵌 H5 业务时由于页面获取参数不规范导致页面跳转异常、参数丢失或解析报错,测试表现为白屏//❌错误写法 let tmp decodeURIComponent(location.href) let dataObj JSON.parse(tmp.split()[1])这种取法非常基础,没有考虑到多个参数的情况二、核心问题URL 被篡改的真相1. 现象页面展示 URL 与原始真实访问地址不一致在支付宝内跳转至第三方 H5 时浏览器地址栏展示的 URL 并非代码中写入的原始链接而是经过了网关处理后的“新链接”。具体差异示例原始链接结构https://xxx.com/h5/?timestamp原始时间戳#/subpkg/page?json加密业务参数实际展示链接结构https://xxx.com/h5/?timestamp最新时间戳flowT流水号flowSig链路签名#/subpkg/page?json加密业务参数直观差异?后的查询参数被完全重写时间戳更新追加了支付宝内部风控参数。#后的路由路径及业务参数json完整保留未发生任何变化。2. 原理网关的“隐形重定向”这是支付宝内核级的安全策略。网关在后台执行 302 重定向重写 HTTP 请求参数? 后以进行风控验签而前端路由片段# 后不参与 HTTP 请求因此绝对安全。3. 误区纠正白名单的作用能解决消除“即将离开支付宝”的拦截弹窗解除域名访问限制。不能解决无法阻止网关对?后参数的篡改。无论域名是否备案Query 参数始终不可靠。三、开发规范参数存放与获取1. 铁则业务参数必须放 Hash所有核心业务参数严禁放在?后必须放在#后。原因#后的参数在网关重定向过程中全程“只读”是唯一稳定的数据传输通道。2. 取参规范严禁二次解码场景一页面内部 (onLoad)uni-app 框架已自动对onLoad的参数进行了一次decodeURIComponent解码。正确做法直接使用。错误风险手动再次解码会导致数据中的%符号解析异常报错URIError或数据损坏。// ✅ 正确 onLoad(options) { if (options.json) { const data JSON.parse(options.json) } } // ❌ 错误禁止二次解码 // const data JSON.parse(decodeURIComponent(options.json))场景二全局入口 (App.vue)App.vue没有onLoad需使用原生 API 手动解析且必须手动进行一次解码。onLaunch() { const hash window.location.hash const paramStr hash.split(?)[1] || const params this.parseUrlParam(paramStr) if (params.json) { // 原生场景需手动解码 const bizData JSON.parse(decodeURIComponent(params.json)) } }, methods: { parseUrlParam(str) { const obj {} if (!str) return obj str.split().forEach(item { const [key, val] item.split() obj[key] val ? decodeURIComponent(val) : }) return obj } }四、总结支付宝环境下的 H5 开发核心在于应对网关对 Query 参数的不可控篡改。通过将业务参数统一迁移至 Hash 路由并严格遵循“框架自动解码、原生手动解码”的取参逻辑即可彻底解决参数丢失、乱码及解析报错问题。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2548869.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!