Powiązanie koszyka
Artykuł zawiera opis metody wykorzystywanej do powiązania koszyka wraz z przykładem implementacji metody w języku PHP.
Na tej stronie:
Opis metody
Metoda służąca do inicjalizacji procesu wiązania koszyka z wykorzystaniem jednej z dwóch metod: qrCode lub numer telefonu oraz przekazująca informacje o przeglądarce w celu dodanie przeglądarki do zaufanych.
W danej metodzie wymagamy implementacji wszystkich pól wymienionych w tabeli, ponieważ składają się na całość usługi InPost Pay. Część poniższych pól w kolumnie 'Wymagalność' jest oznaczona jako 'O' tj. opcjonalna ze względu na to, że nie wszystkie produkty/koszyki w sklepach internetowych mają przypisane wszystkie parametry, więc koszyk może zostać utworzony, a zamówienie złożone bez nich. Jednak implementacja/wdrożenie wszystkich pól jest biznesowo WYMAGANE.
Parameters
Nazwa pola | Opis | Typ | Wymagalność | Dodatkowe uwagi |
| Unikalny identyfikator koszyka nadawany przez merchanta | string | Y |
|
Request
Nazwa pola | Opis | Typ | Wymagalność | Dodatkowe uwagi |
| Wybrana forma wiązania koszyka dostępne dwie metody [ PHONE, DEEP_LINK ]. PHONE – przekazujemy, jeśli widget w metodzie iziGetPayData przekazał parametry prefix- prefiks numeru telefonu; phoneNumber- numer telefonu DEEP_LINK – przekazujemy, jeśli widget w metodzie iziGetPayData nie przekazał prefix i phoneNumber w iziGetPayData | string | O |
|
| Miejsce wiązania koszyka w sklepie merchanta (miejsce osadzenia widget). Dostępne miejsca: PRODUCT_CARD, BASKET_SUMMARY, ORDER_CREATE, BASKET_POPUP, THANK_YOU_PAGE, LOGIN_PAGE, CHECKOUT_PAGE, REGISTERFORM_PAGE, MINICART_PAGE. Przekazujemy wartość otrzymaną z widget z pola bindingPlace w iziGetPayData. PRODUCT_CARD - karta produktu BASKET_SUMMARY - podsumowanie koszyka ORDER_CREATE - etap tworzenia zamówienia BASKET_POPUP - panel boczny koszyka THANK_YOU_PAGE* - nie jest to miejsce bindowania, ale osadzenia widgetu, który powinien przyjąć dedykowaną formę Thank You Page po złożeniu zamówienia LOGIN_PAGE – strona logowania CHECKOUT_PAGE – stona checkout REGISTERFORM_PAGE – strona rejestracji MINICART_PAGE - minikarta. | string | O |
|
| Obiekt służący do przekazania numeru telefonu, z którym ma być powiązany koszyk. Obiekt obligatoryjny tylko jeśli binding_method= PHONE. Dane pobierane z metody iziGetPayData | object | O |
|
| Prefix. Pobierane z prefix iziGetPayData i przekazywane w formacie z symbolem “+”. | string | Y | |
| Numer telefonu pobierany z phoneNumber iziGetPayData | string | Y | |
| Obiekt służący do przekazania informacji o przeglądarce, z której klient aktualnie korzysta i wykonuje wiązanie koszyka w celu dodania przeglądarki do zaufanych. | object | Y |
|
| User agent | string | Y | |
| Nazwa przeglądarki | string | O | |
| Platforma | string | Y | |
| Architektura | string | Y | |
| Data | string($date-time) | Y | |
| Lokalizacja | string | Y | |
| IP klienta | string | Y | |
| Port | string | Y |
Response
202 – pusty response w przypadku, gdy wiązanie następuje z wykorzystaniem numeru telefonu (binding_method= PHONE)
200
Response
Nazwa pola | Opis | Typ | Wymagalność | Dodatkowe uwagi |
| Wygenerowany qrCode | string | O |
|
| Deep link na systemy Android/iOs | String | O |
|
| Deep link na system HMS – obecnie nie wykorzystywany | String | O |
|
POST /v1/izi/basket/{basket_id}/binding
Przykładowy request
{
"binding_method": "PHONE",
"binding_place": "PRODUCT_CARD",
"phone_number": {
"country_prefix": "+48",
"phone": "5xxxxxxxx"
},
"browser": {
"user_agent": "Testzilla 1.0",
"description": "Test agent",
"platform": "Ino Linux 2.0",
"architecture": "x86-646",
"data_time": "2023-08-24T08:52:01.113Z",
"location": "-",
"customer_ip": "127.0.0.1",
"port": "8080"
}
}
Przykład implementacji w PHP
Podanie kodu -
W pliku implementacjaKlienta.txt została dodana tylko funkcja postBasketBinding.
/**
* Client symfony implementation used for communication between Merchant and InPost Pay application.
*
* @param InpostPayBearerServiceInterface $inpostPayBearerService <p> Bearer service interface,
* with contains creating bearer token which is required for communication with Inpost Pay </p>
*
*/
final class InpostPayClient implements InpostPayClientInterface
{
private ClientInterface $client;
private InpostPayURLCreatorInterface $URLCreator;
private InpostPayBearerServiceInterface $bearerService;
public function __construct(
ClientInterface $client,
InpostPayURLCreatorInterface $URLCreator,
InpostPayBearerServiceInterface $bearerService
) {
$this->client = $client;
$this->URLCreator = $URLCreator;
$this->bearerService = $bearerService;
}
public function postBasketBinding(string $basketId, BasketBindingRequest $requestBody): ?QrCodeData
{
if (BindingMethod::PHONE()->equals($requestBody->getBindingMethod()) && !$requestBody->getPhoneNumber()) {
throw InpostPayPostBasketBindingException::createNoPhoneForPhoneBindingMethodException();
}
$path = sprintf('basket/%s/binding', $basketId);
$uri = new Uri($this->buildUri($path));
/** @var string $body */
$body = json_encode($requestBody);
$request = new Request(
'POST',
$uri,
$this->provideDefaultClientHeaders(),
$body
);
try {
$response = $this->client->sendRequest($request);
$statusCode = $response->getStatusCode();
$content = $response->getBody()->getContents();
if (HttpResponseStatus::ACCEPTED()->getValue() === $statusCode) {
return null;
}
if (HttpResponseStatus::OK()->getValue() === $statusCode) {
/**
* @var QrCodeDataArray $data
*/
$data = json_decode($content, true, 512, JSON_THROW_ON_ERROR);
return QrCodeData::fromArray($data);
}
} catch (\Throwable $throwable) {
throw InpostPayPostBasketBindingException::createResponseException($throwable);
}
throw InpostPayPostBasketBindingException::createBadStatusCodeException($statusCode, $content);
}
public function putBasket(string $basketId, Basket $basket): InpostBasketId
{
$path = sprintf('basket/%s', $basketId);
$uri = new Uri($this->buildUri($path));
/** @var string $body */
$body = json_encode($basket);
$request = new Request(
'PUT',
$uri,
$this->provideDefaultClientHeaders(),
$body
);
try {
$response = $this->client->sendRequest($request);
$content = $response->getBody()->getContents();
/**
* @var array{inpost_basket_id: string} $responseData
*/
$responseData = json_decode($content, true, 512, JSON_THROW_ON_ERROR);
return InpostBasketId::fromArray($responseData);
} catch (\Throwable $throwable) {
throw InpostPayPutBasketException::createResponseException($throwable);
}
}
public function deleteBasketBinding(string $basketId, bool $ifBasketRealized = null): void
{
$path = sprintf('basket/%s/binding', $basketId);
$uri = (new Uri($this->buildUri($path)))
->withQuery(Psr7\Query::build(['if_basket_realized' => $ifBasketRealized]));
$request = new Request(
'DELETE',
$uri,
$this->provideDefaultClientHeaders()
);
try {
$response = $this->client->sendRequest($request);
$statusCode = $response->getStatusCode();
$content = $response->getBody()->getContents();
} catch (\Throwable $throwable) {
throw InpostPayDeleteBasketBindingException::createResponseException($throwable);
}
if (HttpResponseStatus::NO_CONTENT()->getValue() === $statusCode) {
return;
}
throw InpostPayDeleteBasketBindingException::createBadStatusCodeException($statusCode, $content);
}
public function deleteBrowserBinding(string $browserId): void
{
$path = sprintf('browser/%s/binding', $browserId);
$uri = new Uri($this->buildUri($path));
$request = new Request(
'DELETE',
$uri,
$this->provideDefaultClientHeaders()
);
try {
$response = $this->client->sendRequest($request);
$statusCode = $response->getStatusCode();
$content = $response->getBody()->getContents();
} catch (\Throwable $throwable) {
throw InpostPayDeleteBrowserBindingException::createResponseException($throwable);
}
if (HttpResponseStatus::NO_CONTENT()->getValue() === $statusCode) {
return;
}
throw InpostPayDeleteBrowserBindingException::createBadStatusCodeException($statusCode, $content);
}
public function getSigningKey(string $version): SigningKeyResponse
{
$path = sprintf('signing-keys/public/%s', $version);
$uri = new Uri($this->buildUri($path));
$request = new Request(
'GET',
$uri,
$this->provideDefaultClientHeaders()
);
try {
$response = $this->client->sendRequest($request);
$statusCode = $response->getStatusCode();
$content = $response->getBody()->getContents();
if (HttpResponseStatus::OK()->getValue() === $statusCode) {
/**
* @var SigningKeyResponseArray $data
*/
$data = json_decode($content, true, 512, JSON_THROW_ON_ERROR);
return SigningKeyResponse::fromArray($data);
}
} catch (\Throwable $throwable) {
throw InpostPayGetSigningKeyException::createResponseException($throwable);
}
throw InpostPayGetSigningKeyException::createBadStatusCodeException($statusCode, $content);
}
public function getSigningKeys(): SigningKeysResponse
{
$path = 'signing-keys/public';
$uri = new Uri($this->buildUri($path));
$request = new Request(
'GET',
$uri,
$this->provideDefaultClientHeaders()
);
try {
$response = $this->client->sendRequest($request);
$statusCode = $response->getStatusCode();
$content = $response->getBody()->getContents();
if (HttpResponseStatus::OK()->getValue() === $statusCode) {
/**
* @var SigningKeysResponseArray $data
*/
$data = json_decode($content, true, 512, JSON_THROW_ON_ERROR);
return SigningKeysResponse::fromArray($data);
}
} catch (\Throwable $throwable) {
throw InpostPayGetSigningKeysException::createResponseException($throwable);
}
throw InpostPayGetSigningKeysException::createBadStatusCodeException($statusCode, $content);
}
/**
* @return array{
* Authorization: string,
* Content-Type: string
* }
*
* @throws InpostPayEndpointException
*/
private function provideDefaultClientHeaders(): array
{
return [
'Authorization' => sprintf('Bearer %s', $this->bearerService->getBearerToken()),
'Content-Type' => 'application/json',
];
}
private function buildUri(string $path): string
{
return sprintf(
'%s%s',
$this->URLCreator->create()->getUrl(),
$path
);
}
}
W SDK.zip zawiera się kod zawierający obiekt requestu oraz response endpointu.