This library is aimed at wrapping all the UPS API into a simple to use PHP Library. It currently covers the Quantum View®, Tracking API, Shipping API, Rating API and Time in Transit API. Feel free to contribute.
- Requirements
- Installation
- Address Validation Class
- QuantumView Class
- Tracking Class
- Rate Class
- TimeInTransit Class
- Locator Class
- Tradeability Class
- Shipping Class
- Logging
- License
This library uses PHP 5.5+.
To use the UPS API, you have to request an access key from UPS. For every request, you will have to provide the Access Key, your UPS User ID and Password.
It is recommended that you install the PHP UPS API library through composer. To do so, run the Composer command to install the latest stable version of PHP UPS API:
composer require gabrielbull/ups-api
The Address Validation Class allow you to validate an address at street level. Suggestions are given when address is invalid.
Note: UPS has two Address Validations. This is Street Level option, which includes all option of the normal Address Validation class and adds street level validation.
Not all countries are supported, see UPS documentation. Currently US & Puerto Rico are supported.
$address = new \Ups\Entity\Address();
$address->setAttentionName('Test Test');
$address->setBuildingName('Test');
$address->setAddressLine1('Address Line 1');
$address->setAddressLine2('Address Line 2');
$address->setAddressLine3('Address Line 3');
$address->setStateProvinceCode('NY');
$address->setCity('New York');
$address->setCountryCode('US');
$address->setPostalCode('10000');
$xav = new \Ups\AddressValidation($accessKey, $userId, $password);
$xav->activateReturnObjectOnValidate(); //This is optional
try {
$response = $xav->validate($address, $requestOption = \Ups\AddressValidation::REQUEST_OPTION_ADDRESS_VALIDATION, $maxSuggestion = 15);
} catch (Exception $e) {
var_dump($e);
}
In the code above $xav->activateReturnObjectOnValidate()
is completely optional. Calling this method will cause
AddressValidation::validate()
to return an AddressValidationResponse
object. If you do not call this method, validate
continues to function as it has previously. If you do not call this method, a single object with either the matched
validated address, or the first candidate address if the address is ambiguous, will be returned.
The AddressValidationResponse object provides a number of methods to allow you to more easily query the API response to
determine the outcome. Continuing the example from above, returning an AddressValidationResponse
object will allow
you to be a bit more specific with how you handle the various outcomes:
if ($response->noCandidates()) {
//Do something clever and helpful to let the use know the address is invalid
}
if ($response->isAmbiguous()) {
$candidateAddresses = $response->getCandidateAddressList();
foreach($candidateAddresses as $address) {
//Present user with list of candidate addresses so they can pick the correct one
}
}
if ($response->isValid()) {
$validAddress = $response->getValidatedAddress();
//Show user validated address or update their address with the 'official' address
//Or do something else helpful...
}
Address Validation parameters are:
address
Address object as constructed in examplerequestOption
One of the three request options. See documentation. Default = Address Validation.maxSuggestion
Maximum number of suggestions to be returned. Max = 50
The QuantumView Class allow you to request a Quantum View Data subscription.
$quantumView = new Ups\QuantumView($accessKey, $userId, $password);
try {
// Get the subscription for all events for the last hour
$events = $quantumView->getSubscription(null, (time() - 3600));
foreach($events as $event) {
// Your code here
echo $event->Type;
}
} catch (Exception $e) {
var_dump($e);
}
QuantumView parameters are:
name
Name of subscription requested by user. If null, all events will be returned.beginDateTime
Beginning date time for the retrieval criteria of the subscriptions. Format: Y-m-d H:i:s or Unix timestamp.endDateTime
Ending date time for the retrieval criteria of the subscriptions. Format: Y-m-d H:i:s or Unix timestamp.fileName
File name of specific subscription requested by user.bookmark
Bookmarks the file for next retrieval.
If you provide a beginDateTime
, but no endDateTime
, the endDateTime
will default to the current date time.
To use the fileName
parameter, do not provide a beginDateTime
.
The Tracking Class allow you to track a shipment using the UPS Tracking API.
$tracking = new Ups\Tracking($accessKey, $userId, $password);
try {
$shipment = $tracking->track('TRACKING NUMBER');
foreach($shipment->Package->Activity as $activity) {
var_dump($activity);
}
} catch (Exception $e) {
var_dump($e);
}
Tracking parameters are:
trackingNumber
The package’s tracking number.requestOption
Optional processing. For Mail Innovations the only valid options are Last Activity and All activity.
$tracking = new Ups\Tracking($accessKey, $userId, $password);
try {
$shipment = $tracking->trackByReference('REFERENCE NUMBER');
foreach($shipment->Package->Activity as $activity) {
var_dump($activity);
}
} catch (Exception $e) {
var_dump($e);
}
Tracking parameters are:
referenceNumber
The ability to track any UPS package or shipment by reference number. Reference numbers can be a purchase order number, job number, etc. Reference Number is supplied when generating a shipment.requestOption
Optional processing. For Mail Innovations the only valid options are Last Activity and All activity.
The Rate Class allow you to get shipment rates using the UPS Rate API.
$rate = new Ups\Rate(
$accessKey,
$userId,
$password
);
try {
$shipment = new \Ups\Entity\Shipment();
$shipperAddress = $shipment->getShipper()->getAddress();
$shipperAddress->setPostalCode('99205');
$address = new \Ups\Entity\Address();
$address->setPostalCode('99205');
$shipFrom = new \Ups\Entity\ShipFrom();
$shipFrom->setAddress($address);
$shipment->setShipFrom($shipFrom);
$shipTo = $shipment->getShipTo();
$shipTo->setCompanyName('Test Ship To');
$shipToAddress = $shipTo->getAddress();
$shipToAddress->setPostalCode('99205');
$package = new \Ups\Entity\Package();
$package->getPackagingType()->setCode(\Ups\Entity\PackagingType::PT_PACKAGE);
$package->getPackageWeight()->setWeight(10);
$dimensions = new \Ups\Entity\Dimensions();
$dimensions->setHeight(10);
$dimensions->setWidth(10);
$dimensions->setLength(10);
$unit = new \Ups\Entity\UnitOfMeasurement;
$unit->setCode(\Ups\Entity\UnitOfMeasurement::UOM_IN);
$dimensions->setUnitOfMeasurement($unit);
$package->setDimensions($dimensions);
$shipment->addPackage($package);
var_dump($rate->getRate($shipment));
} catch (Exception $e) {
var_dump($e);
}
rateRequest
Mandatory. rateRequest Object with shipment details
This Rate class is not finished yet! Parameter should be added when it will be finished.
The TimeInTransit Class allow you to get all transit times using the UPS TimeInTransit API.
$timeInTransit = new Ups\TimeInTransit($access, $userid, $passwd);
try {
$request = new \Ups\Entity\TimeInTransitRequest;
// Addresses
$from = new \Ups\Entity\AddressArtifactFormat;
$from->setPoliticalDivision3('Amsterdam');
$from->setPostcodePrimaryLow('1000AA');
$from->setCountryCode('NL');
$request->setTransitFrom($from);
$to = new \Ups\Entity\AddressArtifactFormat;
$to->setPoliticalDivision3('Amsterdam');
$to->setPostcodePrimaryLow('1000AA');
$to->setCountryCode('NL');
$request->setTransitTo($to);
// Weight
$shipmentWeight = new \Ups\Entity\ShipmentWeight;
$shipmentWeight->setWeight($totalWeight);
$unit = new \Ups\Entity\UnitOfMeasurement;
$unit->setCode(\Ups\Entity\UnitOfMeasurement::UOM_KGS);
$shipmentWeight->setUnitOfMeasurement($unit);
$request->setShipmentWeight($shipmentWeight);
// Packages
$request->setTotalPackagesInShipment(2);
// InvoiceLines
$invoiceLineTotal = new \Ups\Entity\InvoiceLineTotal;
$invoiceLineTotal->setMonetaryValue(100.00);
$invoiceLineTotal->setCurrencyCode('EUR');
$request->setInvoiceLineTotal($invoiceLineTotal);
// Pickup date
$request->setPickupDate(new DateTime);
// Get data
$times = $timeInTransit->getTimeInTransit($request);
foreach($times->ServiceSummary as $serviceSummary) {
var_dump($serviceSummary);
}
} catch (Exception $e) {
var_dump($e);
}
timeInTransitRequest
Mandatory. timeInTransitRequest Object with shipment details, see example above.
The Locator class allows you to search for UPS Access Point locations.
$locatorRequest = new \Ups\Entity\LocatorRequest;
$originAddress = new \Ups\Entity\OriginAddress;
$address = new \Ups\Entity\AddressKeyFormat;
$address->setCountryCode('NL');
$originAddress->setAddressKeyFormat($address);
$geocode = new \Ups\Entity\GeoCode;
$geocode->setLatitude(52.0000);
$geocode->setLongitude(4.0000);
$originAddress->setGeoCode($geocode);
$locatorRequest->setOriginAddress($originAddress);
$translate = new \Ups\Entity\Translate;
$translate->setLanguageCode('ENG');
$locatorRequest->setTranslate($translate);
$acccessPointSearch = new \Ups\Entity\AccessPointSearch;
$acccessPointSearch->setAccessPointStatus(\Ups\Entity\AccessPointSearch::STATUS_ACTIVE_AVAILABLE);
$locationSearch = new \Ups\Entity\LocationSearchCriteria;
$locationSearch->setAccessPointSearch($acccessPointSearch);
$locationSearch->setMaximumListSize(25);
$locatorRequest->setLocationSearchCriteria($locationSearch);
$unitOfMeasurement = new \Ups\Entity\UnitOfMeasurement;
$unitOfMeasurement->setCode(\Ups\Entity\UnitOfMeasurement::UOM_KM);
$unitOfMeasurement->setDescription('Kilometers');
$locatorRequest->setUnitOfMeasurement($unitOfMeasurement);
try {
// Get the locations
$locator = new Ups\Locator($accessKey, $userId, $password);
$locations = $locator->getLocations($locatorRequest, \Ups\Locator::OPTION_UPS_ACCESS_POINT_LOCATIONS);
foreach($locations->SearchResults->DropLocation as $location) {
// Your code here
var_dump($location);
}
} catch (Exception $e) {
var_dump($e);
}
Locator class parameters are:
locatorRequest
Mandatory. locatorRequest object with request details, see examplerequestOption
Optional. Type of locations you are searching for.
The Tradeability class allows you to get data for international shipments:
- Landed Costs (e.g. duties)
- Denied Party Screener
- Import Compliance
- Export License Detection
Note: only the Landed Costs API is currently implemented.
WARNING: Tradeability is only available through a SOAP API. Therefore you are required to have the SOAP extension installed on your system.
// Build request
$landedCostRequest = new \Ups\Entity\Tradeability\LandedCostRequest;
// Build shipment
$shipment = new \Ups\Entity\Tradeability\Shipment;
$shipment->setOriginCountryCode('NL');
$shipment->setDestinationCountryCode('US');
$shipment->setDestinationStateProvinceCode('TX');
$shipment->setResultCurrencyCode('EUR');
$shipment->setTariffCodeAlert(1);
$shipment->setTransportationMode(\Ups\Entity\Tradeability\Shipment::TRANSPORT_MODE_AIR);
$shipment->setTransactionReferenceId('1');
// Build product
$product = new \Ups\Entity\Tradeability\Product;
$product->setProductName('Test');
$tariffInfo = new \Ups\Entity\Tradeability\TariffInfo;
$tariffInfo->setTariffCode('5109.90.80.00');
$product->setTariffInfo($tariffInfo);
$product->setProductCountryCodeOfOrigin('BD');
$unitPrice = new \Ups\Entity\Tradeability\UnitPrice;
$unitPrice->setMonetaryValue(250);
$unitPrice->setCurrencyCode('EUR');
$product->setUnitPrice($unitPrice);
$weight = new Ups\Entity\Tradeability\Weight;
$weight->setValue(0.83);
$unitOfMeasurement = new \Ups\Entity\Tradeability\UnitOfMeasurement;
$unitOfMeasurement->setCode('kg');
$weight->setUnitOfMeasurement($unitOfMeasurement);
$product->setWeight($weight);
$quantity = new \Ups\Entity\Tradeability\Quantity;
$quantity->setValue(5);
$unitOfMeasurement = new \Ups\Entity\Tradeability\UnitOfMeasurement;
$unitOfMeasurement->setCode(\Ups\Entity\Tradeability\UnitOfMeasurement::PROD_PIECES);
$quantity->setUnitOfMeasurement($unitOfMeasurement);
$product->setQuantity($quantity);
$product->setTariffCodeAlert(1);
// Add product to shipment
$shipment->addProduct($product);
// Query request
$queryRequest = new \Ups\Entity\Tradeability\QueryRequest;
$queryRequest->setShipment($shipment);
$queryRequest->setSuppressQuestionIndicator(true);
// Build
$landedCostRequest->setQueryRequest($queryRequest);
try {
// Get the data
$api = new Ups\Tradeability($accessKey, $userId, $password);
$result = $api->getLandedCosts($landedCostRequest);
var_dump($result);
} catch (Exception $e) {
var_dump($e);
}
For the Landed Cost call, parameters are:
landedCostRequest
Mandatory. landedCostRequest object with request details, see example.
Documentation for this class is coming.
All constructors take a PSR-3 compatible logger.
Besides that, the main UPS class has a public method setLogger
to set it after the constructor ran.
Requests & responses (including XML, no access keys) are logged at DEBUG level. At INFO level only the event is reported, not the XML content. More severe problems (e.g. no connection) are logged with higher severity.
Example using Monolog
// Create logger
$log = new \Monolog\Logger('ups');
$log->pushHandler(new \Monolog\Handler\StreamHandler('logs/ups.log', \Monolog\Logger::DEBUG));
// Create Rate object + insert logger
$rate = new Ups\Rate($key, $username, $password, $useIntegration, $log);
PHP UPS API is licensed under The MIT License (MIT).