问题描述

在微信小程序开发中,我们通常通过页面生命周期回调函数 onLoad 的第一个参数来获取页面 URL 中的 query 参数。微信小程序框架会自动解析 URL 中的查询字符串,并将其作为参数传递给页面。

然而,当 query 参数值中包含等号(=)字符时,微信小程序的解析机制会出现问题,导致参数值被错误截断。

问题案例

原始小程序链接:

1
pages/index/index?skin_id=jzWddAEWvD&channel_id=1639617&product_type=5&appid=wx3cc2cddf09969268&short_link_code=3==qMsxn&product_id=81

实际解析结果:

1

  • short_link_code 被解析为 3
  • 期望值应为 3==qMsxn

这种解析错误会导致后续业务逻辑失败,例如使用错误的短链码获取长链接时会失败。

问题原因分析

微信小程序的 URL 解析机制与浏览器解析有差异,以下是浏览器解析结果。

2

可以看出,在浏览器中解析是正常的。

解决方案

修改参数生成逻辑:
在对微信小程序通过 url 进行传参中,生成短链码或其他可能包含等号的参数时,后端应该避免使用等号字符,或者对等号进行编码处理。

1
2
3
4
5
6
7
8
9
// 后端生成短链码时避免使用等号
function generateShortLinkCode() {
const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_';
let result = '';
for (let i = 0; i < 10; i++) {
result += chars.charAt(Math.floor(Math.random() * chars.length));
}
return result;
}

总结

微信小程序的 query 参数解析机制有其局限性,特别是在处理包含等号的参数值时。通过合理的参数设计和编码处理,可以有效避免这类问题。在实际开发中,建议从源头控制参数内容,避免使用可能引起解析冲突的特殊字符。

相关参考