1. Go to this page and download the library: Download starmile/partner-sdk library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
starmile / partner-sdk example snippets
use Starmile\PartnerSdk\Client;
$starmile = Client::create(
getenv('STARMILE_CLIENT_ID'),
getenv('STARMILE_CLIENT_SECRET')
);
$services = $starmile->catalogue()->services(); // valid service_id values to order against
$rates = $starmile->catalogue()->rates(); // the rates bound to your partner
use Starmile\PartnerSdk\Builder\OrderBuilder;
use Starmile\PartnerSdk\Builder\ParcelBuilder;
use Starmile\PartnerSdk\Builder\ProductBuilder;
$order = OrderBuilder::make($serviceId, 'ORD-1001') // service_id + your order_id
->recipient('Jane Doe', '+994500000000', '[email protected]', '5AB12C3') // 4th arg = gov_id (AZ FIN / passport)
->deliverToPudo(42) // or ->deliverHome('1', '2') / ->deliverToLocker($lockerId)
->shippingCost(9.90)
->addParcel(
ParcelBuilder::make('ITEM-1') // your per-item reference (echoed back as partner_tracking)
->merchantTracking('BARCODE-1') // the physical sticker code (merchant_tracking)
->weightGrams(1200)
->addProduct(
ProductBuilder::make('Running shoes')
->hsCode('640299')
->declaredValue(59.99, 'USD')
->quantity(1)
)
);
$created = $starmile->orders()->create($order);
echo $created['order_id']; // STM… (our order id)
echo $created['region_status']; // mapped | pending_mapping | not_applicable
echo $created['items'][0]['parcel_id']; // STM… (our parcel id for your item_id)
var_dump($created['duplicate']); // false — true when the order_id was already used
// Update a shipment that has not been received yet (partial; `products` replaces the list).
$starmile->orders()->updateParcel('ORD-1001', 'ITEM-1', [
'weight_grams' => 1500,
'merchant_tracking' => 'BARCODE-1B',
]);
// Cancel a single parcel while it is still pre-custody (409 once received).
// When it was the order's last active parcel, the order is cancelled too.
$starmile->orders()->cancelParcel('ORD-1001', 'ITEM-1', 'item out of stock');
// Cancel an order while it is still pre-custody (409 once in custody).
$starmile->orders()->cancel('ORD-1001', 'customer changed mind');
// By merchant_tracking (sticker code).
file_put_contents('label.pdf', $starmile->orders()->label('BARCODE-1'));
// By parcel_id (our parcel id, from items[].parcel_id on create).
$pdf = $starmile->orders()->labelByParcelId('STM0000000121');
// A whole ORDER's own label (order barcode/weight/contents) by the order's tracking number.
file_put_contents('order-label.pdf', $starmile->orders()->labelByOrderId('STM0000000120'));
// One page at a time:
$page = $starmile->statusPool()->changes($since = 0, $limit = 100);
foreach ($page->changes() as $change) {
// $change['cursor'], ['tracking_number'], ['external_parent_id'], ['external_id'], ['country'], ['status'], ['previous_status'], ['reason'], ['reason_detail'], ['occurred_at'], ['timezone']
}
$next = $page->nextCursor();
$more = $page->hasMore();
// Or drain everything, auto-paging:
foreach ($starmile->statusPool()->each($since = 0) as $change) {
$since = $change['cursor']; // persist this
}
// Just one order's (or parcel's) history — pass a tracking number to narrow the
// feed server-side, then page from 0 until it is exhausted:
foreach ($starmile->statusPool()->each($since = 0, $limit = 100, 'STM000123') as $change) {
// only changes for tracking number STM000123
}
// Or track by YOUR OWN reference — pass the external_parent_id you sent on create,
// so you never have to hold our tracking number:
foreach ($starmile->statusPool()->each($since = 0, $limit = 100, null, 'PO-1001') as $change) {
// only changes for your order PO-1001
}
use Starmile\PartnerSdk\Enum\Reason;
foreach ($starmile->statusPool()->each($since = 0) as $change) {
switch ($change['reason']) { // often null — most changes have no why
case Reason::CUSTOMER_ABSENT:
$this->offerRedelivery($change['external_parent_id']);
break;
case Reason::MISSING_DECLARATION:
$this->askShopperForInvoice($change['external_parent_id']);
break;
case null:
break; // nothing to explain — just a milestone
default:
// A code this SDK version predates. Codes are only ever ADDED, never
// renamed, so treat an unknown one as "some other reason" and fall
// back to the text rather than failing.
$this->flagForReview($change['reason'], $change['reason_detail']);
}
}
EventType::all(); // every recognised type
EventType::scopeFor(EventType::CUSTOMS_HELD); // 'events:customs'
EventType::dataFieldsFor(EventType::SHIPMENT_DELIVERED); // ['note','recipient_name','signed_by','proof_of_delivery']
use Starmile\PartnerSdk\Exception\ValidationException;
use Starmile\PartnerSdk\Exception\RateLimitException;
use Starmile\PartnerSdk\Exception\StarmileException;
try {
$starmile->orders()->create($order);
} catch (ValidationException $e) {
$e->errors(); // ['service_id' => ['The service id field is
// Retry this create up to 3 times (writes ($order);
// Custom decision — also retry a specific conflict:
use Starmile\PartnerSdk\Exception\RateLimitException;
$starmile
->retry(4, 200, fn ($e) => $e instanceof RateLimitException || $e->getStatusCode() === 409)
->events()->report($event);
catch (\Starmile\PartnerSdk\Exception\ApiException $e) {
$e->getResponseBody(); // [] when the body wasn't JSON
$e->getRawBody(); // the original "<html>...502 Bad Gateway..." string
}
use Starmile\PartnerSdk\Client;
use Starmile\PartnerSdk\Http\HttpClientInterface;
use Starmile\PartnerSdk\Http\RawResponse;
final class GuzzleTransport implements HttpClientInterface
{
public function send($method, $url, array $headers = [], $body = null)
{
// ... call Guzzle, then:
return new RawResponse($statusCode, $responseHeaders, $responseBody);
}
}
$starmile = Client::create($id, $secret, ['http_client' => new GuzzleTransport()]);
Loading please wait ...
Before you can download the PHP files, the dependencies should be resolved. This can take some minutes. Please be patient.