Salesforce es una plataforma basada en la nube de gestión de relaciones con los clientes (CRM). Al ser un software basado en la nube no es necesario tener un software instalado internamente y, las compañías pueden acceder a sus datos en cualquier momento/lugar a través de la web.
El servicio de Salesforce está compuesto por las siguientes categorías:
Un sistema tercero es un software ajeno a Salesforce con su funcionalidad independiente. En este artículo el sistema tercero con el que se integrará Salesforce será SAP, que es un sistema ERP (Enterprise Resource Planning).
Un ERP es un sistema de planificación de recursos empresariales, los cuales se hacen cargo de distintas operaciones internas en una empresa, desde producción a distribución o incluso recursos humanos. Las principales ventajas de estos sistemas son: automatización de procesos de la empresa y disponibilidad de la información de la empresa en una misma plataforma.
Es posible que la compañía no quiera desprenderse del sistema tercero porque cubre una parte del proceso de la compañía complementario al proceso definido en Salesforce pero sea necesaria, y posible, la integración entre ambos sistemas.
La integración entre ambos sistemas proporciona, entre otras, las siguientes ventajas:
Los sistemas pueden integrarse en una dirección o en ambas. A continuación se explicarán ambas formas.
Salesforce ofrece algunos servicios a través de la API REST de manera standard, sin necesidad de desarrollar código. Estos servicios pueden utilizarse para funcionalidades sencillas, como:
Una solicitud de este tipo está compuesta por cuatro componentes: una URL, un método HTTP, cabeceras y cuerpo de la solicitud.
La URL está formada de la siguiente manera: /services/data/vXX.0/sobjects/objectName/action, donde:
Los métodos HTTP más utilizados en los API REST son los siguientes:
Si se necesita una funcionalidad más compleja que los servicios API REST no pueden ofrecer, se necesita realizar el desarrollo de la funcionalidad exponiendo servicios. Estos servicios expuestos por Salesforce pueden ser de tipo REST o SOAP. Ambos servicios son muy parecidos, pero en este artículo se explicará la creación de servicios SOAP.
Para que una clase de Apex esté disponible como servicio SOAP es necesario definir la clase como global. Además, será necesario añadir a cada método que se quiera exponer la palabra webservice (proporciona acceso global al método) y static
global with sharing class CreateCaseAndWorkOrder {
global with sharing class caseData {
webservice String accountNumber;
webservice String subject;
webservice String description;
webservice String country;
webservice String state;
}
webservice static String createCaseWO(caseData dataInfo){
Case newCase = new Case();
newCase.AccountId = [SELECT Id FROM Account WHERE SAP_AccountId__c =: dataInfo.accountNumber LIMIT 1].Id;
newCase.Subject = dataInfo.subject;
newCase.Description = dataInfo.description;
newCase.Country__c = dataInfo.country;
newCase.State__c = dataInfo.state;
insert newCase;
WorkOrder newWO = new WorkOrder();
newWO.Subject = dataInfo.subject;
newWO.Description = dataInfo.description;
newWO.CaseId = newCase.Id;
insert newWO;
return 'Case and WorkOrder created.';
}
}
Figura 1. Código para la creación de un Case y una WorkOrder asociada
SAP llamará a los métodos de Apex haciendo uso del archivo WSDL, generado en Salesforce, de la clase. Pero, dado que la seguridad de la plataforma es una prioridad para Salesforce, el servicio web requiere de autentificación. Por eso antes de utilizar el WSDL del servicio, deben usar el WSDL para la funcionalidad del inicio de sesión. Tanto para el servicio web como para el servicio de inicio de sesión se utilizará un usuario existente en Salesforce.
A continuación se mostrará un ejemplo del proceso que debe seguir SAP para integrarse con Salesforce de manera satisfactoria, realizando la integración con el servicio web de la figura 1. Servicio que, como se puede ver en el código, realizará la creación de un caso y de una orden de trabajo en Salesforce.
Tal y como se ha comentado, lo primero que tiene que hacer el sistema tercero es llamar a Salesforce a través del WSDL para el inicio de sesión. De esta manera, se conseguirá el identificador de sesión (sessionId) necesario para poder realizar la llamada al WSDL de la funcionalidad que se requiere.
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:enterprise.soap.sforce.com">
<soapenv:Header>
<urn:LoginScopeHeader>
<urn:organizationId></urn:organizationId>
<urn:portalId></urn:portalId>
</urn:LoginScopeHeader>
</soapenv:Header>
<soapenv:Body>
<urn:login>
<urn:username>usuariointegraciones@salesforce.com</urn:username>
<urn:password>usuariointegracionesdtOAFyMplQqDvWJyKbeo4tiuf</urn:password>
</urn:login>
</soapenv:Body>
</soapenv:Envelope>
Figura 2. Petición para el servicio API de inicio de sesión
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns="urn:enterprise.soap.sforce.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<loginResponse>
<result>
<metadataServerUrl>https://devEveris.my.salesforce.com/services/Soap/m/48.0/00D0E000000DwCm</metadataServerUrl>
<passwordExpired>false</passwordExpired>
<sandbox>true</sandbox>
<serverUrl>https://devEveris.my.salesforce.com/services/Soap/c/48.0/00D0E000000DwCm/0DF0E0000000Jpd</serverUrl>
<sessionId>00D0E000000DwCm!AQQAQPUN.SjEOjhMNUje00ggupvJAN22mzYiVpkxPPKU4pIdvBrT807mt34tj7JhEegJyIAcUMbYTa_g5rU7ugPRD_HWV9lh</sessionId>
<userId>0050E000006KbmvQAC</userId>
<userInfo>
<accessibilityMode>false</accessibilityMode>
<chatterExternal>false</chatterExternal>
<currencySymbol xsi:nil="true"/>
<orgAttachmentFileSizeLimit>5242880</orgAttachmentFileSizeLimit>
<orgDefaultCurrencyIsoCode xsi:nil="true"/>
<orgDefaultCurrencyLocale xsi:nil="true"/>
<orgDisallowHtmlAttachments>false</orgDisallowHtmlAttachments>
<orgHasPersonAccounts>false</orgHasPersonAccounts>
<organizationId>00D0E000000DwCmUAK</organizationId>
<organizationMultiCurrency>true</organizationMultiCurrency>
<organizationName>Nombre compañia</organizationName>
<profileId>00e0N00000163laQAA</profileId>
<roleId>00E0N000000fnR6UAI</roleId>
<sessionSecondsValid>7200</sessionSecondsValid>
<userDefaultCurrencyIsoCode>EUR</userDefaultCurrencyIsoCode>
<userEmail> usuariointegraciones@salesforce.com </userEmail>
<userFullName>Usuario Integraciones</userFullName>
<userId>0050E000006KbmvQAC</userId>
<userLanguage>en_US</userLanguage>
<userLocale>es_ES</userLocale>
<userName> usuariointegraciones@salesforce.com.deveveris</userName>
<userTimeZone>Europe/Paris</userTimeZone>
<userType>Standard</userType>
<userUiSkin>Theme3</userUiSkin>
</userInfo>
</result>
</loginResponse>
</soapenv:Body>
</soapenv:Envelope>
Figura 3. Respuesta del servicio de inicio de sesión
Una vez que se tiene el identificador de sesión, se tiene que realizar la llamada al servicio web de la Figura 1. Para ello, se tiene que importar el WSDL que se ha generado desde Salesforce.
Una vez importado se completaran los datos de la llamada, incluyendo el identificador de sesión. Cuando todos los datos estén completos, en la herramienta de SOAP UI se pulsará sobre el icono . Este botón simulará la llamada a Salesforce, proporcionando en la parte derecha la respuesta de Salesforce ante esa petición.
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sf="http://soap.sforce.com/schemas/class/CreateCaseAndWorkOrder">
<soapenv:Header>
<cre:SessionHeader>
<cre:sessionId>00D0E000000DwCm!AQQAQPUN.SjEOjhMNUje00ggupvJAN22mzYiVpkxPPKU4pIdvBrT807mt34tj7JhEegJyIAcUMbYTa_g5rU7ugPRD_HWV9lh</cre:sessionId>
</cre:SessionHeader>
</soapenv:Header>
<soapenv:Body>
<cre:createCaseWO>
<cre:dataInfo>
<cre:accountNumber></cre:accountNumber>
<cre:country>Spain</cre:country>
<cre:description>Creación de un Case + WorkOrder asociada</cre:description>
<cre:state>Cantabria</cre:state>
<cre:subject>Case 2208</cre:subject>
</cre:dataInfo>
</cre:createCaseWO>
</soapenv:Body>
</soapenv:Envelope>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sf="http://soap.sforce.com/schemas/class/CreateCaseAndWorkOrder">
<soapenv:Body>
<createCaseWOResponse>
<result>Case and WorkOrder created.</result>
</createCaseWOResponse>
</soapenv:Body>
</soapenv:Envelope>
Figura 4. Petición y respuesta del servicio web de la Figura 1
Para realizar una llamada desde Salesforce a SAP es necesario hacer una llamada basada en un método HTTP. Este método indica el tipo de acción que se quiere realizar.
Además del método HTTP, cada solicitud establece una URL, que es la dirección donde se ubica el servicio. Una vez que el servidor ha procesado la solicitud, envía un código de estado en la respuesta, donde se indica si la solicitud ha sido procesada correctamente (se envía el código 200) o, si se han generado errores (se envía el código 404 o 500, entre otros).
La estructura de estos servicios es la siguiente:
Http http = new Http();
HttpRequest request = new HttpRequest();
request.setEndpoint('https://XXXXXXXXXXXXXXXXXXXXX.XX');
request.setMethod('POST');
request.setHeader('Content-Type', 'application/json;charset=UTF-8');
// Set the body as a JSON object
request.setBody('{"name":"mighty moose"}');
HttpResponse response = http.send(request);
La respuesta al servicio puede llegar a Salesforce en formato JSON o en formato XML, y para utilizar esta respuesta en Salesforce es necesario realizar un parseo.
En caso de que la respuesta venga en formato JSON, se realizará el tratamiento de la respuesta con la clase integrada de Salesforce JSON. Y si viene en formato XML, será necesario tratarla con la clase integrada de Salesforce XmlNode.
Una vez que la respuesta ha sido tratada en Salesforce con la clase integrada correspondiente, se pueden realizar, entre otras, las siguientes acciones: mostrar los datos en pantalla o creación/actualización de objetos de Salesforce.