V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
dugrey
V2EX  ›  程序员

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

  •  
  •   dugrey · 2015-11-30 12:00:48 +08:00 · 4267 次点击
    这是一个创建于 3060 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    谢谢指教 :)

    21 条回复    2015-12-01 09:58:40 +08:00
    abelyao
        1
    abelyao  
       2015-11-30 12:06:43 +08:00 via iPhone   ❤️ 1
    支付宝付款成功之后,支付宝的服务器会通知商家服务器,这是可配置的。
    商家方面做得完善一些的话就是隔几秒查询一下是否收到了支付宝的通知,如果已经成功支付就跳转或刷新。
    dugrey
        2
    dugrey  
    OP
       2015-11-30 12:12:13 +08:00
    @abelyao 可配置是指可以配置关闭掉窗口吗?网易云音乐那边我有 F12 看过,没发现有轮询请求。
    behappy
        3
    behappy  
       2015-11-30 12:12:19 +08:00
    我之前的实现方式是 A 窗口不断轮询,觉得有点蠢。
    1.在 A 窗口点击支付后,生成订单,并跳转到支付宝,并在 A 窗口弹出‘已完成支付‘弹窗
    2.完成支付后支付宝同步通知商户配置的 notify_url, 商户修改订单状态。
    3.A 窗口轮询订单状态,查询订单完成后,更新 A 窗口数据。
    abelyao
        4
    abelyao  
       2015-11-30 12:17:48 +08:00 via iPhone
    @dugrey 现在用手机上的,也不好看网易具体怎么实现,但你可以看看支付宝的 notify url 和 return url 两个参数,实现同样的效果不是问题
    wy315700
        5
    wy315700  
       2015-11-30 12:18:45 +08:00
    长连接
    tracymcladdy
        6
    tracymcladdy  
       2015-11-30 12:20:58 +08:00
    支付宝的返回是有同步的页面返回,和异步的服务器通知的。
    你这个应该写在同步的页面返回去。
    dugrey
        7
    dugrey  
    OP
       2015-11-30 12:22:10 +08:00
    @behappy 以前有看到一个网站的扫码支付也是用轮询,然后我试着挂着,貌似请求了几百次才停。网易云音乐支付完跳转回来窗口就自动关闭,订单页就自动更新状态。整个流程挺流畅的,感觉是一种更好实现,就是不知道具体是如何...
    dugrey
        8
    dugrey  
    OP
       2015-11-30 12:33:42 +08:00
    @wy315700 可以讲得具体一点嘛
    pubby
        9
    pubby  
       2015-11-30 12:45:32 +08:00 via Android
    B 窗关闭前应该是和 A 窗同域,因为 B 是 A 打开的,在 B 中用 JS 控制 A 页面应该不难。
    dugrey
        10
    dugrey  
    OP
       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
        11
    JenJieJu  
       2015-11-30 13:40:30 +08:00
    方法一: B 页面回调(调用 A 页面的函数)
    方法二: A 页面轮训。
    ZnZt
        12
    ZnZt  
       2015-11-30 13:44:18 +08:00
    在 A 页面弹个 dialog , 里面有 已完成支付按钮 和 支付遇到问题按钮
    dugrey
        13
    dugrey  
    OP
       2015-11-30 14:41:35 +08:00
    http://46.101.1.172/order.html
    做了个 demo ,大概是这么个流程,大家可以看看这么做有什么问题没有。
    Lpl
        14
    Lpl  
       2015-11-30 19:43:22 +08:00 via Android
    嗨。。没那么复杂。
    这两天在写微信和支付宝支付的接口,然后看了下以前项目的代码。

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

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

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

    我们是直接在订单结算页面跳转付款回调过来就行了。没必要去轮询的.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3050 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 14:55 · PVG 22:55 · LAX 07:55 · JFK 10:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.