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.
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.
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.
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.
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();
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);
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With