本文最后更新于 3551 天前,其中的信息可能已经有所发展或是发生改变。
引子:
事情的经过是这样的。最近在做微信公众平台开发,其中有一个模块是实现微信授权登录。
页面A(链接为:domain.com/index.php/Store/route.html#/bbb/1/aaa)
微信授权接口文件(链接为:domain.com/index.php/Wechat/Oauth)
业务是这样的:
用户点击页面A,若检测到未授权登录,则跳转到微信授权接口文件,授权完成后再跳转回页面A。
很显然,在页面A检测到未授权,跳转前必须保存当前页面的Url。
那么问题来了,小伙伴用了AngularJs的路由。Url中是带有#的,服务器端不可能获取到整个Url,只能获取到domain.com/index.php/Store/route.html
尽管可以使用html5模式,把#去掉。但为了不大费周章,还是想了其他方法。
Js是可以获取包括hash值的整个Url的。所以我自然得想到使用Js存Cookie,然后用PHP来取。但是实践告诉我,这种方法不行。因为是先执行服务器脚本语言再执行Js的。那么要刷新2次页面才能看到Cookie被echo出来了。但是,亲,哥是要在A页面跳转到接口文件啊。这么一跳转,根本没办法存储到Cookie。
说了那么多“废话”,讲讲解决办法吧。
A页面:使用js获取到带#的整个Url,然后使用replace将#替换为任意字符串,比如|sharp|。然后将该Url作为参数,用window.location.href跳转到接口文件。
接口文件:$_GET获取到传过来的Url。再用PHP的方法将|sharp|替换回#。接着就可以做大事啦~~~
最后附上主要代码:
A页面
echo “<script>
var targetUrl = document.location.href;
targetUrl = targetUrl.replace(‘#’,’|sharp|’);
window.location.href=’http://domain.com/index.php/Wechat/Oauth?targetUrl=’+targetUrl
var targetUrl = document.location.href;
targetUrl = targetUrl.replace(‘#’,’|sharp|’);
window.location.href=’http://domain.com/index.php/Wechat/Oauth?targetUrl=’+targetUrl
</script>”;
接口文件:
$targetUrl =$_GET[‘targetUrl’];
$targetUrl = str_replace(‘|sharp|’,’#’,$targetUrl);
获取到了带#的url,但是传给微信之后,#号后的内容被微信忽略了。
不知道博主有没有解决这个问题。
你对url进行url_encode再传给微信就可以了。