L’API import prodotti consente ad un sistema esterno (ad esempio un gestionale di magazzino) di aggiungere e modificare i prodotti su bindCommerce, per poter successivamente essere inviati ai canali di vendita.
Configurazione connettore su bindCommerce
Per consentire al gestionale API di creare ed aggiornare i prodotti su bindCommerce sarà necessario creare una configurazione apposita e il relativo connettore.
Per creare la configurazione andare al menù:
API >> Import prodotti
Cliccare su Aggiungi e compilare i campi come segue:
- Nome configurazione: scegliere il nome che si ritiene più adeguato
- Tipo d'azione: è possibile scegliere tra - Creazione - Creazione e aggiornamento - Aggiornamento
- Informazioni da considerare: Titolo - Descrizione - Descrizione breve - Produttore - Fornitore - Dimensioni e peso - Quantità - Attributi - Tags - Prezzi - Alternative - Immagini - Categorie
- Eliminazione dati non trasmessi: Barcode - Immagini - Prodotti
- Calcolare quantità prodotto parent dalla somma delle varianti?: opzione che consente di determinare se i prodotti parent dovranno avere la quantità calcolata in base alla somma dello stock delle singole varianti
- Calcolare prezzo del parent dal minimo delle varianti?: opzione che consente di determinare se i prodotti parent dovranno avere il prezzo calcolato in base al prezzo più basso delle singole varianti
Cliccare su SALVA E CHIUDI.
Per creare il connettore che consentirà di di importare i prodotti dal gestionale API a bindCommerce è necessario andare al menù:
Processi >> Connettori
Cliccare su Aggiungi e compilare i campi come segue:
- Nome connettore: usare il nome che si preferisce
- Tipo nodo (tecnologia): API
- Nodo: il nodo creato in precedenza
- Tipo connettore: API [import prodotti]
Cliccando su SALVA E CONTINUA si avrà accesso agli ulteriori campi da compilare.
- Il sistema chiamante dovrà utilizzare la seguente stringa: copiare l’URL presente in questo campo e incollarlo nell’apposito campo sul pannello di controllo del gestionale
- Configurazione connettore: selezionare la configurazione creata prima
- Filtro prodotti: per creare un filtro sui prodotti si invita a seguire le istruzioni riportate all'interno della guida apposita Filtri sui prodotti
Cliccare su SALVA E CHIUDI.
Chiamata ed autenticazione
La chiamata viene effettuata all’URL generato da bindCommerce per lo specifico connettore (da configurare preventivamente attraverso l’interfaccia di bindCommerce).
L’autenticazione avviene attraverso token assegnato per il nodo API. Il parametro viene trasmesso nell'header della richiesta.
<?php
ini_set('display_errors', true);
error_reporting(E_ALL);
$strXml = file_get_contents(__DIR__.'/Products.xml');
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => "https://miohost.bindcommerce.cloud/integrator-tool/api/products.php?connector=N",
CURLOPT_SSL_VERIFYPEER => 0,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_VERBOSE => true,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => $strXml,
CURLOPT_HTTPHEADER => array(
"cache-control: no-cache",
"content-type: text/xml",
"token: 0435a03b361d7cc24fc1acacdeaae1d7"
),
));
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}
Questa chiamata restituisce un json così formato:
[ 'status' => success || error 'message' => Stringa con la descrizione del log del connettore 'code' => un codice numerico che esprime successo o fallimento v. di seguito (CHIAMATA DI CONTROLLO DELLO STATO) per un elenco completo 'id_exec' => opzionale - id esecuzione, viene fornito nel caso sia necessario utilizzarlo nella CHIAMATA DI CONTROLLO DELLO STATO 'id_procedure' => opzionale - id procedura, viene fornito nel caso sia necessario utilizzarlo nella CHIAMATA DI CONTROLLO DELLO STATO ]
File prodotti
<?xml version="1.0" encoding="UTF-8"?>
<bindCommerceProducts Mode="full">
<Products>
<Product>
<Language>IT</Language>
<Code>3410116</Code>
<Barcode>8001066510405</Barcode>
<BarcodeKind>EAN</BarcodeKind>
<Title>6 MATITE PER FALEGNAMI 18CM.</Title>
<DescriptionHtml>6 MATITE PER FALEGNAMI 18CM. COLORE ROSSO</DescriptionHtml>
<ShortDescription></ShortDescription>
<Notes />
<Categories>
<Category>Scarpe|Donna|Scarpe da ginnastica</Category>
<Category>Promo</Category>
</Categories>
<Alternatives>
<Alternative>
<Language>IT</Language>
<Title></Title>
<DescriptionHtml></DescriptionHtml>
<ShortDescription></ShortDescription>
<Notes />
</Alternative>
</Alternatives>
<Prices>
<Price>
<ListCode>Public</ListCode>
<ListName>Prezzo pubblico</ListName>
<Currency>EUR</Currency>
<Vat>0.22</Vat>
<NetPrice>1.0820</NetPrice>
<GrossPrice>1.32</GrossPrice>
<OverridePrice>0</OverridePrice>
<Override>0</Override>
</Price>
<Price>
<ListCode>00045</ListCode>
<Currency>EUR</Currency>
<Vat>0.22</Vat>
<NetPrice>0.3200</NetPrice>
<GrossPrice>1.3904</GrossPrice>
<OverridePrice>0</OverridePrice>
<Override>0</Override>
</Price>
<Price>
<ListCode>Sconti quantità</ListCode>
<Currency>EUR</Currency>
<Vat>0.22</Vat>
<NetPrice>0.3200</NetPrice>
<GrossPrice>1.3904</GrossPrice>
<OverridePrice>0</OverridePrice>
<Override>0</Override>
<PriceQuantityStart>1</PriceQuantityStart>
<PriceQuantityEnd>5</PriceQuantityEnd>
</Price>
<Price>
<ListCode>Sconti quantità</ListCode>
<Currency>EUR</Currency>
<Vat>0.22</Vat>
<NetPrice>0.3200</NetPrice>
<GrossPrice>1.3904</GrossPrice>
<OverridePrice>0</OverridePrice>
<Override>0</Override>
<PriceQuantityStart>6</PriceQuantityStart>
<PriceQuantityEnd>999</PriceQuantityEnd>
</Price>
<Price>
<ListName>Listino 46</ListName>
<Currency>EUR</Currency>
<Vat>0.22</Vat>
<NetPrice>0.3200</NetPrice>
<GrossPrice>1.3904</GrossPrice>
<OverridePrice>0</OverridePrice>
<Override>0</Override>
</Price>
</Prices>
<Manufacturer>METRICA</Manufacturer>
<MPN />
<Supplier>GLP</Supplier>
<Dimensions>
<Weight>0.50</Weight>
<WeightUom>kg</WeightUom>
<WeightVolume />
<LwhUom>cm</LwhUom>
<Length>20.00</Length>
<Width>20.00</Width>
<Height>10.00</Height>
</Dimensions>
<Qty>1</Qty>
<Pictures>
<Picture>
<URL>http://miosito.com/shop/images/341011.jpg</URL>
</Picture>
<Picture tags=”scarpe,sport,estate”>
<URL>http://miosito.com/shop/images/3410116.jpg</URL>
</Picture>
<Picture>
<URL>http://miosito.com/shop/images/3410116.jpg</URL>
</Picture>
</Pictures>
<Attributes>
<Attribute lang=”it”>
<Name>Materiale</Name>
<Value>Gomma</Value>
</Attribute>
<Attribute lang=”it”>
<Name>Colore</Name>
<Value>Rosso</Value>
</Attribute>
<Attribute lang=”en”>
<Name>Color</Name>
<Value>Red</Value>
</Attribute>
</Attributes>
<Warehouses>
<Warehouse>
<WarehouseKey>Magazzino Roma</WarehouseKey>
<Qty>8</Qty>
</Warehouse>
<Warehouse>
<WarehouseKey>Magazzino Milano</WarehouseKey>
<Qty>13</Qty>
</Warehouse>
</Warehouses>
<Variants>
<Variant>
<Code>100383----F254/701/-</Code>
<Barcode>8033766128031</Barcode>
<BarcodeKind>EAN</BarcodeKind>
<Title>BRIKO Maschera sci discesa snowboard unisex S3 nero bianco 100383[701]</Title>
<Qty>1</Qty>
<Pictures>
<Picture>
<URL>http://miosito.com/shop/images/341011.jpg</URL>
</Picture>
<Picture tags=”scarpe,sport,estate”>
<URL>http://miosito.com/shop/images/3410116.jpg</URL>
</Picture>
<Picture>
<URL>http://miosito.com/shop/images/3410116.jpg</URL>
</Picture>
</Pictures>
<Attributes>
<Attribute>
<Name />
<Value />
</Attribute>
</Attributes>
<Prices>
<Price>
<ListName>Prezzo pubblico</ListName>
<Vat>22.0000</Vat>
<NetPrice>1.0820</NetPrice>
<GrossPrice>1.32</GrossPrice>
<OverridePrice>0</OverridePrice>
<Override>0</Override>
</Price>
</Prices>
<Warehouses>
<Warehouse>
<WarehouseKey>Magazzino Roma</WarehouseKey>
<Qty>8</Qty>
</Warehouse>
<Warehouse>
<WarehouseKey>Magazzino Milano</WarehouseKey>
<Qty>13</Qty>
</Warehouse>
</Warehouses>
</Variant>
</Variants>
<Derivatives>
<Derivate>
<Title>Confezione 60 MATITE PER FALEGNAMI 18CM.</Title>
<Code>3410116A</Code>
<Barcode>8001066510405A</Barcode>
<BarcodeKind>EAN</BarcodeKind>
<PackageQty>6</PackageQty>
<PriceMultiplied>9</PriceMultiplied>
</Derivate>
</Derivatives>
</Product>
<Product>
….
</Product>
</Products>
<Delete>
<sku>SKUTEST123</sku>
<sku>SKUTEST456</sku>
</Delete>
</bindCommerceProducts>
Campi del file
DICHIARAZIONI GENERALI
Campo | Descrizione |
---|---|
Mode | Tipo di invio:
|
Products | Contiene uno o più tag <Product> |
INFORMAZIONI SUL PRODOTTO
Campo | Descrizione |
---|---|
Language | Lingua nella quale viene descritto il prodotto in formato ISO 639-1 (es. IT) |
Code | Codice prodotto / SKU (es. 3410116) |
Barcode | Codice a barre (es. 8001066510405) |
BarcodeKind | Tipo di codice a barre (es. EAN, UPS, ISBN) |
Title | Titolo del prodotto |
DescriptionHtml | Descrizione estesa in HTML |
ShortDescription | Descrizione breve |
Notes | Note |
Categories | Gruppo contenente le categorie |
Alternatives | Gruppo contenente le descrizioni alternative |
Prices | Gruppo contenente i prezzi |
Manufacturer | Produttore o Marchio (es. Adidas) |
MPN | Manufacturer Product Number, ovvero codice originale del produttore (es. PERT-G-8678) |
Supplier | Fornitore (es. Rossi Distribuzioni S.p.A.) |
Dimensions | Gruppo contenente le dimensioni |
Qty | Quantità a magazzino. Sono accettati sia valori interi, che decimali (con separatore .), es. 1 oppure 55.31 Se un prodotto è strutturato per varianti, aggiornando lo stock della variante verrà automaticamentre calcolato lo stock del relativo prodotto padre come somma dello stock delle varianti. |
MetaTitle | Meta Title |
MetaDescription | Meta Description |
MetaKeywords
| Meta Keywords
|
Warehouses | Gruppo contenente le disponibilità sui magazzini alternativi |
Pictures | Gruppo contenente le immagini |
Attributes | Gruppo contenente gli attributi |
Variants | Gruppo contenente le varianti |
CATEGORIA (CONTENUTO NEL TAG < CATEGORY >)
Campo | Descrizione |
---|---|
Category | Alberatura della categoria con separatore pipe |
Se si desidera abbinare più alberature di categorie ad un prodotto, è possibile aggiungere più tag Category
ALTERNATIVA (CONTENUTO NEL TAG < ALTERNATIVE >)
Campo | Descrizione |
---|---|
Language | Lingua nella quale viene descritta l’alternativa del prodotto in formato ISO 639-1 (es. EN) |
Title | Traduzione del titolo |
DescriptionHtml | Traduzione della descrizione HTML |
ShortDescription | Traduzione della descrizione breve |
Notes | Traduzione delle note |
PREZZO (CONTENUTO NEL TAG < PRICE >)
Campo | Descrizione |
---|---|
ListCode | Codice identificativo del listino (es. Public01) corrispondente alla chiave listino “Key Gest (Chiave listino gestionale ed API)” |
ListName | Nome identificativo del listino (es. Pubblico scontato) |
Currency | Valuta |
Vat | Aliquota IVA (es. 0.2200) |
NetPrice | Prezzo IVA esclusa (es. 1.08200) |
GrossPrice | Prezzo IVA compresa (es. 1.32000) |
OverridePrice | Prezzo scontato (es. 0) |
Override | Applicazione prezzo scontato Valori ammessi: 0 = prezzo scontato disabilitato E’ consigliabile l’uso dei valori 0 ed 1 (il caso -1 è difficilmente applicabile ai canali di vendita) |
PriceQuantityStart | Limite quantità inferiore |
PriceQuantityStart | Limite quantità superiore |
La necessità di popolare sia NetPrice che GrossPrice è giustificata dalla certezza di arrotondamento dei valori. Nel caso in cui uno dei 2 valori non dovesse essere compilato (sconsigliato), sarà comunque possibile farlo calcolare a bindCommerce al termine dell’importazione.
Se un prodotto è strutturato per varianti, aggiornando il prezzo della variante verrà automaticamentre calcolato il prezzo relativo prodotto padre come minimo dei prezzi delle varianti.
Relativamente all’identificazione dei listini valgono le seguenti regole:
- Se nel file XML è presente solo ListCode viene utilizzata la chiave listino per identificarlo ed abbinarlo a quelli esistenti, oppure eventualmente crearne uno nuovo qualora non si riscontrasse alcun abbinamento (in tal caso il codice listino verrà utilizzato anche come nome dello stesso)
- Se nel file XML è presente solo ListName viene utilizzato il nome del listino per identificarlo ed abbinarlo a quelli esistenti, oppure eventualmente crearne uno nuovo (senza chiave, solo con il nome) qualora non si riscontrasse alcun abbinamento
- Se nel file XML sono peesenti sia ListCode che ListName, per i confronti viene considerato solo ListCode
DIMENSIONI (CONTENUTO NEL TAG < DIMENSIONS >)
Campo | Descrizione |
---|---|
Weight | Peso (es. 0.50) |
WeightUom | Unità di misura del peso (es. Kg) |
WeightVolume | Peso volumetrico (es. 0.67). |
LwhUom | Unità di misura lineare (es. cm) |
Length | Lunghezza (es. 15.12) |
Width | Base (es. 32.00) |
Height | Altezza (es. 5.00) |
MAGAZZINI (CONTENUTO NEL TAG < WAREHOUSE >)
Campo | Descrizione |
---|---|
WarehouseKey | Un identificativo univoco da associare al magazzino. In automatico, la chiamata API assegna il nome seguente che potrà essere visualizzato (e cambiato) nell’interfaccia bind. Esempio se la chiave è “Magazzino Milano” il nome sarà-> Magazzino Milano created by API |
Qty | La quantità di prodotto presente nel magazzino avente chiave “WarehouseKey” Se un prodotto è strutturato per varianti, aggiornando lo stock della variante verrà automaticamentre calcolato lo stock del relativo prodotto padre come somma dello stock delle varianti. |
IMMAGINI (CONTENUTO NEL TAG < PICTURE >)
Campo | Descrizione |
---|---|
URL | URL assoluto dell’immagine da importare. L’immagine principale viene identificata dall’ordine in base a cui sono inviate. La prima è quella principale. |
L’ordine di importazione (che determina l’ordine di esportazione) è determinato dall’ordine dei tag nel file XML, salvo che per l’immagine main, che apparirà sempre per prima).
Ogni immagine può contenere dei tags separati da virgole che devono essere passati nel modo seguente:
<Picture tags=”tag1, tag2, tag3”>...</Picture>
ATTRIBUTO (CONTENUTO NEL TAG < ATTRIBUTE >)
Campo | Descrizione |
---|---|
Name | Nome dell’attributo Il nome verrà confrontato con la “Chiave attributo gestionale” presente nella scheda attributo |
Value | Valore dell’attributo |
Per poter creare un nuovo attributo è necessario che il tag <Attribute lang=”it”> sia completo della lingua
VARIANTE (CONTENUTO NEL TAG < VARIANT >)
Campo | Descrizione |
---|---|
Code | Codice SKU della variante |
Barcode | Codice a barre della variante |
BarcodeKind | Tipo di codice a barre della variante |
Title | Titolo della variante |
Qty | Quantità a magazzino della variante |
Attributes | Gruppo contenente gli attributi |
Prices | Gruppo contenente i prezzi |
Warehouses | Gruppo contenente le disponibilità sui magazzini alternativi |
PRODOTTI DERIVATI (CONTENUTO NEL TAG < DERIVATIVES >)
Campo | Descrizione |
---|---|
Code | Codice SKU del prodotto derivato |
Barcode | Codice a barre del prodotto derivato |
BarcodeKind | Tipo di codice a barre |
Title | Titolo della variante |
PackageQty | Quantità necessarie del prodotto originale |
MultiplierPrice | Prezzo |
I prodotti derivati sono composti da altri prodotti e a loro volta generano un prodotto.
RICODIFICHE SKU (CONTENUTE NEL TAG < RECODES >)
Campo | Descrizione |
---|---|
CodeExt | Codice esterno a cui si vuole abbinare lo sku del prodotto |
NodeId | Nodo bindCommerce per il quale si vuole eseguire la ricodifica |
eBaySiteId | id mercato eBay per il quale si vuole eseguire la ricodifica |
AmazonMarket | Codice mercato Amazon per il quale si vuole eseguire la ricodifica (es. APJ6JRA9NG5V4) |
Ogni singola ricodifica deve essere contenuta nei tag <Recode></Recode>. Il tag <Recode> può avere un attributo “action” impostabile con valore “delete” (<Recode action="delete">) per cancellare una specifica ricodifica precedentemente caricata. L’abbinamento viene fatto con i dati inviati. E’ possibile, per esempio, cancellare tutte le ricodifiche legate ad un nodo inviando solo il tag “NodeId”. Per questo motivo il consiglio è di essere il più precisi possibile con l’invio dei tag, per evitare cancellazioni massive accidentali.
CANCELLAZIONE SPICIFICI SKU (TAG < DELETE >)
Campo | Descrizione |
---|---|
Sku | Sku del prodotto su bindCommerce da contrassegnare come annullato. Tutti i prodotti figlio verranno contrassegnati come annullati. |
CHIAMATA DI CONTROLLO DELLO STATO
La chiamata precedente di importazione dei prodotti via API prende in consegna tutti i prodotti e fornisce un risultato di successo solo in merito alla presa in consegna, ma non in merito all’esito finale di importazione. Ciò perché è una chiamata batch che può richiedere diversi minuti. Per controllare invece l’esito dell’importazione occorre invece effettuare una nuova chiamata che fornisce il log di stato dell’esecuzione.
Lo stesso log può essere consultato cliccando sui pulsanti “Connettori” e “In Esecuzione” nell’interfaccia bindCommerce nel menu in alto.
Per farlo invece a livello programmatico si può usare invece la seguente usando l’id del connettore di cui si vuole conoscere lo stato. N = id del connettore.
In aggiunta al parametro id (che è sempre obbligatorio) è possibile utilizzare i parametri id_exec e id_procedure così come restituiti dalla chiamata precedente (v. Chiamata ed autenticazione).
L’autenticazione avviene attraverso lo stesso token assegnato per il nodo API.
<?php
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => "https://miohost.bindcommerce.cloud/integrator-tool/api/connector_status.php?id=N",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => array(
"cache-control: no-cache",
"content-type: text/xml",
"token: 0a09039b989e7b705da2575ec4ae882f"
),
));
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}
Questa chiamata restituisce un json così formato:
[ 'status' => success || error 'message' => Stringa con la descrizione del log del connettore 'code' => un codice numerico che esprime successo o fallimento ]
Nel caso in cui vengano specificati i parametri id_exec oppure id_exec e id_procedure il campo "message" verrà valorizzato con il contenuto del file di log in formato CSV.
Di seguito si riportano i valori del parametro code
200 => nessun connettore in esecuzione
201 => connettore in esecuzione
401 => errore interno
402 => manca il connettore
403 => errore interno
404 => manca il token di autenticazione
405 => token non configurato nel nodo
406 => autenticazione fallita
407 => connettore inesistente
509 => Procedura ( id procedura ) già in esecuzione dal ( data )