Используя 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.
Если я правильно понимаю, у вас есть объект сеанса оформления заказа, и вы хотите получить набор metadata
для связанных продуктов? Если это так, вам необходимо:
metadata
продуктаАльтернативой может быть установка metadata
непосредственно на объекте сеанса оформления заказа или на объекте цены.
@J.E.N Вы уверены, что правильно установили метаданные this
для объекта Product? Вы можете открыть объект на панели мониторинга и узнать, есть ли у него метаданные или нет.
Да, это отображается в журналах на приборной панели. Проблема заключалась в том, что Stripe не отправлял весь дочерний объект, если вы не запросили его в построителе SessionListLineItemsParams. Большое спасибо.
Проблема в том, что получить доступ к метаданным можно только с помощью параметра расширения. В этом случае метаданные находятся в 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
Вы не можете получать события веб-перехватчика с автоматически развернутыми свойствами. Объекты, отправляемые в событиях, всегда находятся в минимальной форме. Чтобы получить доступ вложенные значения в расширяемых свойствах, вы должны получить объект в отдельном вызове в обработчике веб-перехватчика.
По-прежнему возвращает значение null- item.getPrice().getProductObject().getMetadata().get("this");