我正在努力将 PayPal REST API 集成到我的 Symfony 2 网络应用程序中。我不确定完成订单/付款的正确时间/地点是什么:
与其他参数(如金额、客户数据等)一起,我将两个 URL 传输到 PayPal API:一个是用户在接受付款时重定向到的 URL,另一个是在取消付款时用户重定向到的 URL .
这没有任何问题,付款完成后,当用户使用我之前传输的 URL 重定向到我的页面时,我会获得完成订单所需的所有信息(例如解锁某些内容)。
但是我不确定这是否是正确的方法:
- 如果由于任何原因将用户重定向回我的页面失败,尽管付款已完成,但购买将不会完成(未解锁任何内容)。
- 如果客户使用手动银行转帐,付款将创建为
pending
,并在他手动将钱转入他的 PayPal 帐户时设置为已完成
。我必须以某种方式处理第二个completed
消息 - ...
这些问题可以通过使用 Webhooks
来解决:我在我的 PayPal 配置文件中指定了一个特殊的回调 URL,API 将使用此 URL 在不同的事件上通知我的系统。
这样我会在付款待处理时收到通知,并在付款完成后立即收到第二次通知。听起来不错。但是 Webhooks 是否也意味着完成即时支付? Doks 说,Webhooks 调用是异步执行的,无法保证它们的顺序。
我可以确定,在用户重定向到我的页面之前,我的系统将通过 Webhook 接收到 PAYMENT.SALE.COMPLETED
事件吗?或者有没有可能,他先被重定向,我稍后再收到事件?在这种情况下,用户将返回页面并且看不到购买结果。
那么,处理重定向 URL 和 webhook 事件以完成付款的正确方法/顺序是什么?
最佳答案
您不能相信用户被重定向到您指定的某个页面以将付款标记为已完成这一事实。不要那样做。
客户可以通过在他的地址栏中手动输入来中止交易并访问这个“成功”页面。然后没有付款。
您可以而且应该相信的唯一证据是您是否收到来自 PayPal 的 PAYMENT.SALE.COMPLETED
。
您可以向 PayPal 提供一个成功的 URL,在该 URL 中客户会看到“等待付款完成”,直到对您的 Webhook 端点的请求按预期到达。然后你把他转发到真正的成功页面或他想购买的内容。
如果您没有收到预期的 WebHook 请求,请在一段时间后显示超时错误。使用 Ajax 或 Websockets 来完成这个等待循环。
或者,您可以显示“成功”页面,但仅在 Webhook 请求到达后才让客户使用/解锁内容,如果他在付款确认到达之前尝试访问它,则显示“出现问题”消息WebHook 请求。
请记住,我们在这里谈论的是用户被重定向和 Webhook 被发送之间的几毫秒时间。通常,Webhook 请求是在为客户重定向发生之前发送的,但您不能相信这一点。
关于php - Paypal REST API : Fulfill Order/Payment on Redirect URL or on Webhook call?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36221146/