Payum与Omnipay
简短的回答是 Payum 提供与 Omnipay 相同的功能以及一些额外的功能。
当您将付款模式与转换操作相结合时,Payum 效果最佳。该模型不能只是Payum 的模型,我鼓励您使用自己的模型或电子商务平台的模型。这个想法很简单:您向 Payum 发送请求以捕获您的模型。在操作中,您将支付模型转换为特定于网关的格式,很可能是一个数组。这种方法的美妙之处在于你的代码永远不会改变,看起来像这样:
$gateway->execute(new Capture($payment));
所有网关的差异都隐藏在网关内。当然,Payum 支持网关特定格式,或者 Payum 的支付模型。在 Omnipay 的情况下,您不能简单地将条带网关替换为贝宝网关,因为它们的行为不同,更重要的是它们需要不同的数据。Stripe 需要提供信用卡,而 Paypal 不关心它,而是希望设置返回和取消 url。您必须在代码中反映这些差异,这是抽象吗?顺便说一句,Payum 会为您生成取消和返回 url,它们是安全的(我们稍后会讨论)。
有时您必须获取有关付款交易或付款人的更多详细信息,或有关错误的更多信息。Payum 让您可以访问参与您的代码和支付网关之间通信的所有数据。数据格式是特定于支付的,因此如果您熟悉Paypal 协议(例如),您将很容易理解那里发生了什么。另一个很好的例子是 Klarna Checkout。它返回送货\账单地址、性别和出生日期。使用 Payum,您可以轻松地将这些从付款中取出并用于您的需求。
Payum 为您提供更好的状态处理。Omnipay 仅提供成功和失败两种状态,但这还不够。例如,Paypal 有时会因为多币种问题而返回待处理状态。在这种情况下,omnipay 表示付款失败,但实际上并非如此。或者用户可以在 Paypal 端取消支付,Omnipay 会告诉你失败,但事实并非如此。如果您需要 Payum 默认不提供的状态,您可以轻松添加。您是否已经有付款状态,也许您的电子商务平台提供了它们并且您想重复使用,没有问题 Payum 可以调整以使用它们。
有时用户想要欺骗你或为这些东西支付更少的费用。作为开发人员,您必须考虑并处理好您的数据。你向用户展示了什么?它会以错误的方式使用吗?在验证之前,您不能依赖 url 中给出的金额。例如,Paypal 会向您之前发送给他们的通知 url 发送一个推送通知。Payum 为您生成这样的 url,当通知返回时,它会验证它。您可以开箱即用地获得独特、安全的 URL。与该 url 内部关联的付款,一旦您删除\使 url 用户无效,就无法访问其背后的付款。Omnipay 不提供任何东西来帮助您解决安全问题。这些安全网址有一个很好的副作用。一旦不需要,安全的 url 就会失效\删除。这个不错,例如,用户在浏览器中单击“返回”按钮。由于购买网址不再存在,他将无法进行第二次付款,而是会看到 404 错误。
将信用卡存放在身边不是一个好习惯,不是吗?没有任何借口可以意外存储它,或者只是几秒钟。Payum 有一个敏感的值对象,可确保不会意外保存任何内容。您仍然可以存储它,但在这样做时,您是一个人。
Omnipay 仅支持重定向到网关端或需要信用卡的网关。但是还有很多其他的网关,它们的行为不同。例如,Klarna Checkout需要渲染一个片段(iframe),Stripe.Js需要在购买页面上执行他们的 javascript。Stripe Checkout呈现自己的弹出窗口。Payum支持所有这些,正如我们一开始所说的,您可以从一个网关切换到另一个网关,而无需更改代码。Payum 本身不支持您需要的网关?我不认为重新实现内部的每个网关都是一个好主意。这就是存在 Omnipay 网关的桥梁的原因。它允许您以 Payum 方式使用 Omnipay 网关。
Payum 试图规范支付流程。准备、捕获\授权和完成三个步骤。第一个称为“准备”,在此步骤中,您必须准备付款、计算总价格、税金、获取用户或运输信息等。完成后,您可以将用户重定向到捕获\授权步骤,从这里用户可以被重定向到网关端或要求提供信用卡或其他东西。这取决于您选择的网关。在“完成”步骤,您必须获得付款状态并根据它采取行动。Omnipay 仅部分解决了这一任务。
使用网关工厂,您可以轻松地在功能上覆盖\替换网关的任何部分,或添加自定义操作、扩展或 api。
Payum 为大多数现代框架提供官方扩展,例如Symfony。Laravel、Silex、Yii、 Zend。
最后让我们比较一下 Payum 和 Omnipay 的基石接口。
免责声明:我是Payum的作者