2016-09-06 3 views
4

При реализации полосового webhook в java мне удастся получить объект события в формате JSON. Проблема в том, что я не могу получить детали, такие как количество, subscription_id, атрибуты, которые находятся во вложенном JSON. Получение этих значений из объекта класса также недоступно. Не могли бы вы сказать мне, как извлечь эти значенияRetrive stripe data from stripe webhook event

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 : <[email protected] 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..... Как я могу извлечь данные.

Спасибо заранее

+1

Im а не Dev Java так не знакомый с этим кодом слишком много, но когда нашивки дает идентификаторы вам нужно сделать еще один вызов API, чтобы получить эти данные. – cyberwombat

+0

Проблема в том, что я не могу получить идентификатор счета. – viper

ответ

0

Ну я решить эту проблему. Реальная проблема заключалась в том, что я не смог извлечь object id, в моем случае invoiceid (in_18qcFkElSMaq70BZy1US7o3g). Этот id является идентификатором события. Значение, если это событие 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); 
} 
4

нашивки посылает event objects в обработчик webhook. Каждый объект события переносит другой объект в свой атрибут data.object. Тип этого объекта зависит от типа события: для charge.* событий, это будет charge object, для invoice.* случае, это будет являться invoice object и т.д.

С Stripe's Java bindings, вы можете автоматически получить объект правильного типа:

StripeObject stripeObject = event.getData().getObject(); 

stripeObject будет автоматически приводить к нужному типу.

В качестве альтернативы, вы можете сделать отвержение себя:

if (event.getType().equals("invoice.payment_failed")) { 
    Invoice invoice = event.getData().getObject(); 
+0

Благодарим вас за ответ. Я давно искал что-то подобное. Затем я придумал альтернативное решение, которое я упомянул в этом сообщении в качестве ответа. – viper

+0

'Invoice invoice = event.getData(). GetObject();' должен быть 'Invoice invoice = (Invoice) event.getData(). GetObject();'. Вам все равно нужно передать его в объект 'Invoice'. – mrgrumpy22

Смежные вопросы