This sample demonstrates how to connect to the API to GET and POST resources using PHP
<?php // configuration data // must use your own id and key with no extra whitespace $api = "https://api.unleashedsoftware.com/"; $apiId = "your id here"; $apiKey = "your key here"; // Get the request signature: // Based on your API id and the request portion of the url // - $request is only any part of the url after the "?" // - use $request = "" if there is no request portion // - for GET $request will only be the filters eg ?customerName=Bob // - for POST $request will usually be an empty string // - $request never includes the "?" // Using the wrong value for $request will result in an 403 forbidden response from the API function getSignature($request, $key) { return base64_encode(hash_hmac('sha256', $request, $key, true)); } // Create the curl object and set the required options // - $api will always be https://api.unleashedsoftware.com/ // - $endpoint must be correctly specified // - $requestUrl does include the "?" if any // Using the wrong values for $endpoint or $requestUrl will result in a failed API call function getCurl($id, $key, $signature, $endpoint, $requestUrl, $format) { global $api; $curl = curl_init($api . $endpoint . $requestUrl); curl_setopt($curl, CURLOPT_FRESH_CONNECT, true); curl_setopt($curl, CURLINFO_HEADER_OUT, true); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($curl, CURLOPT_HTTPHEADER, array("Content-Type: application/$format", "Accept: application/$format", "api-auth-id: $id", "api-auth-signature: $signature")); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_TIMEOUT, 20); // these options allow us to read the error message sent by the API curl_setopt($curl, CURLOPT_FAILONERROR, false); curl_setopt($curl, CURLOPT_HTTP200ALIASES, range(400, 599)); return $curl; } // GET something from the API // - $request is only any part of the url after the "?" // - use $request = "" if there is no request portion // - for GET $request will only be the filters eg ?customerName=Bob // - $request never includes the "?" // Format agnostic method. Pass in the required $format of "json" or "xml" function get($id, $key, $endpoint, $request, $format) { $requestUrl = ""; if (!empty($request)) $requestUrl = "?$request"; try { // calculate API signature $signature = getSignature($request, $key); // create the curl object $curl = getCurl($id, $key, $signature, $endpoint, $requestUrl, $format); // GET something $curl_result = curl_exec($curl); error_log($curl_result); curl_close($curl); return $curl_result; } catch (Exception $e) { error_log('Error: ' + $e); } } // POST something to the API // - $request is only any part of the url after the "?" // - use $request = "" if there is no request portion // - for POST $request will usually be an empty string // - $request never includes the "?" // Format agnostic method. Pass in the required $format of "json" or "xml" function post($id, $key, $endpoint, $format, $dataId, $data) { if (!isset($dataId, $data)) { return null; } try { // calculate API signature $signature = getSignature("", $key); // create the curl object. // - POST always requires the object's id $curl = getCurl($id, $key, $signature, "$endpoint/$dataId", "", $format); // set extra curl options required by POST curl_setopt($curl, CURLOPT_POST, 1); curl_setopt($curl, CURLOPT_POSTFIELDS, $data); // POST something $curl_result = curl_exec($curl); error_log($curl_result); curl_close($curl); return $curl_result; } catch (Exception $e) { error_log('Error: ' + $e); } } // GET in XML format // - gets the data from the API and converts it to an XML object function getXml($id, $key, $endpoint, $request) { // GET it $xml = get($id, $key, $endpoint, $request, "xml"); // Convert to XML object and return return new SimpleXMLElement($xml); } // POST in XML format // - the object to POST must be a valid XML object. Not stdClass, not array, not associative. // - converts the object to string and POSTs it to the API function postXml($id, $key, $endpoint, $dataId, $data) { $xml = $data->asXML(); // must remove the <xml version="1.0"> node if present, the API does not want it $pos = strpos($xml, '<?xml version="1.0"?>'); if ($pos !== false) { $xml = str_replace('<?xml version="1.0"?>', '', $xml); } // if the data does not have the correct xml namespace (xmlns) then add it $pos1 = strpos($xml, 'xmlns="http://api.unleashedsoftware.com/version/1"'); if ($pos1 === false) { // there should be a better way than this // using preg_replace with count = 1 will only replace the first occurance $xml = preg_replace(' />/i',' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://api.unleashedsoftware.com/version/1">',$xml,1); } // POST it $posted = post($id, $key, $endpoint, "xml", $dataId, $xml ); // Convert to XML object and return // - the API always returns the POSTed object back as confirmation return new SimpleXMLElement($posted); } // GET in JSON format // - gets the data from the API and converts it to an stdClass object function getJson($id, $key, $endpoint, $request) { // GET it, decode it, return it return json_decode(get($id, $key, $endpoint, $request, "json")); } // POST in JSON format // - the object to POST must be a valid stdClass object. Not array, not associative. // - converts the object to string and POSTs it to the API function postJson($id, $key, $endpoint, $dataId, $data) { // POST it, return the API's response return post($id, $key, $endpoint, "json", $dataId, json_encode($data)); } // Example method: GET customer list in xml or json function getCustomers($format) { global $apiId, $apiKey; if ($format == "xml") return getXml($apiId, $apiKey, "Customers", ""); else return getJson($apiId, $apiKey, "Customers", ""); } // Example method: GET customer list, filtered by name, in xml or json function getCustomersByName($customerName,$format) { global $apiId, $apiKey; if ($format == "xml") return getXml($apiId, $apiKey, "Customers", "customerName=$customerName"); else return getJson($apiId, $apiKey, "Customers", "customerName=$customerName"); } // Example method: POST a customer in xml or json function postCustomer($customer,$format) { global $apiId, $apiKey; if ($format == "xml") return postXml($apiId, $apiKey, "Customers", $customer->Guid, $customer); else return postJson($apiId, $apiKey, "Customers", $customer->Guid, $customer); } // Example method: POST a purchase order in xml or json function postPurchaseOrder($purchase,$format) { global $apiId, $apiKey; if ($format == "xml") return postXml($apiId, $apiKey, "PurchaseOrders", $purchase->Guid, $purchase); else return postJson($apiId, $apiKey, "PurchaseOrders", $purchase->Guid, $purchase); } // Example method: POST a sales order in xml or json function postSalesOrder($salesOrder,$format) { global $apiId, $apiKey; if ($format == "xml") return postXml($apiId, $apiKey, "SalesOrders", $salesOrder->Guid, $salesOrder); else return postJson($apiId, $apiKey, "SalesOrders", $salesOrder->Guid, $salesOrder); } // Generate a new guid for use as the id when POSTing new items // - there should be a better / official way to do this in PHP // - do not use this method on a production system function NewGuid() { return sprintf('%04X%04X-%04X-%04X-%04X-%04X%04X%04X', mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(16384, 20479), mt_rand(32768, 49151), mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(0, 65535)); } // ------------------------------------------------------- // TEST all methods and show the outputs // ------------------------------------------------------- // Call the GET customers method and print the results function testGetCustomers() { echo "Starting test: testGetCustomers" . "<br />"; echo "<br />"; echo "-------------------------------------------------------------------------------------<br />"; echo "GET customers in XML format:" . "<br />"; echo "<br />"; $xml = getCustomers("xml"); echo htmlentities($xml->asXML()); echo "<br />"; echo "<br />"; echo "GET customers in XML format: example of looping through the customer list" . "<br />"; foreach ($xml->Customer as $customer) { $code = $customer->CustomerCode; $name = $customer->CustomerName; echo "XML Customer: $code, $name<br />"; } echo "<br />"; echo "<br />"; echo "-------------------------------------------------------------------------------------<br />"; echo "GET customers in JSON format:" . "<br />"; echo "<br />"; $json = getCustomers("json"); echo json_encode($json); echo "<br />"; echo "<br />"; echo "GET customers in JSON format: example of looping through the customer list" . "<br />"; foreach ($json->Items as $customer) { $code = $customer->CustomerCode; $name = $customer->CustomerName; echo "JSON Customer: $code, $name<br />"; } echo "<br />"; echo "<br />"; echo "End of test: testGetCustomers" . "<br />"; echo "-------------------------------------------------------------------------------------<br />"; } // Call the GET customers by name method and print the results function testGetCustomersByName() { echo "Starting test: testGetCustomersByName". "<br />"; echo "-------------------------------------------------------------------------------------<br />"; echo "GET customers by name in XML format:"; $xml = getCustomersByName("ACE", "xml"); echo htmlentities($xml->asXML()); echo "<br />"; echo "<br />"; echo "GET customers in XML format: example of looping through the customer list" . "<br />"; foreach ($xml->Customer as $customer) { $code = $customer->CustomerCode; $name = $customer->CustomerName; echo "XML Customer: $code, $name<br />"; } echo "-------------------------------------------------------------------------------------<br />"; echo "GET customers by name in JSON format:"; $json = getCustomersByName("ACE", "json"); echo json_encode($json); echo "<br />"; echo "<br />"; echo "GET customers in JSON format: example of looping through the customer list" . "<br />"; foreach ($json->Items as $customer) { $code = $customer->CustomerCode; $name = $customer->CustomerName; echo "JSON Customer: $code, $name<br />"; } echo "<br />"; echo "<br />"; echo "End of test: testGetCustomersByName". "<br />"; echo "-------------------------------------------------------------------------------------<br />"; } // Call the POST new customers method using json and print the results function testPostNewCustomerJson() { echo "Starting test: testPostNewCustomerJson" . "<br />"; echo "-------------------------------------------------------------------------------------<br />"; echo "POST new customer in JSON format:" . "<br />"; $guid = NewGuid(); echo "New GUID = $guid"; echo "<br />"; $customer = new stdClass(); $customer->Guid = "$guid"; $customer->CustomerCode = "PHP-$guid"; $customer->CustomerName = "New customer PHP-$guid"; $customer->Notes = "Customer $guid added via json POST"; echo "Input data:" . "<br />"; echo json_encode($customer); $jsonPost = postCustomer($customer, "json"); echo "<br />"; echo "Output data:" . "<br />"; echo json_encode($jsonPost); echo "<br />"; echo "-------------------------------------------------------------------------------------<br />"; echo "End of test: testPostNewCustomerJson" . "<br />"; } // Call the POST updated an existing customer method and print the results function testPostUpdateCustomer() { echo "Starting test: testPostUpdateCustomer" . "<br />"; echo "-------------------------------------------------------------------------------------<br />"; echo "POST update customer in XML format:" . "<br />"; $xml = getCustomers("xml"); $customer = $xml->Customer[0]; $customer->Notes = "Customer updated via xml POST"; echo "Input data:" . "<br />"; echo htmlentities($customer->asXML()); echo "<br />"; echo "Input id:" . "<br />"; echo $customer->Guid; echo "<br />"; echo "<br />"; $xmlPost = postCustomer($customer, "xml", $customer->Guid); echo "Output data:" . "<br />"; echo htmlentities($xmlPost->asXML()); /* echo "-------------------------------------------------------------------------------------<br />"; echo "POST update customer in JSON format:" . "<br />"; $json = getCustomers("json"); $customer = $json->Items[0]; $customer->Notes = "Customer updated via json POST"; echo "Input data:" . "<br />"; echo json_encode($customer); $jsonPost = postCustomer($customer, "json"); echo "Output data:" . "<br />"; echo json_encode($jsonPost); */ echo "-------------------------------------------------------------------------------------<br />"; echo "End of test: testPostUpdateCustomer" . "<br />"; } // Call the POST new purchase method using json and print the results // NOTE - Not finished yet, has a problem with sending the correct date format. // NOTE - Post purchases in XML instead function testPostNewPurchase() { die("Not implemented"); echo "Starting test: testPostNewPurchase" . "<br />"; echo "-------------------------------------------------------------------------------------<br />"; echo "POST new purchase in JSON format:" . "<br />"; $guid = NewGuid(); echo "New GUID = $guid"; echo "<br />"; // $date = "\/Date(1331550000000)\/"; // // create all the sub objects // $supplier = new stdClass(); // $supplier->SupplierCode = "AUR001"; // $currency = new stdClass(); // $currency->CurrencyCode = "NZD"; // $warehouse = new stdClass(); // $warehouse->WarehouseCode = "W1"; // $tax = new stdClass(); // $tax->TaxCode = "GST"; // $purchase = new stdClass(); // $purchase->Guid = "$guid"; // $purchase->OrderNumber = substr($guid,0,15); // $purchase->RequiredDate = "$date"; // $purchase->Supplier = $supplier; // $purchase->Currency = $currency; // $purchase->Warehouse = $warehouse; // $purchase->Tax = $tax; // $purchase->Comments = "Purchase $guid added via json POST"; // echo "Input data:" . "<br />"; // echo json_encode($purchase); // $jsonPost = postPurchaseOrder($purchase, "json"); // echo "<br />"; // echo "Output data:" . "<br />"; // echo json_encode($jsonPost); // echo "<br />"; echo "-------------------------------------------------------------------------------------<br />"; echo "End of test: testPostNewPurchase" . "<br />"; } // Call the POST new purchase method using xml and print the results function testPostNewCustomerXml() { echo "Starting test: testPostNewCustomerXml" . "<br />"; echo "-------------------------------------------------------------------------------------<br />"; echo "POST new customer in XML format:" . "<br />"; $guid = NewGuid(); echo "New GUID = $guid"; echo "<br />"; // creating an xml object in PHP: $customer = new simpleXMLElement('<Customer />'); // set all the properties of the customer // use simple xml, not stdClass $customer->Guid = "$guid"; $customer->CustomerCode = "XML $guid"; $customer->CustomerName = "New customer from XML $guid"; echo "Input data:" . "<br />"; echo htmlentities($customer->asXML()); echo "<br />"; echo "Input id:" . "<br />"; echo $customer->Guid; echo "<br />"; echo "<br />"; $xmlPost = postCustomer($customer, "xml", $customer->Guid); echo "Output data:" . "<br />"; echo htmlentities($xmlPost->asXML()); } // Call the POST new purchase method using xml and print the results function testPostNewPurchaseXml() { echo "Starting test: testPostNewPurchaseXml" . "<br />"; echo "-------------------------------------------------------------------------------------<br />"; echo "POST new purchase in XML format:" . "<br />"; $guid = NewGuid(); echo "New GUID = $guid"; echo "<br />"; $date = date('Y-m-d'); $taxRate = 0.15; $taxCode = "G.S.T."; // creating an xml object in PHP: $purchase = new simpleXMLElement('<PurchaseOrder />'); // set all the properties of the purchase // use simple xml, not stdClass $purchase->Guid = "$guid"; $purchase->OrderNumber = substr($guid,0,15); $purchase->RequiredDate = $date; $purchase->Supplier->SupplierCode = "AUR001"; $purchase->Currency->CurrencyCode = "NZD"; $purchase->Warehouse->WarehouseCode = "W1"; $purchase->Tax->TaxCode = $taxCode; $lines = $purchase->addChild('PurchaseOrderLines'); addPurchaseLineXml($lines, 1, 'ANIMAL', 5, 10, $taxRate); addPurchaseLineXml($lines, 2, 'BISCUIT', 10, 2, $taxRate); addPurchaseLineXml($lines, 3, 'CANDY', 1, 25, $taxRate); $purchase->SubTotal = 95.00; $purchase->TaxTotal = 14.25; $purchase->Total = 109.25; $purchase->Comments = "Purchase $guid added via xml POST"; echo "Input data:" . "<br />"; echo htmlentities($purchase->asXML()); echo "<br />"; echo "Input id:" . "<br />"; echo $purchase->Guid; echo "<br />"; echo "<br />"; $xmlPost = postPurchaseOrder($purchase, "xml", $purchase->Guid); echo "Output data:" . "<br />"; echo htmlentities($xmlPost->asXML()); } // Create a purchase order line XML object function addPurchaseLineXml($lines, $lineNumber, $productCode, $qty, $price, $taxRate) { $line = $lines->addChild('PurchaseOrderLine'); $line->addChild('LineNumber', $lineNumber); $line->addChild('Guid', NewGuid()); $product = $line->addChild('Product'); $product->addChild('ProductCode', $productCode); $line->addChild('OrderQuantity', $qty); $line->addChild('UnitPrice', $price); $line->addChild('LineTotal', $qty * $price); $line->addChild('LineTax', ($qty * $price * $taxRate) ); $line->addChild('Rate', $taxRate); $tax->addChild('Rate', $taxRate); } function testPostNewSalesOrderXml() { echo "Starting test: testPostNewSalesOrderXml" . "<br />"; echo "-------------------------------------------------------------------------------------<br />"; echo "POST new sales order in XML format:" . "<br />"; $guid = NewGuid(); echo "New GUID = $guid"; echo "<br />"; $date = date('Y-m-d'); $taxRate = 0.15; $taxCode = "G.S.T."; // creating an xml object in PHP: $order = new simpleXMLElement('<SalesInvoice />'); // set all the properties of the sales invoice // use simple xml, not stdClass $order->Guid = "$guid"; $order->OrderNumber = substr($guid,0,15); $order->OrderDate = $date; $order->RequiredDate = $date; $order->OrderStatus = "Parked"; $order->Customer->CustomerCode = "ACE001"; $order->Currency->CurrencyCode = "NZD"; $order->Warehouse->WarehouseCode = "W1"; $order->Tax->TaxCode = $taxCode; $lines = $order->addChild('SalesOrderLines'); addSalesOrderLineXml($lines, 1, 'ANIMAL', 5, 10, $taxRate); addSalesOrderLineXml($lines, 2, 'BISCUIT', 10, 2, $taxRate); addSalesOrderLineXml($lines, 3, 'CANDY', 1, 25, $taxRate); $order->SubTotal = 95.00; $order->TaxTotal = 14.25; $order->Total = 109.25; echo "Input data:" . "<br />"; echo htmlentities($invoice->asXML()); echo "<br />"; echo "Input id:" . "<br />"; echo $order->Guid; echo "<br />"; echo "<br />"; $xmlPost = postSalesOrder($order, "xml", $order->Guid); echo "Output data:" . "<br />"; echo htmlentities($xmlPost->asXML()); } // Create a sales order line XML object function addSalesOrderLineXml($lines, $lineNumber, $productCode, $qty, $price, $taxRate) { $line = $lines->addChild('SalesOrderLine'); $line->addChild('LineNumber', $lineNumber); $line->addChild('Guid', NewGuid()); $product = $line->addChild('Product'); $product->addChild('ProductCode', $productCode); $line->addChild('OrderQuantity', $qty); $line->addChild('UnitPrice', $price); $line->addChild('LineTotal', $qty * $price); $line->addChild('LineTax', ($qty * $price * $taxRate) ); $tax =$product->addChild('Tax'); $tax->addChild('Rate', $taxRate); } testGetCustomers(); testGetCustomersByName(); testPostUpdateCustomer(); testPostNewCustomerJson(); // testPostNewPurchase(); // not finished yet testPostNewCustomerXml(); testPostNewPurchaseXml(); testPostNewSalesOrderXml(); ?>
Use the API Sandbox to see how the object is rendered in JSON or XML.
Note: An Unleashed account is required before you can use the API Sandbox.
Trial accounts are also allowed to connect to the API. You can register a new account here: Register.