前两天在网易云音乐充值,好奇它的回传处理是怎么实现的。具体是这样的:
1 在窗口 A (订单充值页面)点击支付后打开新窗口 B (支付宝)跳转支付,同时 A 页弹出一个带有“已完成支付”的提醒操作弹窗
2 完成支付后跳转回同步通知 URL , B 窗口自动关闭
3 A 窗口中自动关闭提醒弹窗,并自动局部刷新数据(更新订单为已支付)
猜想可能是 iframe 实现,具体这两个窗口间是怎样通信的?
谢谢指教 :)
1
abelyao 2015-11-30 12:06:43 +08:00 via iPhone 1
支付宝付款成功之后,支付宝的服务器会通知商家服务器,这是可配置的。
商家方面做得完善一些的话就是隔几秒查询一下是否收到了支付宝的通知,如果已经成功支付就跳转或刷新。 |
3
behappy 2015-11-30 12:12:19 +08:00
我之前的实现方式是 A 窗口不断轮询,觉得有点蠢。
1.在 A 窗口点击支付后,生成订单,并跳转到支付宝,并在 A 窗口弹出‘已完成支付‘弹窗 2.完成支付后支付宝同步通知商户配置的 notify_url, 商户修改订单状态。 3.A 窗口轮询订单状态,查询订单完成后,更新 A 窗口数据。 |
4
abelyao 2015-11-30 12:17:48 +08:00 via iPhone
@dugrey 现在用手机上的,也不好看网易具体怎么实现,但你可以看看支付宝的 notify url 和 return url 两个参数,实现同样的效果不是问题
|
5
wy315700 2015-11-30 12:18:45 +08:00
长连接
|
6
tracymcladdy 2015-11-30 12:20:58 +08:00
支付宝的返回是有同步的页面返回,和异步的服务器通知的。
你这个应该写在同步的页面返回去。 |
7
dugrey OP @behappy 以前有看到一个网站的扫码支付也是用轮询,然后我试着挂着,貌似请求了几百次才停。网易云音乐支付完跳转回来窗口就自动关闭,订单页就自动更新状态。整个流程挺流畅的,感觉是一种更好实现,就是不知道具体是如何...
|
9
pubby 2015-11-30 12:45:32 +08:00 via Android
B 窗关闭前应该是和 A 窗同域,因为 B 是 A 打开的,在 B 中用 JS 控制 A 页面应该不难。
|
10
dugrey OP 在文档里看到这段:
配置 qr_pay_mode 为 0 或 1 或 3 (扫码支付方式为订单码-简约前置模式或订 单码-前置模式或订单码-迷你前置模式)的情况下,同步通知地址 return_url 需 要传入商户中间跳转页面,即该页面需要实现让父页面自行跳转的功能,中间 页面 javascript 代码:<script>window.parent.location.href='父页面调整的 URL';</script> 可能回传页面是可以控制父窗口的,一会试一下吧,谢谢大家的回复 :) |
11
JenJieJu 2015-11-30 13:40:30 +08:00
方法一: B 页面回调(调用 A 页面的函数)
方法二: A 页面轮训。 |
12
ZnZt 2015-11-30 13:44:18 +08:00
在 A 页面弹个 dialog , 里面有 已完成支付按钮 和 支付遇到问题按钮
|
13
dugrey OP http://46.101.1.172/order.html
做了个 demo ,大概是这么个流程,大家可以看看这么做有什么问题没有。 |
14
Lpl 2015-11-30 19:43:22 +08:00 via Android
嗨。。没那么复杂。
这两天在写微信和支付宝支付的接口,然后看了下以前项目的代码。 支付宝支付结果回调给服务器,然后操作数据库更新订单状态, A 窗口的前端写了个轮循(隔 2s )会向后台发送一次 get 请求获得订单状态,然后根据订单状态更新 A 窗口 |
18
domty 2015-11-30 23:31:22 +08:00
你去支付宝的开发平台看它给的官方文档就知道了
支付宝支付完成要向你支付回调接口发送支付状态数据 你可以在这个接口里专门设置一个状态 充值页做一个定时 ajax 查询,当查询支付状态成功的情况下修改页面状态 当然现在好像有 web socket 这种东西模拟 b-s 的长连接, server 接收到支付成功的时候直接向浏览器推送支付成功消息就行。 |
19
cyberdak 2015-11-30 23:40:33 +08:00
不是轮询就是 web-socket
|
20
kookxiang 2015-12-01 08:39:38 +08:00 via Android
window.opener 有你们说的这么高大上么
|
21
ty0716 2015-12-01 09:58:40 +08:00
为啥要_blank 跳转到支付宝页面?
我们是直接在订单结算页面跳转付款回调过来就行了。没必要去轮询的. |