Paypal logo
Apex General Integraciones

Gestionando reclamaciones de Paypal desde Salesforce – Parte 1

Actualmente es bastante común realizar compras online; no obstante, hay gente a la que aún le cuesta fiarse. Por ello, tenemos plataformas como Paypal que hacen en cierta medida de intermediarios entre el cliente y el vendedor, permitiendo al primero realizar sus compras sin necesidad de dar sus datos bancarios y proporcionándole protección en caso de ser necesario.

Visto así para el cliente es muy cómodo; no obstante, ¿cómo afecta esto al vendedor?

En el caso concreto de Paypal, el vendedor dispone de una página destinada a la gestión de las reclamaciones, es el Centro de Resoluciones y tiene la apariencia de la siguiente imagen:

Centro de resoluciones de Paypal

Si bien la herramienta cumple con su cometido hay ciertas situaciones en las que puede no resultar suficiente; por ejemplo si tenemos varias cuentas por gestionar, un equipo  de atención grande que pueda ir atendiendo distintos canales en función de la carga de trabajo (emails, chats, Paypal…) o si queremos disponer de métricas y trazabilidad de las operaciones realizadas por cada usuario.

Por ello, en este post vamos a ver cómo aprovechar las APIs que provee Paypal para integrar la gestión de reclamaciones desde Salesforce facilitando el trabajo de los usuarios que responden a estas así como del equipo de administración de las cuentas. Con esta integración vamos a poder:

  • Gestionar que usuarios pueden ver y/o responder a las reclamaciones, pudiendo afinar los permisos a nivel de cuenta de Paypal
  • Las acciones que ha realizado cada usuario en cada reclamación
  • Calcular distintos indicadores como el tiempo de resolución de las reclamaciones (desde que se abre hasta que se cierra) o el tiempo medio de respuesta desde que escribe el cliente.
  • Gestionar reclamaciones de diferentes cuentas desde un mismo sitio

 

Dicha integración la vamos a ver en dos partes:

RECEPCIÓN DE RECLAMACIONES EN SALESFORCE

En esta primera parte vamos a cubrir la configuración y desarrollo necesario para la recepción en nuestra org de Salesforce de las reclamaciones de nuestras cuentas de Paypal. Para ello necesitaremos:

Crear dos objetos custom

El primero (DisputaPaypal) lo usaremos para almacenar las reclamaciones. Para la creación y actualización de los registros usaremos los siguientes tres campos recibidos desde Paypal:

  • id: Se trata del identificador del evento recibido, nos puede ser útil para evitar procesar el mismo evento varias veces así como para ver el número de cambios que se han producido para una reclamación.
  • resource.dispute_id: este es el identificador único de cada reclamación y será el campo que usaremos para realizar los upsert de los registros.
  • resource.update_time: nos proporciona la fecha y hora de la última modificación de la reclamación, lo cual nos permite descartar la actualización de registros cuya fecha de última actualización sea posterior a la recibida en otros eventos.

Además, en el JSON que nos enviará el webhook de Paypal vienen los siguientes campos que nos pueden resultar útiles:

  • resource.status: Nos indica el estado actual de la reclamación.
  • resource.reason: Nos indica el motivo por el que se realizó la reclamación.
  • resource.links: Lista de enlaces con las acciones disponibles a realizar en el momento actual.
  • resource.disputed_transactions.seller.merchant_id: Identificador de la cuenta del vendedor, este campo será crucial para el desarrollo de la comunicación desde Salesforce hacia Paypal.
  • resource.disputed_transactions.seller_transaction_id: Identificador de la compra realizada proporcionado por el vendedor, lo cual nos permitirá asociar la reclamación con su correspondiente pedido.
  • resource.dispute_amount: nos indica el importe reclamado así como en qué moneda.

Finalmente, crearemos otro objeto,por ejemplo MensajeDisputaPaypal, para guardar los mensajes relacionados con cada reclamación; no obstante, ya que en cada evento enviado por Paypal están contenidos todos los mensajes de la reclamación, necesitaremos definir un campo único para determinar que ese mensaje existe ya en Salesforce. Una opción rápida y sencilla es concatenar el campo posted_by , cuyos valores pueden ser seller o buyer, con el campo time_posted.

Un servicio REST en Apex y clases wrapper

Tras crear nuestros objetos, debemos definir varias clases wrapper y un servicio REST en Apex. Para ello, debemos crear una clase nueva que podemos llamar WebhookPaypal, por ejemplo. En esta clase debemos definir varias clases internas siguiendo el formato del JSON que nos enviará Paypal; además de definir un método marcado con el método que se expondrá al público, en este caso recibiremos los mensajes a través de POST. Tras definir las clases que corresponden con la estructura básica del JSON así como el método que procese las llamadas la clase Apex debería quedar como vemos a continuación:

@RestResource(urlMapping='/paypal/*')
global class WebhookPaypal {
    private class webhookEventWrapper{
        public String id; 
        public String event_type;
        public String summary;
        public resource resource;
    }
    
    private class resource{
        public Integer dispute_reason;
        public String dispute_id;
        public String create_time;
        public String update_time;
        public Integer dispute_status;
        public String status;
        public String reason;
        public String invoice_number;
        public disputeMessage[] messages;
    }
    public class disputeMessage{
        public String posted_by;
        public String content;
        public String time_posted;
    }
    
    @HttpPost
    global static void doPost() {
        RestRequest req = RestContext.request;
        Blob body = req.requestBody;
        String requestString = body.toString();
        webhookEventWrapper webhookEvent = (webhookEventWrapper)JSON.deserialize(requestString,webhookEventWrapper.class);
        resource src=webhookEvent.resource;
        DisputaPaypal__c disputa=new DisputaPaypal__c();
        disputa.Name=src.dispute_id;
        disputa.WebhookEventId__c=webhookEvent.Id;
        if(src.create_time!=null){
            System.debug(''+src.create_time);
            disputa.CreationDate__c=Datetime.valueOfGmt(src.create_time.replace('T',' ').substring(0,19));
            disputa.LastModifiedDate__c=Datetime.valueOfGmt(src.create_time.replace('T',' ').substring(0,19));
        }
        if(src.update_time!=null){
            System.debug(''+src.update_time);
            disputa.LastModifiedDate__c=Datetime.valueOfGmt(src.update_time.replace('T',' ').substring(0,19));
        }
        List<MensajeDisputaPaypal__c> mensajes=new List<MensajeDisputaPaypal__c>();
        if(src.messages!=null && src.messages.size()>0){
            for(disputeMessage mensaje:src.messages){
                MensajeDisputaPaypal__c m=new MensajeDisputaPaypal__c();
                m.Content__c=mensaje.content;
                m.posted_by__c=mensaje.posted_by;
                m.time_posted__c=Datetime.valueOfGmt(mensaje.time_posted.replace('T',' ').substring(0,19));
                m.Id__c=mensaje.time_posted+mensaje.posted_by;
                mensajes.add(m);               
            }
        }
        
        Schema.SObjectField f = DisputaPaypal__c.Fields.Name;
        Database.UpsertResult  cr =Database.upsert(disputa , f, false );
        if(mensajes.size()>0 && cr.isSuccess()==true){
            for(MensajeDisputaPaypal__c mensaje:mensajes){
                mensaje.Parent_Dispute__c=disputa.Id;
            }
            Database.SaveResult[] crs=Database.insert(mensajes,false );
        }
    }
}

 

Un site público y webhooks de Paypal

Tras terminar de realizar el mapeo de campos del JSON a los objetos creados previamente debemos crear un site público que permita a Paypal enviar los eventos a nuestra org de Salesforce. Para crear el site basta con entrar a Setup -> Sites, hacer click en «New» y configurarlo como en la siguiente imagen:

Nuevo site

Una vez creado el site bastaría con acceder al perfil de este haciendo click en «Public Access Settings» y dándole acceso a la clase Apex creada anteriormente.

Tras realizar este paso ya podríamos recibir las reclamaciones en nuestra org de Salesforce y podemos proceder a probar la integración. Para ello, debemos acceder a nuestra cuenta de Paypal aquí y acceder al apartado Webhook simulator donde deberemos rellenar la URL del servicio expuesto en nuestra org y seleccionar el evento que queremos probar. En caso de haber seguido la clase de ejemplo anterior la URL del servicio expuesto sería URL del Site/apex/services/URL de la clase; por ejemplo, en mi caso sería https://dujtrailhead-developer-edition.eu18.force.com/webhook/services/apexrest/paypal

Una vez hayamos realizado la prueba correctamente, podemos proceder a configurar las cuentas de Paypal para que envíen automáticamente la creación o actualización de disputas automáticamente. Para ello, partiendo de la página anterior, debemos ir a la sección «My Apps & Credentials» , abrir la app que corresponda y seleccionar Live en el selector. Finalmente, en el apartado de webhooks, hacemos click en «Add webhook», rellenamos el campo URL con la que usamos anteriormente y seleccionamos los siguientes eventos: «Customer dispute created»,»Customer dispute resolved»,»Customer dispute updated» y «Risk dispute created».

Llegados a este punto ya deberíamos estar recibiendo las reclamaciones y podemos pasar a la segunda parte de la integración, la explotación de las APIs de Paypal (disponible próximamente).

You Might Also Like...

No Comments

Leave a Reply