PayPal REST API订单工作流程:支付->销售->Webhook?

6

我正在尝试将PayPal REST API集成到我的Symfony 2 Web应用程序中,但我发现很难理解完整的工作流程:

PayPal文档描述了接受付款的以下步骤。可以使用PayPal Playground模拟这些步骤:

  1. 获取访问令牌
  2. 通过查询API创建Payment对象
  3. 将用户重定向到Payment响应中收到的approval url
  4. 在PayPal页面上用户批准付款后,使用Payment对象中定义的成功链接将用户重定向回我的页面。使用收到的信息执行付款。
  5. 付款完成,状态为approved

来自文档:

一旦付款完成,它就被称为销售。然后,您可以查找销售并退款。

到目前为止都很好。但是:这个工作流程中在哪里使用/触发Webhooks?我已经在PayPal开发者仪表板中定义了一个通配符Webhook(接受所有可能的事件)。

我的观察是,我的系统在用户被重定向回成功链接之后的1-2分钟内 以及 支付执行之后(第4步)才会收到Webhook事件。

除了执行付款和接收Webhook之间的长时间延迟外,此工作流程意味着我只在处理成功链接之后收到Webhook。这意味着处理成功链接对于完成付款是绝对必要的。这正确吗?

我需要使用Webhooks吗?

我已经在几天前问过这个问题,nifr的答案相当合理:不能信任用户遵循任何重定向URL,而应仅依赖Webhook事件。

然而,这与我之前描述的观察相冲突,因为如果不处理重定向URL,我将永远不会收到Webhook...

因此,处理PAYMENT.SALE.COMPLETED Webhook事件没有太多意义,因为在处理重定向URL时应该已经完成了。 正确吗?

但是,要处理待处理付款的更新、处理退款或撤销的付款等,只有通过监听这些事件才能实现。

所以答案是:只使用Webhooks来获取之前进行的付款的更新。正确吗?

所以,主要问题是:

  1. 接受付款的5个步骤并未提及使用Webhooks。这似乎不太合理,因为没有Webhooks,将会错过更新事件等。那么,是否真的可以在没有Webhooks的情况下实现完整的支付流程呢?
  2. 如果是,那么在这种情况下,如何处理更新(退款、待处理等)?
  3. 如果不是,那么什么是正确的策略/时间来完成订单,因为完全接收和处理Webhook需要相当长的时间?
1个回答

1
我在PayPal世界中还是新手,但几天前我在一个在线商店集成了PayPal Plus REST API,从我的理解来看,工作流程如下:
  1. 创建付款
  2. 重定向到PayPal
  3. 付款人可以使用PayPal帐户支付或者(使用银行直接借记或信用卡支付而无需PayPal帐户)
  4. 在PayPal端完成流程后,PayPal会将用户重定向回您的成功URL。
  5. 到目前为止,用户仍未被收取任何费用(您没有收到钱)。在您(在成功的URL中)执行$payment->execute($paymentExecution,$api);时,您要求Paypal从用户那里收取金额。但是,在此之后,您仍然没有钱。Paypal必须首先处理收费,并稍后通过WebhookEvents通知您。

Webhook通知(具有恶劣的延迟)对于用户通过直接借记或信用卡等方式支付尤其重要。处理此类付款需要几秒钟/几分钟。

redirectUrl对于收费/执行付款绝对必要。 在执行成功后,只需告诉用户他完成了任务,您可以在此处保存/捕获PaymentID / Transaction id以供以后使用/通过WebhookEvent Listener更新。

我建议您只有在通过WebhookEvent监听器接收到通知后,才更新您的数据库(付款已完成),而不是在成功的RedirectUrl中进行更新。

看起来情况比那还要糟糕。在客户端集成系统中,RedirectURL以及所有其他信息和凭据都以明文形式出现在客户端中。这意味着攻击者可以跳过PayPal付款捕获,只需手动点击RedirectURL即可。如果商家不检查Webhooks,他们就会失败。 - Chris Nadovich
@ChrisNadovich,这不是真的,如果您使用PayPal SDK。如果您通过PayPal表单按钮等方式进行付款,则可能是真的。使用PayPal SDK,您会与PayPal“服务器端”联系,客户端看不到任何内容(仅重定向URL可见,但如果您要求PayPal验证该请求,然后更新您的付款数据库,则这不是问题)。 - Rami.Q
是的,@Rami.Q,对我来说旧的Classic API似乎是安全的。我指的是他们现在似乎在推广的新REST API。他们提供的客户端集成示例似乎都保留了客户端的所有凭据。我甚至找不到PayPal文档中如何解决这个问题的讨论。 - Chris Nadovich

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接