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

Posted

技术标签:

【中文标题】PayPal REST API 订单工作流程:付款 -> 销售 -> Webhook?【英文标题】:PayPal REST API order workflow: Payment -> Sale -> Webhook? 【发布时间】:2016-07-16 15:56:04 【问题描述】:

我正在尝试将 PayPal REST API 集成到我的 Symfony 2 网络应用程序中,但我发现很难理解完整的工作流程到底是什么样子:

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

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

From the docs:一旦付款完成,它被称为 销售。然后,您可以查看销售情况并进行退款。

到目前为止一切顺利。但是: 在这个工作流程中,Webhook 在哪里使用/触发?我在 PayPal Developer Dashboard 中定义了一个通配符 Webhook(接受所有可能的事件)。

我的观察是,我的系统收到 Webhook 事件 1-2 分钟 (!) 用户被重定向回成功链接和 付款完成后(第 4 步)

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

我需要使用 Webhooks 吗?

几天前我已经问过this question,nifr 的回答很合理:不能相信用户会遵循任何重定向 URL,而应该只依赖 Webhook 事件。

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

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

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

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

所以,主要问题是:

    接受付款的 5 步流程并未说明使用 Webhooks。这似乎没有多大意义,因为没有 Webhooks 会错过更新事件等? 那么,真的可以在没有 Webhooks 的情况下实现完整的支付流程吗? 如果是,在这种情况下如何处理更新(退款、待处理等)? 如果不是,什么是正确的策略/时间来完成订单,因为需要很长时间才能完全接收和处理 webhook?

【问题讨论】:

【参考方案1】:

我还是 PayPal 世界的新手,但几天前我在一个在线商店中集成了 PayPal Plus REST API,据我了解,我可以看出工作流程如下:

    创建付款 重定向到 PayPal 付款人可以使用 PayPal 帐户付款(使用银行直接借记卡或信用卡付款,无需 PayPal 帐户) 在 PayPal 端完成该过程后,PayPal 会将用户重定向回您的成功 URL。 到现在为止,用户仍然没有被收费(你没有钱)。在您(在您的成功 URL 中)执行 $payment->execute($paymentExecution,$api); 的那一刻,您要求 Paypal 从用户那里收取费用。但在此之后,你也没有钱。 Paypal 必须先处理收费,然后通过 WebhookEvents 通知您。

当用户通过直接借记卡或信用卡等方式付款时,Webhook 通知(带有令人讨厌的延迟)尤其重要。处理此类付款需要几秒钟/几分钟的时间。

redirectUrl 绝对是收费/执行付款所必需的。 这里执行成功,只是为了告诉用户,他完成了他的工作,你可以在这里保存/捕获 PaymentID/Transaction id 以供以后通过 WebhookEvent Listener 使用/更新。

所以我建议您仅在通过 WebhookEvent 侦听器收到通知后更新您的数据库(付款已完成),而不是在成功的 RedirectUrl 中。

【讨论】:

似乎比这更糟糕。在客户端集成系统中,重定向 URL 以及所有其他信息和凭据在客户端中显示为纯文本。这意味着攻击者可以跳过 PayPal 付款捕获,而只需手动点击 RedirectURL。如果商家不检查 Webhooks,他们就完蛋了。 @ChrisNadovich,如果您使用 PayPal SDK,这不是真的。如果您使用 PayPal SDK 通过 PayPal 表单按钮等进行付款,则这可能是正确的该请求,在更新您的支付数据库之前) 是的,@Rami.Q,在我看来,旧的 Classic API 是安全的。我指的是他们这些天似乎正在推动的新 REST API。他们为客户端集成提供的示例似乎都保留了客户端上的所有凭据。我什至在 PayPal 的文档中找不到任何关于如何缓解此问题的讨论。

以上是关于PayPal REST API 订单工作流程:付款 -> 销售 -> Webhook?的主要内容,如果未能解决你的问题,请参考以下文章

使用 REST api 执行 PayPal 付款

PayPal REST API 未返回 payment_info

如何在使用 PayPal rest API 执行付款之前更改运费

贝宝 Rest API SDK v2

使用 Paypal rest API 未显示付款详细信息

使用 rest api 捕获付款时发生 Paypal 内部服务器错误