Retrieve stripe data from stripe webhook event

本小妞迷上赌 提交于 2019-12-30 09:47:33

问题


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.


回答1:


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



回答2:


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


来源:https://stackoverflow.com/questions/39342251/retrieve-stripe-data-from-stripe-webhook-event

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!