Получить данные чередования из события чередования чередований
При реализации чередования webhook в Java, я успешно получаю объект события в формате JSON. Проблема в том, что я не могу получить детали, такие как сумма, subscription_id, атрибуты, которые находятся во вложенном JSON. Получение этих значений из объекта класса также недоступно. Подскажите, пожалуйста, как извлечь эти значения
public void handle(HttpServletRequest request) {
Stripe.apiKey = sk_test_XXXXXXXXXXXXXXXXXXXX;
String rawJson = "";
try {
rawJson = IOUtils.toString(request.getInputStream());
}
catch (IOException ex) {
System.out.println("Error extracting json value : " + ex.getMessage());
}
Event event = APIResource.GSON.fromJson(rawJson, Event.class);
System.out.println("Webhook event : " + event);
}
И я получаю следующий ответ:
Webhook event : <com.stripe.model.Event@1462134034 id=evt_18qdEBElSMaq70BZlEwdDJG3> JSON: {
"id": "evt_18qdEBElSMaq70BZlEwdDJG3",
"api_version": "2016-07-06",
"created": 1473143919,
"data": {
"object": {
"id": "in_18qcFkElSMaq70BZy1US7o3g",
"amount_due": 4100,
"application_fee": null,
"attempt_count": 1,
"attempted": true,
"charge": "ch_18qdEBElSMaq70BZIEQvJTPe",
"closed": true,
"created": null,
"currency": "usd",
"customer": "cus_95uFN7q2HzHN7j",
"date": 1473140172,
"description": null,
"discount": null,
"ending_balance": 0,
"forgiven": false,
"lines": {
"data": [
{
"id": "sub_95uFmJLQM3jFwP",
"amount": 4100,
"currency": "usd",
"description": null,
"discountable": true,
"livemode": false,
"metadata": {},
"period": {
"end": 1473226524,
"start": 1473140124
},
"plan": {
"id": "aug 19 01",
"amount": 4100,
"created": 1472448923,
"currency": "usd",
"interval": "day",
"interval_count": 1,
"livemode": false,
"metadata": {},
"name": "Aug 19 plan. Better than paypal",
"statement_descriptor": null,
"trial_period_days": null,
"statement_description": null
},
"proration": false,
"quantity": 1,
"subscription": null,
"type": "subscription"
}
],
"total_count": 1,
"has_more": false,
"request_options": null,
"request_params": null,
"url": "/v1/invoices/in_18qcFkElSMaq70BZy1US7o3g/lines",
"count": null
},
"livemode": false,
"metadata": {},
"next_payment_attempt": null,
"paid": true,
"period_end": 1473140124,
"period_start": 1473053724,
"receipt_number": null,
"starting_balance": 0,
"statement_descriptor": null,
"subscription": "sub_95uFmJLQM3jFwP",
"subscription_proration_date": null,
"subtotal": 4100,
"tax": null,
"tax_percent": null,
"total": 4100,
"webhooks_delivered_at": 1473140184
},
"previous_attributes": null
},
"livemode": false,
"pending_webhooks": 1,
"request": null,
"type": "invoice.payment_succeeded",
"user_id": null
}
Я хочу получить такие значения, как customer_id
, subscription_id
и т. д. Но когда я пытаюсь получить данные, используя объект события, я не могу просто сделать как event.get....
, Как бы мне извлечь данные.
2 ответа
Ну, я решил эту проблему. Реальная проблема заключалась в том, что я не смог вернуть object id
в моем случае invoiceid
(In_18qcFkElSMaq70BZy1US7o3g). Этот идентификатор является идентификатором произошедшего события. Смысл, если это payment successful
событие, то object id
будет charge id
, Я должен был преобразовать event
Возражать map
затем получите обязательный атрибут. Ниже приведен фрагмент кода того, что я сделал для решения проблемы.
public void handle(HttpServletRequest request) {
Stripe.apiKey = sk_test_XXXXXXXXXXXXXXXXXXXX;
String rawJson = "";
try {
rawJson = IOUtils.toString(request.getInputStream());
}
catch (IOException ex) {
System.out.println("Error extracting json value : " + ex.getMessage());
}
Event event = APIResource.GSON.fromJson(rawJson, Event.class);
System.out.println("Webhook event : " + event);
// Converting event object to map
ObjectMapper m = new ObjectMapper();
@SuppressWarnings("unchecked")
Map<String, Object> props = m.convertValue(event.getData(), Map.class);
// Getting required data
Object dataMap = props.get("object");
@SuppressWarnings("unchecked")
Map<String, String> objectMapper = m.convertValue(dataMap, Map.class);
String invoiceId = objectMapper.get("id");
System.out.println("invoideId : " + invoiceId);
}
Stripe отправляет объекты событий вашему обработчику webhook. Каждый объект события несет в себе другой объект data.object
приписывать. Тип этого объекта зависит от типа события: для charge.*
события, это будет объект заряда, для invoice.*
событие, это будет объект счета и т. д.
С помощью Java-привязок Stripe вы можете автоматически получить объект правильного типа:
StripeObject stripeObject = event.getData().getObject();
stripeObject
будет автоматически приведен к правильному типу.
Кроме того, вы можете сделать кастинг самостоятельно:
if (event.getType().equals("invoice.payment_failed")) {
Invoice invoice = event.getData().getObject();