package com.paymill.samples.webhookresolver; import java.util.Date; import com.fasterxml.jackson.databind.JsonNode; import com.paymill.context.PaymillContext; import com.paymill.models.Client; import com.paymill.models.Invoice; import com.paymill.models.Merchant; import com.paymill.models.Payment; import com.paymill.models.Refund; import com.paymill.models.Subscription; import com.paymill.models.Transaction; import com.paymill.models.Webhook; import com.paymill.models.Webhook.EventType; /** * You can use this object to deserialize incoming webhooks. */ public class WebhookResolver { private Webhook.EventType eventType; private Client client; private Transaction transaction; private Subscription subscription; private Refund refund; private Payment payment; private Invoice invoice; private Merchant merchant; private Date createdAt; private String appId; public Webhook.EventType getEventType() { return eventType; } public Client getClient() { return client; } public Transaction getTransaction() { return transaction; } public Subscription getSubscription() { return subscription; } public Refund getRefund() { return refund; } public Date getCreatedAt() { return createdAt; } public String getAppId() { return appId; } public Payment getPayment() { return payment; } public Invoice getInvoice() { return invoice; } public Merchant getMerchant() { return merchant; } public static WebhookResolver fromString( String requestBody ) { try { WebhookResolver resolver = new WebhookResolver(); JsonNode eventNode = PaymillContext.PARSER.readValue( requestBody, JsonNode.class ).get( "event" ); if( eventNode != null && eventNode.has( "event_type" ) ) { resolver.eventType = PaymillContext.PARSER.readValue( eventNode.get( "event_type" ).toString(), Webhook.EventType.class ); } else { throw new RuntimeException( "Invalid webhook:" + requestBody ); } JsonNode eventResource = eventNode.get( "event_resource" ); if( resolver.getEventType() == EventType.CHARGEBACK_EXECUTED || resolver.getEventType() == EventType.TRANSACTION_CREATED || resolver.getEventType() == EventType.TRANSACTION_SUCCEEDED || resolver.getEventType() == EventType.TRANSACTION_FAILED ) { resolver.transaction = PaymillContext.PARSER.readValue( eventResource.toString(), Transaction.class ); } if( resolver.getEventType() == EventType.SUBSCRIPTION_CREATED || resolver.getEventType() == EventType.SUBSCRIPTION_UPDATED || resolver.getEventType() == EventType.SUBSCRIPTION_DELETED || resolver.getEventType() == EventType.SUBSCRIPTION_EXPIRING || resolver.getEventType() == EventType.SUBSCRIPTION_DEACTIVATED || resolver.getEventType() == EventType.SUBSCRIPTION_ACTIVATED || resolver.getEventType() == EventType.SUBSCRIPTION_CANCELED ) { resolver.subscription = PaymillContext.PARSER.readValue( eventResource.toString(), Subscription.class ); } if( resolver.getEventType() == EventType.REFUND_CREATED || resolver.getEventType() == EventType.REFUND_SUCCEEDED || resolver.getEventType() == EventType.REFUND_FAILED ) { resolver.refund = PaymillContext.PARSER.readValue( eventResource.toString(), Refund.class ); } if( resolver.getEventType() == EventType.CLIENT_UPDATED ) { resolver.client = PaymillContext.PARSER.readValue( eventResource.toString(), Client.class ); } if( resolver.getEventType() == EventType.SUBSCRIPTION_SUCCEEDED || resolver.getEventType() == EventType.SUBSCRIPTION_FAILED ) { resolver.subscription = PaymillContext.PARSER.readValue( eventResource.get( "subscription" ).toString(), Subscription.class ); resolver.transaction = PaymillContext.PARSER.readValue( eventResource.get( "transaction" ).toString(), Transaction.class ); } if( resolver.getEventType() == EventType.PAYMENT_EXPIRED ) { resolver.payment = PaymillContext.PARSER.readValue( eventResource.toString(), Payment.class ); } if( resolver.getEventType() == EventType.PAYOUT_TRANSFERRED || resolver.getEventType() == EventType.INVOICE_AVAILABLE ) { resolver.invoice = PaymillContext.PARSER.readValue( eventResource.toString(), Invoice.class ); } if( resolver.getEventType() == EventType.APP_MERCHANT_ACTIVATED || resolver.getEventType() == EventType.APP_MERCHANT_DEACTIVATED || resolver.getEventType() == EventType.APP_MERCHANT_REJECTED || resolver.getEventType() == EventType.APP_MERCHANT_LIVE_REQUESTS_ALLOWED || resolver.getEventType() == EventType.APP_MERCHANT_LIVE_REQUESTS_NOT_ALLOWED || resolver.getEventType() == EventType.APP_MERCHANT_APP_DISABLED ) { resolver.merchant = PaymillContext.PARSER.readValue( eventResource.toString(), Merchant.class ); } if( eventNode.has( "created_at" ) ) { resolver.createdAt = new Date( Long.parseLong( eventNode.get( "created_at" ).toString() ) * 1000 ); } if( eventNode.has( "app_id" ) ) { resolver.appId = PaymillContext.PARSER.readValue( eventNode.get( "app_id" ).toString(), String.class ); ; } return resolver; } catch( Exception e ) { throw new RuntimeException( e ); } } }