2016-09-06 21 views
4

ストリーミングWebhookをjavaで実装する場合、JSON形式でイベントオブジェクトを取得できます。問題は、amount、subscription_id、ネストされたJSON内の属性などの詳細を取得できないことです。これらの値をクラスオブジェクトから取得することもできません。あなたはどのようにこれらの値ストライプwebhookイベントからのストライプデータの取得

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); 

} 

を抽出するために教えてくださいそして、私は次の応答を得ることができます: - 私はcustomer_idのような値を取得したい

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 
} 

を、subscription_id、などしかし、私はしようとすると、イベントオブジェクトを使用してデータを取得するには、単純にevent.get....とすることはできませんでした。どのようにしてデータを抽出しますか?

ありがとうございました

+1

イムないJavaのdevのようにあまりない、このコードに精通したがストライプは、あなたがこれらの詳細を取得するには、別のAPI呼び出しを行うために必要なIDを与えたとき。 – cyberwombat

+0

問題は私が請求書IDを取得できないことです。 – viper

答えて

0

よくこの問題を解決しました。実際の問題は、object id、私の場合はinvoiceid(in_18qcFkElSMaq70BZy1US7o3g)を検索することができなかったことでした。このidは、発生したイベントのIDです。意味は、payment successfulイベントの場合、object idcharge 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をウェブフックハンドラに送信します。各イベントオブジェクトは、data.object属性で別のオブジェクトを運びます。そのオブジェクトのタイプは、イベントの種類によって異なります。charge.*イベントのために、それはinvoice.*イベントのために、charge objectだろう、それはあなたがオブジェクトを自動的に取得することができ、invoice objectStripe'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

関連する問題