搜索 PHP 示例新的条带“结帐”集成 stripe-php

Posted

技术标签:

【中文标题】搜索 PHP 示例新的条带“结帐”集成 stripe-php【英文标题】:Search for PHP example new stripe "checkout" integration stripe-php 【发布时间】:2019-09-15 07:38:29 【问题描述】:

我必须在我的代码中进行哪些更改才能从旧式条带结帐迁移到新结帐?我对他们的措辞感到困惑。我发现的大多数例子都是旧的(2015-1016 ......并且是“旧方式”) 由于 SCA,Stripe 想让我升级到新的结账方式

这是我的工作条结帐,我有一个打开结帐框的按钮

<script>
var handler = StripeCheckout.configure(
  key: '<? echo $stripe_p_key;?>',
  image: 'https://stripe.com/img/documentation/checkout/marketplace.png',
  locale: 'auto',
  token: function(token) 
    var $form = $('#f2');
    var token = token.id;
    showloader('loaderid');
        $form.prepend($('<input type="hidden" style="display:none" name="stripeToken">').val(token));
        $form.prepend($('<input type="hidden" style="display:none" name="cc_currency">').val('<? echo $dialog_waehrung_kreditkarte;?>'));
      $form.get(0).submit();  

  
);

document.getElementById('customButton').addEventListener('click', function(e) 
  // Open Checkout with further options:
  handler.open(
    name: '',
    description: '<? echo $dialog_titel;?>',
    zipCode: true,
    currency: '<? echo $dialog_waehrung_kreditkarte;?>',
    email: '<? echo $dialog_email_kreditkarte;?>',
    amount: <? echo $dialog_preis_kreditkarte;?>
  );
  e.preventDefault();
);

// Close Checkout on page navigation:
window.addEventListener('popstate', function() 
  handler.close();
);
</script>

然后我在下一步中对卡进行充值

    Stripe::setApiKey($params['private_live_key']);
    $pubkey = $params['public_live_key'];
    try 
        $charge = Stripe_Charge::create(array(       
              "amount" => $amount_cents,
              "currency" => $_SESSION['cc_currency'],
              "source" => $_SESSION['stripeToken'],
              "description" => $description,
        "expand" =>array("balance_transaction")
        )             
        );

如果没有抛出错误,我会将客户转到他的下载页面。

我想要一个非常简单的方法,我不需要客户、账单、应聘付款或其他任何东西......只需单笔付款。我不希望客户地址或类似的东西。付款和再见...

Stripe 说我必须改变这个过程。 但他们的例子让我感到困惑: https://stripe.com/docs/payments/checkout/migration#api-products (例如,我从来没有创建过客户……我为什么要创建?)

谁能告诉我要迁移到新的结帐版本需要做什么?

【问题讨论】:

这应该会有所帮助:stripe.com/docs/payments/checkout/migration 把所有的旧代码撕掉,使用 v3 js 文件并为卡片元素插入他们的代码。 stripe.com/docs/stripe-js/elements/quickstart。然后将令牌发送到您的 php 服务器并遵循该部分的文档:stripe.com/docs/api/charges/create?lang=php 对于 PHP 特定的 Checkout 集成,您可能需要查看 stripe.com/docs/payments/checkout/server ...boys and grils stripe 太令人困惑了,他们说我现在应该使用支付意图而不是结帐(以及旧的“遗留”结帐)他们的目标似乎是让每个人都感到困惑不同的方法:-( 我完全同意你所说的,Bodomalo; Stripe 文档曾经非常出色,但现在(字面意思)绕圈子,不回答基本请求或提供新实现的完整示例。可悲的是,Stripe 曾经很棒,但现在变得臃肿和混乱。 【参考方案1】:

我同意。我们已经使用 Stripe Checkout 大约一年了。最初的实现非常简单。试图迁移到符合 SCA 的代码只是一团糟。他们的在线聊天毫无用处,从聊天中的响应来看,他们基本上不在乎你是和他们在一起还是离开。 我们将恢复使用之前使用的 PayPal,并寻找替代的支付处理器。

【讨论】:

【参考方案2】:

基本设置(您可以从这里构建)

后端:

更新您的Stripe PHP Library。

按照以下格式从 \Stripe\Charge 更改为 \Stripe\PaymentIntent:

$charge = \Stripe\Charge::create([
    'source' => $token_id,
    'amount' => $amount,
    'currency' => 'usd',
]);

$intent = \Stripe\PaymentIntent::create([
        'payment_method_data' => [
            'type' => 'card',
            'card' => ['token' => $token_id],
        ],
        'amount' => $amount,
        'currency' => 'usd',
        'confirmation_method' => 'manual',
        'confirm' => true,
    ]);

前端:

更新您的 Stripe JS 以使用 v3。

<script src='https://js.stripe.com/v3/' type='text/javascript'></script>

更新处理您的付款表单的 JS 代码:

document.addEventListener("DOMContentLoaded", function(event) 
    var stripe = Stripe('xxxxxxxxxx'); // test publishable API key
    var elements = stripe.elements();

    var card = elements.create('card');
    // Add an instance of the card UI component into the `card-element` <div>
    card.mount('#card-element');

    // Handle events and errors
    card.addEventListener('change', function(event) 
      var displayError = document.getElementById('card-errors');
      if (event.error) 
        displayError.textContent = event.error.message;
       else 
        displayError.textContent = '';
      
    );

    function stripeTokenHandler(token) 
      // Insert the token ID into the form so it gets submitted to the server
      var form = document.getElementById('payment-form');
      var hiddenInput = document.createElement('input');
      hiddenInput.setAttribute('type', 'hidden');
      hiddenInput.setAttribute('name', 'stripeToken');
      hiddenInput.setAttribute('value', token.id);
      form.appendChild(hiddenInput);

      // Submit the form
      form.submit();
    

    function createToken() 
      stripe.createToken(card).then(function(result) 
        if (result.error) 
          // Inform the user if there was an error
          var errorElement = document.getElementById('card-errors');
          errorElement.textContent = result.error.message;
         else 
          // Send the token to your server
          stripeTokenHandler(result.token);
        
      );
    ;

    // Create a token when the form is submitted.
    var form = document.getElementById('payment-form');
    form.addEventListener('submit', function(e) 
      e.preventDefault();
      createToken();
    );
);

编辑您的 html 表单:

    <form action="process_payment.php" method="post" id="payment-form">
          <div class="form-row">
            <label for="card-element">
              Credit or debit card
            </label>
            <div id="card-element"><!-- Your form goes here --></div>                  
            </div>        
            <!-- Used to display form errors -->
            <div id="card-errors" role="alert"></div>
          </div>
        <button type="submit">Pay</button>
    </form>

【讨论】:

正在寻找一种非常无缝的方式来升级到 v3,这是我见过的最简单的答案。更新代码用了不到 5 分钟。我仍然不是 100% 为什么需要从收费到付款意图,但是当我“按原样”离开时收费仍然有效。谢谢。 @JonnyO Payment Intent (主要)用于 SCA 问责制。 如果交易需要强大的客户身份验证,这可能不适用于欧洲国家。【参考方案3】:

随着您在评论中提到的新 SCA 法规的出台,您现在需要使用付款方式和付款意图。

基本上看一下您的示例代码,您将需要重写几乎所有内容(如果您还没有的话)

他们当前的文档在这里 -> https://stripe.com/docs/payments/checkout

付款意图和付款方式的原因是由于 SCA - https://stripe.com/docs/strong-customer-authentication

他们也有一个迁移指南,可以在侧栏上找到。

但是,从他们的示例来看,这就是您创建新付款意图的方式

$intent = \Stripe\PaymentIntent::create([
    'amount' => 1099,
    'currency' => 'gbp',
]);

这也是他们从收费 API 迁移的指南 - 如果您一直在使用它,它有一个 stripe.js V2 的标签https://stripe.com/docs/payments/payment-intents/migration

【讨论】:

虽然参考 Stripe 文档很好,但 Greg,您是否真的阅读并尝试过实施他们的文档线索?这是一个混乱的混乱:-( @Martin 是的,我已经使用条带文档构建了自己的自定义集成,并且偶尔会在他们的 IRC 频道上与他们的开发人员交谈。我也不知道为什么我被否决了。我的答案很确定。

以上是关于搜索 PHP 示例新的条带“结帐”集成 stripe-php的主要内容,如果未能解决你的问题,请参考以下文章

条纹结帐 - 删除或使电子邮件字段只读

如何通过条带结帐传递帐单详细信息

Javascript / Jquery 将变量拆分为两个以进行条带集成

禁用客户名称的条带结帐自动填充

条带结帐发送额外参数

是否可以在 Django 中重定向到没有 AJAX 的条带结帐页面?