Этот вопрос является неправильным пониманием того, как собирать 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 . Но мой идеальный сценарий - это взимать первую квоту при получении карты клиента и оставлении подписки готовой, чтобы последующие взимались автоматически.