kpeu3u/stripe

Omnipay 支付处理库的 Stripe 驱动程序

v3.3.0 2022-07-12 17:21 UTC

README

Omnipay PHP 支付处理库的 Stripe 驱动程序

Build Status Latest Stable Version Total Downloads

Omnipay 是一个与框架无关的多网关支付处理库,用于 PHP。本包实现了 Omnipay 的 Stripe 支持。

安装

Omnipay 通过 Composer 安装。要安装,只需使用 Composer 需要 league/omnipayomnipay/stripe

composer require league/omnipay omnipay/stripe

基本用法

本包提供了以下网关

有关通用使用说明,请参阅主要的 Omnipay 仓库。

Stripe.js

Stripe 集成相对简单。基本上,你只需将 token 字段传递给 Stripe 而不是常规的信用卡数据。

首先,请遵循以下标准 Stripe JS 指南: https://stripe.com/docs/tutorials/forms

之后,你将有一个 stripeToken 字段,该字段将被提交到您的服务器。只需将此作为 token 传递给网关,而不是通常的 card 数组。

        $token = $_POST['stripeToken'];

        $response = $gateway->purchase([
            'amount' => '10.00',
            'currency' => 'USD',
            'token' => $token,
        ])->send();

Stripe 支付意图

Stripe 支付意图是 Stripe 的新基础支付 API。与 Charges API 相比,Payment Intents 支持 强客户身份验证。这意味着在支付过程中,用户可能会被重定向到由客户的银行提供的网站进行身份验证。

本插件实现的实现使用的是手动支付意图确认流程,这与 Charges API 使用的流程非常相似。修改您当前的支付流程不应太困难。

  1. 首先,从客户那里 收集支付方式详细信息。或者,如果客户之前已提供并已在您的系统中保存了支付方式,您可以使用它。

  2. 按照使用 Charges API 时的方式继续授权或购买。

$paymentMethod = $_POST['paymentMethodId'];

$response = $gateway->authorize([
     'amount'                   => '10.00',
     'currency'                 => 'USD',
     'description'              => 'This is a test purchase transaction.',
     'paymentMethod'            => $paymentMethod,
     'returnUrl'                => $completePaymentUrl,
     'confirm'                  => true,
 ])->send();
  • 如果您有一个令牌而不是支付方式,您可以使用它,只需设置 token 参数,而不是设置 paymentMethod 参数。
  • returnUrl 必须指向您将重定向的每个外部网关的位置。如果 confirm 设置为 true,则此参数是必需的。
  • 如果您未将 confirm 参数设置为 true,您将需要手动确认支付意图,如下所示。
$paymentIntentReference = $response->getPaymentIntentReference();

$response = $gateway->confirm([
    'paymentIntentReference' => $paymentIntentReference,
    'returnUrl' => $completePaymentUrl,
])->send();

此时,您需要保存对支付意图的引用。 $_SESSION 可以用于此目的,但更常见的模式是在 $completePaymentUrl URL 中编码当前订单的引用。在这种情况下,现在是保存订单与支付意图之间关系的好时机,以便您可以稍后检索支付意图引用。

  1. 检查支付是否成功。如果是,则表示不需要 3DS 身份验证。此决定由 Stripe(考虑到您设置的任何自定义 Radar 规则)和发行银行决定。
if ($response->isSuccessful()) {
    // Pop open that champagne bottle, because the payment is complete.
} else if($response->isRedirect()) {
    $response->redirect();
} else {
    // The payment has failed. Use $response->getMessage() to figure out why and return to step (1).
}
  1. 客户被重定向到 3DS 身份验证页面。一旦他们验证(或未验证),客户将被重定向到之前指定的带有 completePaymentUrl 的 URL。

  2. 检索步骤(2)末尾提到的 $paymentIntentReference

  3. 现在我们需要确认支付意向,向Stripe表明一切都在控制之中。

$response = $gateway->confirm([
    'paymentIntentReference' => $paymentIntentReference,
    'returnUrl' => $completePaymentUrl,
])->send();

if ($response->isSuccessful()) {
    // All done!! Big bucks!
} else {
    // The response will not be successful if the 3DS authentication process failed or the card has been declined. Either way, it's back to step (1)!
}

Stripe Connect

Stripe Connect应用程序可以在代表用户进行的费用上收取额外的费用。为此,您需要在授权或购买请求中指定一个额外的 transactionFee 参数。

当一笔费用被退款时,交易费用将与退款金额成比例退还,默认情况下,这将从您的连接用户的Stripe账户中扣除,从而让他们承担实际支出。如果您想从(应用程序的)Stripe账户中退款,可以在退款请求中传递一个布尔值为true的 refundApplicationFee 参数。

注意:使用Stripe Connect特定参数进行请求只能使用在授权过程中收到的OAuth访问令牌。有关Stripe Connect的更多信息,请参阅这里

测试模式

Stripe账户同时拥有测试模式的API密钥和实时模式的API密钥。这些密钥可以同时激活。使用测试模式凭据创建的数据永远不会触及信用卡网络,也不会让任何人花费任何费用。

与某些网关不同,没有单独的测试模式端点与实时模式端点分开,Stripe API端点在测试和实时模式中是相同的。

支持

如果您在使用Omnipay时遇到一般问题,我们建议在Stack Overflow上发布帖子。请确保添加omnipay标签,以便轻松找到。

如果您想了解发布公告、讨论项目想法或提出更详细的问题,还可以订阅一个邮件列表

如果您认为您发现了一个错误,请使用GitHub问题跟踪器报告它,或者更好的是,分支库并提交一个pull请求。