遇到这个问题的小伙伴有必要先看下下面这篇博文:
为什么小程序内页面跳转传参时,要对参数应用encodeURIComponent编码?
还拿上篇博文中的参数为例,看下从公众号跳转至小程序页面时,接收到的参数是什么样子
- 小程序内跳转页面时传递url参数,值为
https://mp.weixin.qq.com/s__biz=MzAwgxMw==&mid=10076&sn=466da94f#rd
,对参数进行encodeURIComponent编码变为https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzAwgxMw%3D%3D%26mid%3D10076%26sn%3D466da94f%23rd
,所以在小程序中复制出该页面链接为为/pages/document/document?url=https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzAwgxMw%3D%3D%26mid%3D10076%26sn%3D466da94f%23rd
。 - 在公众号中做好相应的配置之后,打开小程序调试面板,从公众号中点击链接进入小程序的document页面,打印出接收到的参数为
https%253A%252F%252Fmp.weixin.qq.com%252Fs%253F__biz%253DMzAwgxMw%253D%253D%2526mid%253D10076%2526sn%253D466da94f%2523rd
,发现参数跟我们复制出来的页面链接中的参数不对。 - 对
https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzAwgxMw%3D%3D%26mid%3D10076%26sn%3D466da94f%23rd
做encodeURI编码(或encodeURIComponent编码),结果正好为https%253A%252F%252Fmp.weixin.qq.com%252Fs%253F__biz%253DMzAwgxMw%253D%253D%2526mid%253D10076%2526sn%253D466da94f%2523rd
。据此可以推测,在从公众号跳转至小程序时,微信会再次对链接中参数做一次编码(这里的编码具体是encodeURI还是encodeURIComponent不确定,因为我们在小程序中已经做了一次encodeURIComponent编码,没有特殊字符了,此时再次编码,两种方法得到的结果是一样的)
知道了问题产生的原因所在,接下来便是应对之法
// 小程序document页面,解码函数
decode(url){
let result = decodeURIComponent(url);
if(/https?:\/\/.*/.test(result)){ // 进行1次解码,若是以http://或者https://开头,直接返回结果
return result;
}else{ // 若不是以http://或https://,说明是从公众号跳转过来的,多进行1次解码,返回结果
result = decodeURIComponent(result);
return result;
}
}
- 在document页面写一个解码函数,对接收到的参数url进行解码。若是小程序内部跳转,只需解码1次便可得到正确的结果;若解码1次得不到期望的结果,说明是从公众号跳转到小程序的,微信多进行了1次加密,此时多进行1次解码,就可得到正确的结果。