Ошибка заказа с оплатой полосой : Невозможно списать средства с клиента, у которого нет активной карты

#php #stripe-payments #card

Вопрос:

Я использую API Stripe для оплаты заказов.

Мой план, как правило, заключается в следующем:

  1. Создание платежной формы с элементами полосы
  2. Аутентификация карты (3d secure security SCA) с помощью платежного средства, а затем создание метода оплаты.
  3. Создание объекта Клиента, к которому я прикрепляю способ оплаты и который я определяю как стандартный
 $customer = $this->stripeConnector->updateCustomer($customer->id, [
     'invoice_settings' => [
          'default_payment_method' => $paymentMethod->id,
        ],
   ]);
 
  1. Создание подписки или разового платежа.

Обычно это работает нормально.

Но не для Ордена. Я создаю объект Заказа, следуя документации : https://stripe.com/docs/api/orders/create с элементами заказов и связанным Клиентом

И я плачу его, следуя следующей документации https://stripe.com/docs/api/orders/pay

Итак, просто передав идентификатор заказа (потому что клиент уже связан с заказом).

Но у меня следующая ошибка : Не удается взимать плату с клиента, у которого нет активной карты

Почему? И как я могу «активировать» карту клиента ?

Это пример данных о клиентах, которые у меня есть :

 {
  "id": "cus_JocNLLNhqHuOD6",
  "object": "customer",
  "address": {
    "city": "paris",
    "country": "FR",
    "line1": "5 rue pompidou",
    "line2": null,
    "postal_code": "75000",
    "state": null
  },
  "balance": 0,
  "created": 1625758082,
  "currency": null,
  "default_source": null,
  "delinquent": false,
  "description": null,
  "discount": null,
  "email": "admin@mail.fr",
  "invoice_prefix": "D46F6A15",
  "invoice_settings": {
    "custom_fields": null,
    "default_payment_method": "pm_1JAz8uGgCQgXBLKX2hoxLQHr",
    "footer": null
  },
  "livemode": false,
  "metadata": {
  },
  "name": "admin admin",
  "next_invoice_sequence": 1,
  "phone": null,
  "preferred_locales": [
    "fr"
  ],
  "shipping": null,
  "tax_exempt": "none"
}
 

И мой ответ на платежный метод :

 {
  "id": "pm_1JAz8uGgCQgXBLKX2hoxLQHr",
  "object": "payment_method",
  "billing_details": {
    "address": {
      "city": null,
      "country": null,
      "line1": null,
      "line2": null,
      "postal_code": null,
      "state": null
    },
    "email": null,
    "name": "qsvsf",
    "phone": null
  },
  "card": {
    "brand": "visa",
    "checks": {
      "address_line1_check": null,
      "address_postal_code_check": null,
      "cvc_check": "pass"
    },
    "country": "US",
    "exp_month": 5,
    "exp_year": 2025,
    "fingerprint": "oV7uH07M2JEz7jQm",
    "funding": "credit",
    "generated_from": null,
    "last4": "4242",
    "networks": {
      "available": [
        "visa"
      ],
      "preferred": null
    },
    "three_d_secure_usage": {
      "supported": true
    },
    "wallet": null
  },
  "created": 1625758080,
  "customer": "cus_JocNLLNhqHuOD6",
  "livemode": false,
  "metadata": {
  },
  "type": "card"
}
 

Глядя на документ об оплате объекта заказа, я задаюсь вопросом, следует ли мне вместо этого использовать опцию «источник» и, следовательно, использовать объект источника вместо метода оплаты. Но проблема в том, что исходный объект устарел в пользу метода оплаты в пользу 3d secure, поэтому я должен его использовать.

Комментарии:

1. Когда вы создаете способ оплаты, каков его результирующий атрибут типа? stripe.com/docs/api/payment_methods/…

2. Это атрибут типа «карта». Я обновил свой первый пост с ответом на платежный метод

3. Хммм. Вы дважды проверяли, что при создании и оплате заказа вы также попадаете в среду тестирования/песочницы?

4. Да, да, он хорошо использует тестовую среду, не беспокойтесь об этом. Кроме того, если я переключусь с использованием исходного объекта для подачи карты, а не метода оплаты, это сработает, но мне больше не нужно использовать Исходный объект, так как он устарел и не поддерживает аутентификацию SCA 3d secure. Мы обязаны пройти процедуру оплаты. Я не знаю, есть ли где-то дополнительная опция, которую можно куда-то поместить, это очень странно

5. добавлен подробный ответ, вы используете Заказы, которые являются устаревшим API и поддерживают только sources параметры для клиента и не поддерживают методы оплаты.

Ответ №1:

Заказы-это давно устаревший API Stripe, поэтому я бы рекомендовал отказаться от него, перейдя к платежным поручениям или одноразовым счетам.

Поскольку это устаревший API, он работает только с картами/источниками, а не с методами оплаты.

Прямо сейчас ваша интеграция прикрепляет метод оплаты к вашему Клиенту.

Заказы не ищут способы оплаты вашего клиента, а вместо этого просматривают sources: параметры вашего клиента.

Заказы также не поддерживают SCA, поэтому, если платеж требует аутентификации, это будет выглядеть как отклонение и не даст вам функции жизненного цикла аутентификации, которые предоставляют вам PaymentIntents.

Вот почему это работает, как вы сказали, когда вы сохраняете объект «Источник» под именем Клиента source: .

Правильный подход состоял бы в том, чтобы отказаться от использования устаревших объектов Карты/источника и API заказов и интегрировать методы оплаты (которые вы уже интегрировали) и платежные документы, счета или чеки.

Комментарии:

1. Действительно? Так плохо… но вдруг я все еще могу использовать объекты продукта, связанные с объектами Sku? Я имею в виду, что если я создам объект продукта «Футболка» и несколько объектов артикулов, связанных с этим продуктом, с разными цветами и размерами, запасами, могу ли я затем использовать эти артикулы со счетом, методом оплаты или платежным средством в качестве элемента заказа?

2. Артикулы не рекомендуются, но вместо этого рекомендуются цены, вы можете создавать цены на продукты. Затем вы можете создать элемент счета-фактуры для Клиента, используя эту цену, и отправить Счет-фактуру Клиенту по электронной почте. «Страница размещенного счета» поддерживает SCA. Или создайте сеанс проверки для этого Клиента (в качестве платежной страницы на вашем веб-сайте), который также поддерживает SCA.

3. Итак, если я правильно понимаю, это больше не зависит от Stripe для управления запасами и товарами, а от нас, чтобы мы все делали в нашей собственной базе данных и во время оплаты все рассчитывали сами ?

4. да, это правильно, поскольку заказы устарели, вы бы обрабатывали запасы/запасы/и т. Д. На стороне вашего приложения