最近公司要做个微信web新项目,正好在看angular,就愉快的玩耍上了,用ui-router做路由控制,一开始偷懒没有去掉url内的#,不幸的碰到了两个微信js的坑。
1、微信支付授权的url在SPA内不会正确改变。 简单的说就是有页面A、B、C,C为支付页面,当从A进入SPA时,以A>B>C的顺序在页面C调用微信js接口支付,提示地址未授权而且url竟然是A的;以B>C的顺序,在页面C取到的url是B的,最恶心的是该情况只会出现在ios系统的微信内,安卓的SPA拿到的url是正确的。当时想到的解决方案就是在angular入口的地址后紧跟?,然后调用微信js支付时微信会认为?后均为页面参数,不会对授权的url有影响。 2、微信初始化时请求了两次地址,导致微信跳转到缺省的angular路由。 具体表现为我的angular入口为index,然后有路由index#/detail/1,在访问时由于地址为index#/detail/1,浏览器会直接访问index然后由angular来处理#/detail/1,然后index需要微信授权,就导致了授权后跳转到index然后angular跳转到了缺省的路由。解决方法很简单。。。去掉url内的#即可,去掉后的实现相当于将index/路径下的所有请求都使用sendfile的方法将angular的index内的内容当作模板进行应答,然后由angular根据index内的base href来获取原应在#后的内容进行路由处理,其实实现的方式是一样的,只不过一个是由服务器将所有angular处理的请求都返回了index,另一个是由浏览器将所有angular的请求都定向到index。 #去掉后问题1也不用加?即可解决了,打开angular相关实现的代码看了看,还是很巧妙的。