Omnipay和Payum之间的区别

Posted

技术标签:

【中文标题】Omnipay和Payum之间的区别【英文标题】:Difference between Omnipay and Payum 【发布时间】:2016-01-06 06:08:17 【问题描述】:

我正在为我的网络应用寻找支付解决方案。我看到有像 stripe(用于信用卡)或 PayPal 插件这样的 API 可以处理某些支付方式。

然后我看到有一些库可以处理各种支付方式,比如 Payum (https://github.com/Payum/Payum) 或 Omnipay (https://github.com/thephpleague/omnipay)。

如果我理解正确的话,它们都是同一类型的图书馆:它们都以标准化的方式处理各种方法的付款。但是我没有找到两者之间的任何比较,但 Payum 如何包含 OmniPay 的解决方案。所以我很困惑。因此我的问题是:

Omnipay 是否涵盖与 Payum 相同的目的。如果是的话,哪一个有什么优势。如果不是,他们正在执行支付流程的哪些部分。

【问题讨论】:

【参考方案1】:

Payum 与 Omnipay

简短的回答是 Payum 提供与 Omnipay 相同的功能以及一些额外的功能。

当您将付款模式与转化操作相结合时,Payum 效果最佳。该模型不能只是Payum’s one,我鼓励您使用自己的模型或ecommerce platform 中的模型。这个想法很简单:您向 Payum 发送请求以捕获您的模型。在convert the payment model to a gateway specific format 的操作中,很可能是一个数组。这种方法的美妙之处在于你的代码永远不会改变,看起来像这样:

$gateway->execute(new Capture($payment));

所有网关的差异都隐藏在网关内。当然,Payum 支持网关特定格式,或者 Payum 的支付模型。在 Omnipay 的情况下,您不能简单地将条带网关替换为贝宝网关,因为它们的行为不同,更重要的是它们需要不同的数据。 Stripe 需要提供信用卡,而 Paypal 不关心它,而是希望设置返回和取消 url。您必须在代码中反映这些差异,这是抽象吗?顺便说一句,Payum 会为您生成取消和返回 url,它们是安全的(我们稍后会讨论)。

有时您必须获取有关付款交易或付款人的更多详细信息,或有关错误的更多信息。 Payum 让您可以访问参与您的代码和支付网关之间通信的所有数据。数据格式是特定于付款的,因此如果您熟悉Paypal protocol (for example),您将很容易理解那里发生了什么。另一个很好的例子是 Klarna Checkout。它返回送货\账单地址、性别和出生日期。使用 Payum,您可以轻松地从付款中取出这些并用于您的需求。

Payum 为您提供更好的状态处理。 Omnipay 仅提供成功和失败两种状态,但这还不够。例如,由于multi currency issue,Paypal 有时会返回待处理状态。在这种情况下,omnipay 表示付款失败,但实际上并非如此。或者用户可以在 Paypal 端取消支付,Omnipay 会告诉你失败,但事实并非如此。如果您需要 Payum 默认不提供的状态,您可以轻松添加。您是否已经有付款状态,可能是您的ecommerce platform provide 并且您想重复使用,没问题 Payum 可以调整以使用它们。

有时用户想要欺骗您或为这些东西支付更少的费用。作为开发人员,您必须考虑并处理好您的数据。你向用户展示了什么?它会以错误的方式使用吗?在验证之前,您不能依赖 url 中给出的金额。例如,Paypal 会向您之前发送给他们的通知 url 发送一个推送通知。 Payum 为您生成这样的 url,当通知返回时,它会验证它。您可以开箱即用地获得独特、安全的 URL。与该 url 内部关联的付款,一旦您删除\使 url 用户无效,就无法访​​问其背后的付款。 Omnipay 不提供任何东西来帮助您解决安全问题。这些安全网址有一个很好的副作用。一旦不需要,安全的 url 就会失效\删除。这很好,例如用户在浏览器中单击“返回”按钮。由于购买网址不再存在,他将无法进行第二次付款,而是会看到 404 错误。

将信用卡存放在身边不是一个好习惯,不是吗?没有任何借口可以意外存储它,或者只是几秒钟。 Payum 有一个sensitive value 对象,可确保不会意外保存任何内容。您仍然可以存储它,但在这样做的过程中,您只能靠自己。

Omnipay 仅支持重定向到网关端或需要信用卡的网关。但是还有很多其他的网关,它们的行为不同。例如,购买页面上的 Klarna Checkout require a snippet (iframe) to be rendered、Stripe.Js requires their javascript to be executed。条纹结帐renders its own popup。 Payum supports them all,正如我们一开始所说,您可以从一个网关切换到另一个网关,而无需更改代码。 Payum 本身不支持您需要的网关?我不认为重新实现内部的每个网关都是一个好主意。这就是为什么bridge for Omnipay gateways exists。它允许您以 Payum 方式使用 Omnipay 网关。

Payum 尝试standardise the payment flow。准备、捕获\授权和完成三个步骤。第一个称为“准备”,在此步骤中,您必须准备付款、计算总价、税金、获取用户或运输信息等。完成后,您可以将用户重定向到捕获\授权步骤,从这里用户可以被重定向到网关端或要求提供信用卡或其他内容。这取决于您选择的网关。在“完成”步骤,您必须获得付款状态并根据它采取行动。 Omnipay 只能部分解决此任务。

使用网关工厂,您可以轻松地在功能上覆盖\替换网关的任何部分,或添加自定义操作、扩展或 API。

Payum 为大多数现代框架提供官方扩展,例如 Symfony。 Laravel、Silex、Yii、Zend。

最后让我们比较一下 Payum 和 Omnipay 的基石接口。

Payum GatewayInterface 与 Omnipay GatewayInterface Payum GatewayFactoryInterface vs Omnipay GatewayFactory ups 没有接口。

免责声明:我是 Payum 的作者

【讨论】:

如何区分信用卡网关和异地网关? - github.com/thephpleague/omnipay/issues/309 @MaksimKotlyar 您的回答在两年后仍然有效还是 Omnipay 实施了更好的支付流程? 我会说它或多或少是有效的。没有太大的发展或大的变化。

以上是关于Omnipay和Payum之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

Payum 自定义网关

Omnipay:将钱从 PayPal 账户转移到 Stripe 账户

通过 OmniPay PHP 进行 PayPal 汇款

使用 Sylius 0.16 和 Payum 实施异地支付网关时如何完成订单

Payum Bundle 的配置如何工作?

覆盖 Payum Stripe Bundle 模板