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?的主要内容,如果未能解决你的问题,请参考以下文章
PayPal REST API 未返回 payment_info