Tuesday 26 July 2016

Integrating Significant Ecommerce and Helpful Platforms with Salesforce

Hi Awesome Salesforce Developers,

Recently I did custom integrations with shopify,bill.com,LiveChat,Helpscout so sharing with you authentication request/response formats.

Integration with Shopify.com 
(Using private app in Shopify)
Shopify is a complete e-commerce solution that allows you to set up an online store to sell your goods. It lets you organize your products, customize your storefront, accept credit card payments, track and respond to orders — all with a few clicks of the mouse.

Firstly you need to create private app in Shopify.com which will generate the API key , Password,Shared secret

You need to use those keys for authentication purpose and while sending REST requests from salesforce : 

Shopify API Documentation : https://docs.shopify.com/api

Example : Create customer in Shopify.com from salesforce 
API : https://help.shopify.com/api/reference/customer#create

POST Request from salesforce  :

JSONGenerator gen = JSON.createGenerator(true);
gen.writeStartObject();
 gen.writeFieldName('customer');
 gen.writeStartObject();
   gen.writeStringField('email', Contact.Email);        
   gen.writeStringField('first_name', Contact.FirstName);
   gen.writeStringField('last_name', Contact.LastName);             
 gen.writeEndObject();
gen.writeEndObject();

string strRequest = gen.getAsString();

Http objHttp = new Http();

HttpRequest request = new HttpRequest(); 
request.setMethod('POST'); 
Blob headerValue = Blob.valueOf('your apikey: your password');
String authorizationHeader = 'Basic ' + EncodingUtil.base64Encode(headerValue);
request.setHeader('Authorization', authorizationHeader);
request.setHeader('Content-Type', 'application/json');
request.setBody(strRequest);
request.setEndpoint('https://apikey:password@nameofyourshop.myshopify.com/admin/customers.json'); 

HttpResponse res = objHttp.send(request);  

Map<String, Object> mapResponse =                                                                                   (Map<String,Object>)JSON.deserializeUntyped(res.getBody());

Map<String, Object> mapCustomerData =
                       (Map<String, Object>)mapResponse.get('customer');

if(mapCustomerData .containskey('id'))
system.debug('>>>Shopify='+string.valueof(mapCustomerData.get('id'));)



Integration with Bill.com
Bill.com is a US-based cash flow management software system, provided as a software as a service that integrates with accounting and banking systems. It is intended to serve as a command and control dashboard for cash flow, by businesses, accounting firms and banks.

Documentation : http://developer.bill.com/api-documentation/api/bill

Every API request needs a valid session id, which is obtained by issuing a Login request. Login API takes in an organization id, developer (or application) key, and user credentials (or Token), and returns a valid session id, as well as an end-point URL, which should be used for any subsequent API requests. This session id will remain valid for up to 35 minutes without activity. If the session becomes inactive, you will have to issue a new Login request and obtain a new session ID. You can explicitly end the session by issuing a Logout request.

You need Bill.com -> username,password,OrganizationId,Devkey which can obtain from bill.com account / support.

Login Request :
String strLoginRequest = 'userName='+'Bill_com_Username'+'&password='+'Bill_com_Password'
                   +'&orgId='+'Bill_com_OrgId'+'&devKey='+'Bill_com_Devkey'+';

HttpRequest objHttpReq = new HttpRequest();
objHttpReq.setHeader('Content-Type','application/x-www-form-urlencoded');
objHttpReq.setEndpoint('EndPOINTURL'+'/Login.json');
objHttpReq.setMethod('POST');
objHttpReq.setbody(strLoginRequest);

Http http = new Http();
HTTPResponse objHttpResp = http.send(objHttpReq);     

if (objHttpResp.getStatusCode()==200)
{
  Map<String,object> mapLoginResp = (Map<String,object>)JSON.deserializeUntyped(objHttpResp.getBody());
   
 if(mapLoginResp.containsKey('response_status') &&   Integer.valueOf(mapLoginResp.get('response_status'))==0)
 {
  if (mapLoginResp.containsKey('response_data') && 
                    mapLoginResp.get('response_data') instanceof map<string,object>)
   {   
   Map<String,Object> mapLoginRespData =  (Map<String,Object>)mapLoginResp.get('response_data');
   
   if(mapLoginRespData.containskey('apiEndPoint') )
   { 
    system.debug('>apiEndPoint='+string.valueof(mapLoginRespData.get('apiEndPoint')));
     system.debug('>sessionId='+string.valueof(mapLoginRespData.get('sessionId')));
     system.debug('>orgId='+string.valueof(mapLoginRespData.get('orgId')));
     system.debug('>usersId='+string.valueof(mapLoginRespData.get('usersId')));
   }
   }  
 }
}


The session Id,API end point to need to use for making next requests:

For example :Create Bill request : 

HttpRequest objHttpReq = new HttpRequest();
objHttpReq.setEndpoint('ENDPOINTURL');
objHttpReq.setMethod('POST');
objHttpReq.setbody('devKey='+'DEVKEY'+'&sessionId='+'SESSION ID RECEIVED from LOGIN'+'&orgId='+'Bill_com_OrgId'+'&data='+'RequestBODY');
objHttpReq.setHeader('Content-Type','application/x-www-form-urlencoded');       
Http http = new Http();
HTTPResponse objHttpResp = http.send(objHttpReq); 



Integration with LiveChat :
LiveChat is an online customer service software with live support, help desk software and web analytics capabilities. It was first launched in 2002 and since then it is developed and offered in SaaS (software as a service) business model by LiveChat Software.

Documentation : https://developers.livechatinc.com/rest-api/

Request to get all chats :
Livechat give the response in pages so intially we need to make request with page=1 and get a total number of pages. Do the requests till you reach the last page.

    integer intPageCountFromBatch = 1;

    Http objHttp = new Http();
    HttpRequest request = new HttpRequest(); 
    request.setMethod('GET'); 
    Blob headerValue = Blob.valueOf('Livechatusername/email:apikey');
    String authorizationHeader = 'Basic ' +    EncodingUtil.base64Encode(headerValue);
    request.setHeader('Authorization', authorizationHeader);
    request.setHeader('Content-Type', 'application/json');
    request.setHeader('X-API-Version','2');
    request.setEndpoint('https://api.livechatinc.com/chats?page='+intPageCountFromBatch);
    request.setTimeout(120000); 
    HttpResponse res = objHttp.send(request);  

if (res.getStatus() == 'OK')
{
  Map<String, Object> mapResponse =
          (Map<String, Object>)JSON.deserializeUntyped(res.getBody());

  if (mapResponse.containsKey('pages'))
  intTotalPageCount = String.valueOf(mapResponse.get('pages')) != null ? Integer.valueOf(String.valueOf(mapResponse.get('pages'))) : 1 ;
      
List<Object> lstChatData =(List<Object>)mapResponse.get('chats');
   
}

IMP : You need to make callout till you reach the last page number.



Integration with HelpScout :
Help Scout is a simple help desk designed for small businesses. 

Documentation : http://developer.helpscout.net/help-desk-api/

integer intPageCountFromBatch = 1;

Http objHttp = new Http();
HttpRequest request = new HttpRequest(); 
request.setMethod('GET'); 
Blob headerValue = Blob.valueOf('APIKey:Password');
String authorizationHeader = 'Basic ' + EncodingUtil.base64Encode(headerValue);
request.setHeader('Authorization', authorizationHeader);
request.setHeader('Content-Type', 'application/json');
request.setEndpoint('https://api.helpscout.net/v1/mailboxes/YourMailboxId/conversations.json?page='+intPageCountFromBatch); 

HttpResponse res = objHttp.send(request);
request.setTimeout(120000); 

if (res.getStatus() == 'OK')
{
Map<String, Object> mapResponse = (Map<String, Object>)JSON.deserializeUntyped(res.getBody());

if (mapResponse.containsKey('pages'))
  intTotalPageCount = String.valueOf(mapResponse.get('pages')) != null ? Integer.valueOf(String.valueOf(mapResponse.get('pages'))) : 1 ;

 List<Object> lstChatData = (List<Object>)mapResponse.get('items');
}



IMP : You need to make callout till you reach the last page number.


For both LiveChat & HelpScount you need to implement the batch chain logic.

Feel free to contact for detailed code : ajay.ghuge09@gmail.com

Cheers,
Ajay