lunedì 26 novembre 2018

Come collegarsi a Salesforce con il PHP

Se nella tua azienda è stato acquistato il potentissimo (e costosissimo) crm salesforce, devi sapere che oltre a porterlo usare in cloud dalla loro piattaforma online, è anche possibile accingere ai dati tramite delle api php.
Ci sono diversi script già fatti in rete, ma se vuoi avere pieno controllo di quello che fai, posso indicarti la sintassi da utilizzare per collegarsi a salesforce da php, in modo tale da poter fare query ed operazioni varie su quello che è ad oggi il crm numero uno al mondo (almeno credo).


Come collegarsi a Salesforce con il PHP


Prima di poter pensare di connettere una pagina php a salesforce, bisogna abilitare l'ip della macchina da cui ci si intende collegare (o farci abilitare, se non si è amministratori di sistema), ed ovviamente farci dare le credenziali d'accesso (più sotto meglio specificate).

Poi è necessario che il php.ini abbia abilitata/scommentata la seguente riga extension=php_openssl.dll, ed anche la extension=php_curl.dll.

Una volta soddisfatti questi requisiti, potremo iniziare a scrivere un po' di codice php, in modo tale da collegarci a salesforce senza per assurdo avere neanche l'utente a sistema (ma ovviamente è consigliatissimo averlo, per poter verificare che i dati estratti siano corretti).

Bene dunque, bando alle ciance, ed ecco il codice php per la connesione a salesforce:

<?php
    $curl=curl_init();
    curl_setopt($curl,CURLOPT_SSL_VERIFYPEER,false);
    curl_setopt($curl,CURLOPT_RETURNTRANSFER,true);
    $url="https://login.salesforce.com/services/oauth2/token";
    $param=http_build_query(
        array(
            'grant_type'=>'password',
            'client_id'=>'ID-CLIENTE',
            'client_secret'=>'CODICE-SEGRETO-CLIENTE',
            'username'=>'USERNAME',
            'password'=>'PASSWORD'
        ));
    curl_setopt($curl,CURLOPT_URL,$url);
    curl_setopt($curl,CURLOPT_POST,5);
    curl_setopt($curl,CURLOPT_POSTFIELDS,$param);
    $resp = curl_exec($curl);
    if(!curl_exec($curl))
    {
        echo 'Errore: "' . curl_error($curl) . '" - Codice: ' . curl_errno($curl);
    }
    else
    {
        $resArr=json_decode($resp);
        $token=trim($resArr->access_token);
        $newurl=trim($resArr->instance_url);
        if($token!=""&&$newurl!="")
        {
            $url=$newurl."/services/data/v42.0/query";
            $param="q=".urlencode("SELECT Name FROM Account ORDER BY Name");
            $url=$url."?".$param;
            curl_setopt($curl,CURLOPT_URL,$url);
            curl_setopt($curl,CURLOPT_POST,false);
            curl_setopt($curl,CURLOPT_SSL_VERIFYPEER,false);
            curl_setopt($curl,CURLOPT_HEADER,false);
            curl_setopt($curl,CURLOPT_RETURNTRANSFER,true);
            curl_setopt($curl,CURLOPT_HTTPHEADER,array("Authorization: OAuth $token"));
            $json_response = curl_exec($curl);
            $status=curl_getinfo($curl,CURLINFO_HTTP_CODE);
            if ($status!=200)
            {
                die("Errore: " . curl_error($curl) . ", Codice " . curl_errno($curl));
            }
            else
            {
                $risultato=json_decode($json_response);
                $trovati=intval($risultato->totalSize);
                $completato=$risultato->done;
                $nexturl=$risultato->nextRecordsUrl;
                if($trovati>0)
                {
                    $lista=$risultato->records;
                    foreach($lista as $key=>$value) echo $value->Name."<br />";
                }
            }
        }
    }
?>


Vediamo di analizzare un po' meglio questo all'apparenza corposo codice.

Innanzitutto c'è da dire che per poter effettuare la chiamata da php a salesforce si utilizzano le potentissime curl.
I parametri da impostare in questo script d'esempio sono solo quelli d'accesso: grant_type (dove bisogna scrivere semplicemente la parola password), client_id, client_secret, username e password.

Effettuata con successo la login riceveremo indietro, tra le altre cose, un access_token ed un instance_url.
Il primo è ovviamente il token d'accesso per poter proseguire, mentre il secondo è l'indirizzo a cui bisogna reindirizzare la successiva chiamata curl.

Per pescare i record presenti di una tabella salesforce da php quindi, si effettuerà una seconda chiamata, alla quale verrà passata come parametro la query in formato soql.
L'soql è una sorta di sql di salesforce, molto simile all'originale per fortuna, con i classici comandi select, insert, update, delete, e le varie condizioni where e le possibilità di ordinamento con order.

Il risultato ottenuto, come per la prima chiamata, sarà in formato json, quindi andrà estrapolato da lì con le classiche funzioni php.

Come ultima precisazione importante c'è da dire che salesforce potrebbe avere impostato dei limiti alle chiamate delle varie api webservice php, come ad esempio il numero massimo di risultati settato a 2000 alla volta (se non ricordo male).
Quindi se la vostra intenzione è quella di mostrare a video tutti i record presenti in una tabella sf, dovrete creare una funzione ricorsiva da richiamare di volta in volta.
Per far questo vi vengono incontro i parametri json totalSize (vi fa capire il numero di record presenti), done (per capire se il risultato mostrato è totale (true) o parziale (false)), e nextRecordsUrl (ovvero l'url da passare alla funzione ricorsiva alla quale deve puntare la prossima chiamata della curl a salesforce).

Bene è tutto.
Se avrete fatto tutto correttamente, manipolando un po' il codice che vi ho illustrato, potrete fare tutte le api php salesforce che volete... o meglio, sempre nei limiti imposti dal crm.


Possibili errori / problemi nella connessione php -> salesforce


Già che ci sono riporto i possibili errori di connessione che potrebbero capitarvi.

{"error":"invalid_client","error_description":"invalid client credentials"}
In questo caso potreste aver sbagliato ad immettere uno dei parametri d'accesso richiesto, oppure potrebbe esserci anche qualche spazio di troppo, o non è stata rispettata la giusta sintassi.

[{"message":"unexpected token","errorCode":"MALFORMED_QUERY"}]
E' stata inserita la sintassi soql salesforce sbagliata.

[{"message":"INVALID_HEADER_TYPE","errorCode":"INVALID_AUTH_HEADER"}]
Probabili problemi con il token o con l'autentificazione, o nella formattazione dell'header inviato via curl a salesforce.

[{"message":"Session expired or invalid","errorCode":"INVALID_SESSION_ID"}]
Problema con il token e l'autentificazione, magari il codice è errato o c'è qualche spazio di troppo (oppure è scaduto).

Errore: "SSL certificate problem: unable to get local issuer certificate"
Questo può darlo quando i certificati sul server sono in scadenza o non sono configurati al meglio.
Essendo un errore specifico della chiamata curl, si può risolvere aggiungendo questa opzione:
curl_setopt($curl,CURLOPT_SSL_VERIFYPEER,false);

Bene, direi che per il momento è tutto sull'argomento salesforce php.
In caso di dubbi o problemi scrivetemi nei commenti.

Lascia un commento!