Почему Stripe не дает мне статус Payment Intents require_action при использовании номера тестовой карты 3D Secure? - PullRequest
1 голос
/ 23 мая 2019

Следуя документации Stripe для биллинга и подписок, я использую PaymentIntents для создания подписки. Он отлично работает, если я ввожу тестовую карту, которая не требует 3D Secure. Но я использую тот, который вместо того, чтобы дать мне статус require_action, просто выдает ошибку на карте.

//Create customer
$customer = \Stripe\Customer::create(array(
      "source" => $token,
      "email" => $subscriber_email)
    );

    // Get customer variables from Stripe response
    $payment_livemode = $customer->livemode;
    $payer_id = $customer->id;

    // Now put customer on subs plan    
    try {   
        $subscription = \Stripe\Subscription::create([
          "customer" => $payer_id,
          "items" => [
            [
              "plan" => $subscription_plan
            ],
          ],
           "expand" => ["latest_invoice.payment_intent"],
        ]);

        $subscription_id = $subscription->id;
        $subscription_plan_id = $subscription->items->data[0]->plan->id;
        $subscription_latest_invoice_status = $subscription->latest_invoice->status;
        $subscription_latest_invoice_id = $subscription->latest_invoice->id;
        $subscription_latest_invoice_payment_intent_status = $subscription->latest_invoice->payment_intent->status;
        $subscription_latest_invoice_payment_intent_client_secret = $subscription->latest_invoice->payment_intent->client_secret;

        $_SESSION['subscription_latest_invoice_payment_intent_client_secret'] = $subscription_latest_invoice_payment_intent_client_secret;

        if ($subscription_latest_invoice_payment_intent_status=='succeeded') {
             header("Location: ../payment-success");
        }
        if ($subscription_latest_invoice_payment_intent_status=='requires_payment_method') {
             header("Location: ../payment?payment_status=failed&inv=$subscription_latest_invoice_id");
        }
        if ($subscription_latest_invoice_payment_intent_status=='requires_action') {
             header("Location: ../payment?payment_status=requires_action");
        }
    } catch(\Stripe\Error\Card $e) {

          $body = $e->getJsonBody();
          $err  = $body['error'];

          if ($err['code']=="subscription_payment_intent_requires_action") {
              header("Location: ../payment/requires_action");
          }

        } catch (\Stripe\Error\RateLimit $e) {
          // Too many requests made to the API too quickly
        } catch (\Stripe\Error\InvalidRequest $e) {
          // Invalid parameters were supplied to Stripe's API
        } catch (\Stripe\Error\Authentication $e) {
          // Authentication with Stripe's API failed
          // (maybe you changed API keys recently)
        } catch (\Stripe\Error\ApiConnection $e) {
          // Network communication with Stripe failed
        } catch (\Stripe\Error\Base $e) {
          // Display a very generic error to the user, and maybe send
          // yourself an email
        } catch (Exception $e) {
          // Something else happened, completely unrelated to Stripe
        }

Я использую тестовые карточки на этой странице: https://stripe.com/docs/testing#three-ds-cards

Я выбрал карту с этим номером: 4000 0000 0000 3220

Вот мои подробности ошибки: Статус: 402 Тип: card_error Код: subscription_payment_intent_requires_action Сообщение: оплата за эту подписку требует дополнительных действий пользователя, прежде чем она может быть успешно завершена. Пожалуйста, обратитесь к использованию параметра enable_incomplete_payments здесь: https://stripe.com/docs/billing/lifecycle#incomplete-opt-in

Моя версия API - 2018-05-21.

Может кто-нибудь подсказать, что я делаю не так?

1 Ответ

1 голос
/ 25 мая 2019

Ответил в комментариях, просто разместив здесь для наглядности:

Привет, Энди, поскольку у тебя более старая версия API, чтобы поддерживать 3DS в подписках, тебе следует использовать это руководство вместо этого: https://stripe.com/docs/billing/migration/strong-customer-authentication#upgrading-integration.

Это означает, что вы обновляете версию своего API или передаете флаг enable_incomplete_payments при создании подписки, как указано в сообщении об ошибке.

...