Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Retrieve stripe data from stripe webhook event

When implementing stripe webhook in java, I am successful in getting the event object in JSON format. The problem is I am not able to get the details like the amount, subscription_id, attributes which are in nested JSON. Getting these values from the class object is also not available. Could you please tell me how to extract these values

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

}

And I get the following response :-

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
}

I want to get the values like the customer_id, subscription_id , etc. But when I try to get the data using the event object, I couldn't simply do as event.get.... . How would I extract the data.

like image 332
viper Avatar asked Sep 06 '16 06:09

viper


People also ask

How do you handle webhook events?

Steps to receive webhooks Identify the events you want to monitor and the event payloads to parse. Create a webhook endpoint as an HTTP endpoint (URL) on your local server. Handle requests from Stripe by parsing each event object and returning 2xx response status codes.

What are Stripe webhook events?

A webhook is an HTTP endpoint that receives events from Stripe. Webhooks allow you to be notified about payment events that happen in the real world outside of your payment flow such as: Successful payments ( payment_intent. succeeded ) Disputed payments ( charge.

How do I listen to Stripe webhooks?

Open the Webhooks page. Click Add endpoint. Add your webhook endpoint's HTTPS URL in Endpoint URL. If you have a Stripe Connect account, enter a description and select Listen to events on Connected accounts.


2 Answers

Stripe sends event objects to your webhook handler. Each event object carries another object in its data.object attribute. The type of that object depends on the type of the event: for charge.* events, it'll be a charge object, for invoice.* event, it'll be an invoice object, etc.

With Stripe's Java bindings, you can automatically get an object of the correct type:

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

stripeObject will be automatically cast to the correct type.

Alternatively, you can do the casting yourself:

if (event.getType().equals("invoice.payment_failed")) {
    Invoice invoice = event.getData().getObject();
like image 125
Ywain Avatar answered Oct 08 '22 07:10

Ywain


Well I had solved this problem. The real issue was that I was not able to retrive the object id, in my case the invoiceid (in_18qcFkElSMaq70BZy1US7o3g). This id is the id for the event occured. Meaning if it is a payment successful event, then the object id will be the charge id . I had to convert the event object to map then get the required attribute. Below is the complete code snippet of what I had done to solve the problem.

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);
}
like image 26
viper Avatar answered Oct 08 '22 06:10

viper