请教一个支付宝回传处理的实现,快进来呀!

2015-11-30 12:00:48 +08:00
 dugrey

前两天在网易云音乐充值,好奇它的回传处理是怎么实现的。具体是这样的:

1 在窗口 A (订单充值页面)点击支付后打开新窗口 B (支付宝)跳转支付,同时 A 页弹出一个带有“已完成支付”的提醒操作弹窗
2 完成支付后跳转回同步通知 URL , B 窗口自动关闭
3 A 窗口中自动关闭提醒弹窗,并自动局部刷新数据(更新订单为已支付)

猜想可能是 iframe 实现,具体这两个窗口间是怎样通信的?

谢谢指教 :)

4398 次点击
所在节点    程序员
21 条回复
abelyao
2015-11-30 12:06:43 +08:00
支付宝付款成功之后,支付宝的服务器会通知商家服务器,这是可配置的。
商家方面做得完善一些的话就是隔几秒查询一下是否收到了支付宝的通知,如果已经成功支付就跳转或刷新。
dugrey
2015-11-30 12:12:13 +08:00
@abelyao 可配置是指可以配置关闭掉窗口吗?网易云音乐那边我有 F12 看过,没发现有轮询请求。
behappy
2015-11-30 12:12:19 +08:00
我之前的实现方式是 A 窗口不断轮询,觉得有点蠢。
1.在 A 窗口点击支付后,生成订单,并跳转到支付宝,并在 A 窗口弹出‘已完成支付‘弹窗
2.完成支付后支付宝同步通知商户配置的 notify_url, 商户修改订单状态。
3.A 窗口轮询订单状态,查询订单完成后,更新 A 窗口数据。
abelyao
2015-11-30 12:17:48 +08:00
@dugrey 现在用手机上的,也不好看网易具体怎么实现,但你可以看看支付宝的 notify url 和 return url 两个参数,实现同样的效果不是问题
wy315700
2015-11-30 12:18:45 +08:00
长连接
tracymcladdy
2015-11-30 12:20:58 +08:00
支付宝的返回是有同步的页面返回,和异步的服务器通知的。
你这个应该写在同步的页面返回去。
dugrey
2015-11-30 12:22:10 +08:00
@behappy 以前有看到一个网站的扫码支付也是用轮询,然后我试着挂着,貌似请求了几百次才停。网易云音乐支付完跳转回来窗口就自动关闭,订单页就自动更新状态。整个流程挺流畅的,感觉是一种更好实现,就是不知道具体是如何...
dugrey
2015-11-30 12:33:42 +08:00
@wy315700 可以讲得具体一点嘛
pubby
2015-11-30 12:45:32 +08:00
B 窗关闭前应该是和 A 窗同域,因为 B 是 A 打开的,在 B 中用 JS 控制 A 页面应该不难。
dugrey
2015-11-30 13:06:19 +08:00
在文档里看到这段:
配置 qr_pay_mode 为 0 或 1 或 3 (扫码支付方式为订单码-简约前置模式或订
单码-前置模式或订单码-迷你前置模式)的情况下,同步通知地址 return_url 需
要传入商户中间跳转页面,即该页面需要实现让父页面自行跳转的功能,中间
页面 javascript 代码:<script>window.parent.location.href='父页面调整的
URL';</script>

可能回传页面是可以控制父窗口的,一会试一下吧,谢谢大家的回复 :)
JenJieJu
2015-11-30 13:40:30 +08:00
方法一: B 页面回调(调用 A 页面的函数)
方法二: A 页面轮训。
ZnZt
2015-11-30 13:44:18 +08:00
在 A 页面弹个 dialog , 里面有 已完成支付按钮 和 支付遇到问题按钮
dugrey
2015-11-30 14:41:35 +08:00
http://46.101.1.172/order.html
做了个 demo ,大概是这么个流程,大家可以看看这么做有什么问题没有。
Lpl
2015-11-30 19:43:22 +08:00
嗨。。没那么复杂。
这两天在写微信和支付宝支付的接口,然后看了下以前项目的代码。

支付宝支付结果回调给服务器,然后操作数据库更新订单状态, A 窗口的前端写了个轮循(隔 2s )会向后台发送一次 get 请求获得订单状态,然后根据订单状态更新 A 窗口
g079708
2015-11-30 19:49:23 +08:00
@dugrey 页面打不开呢
dugrey
2015-11-30 20:35:31 +08:00
@Lpl 嗯,一般都是这么实现的。
dugrey
2015-11-30 20:36:25 +08:00
@g079708 临时开的两台 vps 实验,下午看没人回复也就关掉了...
domty
2015-11-30 23:31:22 +08:00
你去支付宝的开发平台看它给的官方文档就知道了
支付宝支付完成要向你支付回调接口发送支付状态数据 你可以在这个接口里专门设置一个状态

充值页做一个定时 ajax 查询,当查询支付状态成功的情况下修改页面状态

当然现在好像有 web socket 这种东西模拟 b-s 的长连接, server 接收到支付成功的时候直接向浏览器推送支付成功消息就行。
cyberdak
2015-11-30 23:40:33 +08:00
不是轮询就是 web-socket
kookxiang
2015-12-01 08:39:38 +08:00
window.opener 有你们说的这么高大上么

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

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

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

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

© 2021 V2EX