【发布时间】:2021-12-22 14:10:44
【问题描述】:
我正在开发和测试一个用 PHP 编写的 Stripe 集成,它运行良好。我可以创建会话,重定向到结帐表单,当付款完成时,它会向我的 webhook 脚本发送一个事件,该脚本成功处理有关付款的信息。
当我创建会话时,我将在我的网站上填写的表单的数据存储在数据库中,当付款通过时,我将信息存储在不同的表中,这很棒。
我遇到的问题是我不知道如何将有关成功付款的信息与生成它的会话联系起来。
关联这些数据对我来说很重要,因为我想跟踪哪些会话实际上导致了成功的支付,这样我就可以分析用户界面的流程并跟踪转化率并分析导致放弃结帐的因素会话。
在某些情况下,很容易将这些东西联系起来。例如,如果在给定的时间范围内只生成一个会话和一个成功的付款,与给定的电子邮件相关联,我可以将它们链接起来。问题是我希望能够处理一个人创建多个会话并放弃它们的(可能常见的)场景。在这种情况下,我无法将付款链接到与电子邮件关联的最新会话,因为单个客户可能会创建两个会话,但在第一个早期创建的会话中完成付款。
我不知道如何从返回到我的 webhook 的 payment_intent 对象中访问 session_id。我对如何解决这个问题的一些想法包括:
- 侦听我的 webhook 脚本中发生的其他事件,这可能允许我链接两条记录。
- 将元数据传递给会话,例如唯一生成的 ID,然后从 payment_intent 对象访问相同的元数据。但是,我无法通过阅读 Stripe 文档来弄清楚元数据是如何工作的,即使元数据从会话传递到 payment_intent 对象(文档没有明确说明或解释它,而且 session_id 没有传递的事实让我想知道元数据是否会被传递)。我不想做这个解决方案,因为它需要在生成会话之前生成唯一 ID 的额外步骤,这将需要我做更多的工作,也会使我的代码更复杂并涉及更多数据库调用和更多可能出错的潜在步骤(目前我正在生成会话,然后存储信息以响应会话的成功创建),但如果真的没有更好的选择,我可以容忍它。
我想在这里遵循“最佳实践”,但我不清楚 Stripe 打算如何让人们链接或访问数据,或者这可能是他们的疏忽。
如果你给我示例代码,如果可能的话,我更愿意在 PHP 中看到它,但你根本不需要给我看任何代码;只需给我一个关于如何完成此任务的抽象或一般概念就足够了,我可以自己想出编码细节。
【问题讨论】:
-
您的元数据属性是正确的。当您获得 webhook 时,使用 用户 ID/订单 ID 链接备份。我对订阅做了类似的事情。这是关于元数据的文档,基本上只是一个数组..stripe.com/docs/payments/…
-
@Bossman 当我在创建会话对象时将元数据传递给它,即在调用
\Stripe\Checkout\Session::create()时将其作为数组中的条目输入时,相应的payment_intent对象返回空元数据。所以看起来这种方法行不通。我想知道我是否需要在这里收听另一个事件,也许是checkout.session.completed。我想接下来我会尝试这条途径。 -
你可以试试
client_reference_id。这是您可以使用的另一个可选属性。进一步研究它,我认为元数据不会与会话对象一起保存,即使它在文档中作为属性。 -
因此,尽管我想出了另一个解决方案,使用 webhook 监听
checkout.session.completed事件,并且因为我更喜欢它而使用它,但对它进行更多研究,它也可以使用元数据完成,但关键是使用参数payment_intent_data.metadata,因为只有这个被传递给payment_intent 对象。我在第一次尝试时错过了这一点,因为我在会话对象中看到了metadata字段,它具有误导性。 Stripe 可以改进他们的文档;会话的 API 文档中未提及传递给会话的参数。 -
取而代之的是这个单独的页面(我只是通过网络搜索找到的,不确定它是否或如何在文档内部链接到),它解释了:support.stripe.com/questions/…
标签: php stripe-payments checkout