function readOnly(count){ }
Starting November 20, the site will be set to read-only. On December 4, 2023,
forum discussions will move to the Trailblazer Community.
+ Start a Discussion
Sagar_SFDCSagar_SFDC 

How to Integrate Quickbooks with salesforce

I want to create a Cutomer in Quickbooks when any account create in Salesforce without using any third party app.
Is this possible by using API's?
Shashikant SharmaShashikant Sharma
Hi Sagar,

You could directly develop Apex code to make an HttpRequest to quickbooks in order to achieve customer creation. Start on it and if you face issues you could ask queries here.

Thanks
Shashikant
Sagar_SFDCSagar_SFDC
Hi Shashikant,

Thank you for giving you time. I have tried using apex Code But i am unable to create Customer using this code.
Here is my code.

public with sharing class QuickbooksConnector {

    public String outputString { get; set; }
    public String authToken { get; set; }
    private static OAuthService__c serviceSettings;
    public static OAuthService__c serviceObject;

    public pagereference OAuth_Step1_getTempTokenAndRedirectToIntuit() {
        
        serviceObject = getServiceSettings();
        
        String nonce = string.valueof(dateTime.now().getTime()/1000);
        String timestamp = string.valueof(dateTime.now().getTime()/1000);
         
        Map<String,String> parameters = new Map<String,String>();
        parameters.put('oauth_callback', EncodingUtil.urlEncode(URL.getSalesforceBaseUrl().toExternalForm() + '/apex/QuickbooksConnect2', 'UTF-8'));
        parameters.put('oauth_consumer_key', serviceObject.Consumer_Key__c);
        parameters.put('oauth_nonce', nonce);
        parameters.put('oauth_signature_method', 'HMAC-SHA1');
        parameters.put('oauth_timestamp', timestamp);
        parameters.put('oauth_version', '1.0');

        HttpRequest req = new HttpRequest();
        HttpResponse res;
         
        req.setEndpoint(serviceObject.Request_Token_URL__c);
        req.setMethod('POST');   
                 
        String signature = generateSignature(req, serviceObject.Consumer_Secret__c, serviceObject.OAuth_Token_Secret__c, parameters);
        
        String body = 'oauth_callback=' + URL.getSalesforceBaseUrl().toExternalForm() + '/apex/QuickbooksConnect2' + '&';
        body += 'oauth_consumer_key=' + serviceObject.Consumer_Key__c + '&';
        body += 'oauth_nonce=' + nonce + '&';
        body += 'oauth_signature_method=HMAC-SHA1&';
        body += 'oauth_timestamp=' + timestamp + '&';
        body += 'oauth_version=1.0&';
        body += 'oauth_signature=' + signature;
        req.setBody(body);
        
        String authToken = '';
        
        try {
            
            Map<String,String> responseItems = getResponseNVP( req );

            serviceObject.Temporary_Token_Secret__c = responseItems.get('oauth_token_secret');
            update serviceObject;
        
            authToken = responseItems.get('oauth_token');
        
        } catch(Exception e) {
            System.debug(e.getMessage());        
        }
        
        String redirectUrl = 'https://appcenter.intuit.com/Connect/Begin?oauth_token=' + authToken;
        pagereference redirect = new PageReference( redirectUrl );
        return redirect.setRedirect(true);
    }

/*=============================================================================
//
//    Function: OAuth_Step2_getFinalToken    
//
/*=============================================================================*/
    public pagereference OAuth_Step2_getFinalToken() {
        
        serviceObject = getServiceSettings();
        
        String nonce = string.valueof(dateTime.now().getTime()/1000);
        String timestamp = string.valueof(dateTime.now().getTime()/1000);
         
         String tokenParm       = apexpages.currentpage().getparameters().get('oauth_token');
        String tokenVerifier   = apexpages.currentpage().getparameters().get('oauth_verifier');
         
        Map<String,String> parameters = new Map<String,String>();
        parameters.put('oauth_callback', EncodingUtil.urlEncode(URL.getSalesforceBaseUrl().toExternalForm() + '/apex/QuickbooksConnect2', 'UTF-8'));
        parameters.put('oauth_consumer_key', serviceObject.Consumer_Key__c);
        parameters.put('oauth_nonce', nonce);
        parameters.put('oauth_signature_method', 'HMAC-SHA1');
        parameters.put('oauth_timestamp', timestamp);
        parameters.put('oauth_token', tokenParm);
        parameters.put('oauth_verifier', tokenVerifier);
        parameters.put('oauth_version', '1.0');
    
        Http http       = new Http();
        HttpRequest req = new HttpRequest();
         
        req.setEndpoint(serviceObject.Access_Token_URL__c);
        req.setMethod('POST');   
                 
        String signature = generateSignature(req, serviceObject.Consumer_Secret__c, serviceObject.Temporary_Token_Secret__c, parameters);
        
        String body = 'oauth_callback=' + URL.getSalesforceBaseUrl().toExternalForm() + '/apex/QuickbooksConnect2' + '&';
        body += 'oauth_consumer_key=' + serviceObject.Consumer_Key__c + '&';
        body += 'oauth_nonce=' + nonce + '&';
        body += 'oauth_signature_method=HMAC-SHA1&';
        body += 'oauth_timestamp=' + timestamp + '&';
        body += 'oauth_version=1.0&';
        body += 'oauth_token=' + tokenParm + '&';
        body += 'oauth_verifier=' + tokenVerifier + '&';
        body += 'oauth_signature=' + signature;        
        req.setBody(body);

        try {
        
            Map<String,String> responseItems = getResponseNVP( req );

            outputString += JSON.serialize( responseItems );
        
            serviceObject.OAuth_Token__c = responseItems.get('oauth_token');
            serviceObject.OAuth_Token_Secret__c = responseItems.get('oauth_token_secret');
            update serviceObject;
        
        } catch(Exception e) {
            System.debug(e.getMessage());        
        }
        
        String redirectUrl = URL.getSalesforceBaseUrl().toExternalForm() + '/apex/QuickbooksConnectTest';
        pagereference redirect = new PageReference( redirectUrl );
        redirect.setRedirect(true);
        
        return redirect;
    } 

/*=============================================================================
//
//    Function: testAPICall    
//
/*=============================================================================*/
    public void testAPICall() {
        
        validateCredentials();
        
        String companyId = '12345678';
        String invoiceId = '123';
        
        String endpoint = 'https://sandbox-quickbooks.api.intuit.com/v3/company/' + companyId + '/invoice/' + invoiceId;

        Http http = new Http();
        HttpRequest req = new HttpRequest();
        
        req.setEndpoint(endpoint);
        req.setMethod('GET');   
        req = signRequest(req);

        HttpResponse res;
        res = http.send(req); 
        String resParams = res.getBody();
        
        Map <String,Object> jsonData = (Map<String,Object>) JSON.deserializeUntyped( resParams );
            
                
        outputString = JSON.serialize(jsonData);    
    }
    
/*=============================================================================
//
//    Function: signRequest    
//
/*=============================================================================*/
    public static HttpRequest signRequest(HttpRequest req) {

        serviceObject = getServiceSettings();

        String nonce     = string.valueof(dateTime.now().getTime()/1000);
        String timestamp = string.valueof(dateTime.now().getTime()/1000);
 
        Map<String,String> parameters = new Map<String,String>();
        parameters.put('oauth_consumer_key', serviceObject.Consumer_Key__c);
        parameters.put('oauth_nonce', nonce);
        parameters.put('oauth_signature_method', 'HMAC-SHA1');
        parameters.put('oauth_timestamp', timestamp);
        parameters.put('oauth_token', EncodingUtil.urlEncode(serviceObject.OAuth_Token__c, 'UTF-8'));
        parameters.put('oauth_version', '1.0');
 
        String signature = generateSignature(req, serviceObject.Consumer_Secret__c, serviceObject.OAuth_Token_Secret__c, parameters);
        String header = generateHeader(signature, parameters);
        req.setHeader('Authorization', header);
        req.setHeader('Accept', 'application/json');
 
        return req;
    } 

/*=============================================================================
//
//    Function: generateHeader    
//
/*=============================================================================*/
    private static String generateHeader(String signature, Map<String,String> parameters) {
        String header = 'OAuth ';
        for (String key : parameters.keySet()) {
            header = header + key + '="'+parameters.get(key)+'", ';
        }
        return header + 'oauth_signature="' + signature + '"';
    } 
 
/*=============================================================================
//
//    Function: generateSignature    
//
/*=============================================================================*/
    private static String generateSignature(HttpRequest req, String consumerSecret, String tokenSecret, Map<String,String> parameters) {
        String s     = createBaseString(req, parameters);        
        String key  = EncodingUtil.urlEncode(consumerSecret, 'UTF-8') + '&' + EncodingUtil.urlEncode(tokenSecret, 'UTF-8');
 
        Blob sig = Crypto.generateMac(
           'HmacSHA1'
          , Blob.valueOf(s)
          , Blob.valueOf(key)
        );
        return EncodingUtil.urlEncode( EncodingUtil.base64encode(sig), 'UTF-8');
    } 
 
/*=============================================================================
//
//    Function: createBaseString    
//
/*=============================================================================*/
    private static String createBaseString(HttpRequest req, Map<String,String> parameters) {
        Map<String,String> p = parameters.clone();
        String host = req.getEndpoint();
        Integer n = host.indexOf('?');
        if(n>-1) {
            p.putAll(getUrlParams(host.substring(n+1)));
            host = host.substring(0,n);
        }
        List<String> keys = new List<String>();
        keys.addAll(p.keySet());
        keys.sort();
        String s = keys.get(0)+'='+p.get(keys.get(0));
        for(Integer i=1;i<keys.size();i++) {
            s = s + '&' + keys.get(i)+'='+p.get(keys.get(i));
        }
 
        return req.getMethod().toUpperCase()+ '&' +
            EncodingUtil.urlEncode(host, 'UTF-8') + '&' +
            EncodingUtil.urlEncode(s, 'UTF-8');
    } 
 
/*=============================================================================
//
//    Function: getUrlParams    
//
/*=============================================================================*/
    private static Map<String,String> getUrlParams(String value) {
        Map<String,String> res = new Map<String,String>();
        if(value==null || value=='') {
            return res;
        }
        for(String s : value.split('&')) {
            System.debug('getUrlParams: '+s);
            List<String> kv = s.split('=');
            if(kv.size()>1) {
                System.debug('getUrlParams: -> '+kv[0]+','+kv[1]);
                res.put(kv[0],kv[1]);
            }
        }
        return res;
    } 
    
/*=============================================================================
//
//    Function: getResponseNVP()    
//
/*=============================================================================*/
    private static Map<String,String> getResponseNVP(HttpRequest req){
        
        Http http = new Http();
        HttpResponse res;

        res = http.send(req); 
        String resParams = res.getBody();
            
        Map<String,String> rp = new Map<String,String>();
        
        for(String s : resParams.split('&')) {
            List<String> kv = s.split('=');
            rp.put(kv[0],kv[1]);
        }
        
        return rp;
    } 
            
/*=============================================================================
//
//    Function: getServiceSettings    
//
/*=============================================================================*/
    private static OAuthService__c getServiceSettings(){
        
        if (serviceObject != null)
        {
            return serviceObject;
        }
        
        try {
            /*serviceObject = [Select Name, OAuth_Token__c, OAuth_Token_Secret__c, Access_Token_URL__c, Application_Token__c, Authorization_URL__c, Consumer_Key__c, Consumer_Secret__c, Request_Token_URL__c, Temporary_Token_Secret__c From OAuthService__c Where     Name='Intuit' limit 1 ]; */
            
            serviceObject = OAuthService__c.getall().values();
        // OAuthService__c is custom setting in which have Tokens,consumer key etc. for Authencate in Quickbooks
            System.debug('list result is : '+serviceObject);
        } catch(Exception e) {
            System.debug(e.getMessage());        
        }
        
        return     serviceObject;                             
    } 

/*=============================================================================
//
//    Function: validateCredentials    
//
/*=============================================================================*/
    private void validateCredentials(){
        
        String companyId = '193514513971534';        
        String endpoint  = 'https://quickbooks.api.intuit.com/v3/company/' + companyId + '/companyinfo/' + companyId;

        Http http = new Http();
        HttpRequest req = new HttpRequest();
        
        req.setEndpoint(endpoint);
        req.setMethod('GET');   
        req = signRequest(req);
        
        Map <String,Object> jsonResponse;
        String resParams;
        
        try {
            HttpResponse res;
            res = http.send(req); 
            resParams = res.getBody();
        
            jsonResponse = (Map<String,Object>) JSON.deserializeUntyped( resParams );
        
        } catch(Exception e) {
            System.debug(e.getMessage());        
        }
                
        if (jsonResponse.get('time') == null) {
        
            Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage() ;
            String[] toAddresses = new String[] {'test@test.com'};
            mail.setToAddresses(toAddresses) ;
            mail.setSubject('Error Connecting To Quickbooks');
        
            String body = resParams;
            mail.setHtmlBody(body);
            Messaging.sendEmail(new Messaging.SingleEmailMessage[] { mail });
        
        }                 
    }
}
Sagar_SFDCSagar_SFDC
Hi,

Please let me know about the solution is anyone know about this.
I need it urgent.