Настройка полосовой подписки с клиентом без способа оплаты по умолчанию в Java - PullRequest
0 голосов
/ 03 февраля 2020

Этот вопрос является неправильным пониманием того, как собирать PaymentMethod для подписки с новыми требованиями SCA. Ключевым моментом было внимательно прочитать, как оформить подписку , что немного отличается от разовых платежей.

Я перевожу реализацию Stripe на версию 16.4. 0, для приложения, разработанного с Java с использованием среды Spring-boot, для поддержки требований строгой аутентификации клиентов (SCA).

Проблема в том, что Я не могу создать подписку потому что у клиента нет способа оплаты .

Это мой рабочий процесс для подписки:

Я создаю клиента:

   Map<String, Object> params = new HashMap<>();
   params.put("name", customerName);
   params.put("email", user.getUsername());
   params.put("description", "idweb: " + user.getIdweb() + " " + customerName);
   Customer customer = Customer.create(params);
   customerId = customer.getId();

Далее, Я создаю подписку для этого клиента:

   Map<String, Object> firstItem = new HashMap<>();
   firstItem.put("plan", baseFee);
   firstItem.put("quantity", 1);

   Map<String, Object> secondItem = new HashMap<>();
   secondItem.put("plan", perUnitFee);
   secondItem.put("quantity", propertiesBase);

   Map<String, Object> items = new HashMap<>();
   items.put("0", firstItem);
   items.put("1", secondItem);

   Map<String, Object> metadata = new HashMap<>();
   metadata.put("properties", properties);
   metadata.put("RwRate", stripePlans.getRwRate());

   Map<String, Object> subscriptionParams = new HashMap<>();
   subscriptionParams.put("customer", customerId);
   subscriptionParams.put("collection_method", "charge_automatically");
   subscriptionParams.put("items", items);
   subscriptionParams.put("metadata", metadata);

   Subscription subscription = Subscription.create(subscriptionParams);

Здесь система выдает эту ошибку:

com.stripe.exception.InvalidRequestException: This customer has no attached payment source or default payment method.

Как я понял из документации ... с использованием версии API не позднее 2019-03-14 система устанавливает подписку в статус не завершена , если не удается выполнить платежное намерение, чтобы мы могли получить способ оплаты во внешнем интерфейсе.

Если бы я мог создать ubscription, я бы взял его последний счет-фактуру, из которого я бы взял платежное намерение передать Client Secret во внешний интерфейс.

    Invoice invoice = Invoice.retrieve(subscription.getLatestInvoice());
    PaymentIntent paymentIntent = PaymentIntent.retrieve(invoice.getPaymentIntent());
    model.addAttribute("clientSecret", paymentIntent.getClientSecret());

С этого момента я смогу назначить собранный способ оплаты гостю и оставить подписку активной для следующих платежей, поскольку она работала до сих пор без требований SCA.

Возможно, я что-то упустил или мой подход может быть неправым, в любом случае любой совет будет более чем приветствоваться . Я читал о разных подходах, установке пробного периода или установке SetupIntent . Но мой идеальный сценарий - это взимать первую квоту при получении карты клиента и оставлении подписки готовой, чтобы последующие взимались автоматически.

1 Ответ

0 голосов
/ 03 февраля 2020

Если вы используете Источники, вам нужно установить default_source.

Клиента. Если вы вместо этого используете более новый API PaymentMethods (и вам следует это делать, если у вас нет веских причин не делать этого), вместо этого вы захотите установить invoice_settings.default_payment_method.

для Заказчика. Подробную информацию см. в Документах Stripe .

...