微信授权遇到点问题,能帮忙看看嘛?

2017-02-10 09:42:42 +08:00
 xiaomajia008
https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect


我用的 vue 来管理路由。

现在遇到的问题是 授权 url redirect_uri 我填写的地址 带了 # 号, 导致不能授权,有遇到过这样问题的嘛?
8759 次点击
所在节点    程序员
26 条回复
snailsir
2017-02-10 09:44:35 +08:00
url_encode 一下啊
xiaomajia008
2017-02-10 10:05:05 +08:00
@snailsir

感谢你的回复,我试过了。

http://www.abc.com/acts/#/share/20170101/

encode 之后,通过那个获取 code 的 url 跳转之后
变成了

http://www.abc.com/acts/?code=xxxx&state=STATE#/share/20170101/

。。。。路由被破坏了。
bombless
2017-02-10 10:09:41 +08:00
微信就是这样设计的。看来你要让路由更聪明点自己处理查询串,或者把你 hash 带到查询串里面再由后端跳到一个没有查询串且 hash 也正常的地址
congminghaoxue92
2017-02-10 10:17:38 +08:00
微信的跳转是跳转到页面的,而不是页面上的锚点。
你的 url :'http://www.abc.com/acts/#/share/20170101/ '改掉'#','#'号后面代表是锚点;'http://www.abc.com/acts/#abc/dde'和'http://www.abc.com/acts/#/share/20170101/ '是指向同一个页面的。
qiayue
2017-02-10 10:20:42 +08:00
redirect_uri 你用一个新网址,这个网址对应的程序是没有界面的,后端处理完之后,你自己跳转回 vue 做的页面
Sunyanzi
2017-02-10 10:26:18 +08:00
我想知道你用前端接微信返回的话你准备怎么处理 code 和 state ..?

跳转链接和返回本来就是后端活儿 ... 包括 state 的验证也是 ...

你需要做的是跳一个类似 /wx/authorize 这样的 URL 由后端 redirect 到微信的 authorize 去 ...

同时 redirect_uri 也是后端维护的 ... 接收返回获得用户的信息和登录态才会再跳回前端 ...
jarlyyn
2017-02-10 11:01:47 +08:00
有,去年年底某次改版改掉的,正好项目刚上线,客户反馈过来查了很久,蛋疼。之前都可以用

解决方案:

在执行前端 app 前预先处理 url ,直接 push 一个 statue 。
具体来说就是在 app.js 的头部加入
var search=location.search;
if (search.length>0){history.pushState({},'web title','#wechatreturn'+search);}

不知道那些说之前就这样设计的,还有说跳转链接和返回的后端的活的是几个意思。

做一个接口, Post 一下获取登录地址,直接 location=跳转过去就可以 oauth 登录了。

再做一个接口,把得到的 search 直接 Post 到接口取得登录信息就可以了。

如果前端或者后台只熟一个,这么自信去评论自己不熟的部分不好
KeepPro
2017-02-10 11:10:27 +08:00
@jarlyyn 这个 api 要支持 h5 才行吧
jarlyyn
2017-02-10 11:13:32 +08:00
@KeepPro

首先,如果是说浏览器兼容性的话,这不过是跑 app 自己的 router 之前先做个自己的简单 router 罢了。

其次,如果是说后台的话,前端是 ie6/h5/app/客户端,和后台 api 没什么关系吧?
Sunyanzi
2017-02-10 11:32:26 +08:00
@jarlyyn 这里似乎有我事儿我就再多句嘴 ... 所以你是怎么处理的 code 和 state ..?

state 的意义是保证回调是由当前用户发起的 ... 也就是你要判断传出和传入相等 ... 前端额外存 ..?

那 code 呢 ..? 无论如何还是要丢给后端吧 ... 既然如此为什么不直接让后端来接这个回调 ..?
jarlyyn
2017-02-10 12:00:40 +08:00
@Sunyanzi

"跳转链接和返回"

和怎么处理 code 与 state 有什么关系?

后端只需要提供是否能验证的功能。

至于验证成功后怎么处理怎么跳转怎么显示,这是前端的事情,为什么要交给后台来处理?

让后台来处理调整,那岂不是前端的结构和入口要跟着后端来?前端页面结构重构一下的话还必须要要后台配合?
jarlyyn
2017-02-10 12:09:56 +08:00
@Sunyanzi

简单来说,前台本身是 /index.html#xxx
后来需要加入新版本,对 ab 测试,新版本地址是 /v2/index.html#xxx
又要加英文版本,英文版的地址是 /en/index.html#xxx

这个项目难道应该通过后端来接这个回调?
sighforever
2017-02-10 12:15:59 +08:00
做个自己的跳转页面吧,把当前页的 url 做成一个参数穿个跳转页,自己处理就好了
thundernet8
2017-02-10 12:50:52 +08:00
vue 路由用 history hash 吧
hellocy
2017-02-10 13:05:01 +08:00
我记得 redirect_uri 不能带任何参数
DeepCold
2017-02-10 14:16:29 +08:00
我的解决办法是放弃用 history 模式,改用 hash 模式。
可以借鉴我的线上项目, https://wx.wcar.net.cn/weiche-oil.php?station_id=83764
kanezeng
2017-02-10 15:06:30 +08:00
@jarlyyn 我觉得问题是微信授权后要做什么吧,比如至少基本授权拿到用户的 open-id ?那样的话拿到 code 后需要 appid 和 appkey 去取用户的 open-id ?这一步如果在前端做的话,是要把 appkey 也写到前端去么?这部分就是我一直没想明白的。
learnshare
2017-02-10 15:12:14 +08:00
没错的,微信是这样。我在 Angular 里手动解析跳转回来的 URL ,然后取 code 出来
jarlyyn
2017-02-10 15:12:16 +08:00
@kanezeng

微信授权后本质是做个登录的动作。

所以需要把登录成功与否的信息返回给前端啊。

前端收到 code/status,发给后端进行登录。

登录成功的话返回系统用户 id/openid/token 之类。

不然你准备怎么把用户信息传给前端,让前端再发个请求用 cooke 里的 session 判断吗?还是作为跳转的参数?

数据的归后端,浏览器的表现归前端。
qiayue
2017-02-10 15:14:40 +08:00
@jarlyyn 不管你前端几个版本,微信授权都应该是一个独立的服务,给前端调用。
比如我同时几个 web app 都要用同一个服务号来授权,难道每一个 web app 都重复写一套授权逻辑?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/339467

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX