Как я могу получить метаданные продукта из сеанса после завершения оформления заказа с помощью Stripe в приложении Spring Boot?

Используя Stripe SDK в Spring Boot, после создания сеанса и добавления данных о продукте у вас есть возможность использовать putAllMetadata, который принимает карту <String, String>. Целью добавления этих метаданных является их получение после успешной оплаты через вебхук.

Я реализовал вебхук и получил от него объект сеанса, но не могу найти метод получения этих метаданных.

 paramsBuilder.addLineItem(
       SessionCreateParams.LineItem.builder()
              .setQuantity(1L)
              .setPriceData(
                  PriceData.builder()
                       .setProductData(
                           PriceData.ProductData
                                .builder()
                                .putAllMetadata(metadata)
                                .setName("Book "))
                                .build())
                       .setCurrency(myDTO.getCurrency())
                       .setUnitAmountDecimal(BigDecimal.valueOf(myDTO.getPrice()* 100))
                       .build())
              .build());
                Session session = Session.create(paramsBuilder.build());
                return session.getUrl();

Я попытался получить его из сеанса

 switch (event.getType()) {
        case "payment_intent.succeeded": {
            // System.out.println("done");
            // System.out.println("succeeded " + stripeObject.toJson());
            break;
         }
         case "charge.updated": {
             // System.out.println("upda " + stripeObject.toJson());
         }
         case "checkout.session.completed":
             Session sessionEvent = (Session) stripeObject;
             handleCheckoutSessionCompleted(sessionEvent);
             // System.out.print("sessiom " + sessionEvent.toJson());
             break;
             // ... handle other event types
         default:
             System.out.println("Unhandled event type: " + event.getType());
   }
return ResponseEntity.ok("");
}

private void handleCheckoutSessionCompleted(Session session) {
       try {
             SessionListLineItemsParams params = SessionListLineItemsParams.builder().build();
             List<LineItem> lineItems = session.listLineItems(params).getData();

             for (LineItem item : lineItems) {
                String this = item.getPrice().getMetadata()
                                                .get("this");
                System.out.println("this is "+ this);
             }
       } catch (StripeException e) {
              e.printStackTrace();
       } catch (Exception e) {
              e.printStackTrace();
       }
}

// System.out.print("sessiom " + sessionEvent.toJson()); Эта строка кода правильно печатает объект сеанса.

Мой код выводит на консоль значение null.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
54
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Если я правильно понимаю, у вас есть объект сеанса оформления заказа, и вы хотите получить набор metadata для связанных продуктов? Если это так, вам необходимо:

  1. Получить объект сеанса проверки
  2. Получите позиции сеанса оформления заказа
  3. Получить всю цену в позициях
  4. Для каждой цены найдите соответствующий продукт (это шаг, который вы пропустили).
  5. Найдите metadata продукта

Альтернативой может быть установка metadata непосредственно на объекте сеанса оформления заказа или на объекте цены.

По-прежнему возвращает значение null- item.getPrice().getProductObject().getMetadata().get("this")‌​;

J.E.N 17.06.2024 13:58

@J.E.N Вы уверены, что правильно установили метаданные this для объекта Product? Вы можете открыть объект на панели мониторинга и узнать, есть ли у него метаданные или нет.

soma 17.06.2024 14:09

Да, это отображается в журналах на приборной панели. Проблема заключалась в том, что Stripe не отправлял весь дочерний объект, если вы не запросили его в построителе SessionListLineItemsParams. Большое спасибо.

J.E.N 17.06.2024 14:51
Ответ принят как подходящий

Проблема в том, что получить доступ к метаданным можно только с помощью параметра расширения. В этом случае метаданные находятся в data.price.product, и к ним невозможно получить доступ из сеанса, кроме случаев явного запроса. Stripe не дает вам полного объекта.

Большое спасибо Соме за то, что он указал правильный метод, который я должен был использовать. Метаданные действительно есть как в объектах цены, так и в объектах продуктов.

SessionListLineItemsParams params = SessionListLineItemsParams.builder()
             .addExpand("data.price.product") //can't get product data without this
             .build();
List<LineItem> lineItems = session.listLineItems(params).getData();

String this = item.getPrice().getProductObject().getMetadata().get("this");

https://docs.stripe.com/api/expanding_objects

https://docs.stripe.com/expand

Вы не можете получать события веб-перехватчика с автоматически развернутыми свойствами. Объекты, отправляемые в событиях, всегда находятся в минимальной форме. Чтобы получить доступ вложенные значения в расширяемых свойствах, вы должны получить объект в отдельном вызове в обработчике веб-перехватчика.

Другие вопросы по теме