EasyWebshop API
Interfejs Programowania Aplikacji (API) łączy Twój sklep internetowy z zewnętrznymi platformami, takimi jak dostawcy płatności, usługi dostawcze i aplikacje biurowe. Włożyliśmy ogromny wysiłek, aby API było łatwe w użyciu, nawet dla osób nietechnicznych. W niektórych przypadkach pozwoli to naszym użytkownikom na samodzielne połączenie swojego sklepu internetowego, zamiast polegania na drogim programiście.
Dzięki zgodności z ogólnymi praktykami i standardami branżowymi, połączenia z naszym API można tworzyć szybko, możliwie z pomocą kodu generowanego przez AI. Przeczytaj uważnie tę stronę, jeśli chcesz samodzielnie utworzyć połączenie.
Przegląd funkcji
- Połączenie z dostawcami usług płatniczych
- Połączenie z usługami dostawy
- Połączenie z oprogramowaniem POS, lokalnym i chmurowym
- Import produktów od dostawców lub hurtowników
- Eksport produktów do serwisów porównawczych
- Połączenie z oprogramowaniem do fakturowania
- Połączenie z oprogramowaniem CRM
- Połączenie z oprogramowaniem do zarządzania logistyką
- Aktualizacja stanu magazynowego w czasie rzeczywistym
- Akceptacja lub odrzucanie klientów na podstawie określonych kryteriów
- Eksport zamówień w czasie rzeczywistym dla dropshippingu
- Eksport klientów dla aplikacji newsletterowych
- Eksport danych do raportów i analiz
- Tworzenie połączeń instalujących widżety HTML/JavaScript/CSS za pomocą jednego kliknięcia
- Tworzenie niestandardowych raportów dotyczących zapasów, zamówień, klientów i sprzedaży
API, API Push i Połączenia
API | API Push | Znajomości |
---|---|---|
Do importowania i eksportowania kategorii, produktów, zamówień i klientów. | Do synchronizacji stanu magazynowego lub akceptacji klientów w czasie rzeczywistym. | Do łączenia dostawców płatności, usług dostawy, serwisów porównawczych, punktów sprzedaży, aplikacji do fakturowania i instalowania widżetów. |
Uwierzytelnianie za pomocą tokena Bearer. | Wprowadź adres URL Push w module API. | Uwierzytelnianie za pomocą tokena Bearer (połączenie) i instalacja połączenia (użytkownik). |
Dostosowane do jednego użytkownika. | Dostosowane do jednego użytkownika. | Może być instalowane przez wszystkich użytkowników. |
API
Aktywuj EasyWebshop API w Ustawienia > Moduły > Easywebshop API używając kodu aktywacyjnego MODA.
Jeśli EasyWebshop API nie jest widoczne w menu, przejdź do Ustawienia > Więcej opcji > Poziom doświadczenia użytkownika i zmień poziom doświadczenia użytkownika na Ekspert.
Aktywuj API tylko wtedy, gdy zamierzasz go używać. Ze względów bezpieczeństwa dezaktywuj API, gdy nie jest używane.
- Punkt końcowy APIKopiuj
- https://easywebshop.com/apiZawsze używaj wersji https! Uwierzytelnianie przez zwykły tekst http może spowodować wyciek Twojego tokena API.
Nie dołączaj subdomeny www. - ?format=xml
- Zmień format wyjściowy z JSON na XML.
- ?pretty=1
- Ładne formatowanie wyjścia dla lepszej czytelności przez człowieka. Usuń to, aby zaoszczędzić przepustowość w systemach zautomatyzowanych.
Podczas używania wielu parametrów, oddzielaj je znakiem & (ampersand). Na przykład: ?format=xml&pretty=1.
W wierszu poleceń, znak ampersand należy poprzedzić znakiem ucieczki w następujący sposób: ?format=xml\&pretty=1.
Korzystaj z naszego API z rozwagą i tylko zapytuj lub aktualizuj to, czego potrzebujesz. Nie używaj odpytywania, jeśli można zamiast tego użyć funkcji API Push. Limity są nałożone, aby zapobiec marnowaniu zasobów serwera.
Uwierzytelnianie
Kliknij przycisk Dodaj, aby utworzyć Token API i wybierz odpowiednie uprawnienia dla tego tokena.
Dla zwiększenia bezpieczeństwa wybieraj tylko uprawnienia, które są absolutnie niezbędne. Odwołuj uprawnienia, gdy nie są już potrzebne.
Po zapisaniu, skopiuj swój Token API do wykorzystania w aplikacji lub do przesłania deweloperowi. Możesz to zrobić tylko raz: jeśli zgubisz swój Token API, będziesz musiał go usunąć i utworzyć nowy.
Używaj swojego Tokenu API z ostrożnością.
Nie przesyłaj swojego Tokenu API przez niezabezpieczony kanał komunikacji, taki jak e-mail czy WhatsApp. Zalecamy korzystanie z SimpleX Chat, jeśli musisz przesłać swój Token API programiście. Nie przechowuj swojego Tokenu API na niezabezpieczonym urządzeniu. My nie przechowujemy Twojego Tokenu API w ogóle, tylko jego hash.
- Żądanie
- Odpowiedź
- curl
- PHP
GET /api/status HTTP/2
Host: easywebshop.com
Authorization: Bearer YOUR_API_TOKEN
Content-Type: application/json
HTTP/2 200
Server: nginx
Date: Wed, 12 Mar 2025 12:00:00 GMT
Content-Type: text/plain;charset=UTF-8
{
"status": "success",
"message": "API online"
}
Pobiera status API
curl -D - https://easywebshop.com/api/status
Zapisuje odpowiedź w pliku JSON
curl https://easywebshop.com/api/status -o status.json
-D, --dump-header
-o, --output <file>
curl man page:
https://curl.se/docs/manpage.html
<?php
header("Content-Type: text/plain");
// API endpoint
const API_URL = 'https://easywebshop.com/api/status';
// Your Bearer token
const API_TOKEN = 'YOUR_API_TOKEN';
// True: show request and response headers
const DEBUG = true;
// Initialize cURL session
$ch = curl_init(API_URL);
// Set cURL options
// Return the response as a string
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Authorization: Bearer ' . API_TOKEN,
'Content-Type: application/json'
]);
// Optional: If you are sending data (e.g., for a POST request)
// Uncomment the following lines to send a JSON payload
/*
$data = [
'key1' => 'value1',
'key2' => 'value2'
];
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
*/
// Activate request and response details (for showing later)
if (DEBUG) {
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLINFO_HEADER_OUT, true);
}
// Execute the cURL request
$response = curl_exec($ch);
// Show the request details
if (DEBUG) {
echo curl_getinfo($ch, CURLINFO_HEADER_OUT);
}
// Check for errors
if (curl_errno($ch)) {
echo 'cURL error: ' . curl_error($ch);
// Print the response
} else {
// Print request and response header
if (DEBUG) {
$header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
$header = substr($response, 0, $header_size);
$response = substr($response, $header_size);
echo $header;
}
// Print response
echo $response;
}
// Close the cURL session
curl_close($ch);
?>
W tej dokumentacji przedstawiamy przykłady dla curl i PHP. Nowoczesna sztuczna inteligencja jest coraz lepsza w konwertowaniu kodu na inne języki programowania, takie jak C, Java czy Python.
Kategorie
Wyświetlanie kategorii
- GET /api/category
- Pobiera wszystkie kategorie
- GET /api/category/[categoryName]
- Pobiera wszystkie produkty w określonej kategorii
Użycie nazwy kategorii w domyślnym języku sklepu internetowego
GET /api/category HTTP/2
Host: easywebshop.com
Authorization: Bearer YOUR_API_TOKEN
Content-Type: application/json
HTTP/2 200
Server: nginx
Date: Wed, 12 Mar 2025 12:00:00 GMT
Content-Type: text/plain;charset=UTF-8
{
"categorylist": [
{
"category": {
"name:lang=en": "Cocktails",
"name:lang=fr": "Cocktails",
"name:lang=nl": "Cocktails",
"visible": "1",
"image": "https:\/\/ew.ms\/shops\/fashion\/category\/cocktails.jpg",
"url": "https:\/\/all4you.be\/cocktails",
"categorylist": [
{
"category": {
"name:lang=en": "Non-alcoholic",
"name:lang=fr": "Sans alcool",
"name:lang=nl": "Alcoholvrij",
"visible": "1",
"url": "https:\/\/all4you.be\/non-alcoholic"
}
}
]
}
}
]
}
Pobiera wszystkie kategorie
curl -H "Authorization: Bearer YOUR_API_TOKEN" -D - https://easywebshop.com/api/category
Pobiera wszystkie produkty w określonej kategorii
curl -H "Authorization: Bearer YOUR_API_TOKEN" -D - https://easywebshop.com/api/category/Cocktails
Pobiera wszystkie kategorie w formacie JSON czytelnym dla człowieka
curl -H "Authorization: Bearer YOUR_API_TOKEN" -D - https://easywebshop.com/api/category?pretty=1
Pobiera wszystkie kategorie w formacie XML czytelnym dla człowieka
curl -H "Authorization: Bearer YOUR_API_TOKEN" -D - https://easywebshop.com/api/category?format=xml\&pretty=1
<?php
header("Content-Type: text/plain");
// API endpoint
// You can add a category name behind the slash for searching products within that category
const API_URL = 'https://easywebshop.com/api/category/';
// Your Bearer token
const API_TOKEN = 'YOUR_API_TOKEN';
// True: show request and response headers
const DEBUG = true;
// Initialize cURL session
$ch = curl_init(API_URL);
// Set cURL options
// Return the response as a string
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Authorization: Bearer ' . API_TOKEN,
'Content-Type: application/json'
]);
// Optional: If you are sending data (e.g., for a POST request)
// Uncomment the following lines to send a JSON payload
/*
$data = [
'key1' => 'value1',
'key2' => 'value2'
];
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
*/
// Activate request and response details (for showing later)
if (DEBUG) {
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLINFO_HEADER_OUT, true);
}
// Execute the cURL request
$response = curl_exec($ch);
// Show the request details
if (DEBUG) {
echo curl_getinfo($ch, CURLINFO_HEADER_OUT);
}
// Check for errors
if (curl_errno($ch)) {
echo 'cURL error: ' . curl_error($ch);
// Print the response
} else {
// Print request and response header
if (DEBUG) {
$header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
$header = substr($response, 0, $header_size);
$response = substr($response, $header_size);
echo $header;
}
// Print response
echo $response;
// Print response in PHP array
if ($response_array = json_decode($response, true)) {
echo "\n\n" . print_r($response_array, true);
}
}
// Close the cURL session
curl_close($ch);
?>
{
"categorylist": [
{
"category": {
"name:lang=en": "Cocktails",
"name:lang=fr": "Cocktails",
"name:lang=nl": "Cocktails",
"visible": "1",
"image": "https:\/\/ew.ms\/shops\/fashion\/category\/cocktails.jpg",
"url": "https:\/\/all4you.be\/cocktails",
"categorylist": [
{
"category": {
"name:lang=en": "Non-alcoholic",
"name:lang=fr": "Sans alcool",
"name:lang=nl": "Alcoholvrij",
"visible": "1",
"url": "https:\/\/all4you.be\/non-alcoholic"
}
}
]
}
}
]
}
<?xml version="1.0" encoding="UTF-8" ?>
<categorylist>
<category>
<name lang="en">Cocktails</name>
<name lang="fr">Cocktails</name>
<name lang="nl">Cocktails</name>
<visible>1</visible>
<image>https://ew.ms/shops/fashion/category/cocktails.jpg</image>
<url>https://all4you.be/cocktails</url>
<categorylist>
<category>
<name lang="en">Non-alcoholic</name>
<name lang="fr">Sans alcool</name>
<name lang="nl">Alcoholvrij</name>
<visible>1</visible>
<url>https://all4you.be/non-alcoholic</url>
</category>
</categorylist>
</category>
</categorylist>
Kategorie można tylko przeglądać. Nie ma implementacji API do tworzenia, edytowania i usuwania kategorii, ponieważ funkcje te są rzadko używane i stworzyłyby dodatkową powierzchnię ataku. Zarządzanie kategoriami może odbywać się za pomocą interfejsu internetowego.
Produkty
Przeglądanie produktów
EasyWebshop stosuje format schema.org/Product zawsze, gdy jest to możliwe.
- GET /api/product
- Pobiera ostatnie 1000 produktów
- GET /api/product?offset=1000
- Pobiera ostatnie 1000 produktów, ale pomija pierwsze 1000 produktów
- GET /api/product/86400
- Pobiera produkty, które zostały dodane lub zmodyfikowane w ciągu ostatnich 24 godzin
- GET /api/product/[productID]
- Wyszukuje produkt według productID, z uwzględnieniem wielkości liter
GET /api/product HTTP/2
Host: easywebshop.com
Authorization: Bearer YOUR_API_TOKEN
Content-Type: application/json
HTTP/2 200
Server: nginx
Date: Wed, 12 Mar 2025 12:00:00 GMT
Content-Type: text/plain;charset=UTF-8
{
"productlist": [
{
"product": {
"productID": "LA-B03",
"category": "Ambiance",
"price": 49.99,
"stock": 0,
"weight": 5,
"status": "Available",
"vat_code": 0,
"old_price": "75",
"colors": "Blue,Red,Violet",
"promotion": 1
}
},
{
"product": {
"productID": "LA-C05",
"category": "Ambiance",
"name:lang=en": "Example paint",
"name:lang=nl": "Voorbeeld verf",
"description:lang=en": "Lorem ipsum dolor sit amet.",
"price": 79,
"stock": 1,
"status": "Available",
"weight": 5,
"vat_code": 0,
"condition": "New",
"gtin": "123456",
"old_price": "179",
"units": "test",
"mpq": 1,
"purchase_price": 50,
"promo": 1,
"label_id": 1,
"colors": "Blue,Red,Violet",
"params": "T,en,Name,,,\nS,en,Select size,[A|B|C],A,1",
"review": 1
}
},
{
"product": {
"productID": "LA-C05-A",
"parent_productID": "LA-C05",
"name:lang=en": "Variation A",
"price": "79",
"colors": "LightCoral"
}
},
{
"product": {
"productID": "LA-C05-B",
"parent_productID": "LA-C05",
"name:lang=en": "Variation B",
"price": "89"
}
}
]
}
Pobiera ostatnie 1000 produktów
curl -H "Authorization: Bearer YOUR_API_TOKEN" -D - https://easywebshop.com/api/product
Pobiera ostatnie 1000 produktów, ale pomija pierwsze 1000 produktów
curl -H "Authorization: Bearer YOUR_API_TOKEN" -D - https://easywebshop.com/api/product?offset=1000
Pobiera produkty, które zostały dodane lub zmodyfikowane w ciągu ostatnich 24 godzin
curl -H "Authorization: Bearer YOUR_API_TOKEN" -D - https://easywebshop.com/api/product/86400
Wyszukuje produkt według productID, z uwzględnieniem wielkości liter
curl -H "Authorization: Bearer YOUR_API_TOKEN" -D - https://easywebshop.com/api/product/LA-C05
<?php
header("Content-Type: text/plain");
// API endpoint
// You can add a product search behind the slash
const API_URL = 'https://easywebshop.com/api/product/';
// Your Bearer token
const API_TOKEN = 'YOUR_API_TOKEN';
// True: show request and response headers
const DEBUG = true;
// Initialize cURL session
$ch = curl_init(API_URL);
// Set cURL options
// Return the response as a string
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Authorization: Bearer ' . API_TOKEN,
'Content-Type: application/json'
]);
// Optional: If you are sending data (e.g., for a POST request)
// Uncomment the following lines to send a JSON payload
/*
$data = [
'key1' => 'value1',
'key2' => 'value2'
];
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
*/
// Activate request and response details (for showing later)
if (DEBUG) {
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLINFO_HEADER_OUT, true);
}
// Execute the cURL request
$response = curl_exec($ch);
// Show the request details
if (DEBUG) {
echo curl_getinfo($ch, CURLINFO_HEADER_OUT);
}
// Check for errors
if (curl_errno($ch)) {
echo 'cURL error: ' . curl_error($ch);
// Print the response
} else {
// Print request and response header
if (DEBUG) {
$header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
$header = substr($response, 0, $header_size);
$response = substr($response, $header_size);
echo $header;
}
// Print response
echo $response;
// Print response in PHP array
if ($categories = json_decode($response, true)) {
echo "\n\n" . print_r($categories, true);
}
}
// Close the cURL session
curl_close($ch);
?>
{
"productlist": [
{
"product": {
"productID": "LA-B03",
"category": "Ambiance",
"price": 49.99,
"stock": 0,
"weight": 5,
"status": "Available",
"vat_code": 0,
"old_price": "75",
"colors": "Blue,Red,Violet",
"promotion": 1
}
},
{
"product": {
"productID": "LA-C05",
"category": "Ambiance",
"name:lang=en": "Example paint",
"name:lang=nl": "Voorbeeld verf",
"description:lang=en": "Lorem ipsum dolor sit amet.",
"price": 79,
"stock": 1,
"status": "Available",
"weight": 5,
"vat_code": 0,
"condition": "New",
"gtin": "123456",
"old_price": "179",
"units": "test",
"mpq": 1,
"purchase_price": 50,
"promo": 1,
"label_id": 1,
"colors": "Blue,Red,Violet",
"params": "T,en,Name,,,\nS,en,Select size,[A|B|C],A,1",
"review": 1
}
},
{
"product": {
"productID": "LA-C05-A",
"parent_productID": "LA-C05",
"name:lang=en": "Variation A",
"price": "79",
"colors": "LightCoral"
}
},
{
"product": {
"productID": "LA-C05-B",
"parent_productID": "LA-C05",
"name:lang=en": "Variation B",
"price": "89"
}
}
]
}
<?xml version="1.0" encoding="UTF-8" ?>
<productlist>
<product>
<productID>LA-B03</productID>
<category>Ambiance</category>
<price>49.99</price>
<stock>0</stock>
<weight>5</weight>
<status>Available</status>
<vat_code>0</vat_code>
<old_price>75</old_price>
<colors>Blue,Red,Violet</colors>
<promotion>1</promotion>
</product>
<product>
<productID>LA-C05</productID>
<category>Ambiance</category>
<name lang="en">Example paint</name>
<name lang="nl">Voorbeeld verf</name>
<description lang="en">Lorem ipsum dolor sit amet.</description>
<price>79</price>
<stock>1</stock>
<status>Available</status>
<weight>5</weight>
<vat_code>0</vat_code>
<condition>New</condition>
<gtin>123456</gtin>
<old_price>179</old_price>
<units>test</units>
<mpq>1</mpq>
<purchase_price>50</purchase_price>
<promo>1</promo>
<label_id>1</label_id>
<colors>Blue,Red,Violet</colors>
<params>T,en,Name,,,
S,en,Select size,[A|B|C],A,1</params>
<review>1</review>
</product>
<product>
<productID>LA-C05-A</productID>
<parent_productID>LA-C05</parent_productID>
<name lang="en">Variation A</name>
<price>79</price>
<colors>LightCoral</colors>
</product>
<product>
<productID>LA-C05-B</productID>
<parent_productID>LA-C05</parent_productID>
<name lang="en">Variation B</name>
<price>89</price>
</product>
</productlist>
Importowanie produktów
- POST /api/product
- W przypadku powodzenia zostanie zwrócone 201 Created
POST /api/product HTTP/2
Host: easywebshop.com
Authorization: Bearer YOUR_API_TOKEN
Content-Type: application/json
{
"productlist": [
{
"product": {
"productID": "LA-B03",
"category": "Ambiance",
"price": 49.99,
"stock": 0,
"weight": 5,
"status": "Available",
"vat_code": 0,
"old_price": "75",
"colors": "Blue,Red,Violet",
"promotion": 1
}
},
{
"product": {
"productID": "LA-C05",
"category": "Ambiance",
"name:lang=en": "Example paint",
"name:lang=nl": "Voorbeeld verf",
"description:lang=en": "Lorem ipsum dolor sit amet.",
"price": 79,
"stock": 1,
"status": "Available",
"weight": 5,
"vat_code": 0,
"condition": "New",
"gtin": "123456",
"old_price": "179",
"units": "test",
"mpq": 1,
"purchase_price": 50,
"promo": 1,
"label_id": 1,
"colors": "Blue,Red,Violet",
"params": "T,en,Name,,,\nS,en,Select size,[A|B|C],A,1",
"review": 1
}
},
{
"product": {
"productID": "LA-C05-A",
"parent_productID": "LA-C05",
"name:lang=en": "Variation A",
"price": "79",
"colors": "LightCoral"
}
},
{
"product": {
"productID": "LA-C05-B",
"parent_productID": "LA-C05",
"name:lang=en": "Variation B",
"price": "89"
}
}
]
}
HTTP/2 201
Server: nginx
Date: Wed, 12 Mar 2025 12:00:00 GMT
Content-Type: text/plain;charset=UTF-8
{
"status": "success",
"message": [
"4 products inserted"
]
}
curl -X POST -H "Authorization: Bearer YOUR_API_TOKEN" -d @product-import.json https://easywebshop.com/api/product
<?php
header("Content-Type: text/plain");
// API endpoint
const API_URL = 'https://easywebshop.com/api/product/';
// Your Bearer token
const API_TOKEN = 'YOUR_API_TOKEN';
// True: show request and response headers
const DEBUG = true;
// Initialize cURL session
$ch = curl_init(API_URL);
// Set cURL options
// Return the response as a string
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Authorization: Bearer ' . API_TOKEN,
'Content-Type: application/json'
]);
// Uncomment the following lines to set data in PHP
/*
$data = [
'key1' => 'value1',
'key2' => 'value2'
];
$data = json_encode($data);
*/
// Get data from file
$data = file_get_contents('product-import.json');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
// Activate request and response details (for showing later)
if (DEBUG) {
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLINFO_HEADER_OUT, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
}
// Execute the cURL request
$response = curl_exec($ch);
// Show the request details
if (DEBUG) {
echo curl_getinfo($ch, CURLINFO_HEADER_OUT);
}
// Check for errors
if (curl_errno($ch)) {
echo 'cURL error: ' . curl_error($ch);
// Print the response
} else {
// Print request and response header
if (DEBUG) {
$header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
$header = substr($response, 0, $header_size);
$response = substr($response, $header_size);
echo $header;
}
// Print response
echo $response;
// Print response in PHP array
if ($response_array = json_decode($response, true)) {
echo "\n\n" . print_r($response_array, true);
}
}
// Close the cURL session
curl_close($ch);
?>
{
"productlist": [
{
"product": {
"productID": "LA-B03",
"category": "Ambiance",
"price": 49.99,
"stock": 0,
"weight": 5,
"status": "Available",
"vat_code": 0,
"old_price": "75",
"colors": "Blue,Red,Violet",
"promotion": 1
}
},
{
"product": {
"productID": "LA-C05",
"category": "Ambiance",
"name:lang=en": "Example paint",
"name:lang=nl": "Voorbeeld verf",
"description:lang=en": "Lorem ipsum dolor sit amet.",
"price": 79,
"stock": 1,
"status": "Available",
"weight": 5,
"vat_code": 0,
"condition": "New",
"gtin": "123456",
"old_price": "179",
"units": "test",
"mpq": 1,
"purchase_price": 50,
"promo": 1,
"label_id": 1,
"colors": "Blue,Red,Violet",
"params": "T,en,Name,,,\nS,en,Select size,[A|B|C],A,1",
"review": 1
}
},
{
"product": {
"productID": "LA-C05-A",
"parent_productID": "LA-C05",
"name:lang=en": "Variation A",
"price": "79",
"colors": "LightCoral"
}
},
{
"product": {
"productID": "LA-C05-B",
"parent_productID": "LA-C05",
"name:lang=en": "Variation B",
"price": "89"
}
}
]
}
<?xml version="1.0" encoding="UTF-8" ?>
<productlist>
<product>
<productID>LA-B03</productID>
<category>Ambiance</category>
<price>49.99</price>
<stock>0</stock>
<weight>5</weight>
<status>Available</status>
<vat_code>0</vat_code>
<old_price>75</old_price>
<colors>Blue,Red,Violet</colors>
<promotion>1</promotion>
</product>
<product>
<productID>LA-C05</productID>
<category>Ambiance</category>
<name lang="en">Example paint</name>
<name lang="nl">Voorbeeld verf</name>
<description lang="en">Lorem ipsum dolor sit amet.</description>
<price>79</price>
<stock>1</stock>
<status>Available</status>
<weight>5</weight>
<vat_code>0</vat_code>
<condition>New</condition>
<gtin>123456</gtin>
<old_price>179</old_price>
<units>test</units>
<mpq>1</mpq>
<purchase_price>50</purchase_price>
<promo>1</promo>
<label_id>1</label_id>
<colors>Blue,Red,Violet</colors>
<params>T,en,Name,,,
S,en,Select size,[A|B|C],A,1</params>
<review>1</review>
</product>
<product>
<productID>LA-C05-A</productID>
<parent_productID>LA-C05</parent_productID>
<name lang="en">Variation A</name>
<price>79</price>
<colors>LightCoral</colors>
</product>
<product>
<productID>LA-C05-B</productID>
<parent_productID>LA-C05</parent_productID>
<name lang="en">Variation B</name>
<price>89</price>
</product>
</productlist>
Szczegółowe wyjaśnienie wszystkich pól produktu można znaleźć na stronie dokumentacji Podstawowe zarządzanie produktami i Zaawansowane zarządzanie produktami.
Parametr | Typ | Opis |
---|---|---|
productID | string | Artykuł. Unikalny i zdefiniowany przez użytkownika identyfikator produktu. Unikaj znaków specjalnych oraz zduplikowanych lub niejednoznacznych identyfikatorów. Podczas edycji produktu productID jest używany jako identyfikator. ProductID można zmienić tylko za pomocą zarządzania produktami. |
parent_productID | string | Jeśli chcesz, aby ten produkt był wariantem produktu, wprowadź tutaj productID produktu nadrzędnego. Warianty działają jak samodzielne produkty. Są połączone z produktem nadrzędnym zamiast z kategorią i dlatego nie są widoczne na listach produktów. Podwarianty nie są zalecane i można je ustawić tylko za pomocą zarządzania produktami. |
category | string | Nazwa kategorii w domyślnym języku sklepu internetowego. Nie dotyczy wariantów produktów. |
name:lang | string | Nazwisko. Możesz ustawić nazwy i opisy dla wszystkich języków, nawet jeśli nie są one aktywowane w sklepie internetowym. Dostępne języki (ISO 639-1): cs, da, de, el, en, es, fi, fr, it, ja, ko, nl, no, pl, pt, ro, ru, sv, tr, zh |
description:lang | string | Opis Dostępne języki (ISO 639-1): cs, da, de, el, en, es, fi, fr, it, ja, ko, nl, no, pl, pt, ro, ru, sv, tr, zh |
price | string | Cena. Może być liczbą dziesiętną, liczbą całkowitą, pustym polem lub ciągiem znaków. |
stock | integer | Zapasy. Pozostaw 0 dla nieskończonego zapasu lub wyłączonego zapasu. |
status | string | Status Available, Available but not online, Pre-order, Sold Out, Invisible, Customers only, Price visible for customers, Choose property, Hide status, custom0, custom1, ..., custom9 |
image:no | string | Dołącz adres URL obrazu, aby przesłać zdjęcia produktów. Pierwszy obraz jest zdjęciem głównym, kolejne cztery to zdjęcia dodatkowe. Gdy zdjęcie produktu już istnieje, zostanie zastąpione. Po przesłaniu obrazy zostaną proporcjonalnie przeskalowane zgodnie z ustawieniami sklepu internetowego, miniatury zostaną utworzone automatycznie, a obraz zostanie zsynchronizowany z wieloma serwerami plików. Upewnij się, że każdy obraz ma prawidłowy adres URL, maksymalny rozmiar pliku 25 MB, prawidłowe rozszerzenie (.jpg, .jpeg, .png lub .gif) oraz prawidłowy typ MIME (image/jpeg, image/jpg, image/png, image/gif). Przesyłanie obrazów wymaga czasu i zasobów serwera. Unikaj zastępowania tych samych obrazów podczas aktualizacji produktów. Jeśli napotkasz przekroczenia limitu czasu, przesyłaj ograniczoną liczbę produktów w partiach po 25 obrazów każda.1 - 5 |
thumbnail:no | string | Miniatury są generowane automatycznie. Jest to parametr tylko do odczytu. |
weight | decimal | Waga. Jednostka SI kilogram. |
vat_code | integer | Stawka VATu. Stawka VAT ustawiona w ustawieniach faktury. 0, 1, 2 |
condition | string | Stan New, Used, Refurbished |
gtin | string | EAN kod |
old_price | string | Stara cena |
units | string | Liczba sztuk |
mpq | integer | Minimalny zakup |
purchase_price | decimal | Cena zakupu |
promo | boolean | Promuj ten produkt na stronie głównej mojego sklepu. Nie dotyczy wariantów produktów. |
label_id | integer | Etykieta. Pozostaw 0 dla braku etykiety. Nie dotyczy wariantów produktów. 0 - 100 |
colors | string | Zabarwienie. Wybierz spośród 256 bezpiecznych dla sieci nazw kolorów w języku angielskim, oddzielonych przecinkami. |
params | string | Personalizacja produktu. Parametry mają specjalny format i najlepiej ustawiać je za pomocą interfejsu zarządzania produktami. Gdy masz już przykład, możesz go skopiować do importu. |
review | boolean | Opinie. Włącz lub wyłącz recenzje produktów. |
last_update | datetime | Data ostatniego logowania. Tylko do odczytu. |
Te sekcje można ustawić tylko za pomocą interfejsu zarządzania: rabat hurtowy, grupy klientów, bony upominkowe, rezerwacje, produkty cyfrowe, filtry, artykuły pochodne.
Jednorazowo można zaimportować do 100 produktów. Jeśli chcesz zaimportować więcej produktów, możesz powtórzyć polecenie co 5 minut.
Edytowanie produktów
Możesz również edytować produkty za pomocą funkcji szybkiej edycji, funkcji importu i funkcji operacji zbiorczych.
- PUT /api/product
- W przypadku powodzenia zostanie zwrócone 200 OK
PUT /api/product HTTP/2
Host: easywebshop.com
Authorization: Bearer YOUR_API_TOKEN
Content-Type: application/json
{
"productlist": [
{
"product": {
"code": "LA-C05",
"price": 16,
"status": "Available",
"stock": 7,
"image:no=1": "https://easywebshop.com/img/slideshow/9001.jpg",
"image:no=2": "https://easywebshop.com/img/easywebshop.png"
}
},
{
"product": {
"code": "SI-V55",
"price": "28",
"status": "Sold Out",
"stock": "0",
"weight": "2",
"old_price": "43"
}
}
]
}
HTTP/2 200
Server: nginx
Date: Wed, 12 Mar 2025 12:00:00 GMT
Content-Type: text/plain;charset=UTF-8
{
"status": "success",
"message": [
"Product SI-V55 not found, skipping",
"1 products updated"
]
}
curl -X PUT -H "Authorization: Bearer YOUR_API_TOKEN" -d @product-edit.json https://easywebshop.com/api/product
<?php
header("Content-Type: text/plain");
// API endpoint
const API_URL = 'https://easywebshop.com/api/product/';
// Your Bearer token
const API_TOKEN = 'YOUR_API_TOKEN';
// True: show request and response headers
const DEBUG = true;
// Initialize cURL session
$ch = curl_init(API_URL);
// Set cURL options
// Return the response as a string
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Authorization: Bearer ' . API_TOKEN,
'Content-Type: application/json'
]);
// Uncomment the following lines to set data in PHP
/*
$data = [
'key1' => 'value1',
'key2' => 'value2'
];
$data = json_encode($data);
*/
// Get data from file
$data = file_get_contents('product-edit.json');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
// Activate request and response details (for showing later)
if (DEBUG) {
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLINFO_HEADER_OUT, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
}
// Execute the cURL request
$response = curl_exec($ch);
// Show the request details
if (DEBUG) {
echo curl_getinfo($ch, CURLINFO_HEADER_OUT);
}
// Check for errors
if (curl_errno($ch)) {
echo 'cURL error: ' . curl_error($ch);
// Print the response
} else {
// Print request and response header
if (DEBUG) {
$header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
$header = substr($response, 0, $header_size);
$response = substr($response, $header_size);
echo $header;
}
// Print response
echo $response;
// Print response in PHP array
if ($response_array = json_decode($response, true)) {
echo "\n\n" . print_r($response_array, true);
}
}
// Close the cURL session
curl_close($ch);
?>
{
"productlist": [
{
"product": {
"code": "LA-C05",
"price": 16,
"status": "Available",
"stock": 7,
"image:no=1": "https://easywebshop.com/img/slideshow/9001.jpg",
"image:no=2": "https://easywebshop.com/img/easywebshop.png"
}
},
{
"product": {
"code": "SI-V55",
"price": "28",
"status": "Sold Out",
"stock": "0",
"weight": "2",
"old_price": "43"
}
}
]
}
<?xml version="1.0" encoding="UTF-8" ?>
<productlist>
<product>
<code>LA-C05</code>
<price>16</price>
<status>Available</status>
<stock>7</stock>
<image no="1">https://easywebshop.com/img/slideshow/9001.jpg</image>
<image no="2">https://easywebshop.com/img/easywebshop.png</image>
</product>
<product>
<code>SI-V55</code>
<price>28</price>
<status>Sold Out</status>
<stock>0</stock>
<weight>2</weight>
<old_price>43</old_price>
</product>
</productlist>
Jeśli chcesz zaktualizować stan magazynowy produktu, zaktualizuj tylko pola status i stan magazynowy. Pamiętaj, aby ustawić odpowiedni status produktu dla sytuacji takich jak Wyprzedane lub Nieskończony zapas.
Jednorazowo można zaktualizować do 100 produktów. Jeśli chcesz zaktualizować więcej produktów, możesz powtórzyć polecenie co 5 minut.
Usuwanie produktów
- DELETE /api/product/[productID]
- W przypadku powodzenia zostanie zwrócone 204 No Content
- Żądanie
- Odpowiedź
- curl
- PHP
DELETE /api/product/LA-C05 HTTP/2
Host: easywebshop.com
Authorization: Bearer YOUR_API_TOKEN
Content-Type: application/json
HTTP/2 204
Server: nginx
Date: Wed, 12 Mar 2025 12:00:00 GMT
Content-Type: text/plain;charset=UTF-8
curl -k -X DELETE -H "Authorization: Bearer YOUR_API_TOKEN" -D - https://easywebshop.com/api/product/LA-C05
<?php
header("Content-Type: text/plain");
// API endpoint
const API_URL = 'https://easywebshop.com/api/product/LA-B03';
// Your Bearer token
const API_TOKEN = 'YOUR_API_TOKEN';
// True: show request and response headers
const DEBUG = true;
// Initialize cURL session
$ch = curl_init(API_URL);
// Set cURL options
// Return the response as a string
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Authorization: Bearer ' . API_TOKEN,
'Content-Type: application/json'
]);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');
// Activate request and response details (for showing later)
if (DEBUG) {
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLINFO_HEADER_OUT, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
}
// Execute the cURL request
$response = curl_exec($ch);
// Show the request details
if (DEBUG) {
echo curl_getinfo($ch, CURLINFO_HEADER_OUT);
}
// Check for errors
if (curl_errno($ch)) {
echo 'cURL error: ' . curl_error($ch);
// Print the response
} else {
// Print request and response header
if (DEBUG) {
$header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
$header = substr($response, 0, $header_size);
$response = substr($response, $header_size);
echo $header;
}
// Print response
$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($httpcode == 204) {
echo "Delete successful";
} else {
echo $response;
}
// Print response in PHP array
if ($response_array = json_decode($response, true)) {
echo "\n\n" . print_r($response_array, true);
}
}
// Close the cURL session
curl_close($ch);
?>
Klienci
Przeglądanie klientów
EasyWebshop stosuje format schema.org/Person.
- GET /api/customer
- Pobiera ostatnich 1000 klientów
- GET /api/customer?offset=1000
- Pobiera ostatnich 1000 klientów, ale pomija pierwszych 1000 klientów
- GET /api/customer/86400
- Pobiera klientów, którzy zostali dodani lub zmodyfikowani w ciągu ostatnich 24 godzin
- GET /api/customer/[email]
- Pobiera konkretnego klienta według adresu e-mail
GET /api/customer HTTP/2
Host: easywebshop.com
Authorization: Bearer YOUR_API_TOKEN
Content-Type: application/json
HTTP/2 200
Server: nginx
Date: Wed, 12 Mar 2025 12:00:00 GMT
Content-Type: text/plain;charset=UTF-8
{
"customerlist": [
{
"customer": {
"givenName": "Test",
"familyName": "Buddy",
"brand": "",
"vatID": "",
"knowsLanguage": "en",
"address": {
"addressCountry": "BE",
"addressLocality": "Gent",
"addressRegion": "",
"postalCode": "9000",
"streetAddress": "Veldstraat",
"houseNo": "1"
},
"telephone": "123456789",
"email": "testbuddy@ew.ms",
"memberOf": "OpenGroup",
"denied": 0
}
},
{
"customer": {
"givenName": "Cindy",
"familyName": "Test",
"brand": "",
"vatID": "",
"knowsLanguage": "nl",
"address": {
"addressCountry": "BE",
"addressLocality": "Gent",
"addressRegion": "",
"postalCode": "9000",
"streetAddress": "Veldstraat",
"houseNo": "1"
},
"telephone": "123456789",
"email": "cindytest@ew.ms",
"denied": 0
}
}
]
}
Pobiera ostatnich 1000 klientów
curl -H "Authorization: Bearer YOUR_API_TOKEN" -D - https://easywebshop.com/api/customer
Pobiera ostatnich 1000 klientów, ale pomija pierwszych 1000 klientów
curl -H "Authorization: Bearer YOUR_API_TOKEN" -D - https://easywebshop.com/api/customer?offset=1000
Pobiera klientów, którzy zostali dodani lub zmodyfikowani w ciągu ostatnich 24 godzin
curl -H "Authorization: Bearer YOUR_API_TOKEN" -D - https://easywebshop.com/api/customer/86400
Pobiera konkretnego klienta według adresu e-mail
curl -H "Authorization: Bearer YOUR_API_TOKEN" -D - https://easywebshop.com/api/customer/email@address.com
<?php
header("Content-Type: text/plain");
// API endpoint
// You can add an email address behind the slash for searching a specific customer
const API_URL = 'https://easywebshop.com/api/customer/';
// Your Bearer token
const API_TOKEN = 'YOUR_API_TOKEN';
// True: show request and response headers
const DEBUG = true;
// Initialize cURL session
$ch = curl_init(API_URL);
// Set cURL options
// Return the response as a string
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Authorization: Bearer ' . API_TOKEN,
'Content-Type: application/json'
]);
// Optional: If you are sending data (e.g., for a POST request)
// Uncomment the following lines to send a JSON payload
/*
$data = [
'key1' => 'value1',
'key2' => 'value2'
];
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
*/
// Activate request and response details (for showing later)
if (DEBUG) {
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLINFO_HEADER_OUT, true);
}
// Execute the cURL request
$response = curl_exec($ch);
// Show the request details
if (DEBUG) {
echo curl_getinfo($ch, CURLINFO_HEADER_OUT);
}
// Check for errors
if (curl_errno($ch)) {
echo 'cURL error: ' . curl_error($ch);
// Print the response
} else {
// Print request and response header
if (DEBUG) {
$header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
$header = substr($response, 0, $header_size);
$response = substr($response, $header_size);
echo $header;
}
// Print response
echo $response;
// Print response in PHP array
if ($categories = json_decode($response, true)) {
echo "\n\n" . print_r($categories, true);
}
}
// Close the cURL session
curl_close($ch);
?>
{
"customerlist": [
{
"customer": {
"givenName": "Test",
"familyName": "Buddy",
"brand": "",
"vatID": "",
"knowsLanguage": "en",
"address": {
"addressCountry": "BE",
"addressLocality": "Gent",
"addressRegion": "",
"postalCode": "9000",
"streetAddress": "Veldstraat",
"houseNo": "1"
},
"telephone": "123456789",
"email": "testbuddy@ew.ms",
"memberOf": "OpenGroup",
"denied": 0
}
},
{
"customer": {
"givenName": "Cindy",
"familyName": "Test",
"brand": "",
"vatID": "",
"knowsLanguage": "nl",
"address": {
"addressCountry": "BE",
"addressLocality": "Gent",
"addressRegion": "",
"postalCode": "9000",
"streetAddress": "Veldstraat",
"houseNo": "1"
},
"telephone": "123456789",
"email": "cindytest@ew.ms",
"denied": 0
}
}
]
}
<?xml version="1.0" encoding="UTF-8" ?>
<customerlist>
<customer>
<givenName>Test</givenName>
<familyName>Buddy</familyName>
<brand></brand>
<vatID></vatID>
<knowsLanguage>en</knowsLanguage>
<address>
<addressCountry>BE</addressCountry>
<addressLocality>Gent</addressLocality>
<addressRegion></addressRegion>
<postalCode>9000</postalCode>
<streetAddress>Veldstraat</streetAddress>
<houseNo>1</houseNo>
</address>
<telephone>123456789</telephone>
<email>testbuddy@ew.ms</email>
<memberOf>OpenGroup</memberOf>
<denied>0</denied>
</customer>
<customer>
<givenName>Cindy</givenName>
<familyName>Test</familyName>
<brand></brand>
<vatID></vatID>
<knowsLanguage>nl</knowsLanguage>
<address>
<addressCountry>BE</addressCountry>
<addressLocality>Gent</addressLocality>
<addressRegion></addressRegion>
<postalCode>9000</postalCode>
<streetAddress>Veldstraat</streetAddress>
<houseNo>1</houseNo>
</address>
<telephone>123456789</telephone>
<email>cindytest@ew.ms</email>
<denied>0</denied>
</customer>
</customerlist>
Importowanie klientów
Każdy klient otrzymuje e-mail w celu weryfikacji adresu e-mail.
- POST /api/customer
- W przypadku powodzenia zostanie zwrócone 201 Created
POST /api/customer HTTP/2
Host: easywebshop.com
Authorization: Bearer YOUR_API_TOKEN
Content-Type: application/json
{
"customerlist": [
{
"customer": {
"givenName": "Test",
"familyName": "Buddy",
"brand": "",
"vatID": "",
"knowsLanguage": "en",
"address": {
"addressCountry": "BE",
"addressLocality": "Gent",
"addressRegion": "",
"postalCode": "9000",
"streetAddress": "Veldstraat",
"houseNo": "1"
},
"telephone": "123456789",
"email": "testbuddy@ew.ms",
"memberOf": "OpenGroup",
"denied": 0
}
},
{
"customer": {
"givenName": "Cindy",
"familyName": "Test",
"brand": "",
"vatID": "",
"knowsLanguage": "nl",
"address": {
"addressCountry": "BE",
"addressLocality": "Gent",
"addressRegion": "",
"postalCode": "9000",
"streetAddress": "Veldstraat",
"houseNo": "1"
},
"telephone": "123456789",
"email": "cindytest@ew.ms",
"denied": 0
}
}
]
}
HTTP/2 201
Server: nginx
Date: Wed, 12 Mar 2025 12:00:00 GMT
Content-Type: text/plain;charset=UTF-8
{
"status": "success",
"message": [
"Customer testbuddy@ew.ms: inserted successfully",
"Customer testbuddy@ew.ms: verification email sent successfully",
"Customer cindytest@ew.ms: inserted successfully",
"Customer cindytest@ew.ms: verification email sent successfully",
"2 customers inserted"
]
}
curl -X POST -H "Authorization: Bearer YOUR_API_TOKEN" -d @customer-import.json https://easywebshop.com/api/customer
<?php
header("Content-Type: text/plain");
// API endpoint
const API_URL = 'https://easywebshop.com/api/customer/';
// Your Bearer token
const API_TOKEN = 'YOUR_API_TOKEN';
// True: show request and response headers
const DEBUG = true;
// Initialize cURL session
$ch = curl_init(API_URL);
// Set cURL options
// Return the response as a string
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Authorization: Bearer ' . API_TOKEN,
'Content-Type: application/json'
]);
// Uncomment the following lines to set data in PHP
/*
$data = [
'key1' => 'value1',
'key2' => 'value2'
];
$data = json_encode($data);
*/
// Get data from file
$data = file_get_contents('customer-import.json');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
// Activate request and response details (for showing later)
if (DEBUG) {
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLINFO_HEADER_OUT, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
}
// Execute the cURL request
$response = curl_exec($ch);
// Show the request details
if (DEBUG) {
echo curl_getinfo($ch, CURLINFO_HEADER_OUT);
}
// Check for errors
if (curl_errno($ch)) {
echo 'cURL error: ' . curl_error($ch);
// Print the response
} else {
// Print request and response header
if (DEBUG) {
$header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
$header = substr($response, 0, $header_size);
$response = substr($response, $header_size);
echo $header;
}
// Print response
echo $response;
// Print response in PHP array
if ($response_array = json_decode($response, true)) {
echo "\n\n" . print_r($response_array, true);
}
}
// Close the cURL session
curl_close($ch);
?>
{
"customerlist": [
{
"customer": {
"givenName": "Test",
"familyName": "Buddy",
"brand": "",
"vatID": "",
"knowsLanguage": "en",
"address": {
"addressCountry": "BE",
"addressLocality": "Gent",
"addressRegion": "",
"postalCode": "9000",
"streetAddress": "Veldstraat",
"houseNo": "1"
},
"telephone": "123456789",
"email": "testbuddy@ew.ms",
"memberOf": "OpenGroup",
"denied": 0
}
},
{
"customer": {
"givenName": "Cindy",
"familyName": "Test",
"brand": "",
"vatID": "",
"knowsLanguage": "nl",
"address": {
"addressCountry": "BE",
"addressLocality": "Gent",
"addressRegion": "",
"postalCode": "9000",
"streetAddress": "Veldstraat",
"houseNo": "1"
},
"telephone": "123456789",
"email": "cindytest@ew.ms",
"denied": 0
}
}
]
}
<?xml version="1.0" encoding="UTF-8" ?>
<customerlist>
<customer>
<givenName>Test</givenName>
<familyName>Buddy</familyName>
<brand></brand>
<vatID></vatID>
<knowsLanguage>en</knowsLanguage>
<address>
<addressCountry>BE</addressCountry>
<addressLocality>Gent</addressLocality>
<addressRegion></addressRegion>
<postalCode>9000</postalCode>
<streetAddress>Veldstraat</streetAddress>
<houseNo>1</houseNo>
</address>
<telephone>123456789</telephone>
<email>testbuddy@ew.ms</email>
<memberOf>OpenGroup</memberOf>
<denied>0</denied>
</customer>
<customer>
<givenName>Cindy</givenName>
<familyName>Test</familyName>
<brand></brand>
<vatID></vatID>
<knowsLanguage>nl</knowsLanguage>
<address>
<addressCountry>BE</addressCountry>
<addressLocality>Gent</addressLocality>
<addressRegion></addressRegion>
<postalCode>9000</postalCode>
<streetAddress>Veldstraat</streetAddress>
<houseNo>1</houseNo>
</address>
<telephone>123456789</telephone>
<email>cindytest@ew.ms</email>
<denied>0</denied>
</customer>
</customerlist>
Szczegółowe informacje można znaleźć na stronie wiki zarządzania klientami.
Parametr | Typ | Opis |
---|---|---|
string | Adres poczty internetowej (e-mail). Adres e-mail jest unikalnym identyfikatorem klienta. | |
givenName | string | Imię |
familyName | string | Nazwisko |
brand | string | Firma |
vatID | string | Numer VATu |
knowsLanguage | string | Język (ISO 639-1): cs, da, de, el, en, es, fi, fr, it, ja, ko, nl, no, pl, pt, ro, ru, sv, tr, zh |
addressCountry | string | Kraj (ISO_3166-1) |
addressLocality | string | Miejscowość |
addressRegion | string | Województwo. Nie wymagane dla większości krajów i często pomijane, aby skrócić formularz zamówienia. |
postalCode | string | Kod pocztowy. Nie wszystkie kraje mają kody pocztowe. |
streetAddress | string | Ulica |
houseNo | string | Numer domu. Niektóre miejsca nie mają numerów domów. |
telephone | string | Telefon |
memberOf | string | Grupa klientów |
status | string | Status Unconfirmed, Confirmed, Denied |
denied | boolean | Odrzucono 0 - 1 |
newsletter | boolean | Subskrybcja newsletter. Tylko sami klienci mogą to aktywować. |
registration_date | datetime | Data rejestracji. Tylko do odczytu. |
Jednorazowo można zaimportować do 100 klientów. Jeśli chcesz zaimportować więcej klientów, możesz powtórzyć polecenie co 5 minut.
Edytowanie klientów
Należy zauważyć, że tylko klienci mogą aktualizować swoje dane jako środek bezpieczeństwa. Możesz aktualizować grupę klientów i status klienta (dozwolony lub zabroniony).
- PUT /api/customer
- W przypadku powodzenia zostanie zwrócone 200 OK
PUT /api/customer HTTP/2
Host: easywebshop.com
Authorization: Bearer YOUR_API_TOKEN
Content-Type: application/json
{
"customerlist": [
{
"customer": {
"email": "cindytest@ew.ms",
"memberOf": "OpenGroup",
"denied": 0
}
}
]
}
HTTP/2 200
Server: nginx
Date: Wed, 12 Mar 2025 12:00:00 GMT
Content-Type: text/plain;charset=UTF-8
{
"status": "success",
"message": [
"Customer cindytest@ew.ms: updated successfully",
"1 customers updated"
]
}
curl -X PUT -H "Authorization: Bearer YOUR_API_TOKEN" -d @customer-edit.json https://easywebshop.com/api/customer
<?php
header("Content-Type: text/plain");
// API endpoint
const API_URL = 'https://easywebshop.com/api/customer/';
// Your Bearer token
const API_TOKEN = 'YOUR_API_TOKEN';
// True: show request and response headers
const DEBUG = true;
// Initialize cURL session
$ch = curl_init(API_URL);
// Set cURL options
// Return the response as a string
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Authorization: Bearer ' . API_TOKEN,
'Content-Type: application/json'
]);
// Uncomment the following lines to set data in PHP
/*
$data = [
'key1' => 'value1',
'key2' => 'value2'
];
$data = json_encode($data);
*/
// Get data from file
$data = file_get_contents('customer-edit.json');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
// Activate request and response details (for showing later)
if (DEBUG) {
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLINFO_HEADER_OUT, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
}
// Execute the cURL request
$response = curl_exec($ch);
// Show the request details
if (DEBUG) {
echo curl_getinfo($ch, CURLINFO_HEADER_OUT);
}
// Check for errors
if (curl_errno($ch)) {
echo 'cURL error: ' . curl_error($ch);
// Print the response
} else {
// Print request and response header
if (DEBUG) {
$header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
$header = substr($response, 0, $header_size);
$response = substr($response, $header_size);
echo $header;
}
// Print response
echo $response;
// Print response in PHP array
if ($response_array = json_decode($response, true)) {
echo "\n\n" . print_r($response_array, true);
}
}
// Close the cURL session
curl_close($ch);
?>
{
"customerlist": [
{
"customer": {
"email": "cindytest@ew.ms",
"memberOf": "OpenGroup",
"denied": 0
}
}
]
}
<?xml version="1.0" encoding="UTF-8" ?>
<customerlist>
<customer>
<email>cindytest@ew.ms</email>
<memberOf>OpenGroup</memberOf>
<denied>0</denied>
</customer>
</customerlist>
Jednorazowo można zaktualizować do 100 klientów. Jeśli chcesz zaktualizować więcej klientów, możesz powtórzyć polecenie co 5 minut.
Usuwanie klientów
- DELETE /api/customer/[email]
- W przypadku powodzenia zostanie zwrócone 204 No Content
- Żądanie
- Odpowiedź
- curl
- PHP
DELETE /api/customer/email@address.com HTTP/2
Host: easywebshop.com
Authorization: Bearer YOUR_API_TOKEN
Content-Type: application/json
HTTP/2 204
Server: nginx
Date: Wed, 12 Mar 2025 12:00:00 GMT
Content-Type: text/plain;charset=UTF-8
curl -k -X DELETE -H "Authorization: Bearer YOUR_API_TOKEN" -D - https://easywebshop.com/api/customer/email@address.com
<?php
header("Content-Type: text/plain");
// API endpoint
const API_URL = 'https://easywebshop.com/api/customer/email@address.com';
// Your Bearer token
const API_TOKEN = 'YOUR_API_TOKEN';
// True: show request and response headers
const DEBUG = true;
// Initialize cURL session
$ch = curl_init(API_URL);
// Set cURL options
// Return the response as a string
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Authorization: Bearer ' . API_TOKEN,
'Content-Type: application/json'
]);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');
// Activate request and response details (for showing later)
if (DEBUG) {
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLINFO_HEADER_OUT, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
}
// Execute the cURL request
$response = curl_exec($ch);
// Show the request details
if (DEBUG) {
echo curl_getinfo($ch, CURLINFO_HEADER_OUT);
}
// Check for errors
if (curl_errno($ch)) {
echo 'cURL error: ' . curl_error($ch);
// Print the response
} else {
// Print request and response header
if (DEBUG) {
$header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
$header = substr($response, 0, $header_size);
$response = substr($response, $header_size);
echo $header;
}
// Print response
$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($httpcode == 204) {
echo "Delete successful";
} else {
echo $response;
}
// Print response in PHP array
if ($response_array = json_decode($response, true)) {
echo "\n\n" . print_r($response_array, true);
}
}
// Close the cURL session
curl_close($ch);
?>
Zamówienia
Przeglądanie zamówień
EasyWebshop stosuje format schema.org/Order zawsze, gdy jest to możliwe.
- GET /api/order
- Pobiera ostatnie 1000 zamówień
- GET /api/order?offset=1000
- Pobiera ostatnie 1000 zamówień, ale pomija pierwsze 1000 zamówień
- GET /api/order/86400
- Pobiera zamówienia, które zostały złożone lub zmodyfikowane w ciągu ostatnich 24 godzin
- GET /api/order/[orderNumber]
- Pobiera konkretne zamówienie według numeru zamówienia
GET /api/order HTTP/2
Host: easywebshop.com
Authorization: Bearer YOUR_API_TOKEN
Content-Type: application/json
HTTP/2 200
Server: nginx
Date: Wed, 12 Mar 2025 12:00:00 GMT
Content-Type: text/plain;charset=UTF-8
{
"orderlist": [
{
"order": {
"@context": "https:\/\/schema.org",
"@type": "Order",
"orderNumber": "20250-71911-55107-56027",
"orderDate": "2025-04-16 15:39:52",
"OrderStatus": "OrderPaymentDue",
"description": "",
"language": "en",
"currency": "EUR",
"totalprice": "79",
"productlist": [
{
"product": {
"@type": "Product",
"productId": "LA-C05",
"description": "Example paint",
"price": "79",
"amount": "1",
"vat_code": "0"
}
}
],
"customer": {
"@context": "https:\/\/schema.org",
"@type": "Person",
"givenName": "Test",
"familyName": "Buddy",
"brand": "",
"vatID": "",
"knowsLanguage": "nl",
"address": {
"addressCountry": "BE",
"addressLocality": "Gent",
"addressRegion": "",
"postalCode": "",
"streetAddress": "Veldstraat",
"houseNo": "1"
},
"telephone": "123456789",
"email": "testbuddy@ew.ms",
"status": "Confirmed",
"newsletter": 0,
"registration_date": "2009-03-27 15:42:02"
},
"paymentMethod": "bank",
"paymentUrl": "https:\/\/all4you.be\/payment\/20250-71911-55107-56027",
"last_update": "2025-04-19 13:18:17"
}
}
]
}
Pobiera ostatnie 1000 zamówień
curl -H "Authorization: Bearer YOUR_API_TOKEN" -D - https://easywebshop.com/api/order
Pobiera ostatnie 1000 zamówień, ale pomija pierwsze 1000 zamówień
curl -H "Authorization: Bearer YOUR_API_TOKEN" -D - https://easywebshop.com/api/order?offset=1000
Pobiera zamówienia, które zostały złożone lub zmodyfikowane w ciągu ostatnich 24 godzin
curl -H "Authorization: Bearer YOUR_API_TOKEN" -D - https://easywebshop.com/api/order/86400
Pobiera konkretne zamówienie według numeru zamówienia
curl -H "Authorization: Bearer YOUR_API_TOKEN" -D - https://easywebshop.com/api/order/20250-00544-27497-22264
<?php
header("Content-Type: text/plain");
// API endpoint
// You can add an order code behind the slash for searching a specific order
const API_URL = 'https://easywebshop.com/api/order/';
// Your Bearer token
const API_TOKEN = 'YOUR_API_TOKEN';
// True: show request and response headers
const DEBUG = true;
// Initialize cURL session
$ch = curl_init(API_URL);
// Set cURL options
// Return the response as a string
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Authorization: Bearer ' . API_TOKEN,
'Content-Type: application/json'
]);
// Optional: If you are sending data (e.g., for a POST request)
// Uncomment the following lines to send a JSON payload
/*
$data = [
'key1' => 'value1',
'key2' => 'value2'
];
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
*/
// Activate request and response details (for showing later)
if (DEBUG) {
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLINFO_HEADER_OUT, true);
}
// Execute the cURL request
$response = curl_exec($ch);
// Show the request details
if (DEBUG) {
echo curl_getinfo($ch, CURLINFO_HEADER_OUT);
}
// Check for errors
if (curl_errno($ch)) {
echo 'cURL error: ' . curl_error($ch);
// Print the response
} else {
// Print request and response header
if (DEBUG) {
$header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
$header = substr($response, 0, $header_size);
$response = substr($response, $header_size);
echo $header;
}
// Print response
echo $response;
// Print response in PHP array
if ($categories = json_decode($response, true)) {
echo "\n\n" . print_r($categories, true);
}
}
// Close the cURL session
curl_close($ch);
?>
{
"orderlist": [
{
"order": {
"@context": "https:\/\/schema.org",
"@type": "Order",
"orderNumber": "20250-71911-55107-56027",
"orderDate": "2025-04-16 15:39:52",
"OrderStatus": "OrderPaymentDue",
"description": "",
"language": "en",
"currency": "EUR",
"totalprice": "79",
"productlist": [
{
"product": {
"@type": "Product",
"productId": "LA-C05",
"description": "Example paint",
"price": "79",
"amount": "1",
"vat_code": "0"
}
}
],
"customer": {
"@context": "https:\/\/schema.org",
"@type": "Person",
"givenName": "Test",
"familyName": "Buddy",
"brand": "",
"vatID": "",
"knowsLanguage": "nl",
"address": {
"addressCountry": "BE",
"addressLocality": "Gent",
"addressRegion": "",
"postalCode": "",
"streetAddress": "Veldstraat",
"houseNo": "1"
},
"telephone": "123456789",
"email": "testbuddy@ew.ms",
"status": "Confirmed",
"newsletter": 0,
"registration_date": "2009-03-27 15:42:02"
},
"paymentMethod": "bank",
"paymentUrl": "https:\/\/all4you.be\/payment\/20250-71911-55107-56027",
"last_update": "2025-04-19 13:18:17"
}
}
]
}
<?xml version="1.0" encoding="UTF-8" ?>
<orderlist>
<order>
<@context>https://schema.org</@context>
<@type>Order</@type>
<orderNumber>20250-71911-55107-56027</orderNumber>
<orderDate>2025-04-16 15:39:52</orderDate>
<OrderStatus>OrderPaymentDue</OrderStatus>
<description></description>
<language>en</language>
<currency>EUR</currency>
<totalprice>79</totalprice>
<productlist>
<product>
<@type>Product</@type>
<productId>LA-C05</productId>
<description>Example paint</description>
<price>79</price>
<amount>1</amount>
<vat_code>0</vat_code>
</product>
</productlist>
<customer>
<@context>https://schema.org</@context>
<@type>Person</@type>
<givenName>Test</givenName>
<familyName>Buddy</familyName>
<brand></brand>
<vatID></vatID>
<knowsLanguage>nl</knowsLanguage>
<address>
<addressCountry>BE</addressCountry>
<addressLocality>Gent</addressLocality>
<addressRegion></addressRegion>
<postalCode></postalCode>
<streetAddress>Veldstraat</streetAddress>
<houseNo>1</houseNo>
</address>
<telephone>123456789</telephone>
<email>testbuddy@ew.ms</email>
<status>Confirmed</status>
<newsletter>0</newsletter>
<registration_date>2009-03-27 15:42:02</registration_date>
</customer>
<paymentMethod>bank</paymentMethod>
<paymentUrl>https://all4you.be/payment/20250-71911-55107-56027</paymentUrl>
<last_update>2025-04-19 13:18:17</last_update>
</order>
</orderlist>
Importowanie zamówień
Ze względu na złożony charakter procesu realizacji zamówienia, zamówienia można wprowadzać tylko poprzez złożenie zamówienia w sklepie internetowym lub za pomocą aplikacji POS.
Edytowanie zamówień
- PUT /api/order
- W przypadku powodzenia zostanie zwrócone 200 OK
PUT /api/customer HTTP/2
Host: easywebshop.com
Authorization: Bearer YOUR_API_TOKEN
Content-Type: application/json
{
"orderlist": [
{
"order": {
"code": "20250-71911-55107-56027",
"status": "OrderDelivered",
"reference": "Internal note",
"mail_customer": 1
}
}
]
}
HTTP/2 200
Server: nginx
Date: Wed, 12 Mar 2025 12:00:00 GMT
Content-Type: text/plain;charset=UTF-8
{
"status": "success",
"message": [
"Order 20250-71911-55107-56027: updated successfully",
"Order 20250-71911-55107-56027: email successfully sent to testbuddy@ew.ms"
]
}
curl -X PUT -H "Authorization: Bearer YOUR_API_TOKEN" -d @order-edit.json https://easywebshop.com/api/order
<?php
header("Content-Type: text/plain");
// API endpoint
const API_URL = 'https://easywebshop.com/api/order/';
// Your Bearer token
const API_TOKEN = 'YOUR_API_TOKEN';
// True: show request and response headers
const DEBUG = true;
// Initialize cURL session
$ch = curl_init(API_URL);
// Set cURL options
// Return the response as a string
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Authorization: Bearer ' . API_TOKEN,
'Content-Type: application/json'
]);
// Uncomment the following lines to set data in PHP
/*
$data = [
'key1' => 'value1',
'key2' => 'value2'
];
$data = json_encode($data);
*/
// Get data from file
$data = file_get_contents('order-edit.json');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
// Activate request and response details (for showing later)
if (DEBUG) {
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLINFO_HEADER_OUT, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
}
// Execute the cURL request
$response = curl_exec($ch);
// Show the request details
if (DEBUG) {
echo curl_getinfo($ch, CURLINFO_HEADER_OUT);
}
// Check for errors
if (curl_errno($ch)) {
echo 'cURL error: ' . curl_error($ch);
// Print the response
} else {
// Print request and response header
if (DEBUG) {
$header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
$header = substr($response, 0, $header_size);
$response = substr($response, $header_size);
echo $header;
}
// Print response
echo $response;
// Print response in PHP array
if ($response_array = json_decode($response, true)) {
echo "\n\n" . print_r($response_array, true);
}
}
// Close the cURL session
curl_close($ch);
?>
{
"orderlist": [
{
"order": {
"code": "20250-71911-55107-56027",
"status": "OrderDelivered",
"reference": "Internal note",
"mail_customer": 1
}
}
]
}
<?xml version="1.0" encoding="UTF-8" ?>
<orderlist>
<order>
<code>20250-71911-55107-56027</code>
<status>OrderDelivered</status>
<reference>Internal note</reference>
<mail_customer>1</mail_customer>
</order>
</orderlist>
Szczegółowe informacje można znaleźć na stronie wiki zarządzania zamówieniami.
Parametr | Typ | Opis | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
orderNumber | string | Numer zamówienia. Numer zamówienia lub kod zamówienia jest unikalnym identyfikatorem zamówienia. | ||||||||||||||||
status | string | Status | ||||||||||||||||
| ||||||||||||||||||
reference | string | Jest to odniesienie do celów wewnętrznych, które można ustawić dla każdego zamówienia. Odniesienie nie będzie pokazywane klientowi. | ||||||||||||||||
mail_customer | boolean | Wyślij powiadomienie e-mail do klienta. |
Jednorazowo można zaktualizować do 100 zamówień. Jeśli chcesz zaktualizować więcej zamówień, możesz powtórzyć polecenie co 5 minut.
Usuwanie zamówień
- DELETE /api/order/[orderNumber]
- W przypadku powodzenia zostanie zwrócone 204 No Content
- Żądanie
- Odpowiedź
- curl
- PHP
DELETE /api/order/20250-00544-27497-22264 HTTP/2
Host: easywebshop.com
Authorization: Bearer YOUR_API_TOKEN
Content-Type: application/json
HTTP/2 204
Server: nginx
Date: Wed, 12 Mar 2025 12:00:00 GMT
Content-Type: text/plain;charset=UTF-8
curl -k -X DELETE -H "Authorization: Bearer YOUR_API_TOKEN" -D - https://easywebshop.com/api/order/20250-00544-27497-22264
<?php
header("Content-Type: text/plain");
// API endpoint
const API_URL = 'https://easywebshop.com/api/order/20250-71911-55107-56027';
// Your Bearer token
const API_TOKEN = 'YOUR_API_TOKEN';
// True: show request and response headers
const DEBUG = true;
// Initialize cURL session
$ch = curl_init(API_URL);
// Set cURL options
// Return the response as a string
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Authorization: Bearer ' . API_TOKEN,
'Content-Type: application/json'
]);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');
// Activate request and response details (for showing later)
if (DEBUG) {
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLINFO_HEADER_OUT, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
}
// Execute the cURL request
$response = curl_exec($ch);
// Show the request details
if (DEBUG) {
echo curl_getinfo($ch, CURLINFO_HEADER_OUT);
}
// Check for errors
if (curl_errno($ch)) {
echo 'cURL error: ' . curl_error($ch);
// Print the response
} else {
// Print request and response header
if (DEBUG) {
$header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
$header = substr($response, 0, $header_size);
$response = substr($response, $header_size);
echo $header;
}
// Print response
$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($httpcode == 204) {
echo "Delete successful";
} else {
echo $response;
}
// Print response in PHP array
if ($response_array = json_decode($response, true)) {
echo "\n\n" . print_r($response_array, true);
}
}
// Close the cURL session
curl_close($ch);
?>
Należy zauważyć, że podczas usuwania zamówień lub zmiany statusu na Anulowane, stan magazynowy zostanie ponownie dodany (jeśli produkty nadal istnieją), a produkty zmienią status z Wyprzedane na Dostępne, jeśli dotyczy. Podczas cofania anulowania zamówienia, stan magazynowy zostanie ponownie odjęty od produktów.
Limity
EasyWebshop jest zoptymalizowany pod kątem redundancji i niezwykle szybkiego ładowania stron internetowych. W tle działa klaster serwerów geograficznie rozproszonych w wielu centrach danych w różnych krajach. Ma to swoją cenę: podczas dodawania i aktualizowania danych i plików, muszą one zostać zsynchronizowane w klastrze serwerów, a pamięć podręczna musi zostać wyczyszczona na wszystkich serwerach. Obrazy muszą być skompresowane i przeskalowane do różnych formatów dla zdjęć z funkcją powiększania i miniatur, nazwy plików SEO muszą zostać sprawdzone i utworzone, a wszystkie dane muszą zostać zsynchronizowane na rozproszonych serwerach plików i serwerach kopii zapasowych.
Celem limitów jest zapobieganie przeciążeniu naszych systemów przez jednego użytkownika, co mogłoby zaszkodzić innym użytkownikom.
Zapytania API | 300 zapytania na 24h |
---|---|
Przeglądanie elementów | 1000 elementy na zapytanie |
Importowanie elementów | 100 elementy na zapytanie |
Aktualizowanie elementów | 100 elementy na zapytanie |
Przesyłanie obrazów | 100 obrazy na zapytanie (25 Megabyte per image) |
Wysokie limity API
W normalnych sytuacjach domyślne limity powinny być wystarczające. Tylko dla sklepów internetowych z ogromną ilością produktów limity mogą stanowić barierę.
W sekcji Ustawienia > Więcej opcji > EasyWebshop API można aktywować funkcję Wysokie limity API. Umożliwia to zakup dodatkowych zapytań API.
API Push
API Push wysyła żądanie HTTPS z danymi JSON lub XML. Te dane mogą zostać "przechwycone" przez serwer i przetworzone.
Jeśli po prostu chcesz otrzymywać wiadomości e-mail o swoich zamówieniach w dodatkowym miejscu docelowym, użyj kont administratora. Możesz również otrzymywać natychmiastowe powiadomienia o przychodzących zamówieniach.
W sekcji Ustawienia > Moduły > EasyWebshop API > API Push, wprowadź adres URL swojej aplikacji i zapisz. Po zapisaniu pojawi się przycisk Test, który umożliwia wysłanie przykładowego żądania. Aby dezaktywować, po prostu pozostaw puste adresy URL i zapisz.
Customer Push | Order Push |
---|---|
Żądanie HTTPS jest wysyłane, gdy klient tworzy konto, zawierające wszystkie informacje o kliencie, podobnie jak w API Klienta. | Żądanie HTTPS jest wysyłane, gdy klient składa zamówienie w sklepie internetowym lub gdy zamówienie jest składane za pomocą POS. To żądanie zawiera wszystkie dane zamówienia, zakupione produkty i informacje o kliencie, podobnie jak w API Zamówień. |
- Customer Push
- Order Push
- index.php
{
"customerlist": [
{
"customer": {
"givenName": "Test",
"familyName": "Buddy",
"brand": "",
"vatID": "",
"knowsLanguage": "en",
"address": {
"addressCountry": "BE",
"addressLocality": "Gent",
"addressRegion": "",
"postalCode": "9000",
"streetAddress": "Veldstraat",
"houseNo": "1"
},
"telephone": "123456789",
"email": "testbuddy@ew.ms",
"memberOf": "OpenGroup",
"denied": 0
}
},
{
"customer": {
"givenName": "Cindy",
"familyName": "Test",
"brand": "",
"vatID": "",
"knowsLanguage": "nl",
"address": {
"addressCountry": "BE",
"addressLocality": "Gent",
"addressRegion": "",
"postalCode": "9000",
"streetAddress": "Veldstraat",
"houseNo": "1"
},
"telephone": "123456789",
"email": "cindytest@ew.ms",
"denied": 0
}
}
]
}
{
"orderlist": [
{
"order": {
"@context": "https:\/\/schema.org",
"@type": "Order",
"orderNumber": "20250-71911-55107-56027",
"orderDate": "2025-04-16 15:39:52",
"OrderStatus": "OrderPaymentDue",
"description": "",
"language": "en",
"currency": "EUR",
"totalprice": "79",
"productlist": [
{
"product": {
"@type": "Product",
"productId": "LA-C05",
"description": "Example paint",
"price": "79",
"amount": "1",
"vat_code": "0"
}
}
],
"customer": {
"@context": "https:\/\/schema.org",
"@type": "Person",
"givenName": "Test",
"familyName": "Buddy",
"brand": "",
"vatID": "",
"knowsLanguage": "nl",
"address": {
"addressCountry": "BE",
"addressLocality": "Gent",
"addressRegion": "",
"postalCode": "",
"streetAddress": "Veldstraat",
"houseNo": "1"
},
"telephone": "123456789",
"email": "testbuddy@ew.ms",
"status": "Confirmed",
"newsletter": 0,
"registration_date": "2009-03-27 15:42:02"
},
"paymentMethod": "bank",
"paymentUrl": "https:\/\/all4you.be\/payment\/20250-71911-55107-56027",
"last_update": "2025-04-19 13:18:17"
}
}
]
}
<?php
/*--------------------------------------------
* EasyWebshop API Push test script
--------------------------------------------*/
// Address to send data to
$email = 'test@ew.ms';
// Collect data
$feedback = "\n\nGET variables:\n\n";
foreach ($_GET as $name => $value) {
$feedback .= $name . ': ' . $value . "\n";
}
$feedback .= "\n\nPOST variables:\n\n";
foreach ($_POST as $name => $value) {
$feedback .= $name . ': ' . $value . "\n";
}
$feedback .= "\n\nInput data:\n\n" . file_get_contents("php://input");
// Send mail
mail($email, 'EasyWebshop API Push ', $feedback . "\n\n" .
// Username
(isset($_SERVER['PHP_AUTH_USER']) ? 'User: ' . $_SERVER['PHP_AUTH_USER'] . "\n" : '') .
// IP Address
(isset($_SERVER['HTTP_X_FORWARDED_FOR']) ? $_SERVER['HTTP_X_FORWARDED_FOR'] . "\n" : '') .
$_SERVER['REMOTE_ADDR']);
// Return success
header('HTTP/1.1 200 OK');
die('200 OK');
?>
Znajomości
Połączenia to małe aplikacje internetowe, które działają na własnym serwerze i mają własny adres URL. Mogą być instalowane przez wszystkie sklepy internetowe, dzięki czemu ich kod może być ponownie wykorzystany przez wszystkich użytkowników EasyWebshop.
W sekcji Ustawienia > Moduły > EasyWebshop API > Tokeny Połączeń, kliknij przycisk Dodaj, aby utworzyć nowy Token Połączenia API. Będziesz musiał wprowadzić adres URL połączenia.
Upewnij się, że tworzysz Token Połączenia API, a nie zwykły Token API.
Rodzaje połączeń to:
Usługa dostawy, Widget HTML, Faktura, Kanał produktów, Dostawca Usług Płatniczych.
Połączenia zazwyczaj mają kilka plików:
Plik | Opis |
---|---|
settings.xml | Jest to plik konfiguracyjny połączenia.
|
easywebshop.php | Jest to plik, który łączy się z API EasyWebshop. Ustaw swój Token Połączenia API (nie zwykły Token API) w tym pliku. |
index.php | Jest to główny plik i pierwszy plik, do którego następuje dostęp, gdy połączenie jest używane. W przypadku usługi dostawy, pola GET z adresem klienta są wysyłane do tego pliku. W przypadku dostawcy usług płatniczych, pola POST zamówienia są wysyłane do tego pliku. |
report.php | Ten plik jest używany w przypadku dostawcy usług płatniczych i faktury i jest zazwyczaj żądany w tle przez dostawcę usług płatniczych w celu wysyłania aktualizacji o statusie płatności. Ten plik następnie aktualizuje status zamówienia w sklepie internetowym na Płatność otrzymana. |
Aby ułatwić tworzenie nowych połączeń, zachowaliśmy poniższe przykłady tak proste i przejrzyste, jak to tylko możliwe.
Usługa dostawy
Użyj poniższego przykładu do tworzenia połączeń z usługami dostawy lub transportu.
Połączenie musi zostać zainstalowane przez sprzedawcę, a metody wysyłki muszą zostać połączone poprzez ich wybór.
- Klient znajduje się na stronie kasy i wybiera metodę wysyłki. Ponieważ Twoje połączenie jest połączone z metodą wysyłki, powoduje to wyświetlenie wyskakującego okienka z ramką iframe, która wskazuje na Twój plik index.php.
- Dane adresowe klienta są wysyłane jako zmienne GET w ciągu zapytania.
- W Twoim połączeniu klient może wybrać metodę wysyłki lub wybrać punkt odbioru z mapy.
- Twoje połączenie wysyła nazwę metody wysyłki, cenę, opis i logo do naszego adresu URL potwierdzenia (/dsconfirm).
- Dane są dodawane do zamówienia, a klient otrzymuje potwierdzenie.
- settings.xml
- easywebshop.php
- index.php
- style.css
<?xml version="1.0" encoding="UTF-8" ?>
<settings>
<name>ExampleDeliveryService</name>
<logo>logo.png</logo>
<type>ds</type>
<url>https://www.webshopdata.com/app/easywebshop-ds/index.php</url>
<parameter name="Account ID"></parameter>
<parameter name="Passphrase"></parameter>
</settings>
<?php
/*
EasyWebshop API Connector
Documentation: https://easywebshop.com/doc/api
*/
function easyApp($data = '') {
// Set your API Connection Token (not API Token!) here
$conn_token = 'YOUR_API_TOKEN';
// No need to change anything below. You can watch, but you can't touch!
if (!isset($_REQUEST['shop_id']) || !$_REQUEST['shop_id'] ||
!filter_var($_REQUEST['shop_id'], FILTER_VALIDATE_INT,
array('options' => array('min_range' => 1, 'max_range' => 1000000000)))) {
die('Error: $_REQUEST[\'shop_id\'] not set');
}
$settings = new SimpleXMLElement(file_get_contents(dirname(__FILE__) . '/settings.xml'));
$method = isset($data['function']) && substr($data['function'], 0, 3) == 'set' ? 'PUT' : 'GET';
$format = isset($data['format']) && in_array(strtolower($data['format']), array('json', 'xml')) ?
strtolower($data['format']) : 'array';
$data = is_array($data) ? ($method == 'GET' ? http_build_query($data) : json_encode($data)) : '';
$apiurl = 'https://easywebshop.jan/api/conn/' . $_REQUEST['shop_id'] . '/' . $settings->name .
($method == 'GET' && $data ? '?' . $data : ''); // HTTPS only
$opts = array(
'http' => array(
'header' => "Content-Type: application/x-www-form-urlencoded\r\n" .
'Authorization: Bearer ' .
hash('sha512', $_REQUEST['shop_id'] . $settings->name . hash('sha256', $conn_token) . $data) . "\r\n",
'method' => $method,
'ignore_errors' => true),
'ssl' => array('verify_peer' => false, 'verify_peer_name' => false)
);
if ($method == 'PUT') { $opts['http']['content'] = $data; }
$response = file_get_contents($apiurl, false, stream_context_create($opts));
$appdata = $format == 'array' ? json_decode($response, true) : $response;
// Output log - only in debug mode
if (defined('DEBUG') && DEBUG) {
echo "-- easywebshop.php " . $settings->name . "\n> Accessing API: " .
$apiurl . "\n> API response: " . $response . "--\n";
}
return $appdata; // this can be a PHP array, JSON or XML, depending on the $data['format'] value
} // easyApp()
?>
<?php
/*--------------------------------------------
EasyWebshop Delivery service example
Install link:
https://easywebshop.com/software/connections?install=https://www.webshopdata.com/app/easywebshop-ds
Block 1: Variables
Block 2: Languages
Block 3: Delivery service API code
Block 4: Process form data
Block 5: Start page
--------------------------------------------*/
/*--------------------------------
Block 1: Variables
-------------------------------*/
// Debug mode for testing, set to false in production
define('DEBUG', true);
// Use test data
define('TEST', true);
// Use for testing without GET vars from checkout form
if (TEST) {
$_REQUEST = array('shop_id' => 71911, 'lang' => 'en');
$_GET = array('shop_id' => $_REQUEST['shop_id'],
'webshop_url' => 'https://all4you.be',
'shipping_method' => 'Standard delivery',
#'shipping_method' => 'Pickup at collection point',
'firstname' => 'Bruno',
'lastname' => 'Test',
'street' => 'Mottakerveien',
'no' => '14',
'zipcode' => '0150',
'city' => 'Oslo',
'province' => '',
'country' => 'NO',
'lang' => $_REQUEST['lang'],
'weight' => 0.5, // total weight of the shopping basket in kg
'freeshipping' => '', // shipping discount
'email' => 'bruno@mailinator.com',
'phone' => '12345678',
'total' => 100); // total price of the order, can be used to give discounts
} // TEST
// Get the connection settings
$settings = new SimpleXMLElement(file_get_contents(dirname(__FILE__) . '/settings.xml'));
// Get the data from the webshop
require 'easywebshop.php';
$appdata = easyApp();
/* This gives us the following array
Array
(
[webshop] => Array
(
[email] => example@voorbeeldshop.be
[url] => https://voorbeeldshop.be
[name] => Voorbeeld webshop
[country] => BE
[lang] => nl
[currency] => EUR
)
[response_time] => 0.00084
)*/
// Show all the data we have for testing
if (DEBUG) {
echo "<pre>--------------------------------\n\tGET variables:\n--------------------------------\n\n";
print_r($_GET);
echo "\n\n</pre>";
echo "<pre>--------------------------------\n\tConnection variables:\n--------------------------------\n\n";
print_r($appdata);
echo "\n\n</pre>";
}
/*--------------------------------
Block 3: Delivery service API code
Delivery variables
- These can be hard coded, or requested from another source
- Prices can also depend on customer location, use $_GET['zipcode'] for this
-------------------------------*/
$delivery_prices = array(2.5, 1.5, 0);
/*--------------------------------
Block 2: Languages
-------------------------------*/
// Dutch
if ($_REQUEST['lang'] == 'nl') {
$l_deliverymethod = 'Kies uw verzendmethode';
$l_deliverymethods = array('Levering met drone', 'Levering met fiets', 'Afhalen in pakketautomaat');
$l_confirm = 'Bevestigen';
// Other languages
} else {
$l_deliverymethod = 'Choose your delivery method';
$l_deliverymethods = array('Delivery by drone', 'Delivery by bicycle', 'Pick up in a parcel machine');
$l_confirm = 'Confirm';
}
/*--------------------------------
Block 4: Process form data
-------------------------------*/
if (isset($_POST['deliverymethod'])) {
// Send delivery method
$ds_method = $l_deliverymethods[0];
if (is_numeric($_POST['deliverymethod']) && isset($l_deliverymethods[$_POST['deliverymethod']])) {
$ds_method = $l_deliverymethods[$_POST['deliverymethod']];
}
// Separate prices per delivery method
$ds_price = $delivery_prices[0];
if (is_numeric($_POST['deliverymethod']) && isset($delivery_prices[$_POST['deliverymethod']])) {
$ds_price = $delivery_prices[$_POST['deliverymethod']];
}
// Show a logo on the confirm page, always use HTTPS for displaying images on a HTTPS page
$ds_logo = 'https://www.webshopdata.com/app/easywebshop-ds/logo.png';
// Order number
$ds_info = 'Reference ' . rand(0, 10000); // this can be a reference to an external database
// Confirm delivery method
header('Location: ' . $appdata['webshop']['url'] . '/dsconfirm' .
'?ds=' . urlencode($settings->name) .
'&ds_price=' . $ds_price .
'&ds_method=' . urlencode($ds_method) .
'&ds_info=' . urlencode($ds_info) .
'&ds_logo=' . urlencode($ds_logo) .
'&ds_seconds=5'); // how long to show the confirmation message
die;
}
/*--------------------------------
Block 5: Start page
- Let's keep it very simple
-------------------------------*/
// Header
echo '<!DOCTYPE html><html lang="en"><head><title>' . $settings->name . '</title><meta charset="utf-8">' .
'<link rel="stylesheet" href="style.css"></head>' . // you can also include javascript here
'<body><main><img src="logo.png" alt="' . $settings->name . '" id="logo"><h1>' . $settings->name . '</h1>' .
// Form
'<form method="POST">' .
'<input type="hidden" name="shop_id" value="' . $_REQUEST['shop_id'] . '">' .
'<input type="hidden" name="lang" value="' . $_REQUEST['lang'] . '">' .
'<table>' .
'<tr><td>' . $l_deliverymethod . '</td><td>';
// Loop delivery methods
foreach ($l_deliverymethods as $k => $v) {
echo '<input type="radio" name="deliverymethod" value="' . $k . '" id="' . $k . '">' .
'<label for="' . $k . '">' . $v . ' <strong>€ ' . $delivery_prices[$k] . '</strong></label><br>';
}
echo '</td></tr>' .
// Submit form
'<tr><td></td><td><input type="submit" name="submit" value="' . $l_confirm . '"></td></tr>' .
'</table></form>' .
// End page
'</main></body></html>';
?>
body { margin: 0; font-family: Helvetica, Arial, sans-serif; color: #333; background-color: #E4E4E4; }
main { margin: 0 auto; margin-top: 30px; margin-bottom: 30px; padding: 20px; width: 760px; background-color: #FFF; border-radius: 8px; border: 1px solid #CCC; box-shadow: 5px 5px 5px #888; }
#logo { margin-bottom: 10px; }
h1 { font-size: 22px; margin: 0; padding: 0; color: #06C; margin-bottom: 80px; }
hr { clear: both; border-style: solid; border-width: 1px 0 0 0; border-color: #E4E4E4; margin: 20px 0; }
/*--------------------------------
Navigation
-------------------------------*/
nav { margin: 40px 0; clear: both; }
nav a {
display: block; width: 70%; margin: 30px auto; padding: 20px; vertical-align: top;
border: 1px solid #E4E4E4; box-shadow: 2px 2px 2px #888;
/*border-style: solid; border-width: 0 0 1px 0; border-color: #CCC;*/
text-decoration: none; color: #06C; font-size: 20px; font-weight: bold;
transition: background 0.4s;
}
nav a:hover { background: #EEE; }
nav img { display: inline-block; float: left; width: 100px; height: 100px; vertical-align: top; }
nav span{ display: inline-block; line-height: 100px; text-indent: 30px; }
.langselect { font-size: 0.8em; font-weight: bold; }
/*--------------------------------
Buttons
-------------------------------*/
a.glowbutton, input[type="submit"], input[type="button"] {
white-space: nowrap; display: inline-block; min-width: 210px; margin: 0 0 10px 0; padding: 0;
text-decoration: none; text-align: center;
color: #FFF; background-color: #06C; border: 0; border-radius: 3px;
line-height: 33px; height: 33px; font-weight: bold; font-size: 0.9em;
-webkit-appearance: none; -moz-appearance: none; appearance: none;
transition: background 0.4s;
}
a.glowbutton:hover, input[type="submit"]:hover {
background-color: #06F; text-decoration: none;
}
/*--------------------------------
Fancy
-------------------------------*/
a { color: #06C; text-decoration: none; }
a:hover { text-decoration: underline; }
h2 { font-size: 1.6em; }
h3 { font-size: 1.4em; }
h4 { font-size: 1.1em; color: #666; }
.blue { color: #06C; }
.orange { color: #F60; }
.code { font-family: monospace; color: #090; }
.code a { font-weight: bold; color: #090; }
.warn { background-color: #FC0; padding: 15px 5px; text-align: center; border-radius: 5px; font-size: 0.9em; box-shadow: 2px 2px 2px #888; }
/*--------------------------------
Forms
-------------------------------*/
textarea { width: 99%; height: 200px; font-size: 1.2em; color: #666; }
input, select, textarea { border: 1px solid #CCC; border-radius: 3px; padding: 3px; }
input:focus, textarea:focus { background-color: #EEE; }
input[type="checkbox"], input[type="radio"] { border: 0;}
input[type="submit"], input[type="button"] { cursor: pointer; float: right; margin: 10px 0 0 0; }
form table { width: 100%; }
form table td:first-child { width: 50%; }
label { display: inline-block; max-width: 90%; padding: 0 0 0 10px; cursor: pointer; }
/*--------------------------------
Responsive
-------------------------------*/
@media all and (max-width: 790px) {
main { width: 100%; margin: 0; padding: 20px 0; border: none; border-radius: 0; }
nav a { margin: 0 auto; margin-top: 20px; margin-bottom: 20px; }
textarea { width: 97%; }
}
Widget HTML
Widgety mogą być używane do łatwego wstawiania kodu HTML, CSS i JavaScript. Użytkownik może wybrać, na których stronach witryny chce zainstalować ten kod. Jest to zasadniczo to samo, co kopiuj i wklej, ale bardziej przyjazne dla użytkownika.
- settings.xml
<?xml version="1.0" encoding="UTF-8" ?>
<settings>
<name>ExampleWidget</name>
<type>html</type>
<parameter name="Enter variable data 1">Example data 1</parameter>
<parameter name="Enter variable data 2">Example data 2</parameter>
<url>https://www.webshopdata.com/app/easywebshop-html/settings.xml</url>
<html><![CDATA[<p>
Hello! I'm a <strong>HTML example</strong>.<br>
You can use HTML, CSS and JavaScript code here.<br>
The user can insert it on any page of the website.
</p>
<p>
Your first parameter was <strong>[PARAMETER1]</strong>.<br>
Your second parameter was <strong>[PARAMETER2]</strong>.
</p>
<p>
To install me, redirect your user to:<br>
https://easywebshop.com/software/connections?install=https://www.webshopdata.com/app/easywebshop-html
</p>
<p>
Replace the second part of the URL by the directory on your sever.<br>
Only this settings.xml file is required in the directory.
</p>]]></html>
</settings>
Faktura
Faktura działa w ten sam sposób jak Dostawca Usług Płatniczych, ale koncentruje się na płatności na fakturę, gdzie potrzebne są dane klienta. Gdy typ jest ustawiony na psp, dostępne są tylko niezbędne dane, których dostawca usług płatniczych potrzebuje do przetworzenia płatności. Gdy typ jest ustawiony na invoice, dane klienta również stają się dostępne.
Kanał produktów
Używany do pobierania danych o produktach, na przykład do wykorzystania na stronach porównawczych.
- settings.xml
- easywebshop.php
- index.php
- style.css
<?xml version="1.0" encoding="UTF-8" ?>
<settings>
<name>DemoFeed</name>
<type>productfeed</type>
<url>https://www.webshopdata.com/app/easywebshop-productfeed/index.php</url>
</settings>
<?php
/*
EasyWebshop API Connector
Documentation: https://easywebshop.com/doc/api
*/
function easyApp($data = '') {
// Set your API Connection Token (not API Token!) here
$conn_token = 'YOUR_API_TOKEN';
// No need to change anything below. You can watch, but you can't touch!
if (!isset($_REQUEST['shop_id']) || !$_REQUEST['shop_id'] ||
!filter_var($_REQUEST['shop_id'], FILTER_VALIDATE_INT,
array('options' => array('min_range' => 1, 'max_range' => 1000000000)))) {
die('Error: $_REQUEST[\'shop_id\'] not set');
}
$settings = new SimpleXMLElement(file_get_contents(dirname(__FILE__) . '/settings.xml'));
$method = isset($data['function']) && substr($data['function'], 0, 3) == 'set' ? 'PUT' : 'GET';
$format = isset($data['format']) && in_array(strtolower($data['format']), array('json', 'xml')) ?
strtolower($data['format']) : 'array';
$data = is_array($data) ? ($method == 'GET' ? http_build_query($data) : json_encode($data)) : '';
$apiurl = 'https://easywebshop.jan/api/conn/' . $_REQUEST['shop_id'] . '/' . $settings->name .
($method == 'GET' && $data ? '?' . $data : ''); // HTTPS only
$opts = array(
'http' => array(
'header' => "Content-Type: application/x-www-form-urlencoded\r\n" .
'Authorization: Bearer ' .
hash('sha512', $_REQUEST['shop_id'] . $settings->name . hash('sha256', $conn_token) . $data) . "\r\n",
'method' => $method,
'ignore_errors' => true),
'ssl' => array('verify_peer' => false, 'verify_peer_name' => false)
);
if ($method == 'PUT') { $opts['http']['content'] = $data; }
$response = file_get_contents($apiurl, false, stream_context_create($opts));
$appdata = $format == 'array' ? json_decode($response, true) : $response;
// Output log - only in debug mode
if (defined('DEBUG') && DEBUG) {
echo "-- easywebshop.php " . $settings->name . "\n> Accessing API: " .
$apiurl . "\n> API response: " . $response . "--\n";
}
return $appdata; // this can be a PHP array, JSON or XML, depending on the $data['format'] value
} // easyApp()
?>
<?php
/*--------------------------------------------
EasyWebshop Productfeed example
Install link:
https://easywebshop.com/software/connections?install=https://www.webshopdata.com/app/easywebshop-productfeed
Block 1: Variables
Block 2: Generate feed
Block 3: Languages
Block 4: Productfeed form
Block X: Functions
--------------------------------------------*/
/*--------------------------------
Block 1: Variables
-------------------------------*/
define('DEBUG', true); // Debug mode for testing, set to false in production
$languages = array('cs', 'da', 'de', 'el', 'en', 'es', 'fi', 'fr', 'it', 'ja', 'ko', 'nl', 'no', 'pl', 'pt', 'ro', 'ru', 'sv', 'tr', 'zh');
define('SHOP_ID', isset($_REQUEST['shop_id']) && checkId($_REQUEST['shop_id']) ? $_REQUEST['shop_id'] : 0);
define('LANG', isset($_REQUEST['lang']) && in_array($_REQUEST['lang'], $languages) ? $_REQUEST['lang'] : 'en');
$settings = new SimpleXMLElement(file_get_contents(dirname(__FILE__) . '/settings.xml'));
/*--------------------------------
Block 2: Generate feed
-------------------------------*/
if (SHOP_ID && isset($_GET['token']) &&
preg_match('/^[0-9a-f]{40}$/i', $_GET['token']) && $_GET['token'] == sha1(SHOP_ID . LANG . 'roor8weiChait0gai')) {
/*--------------------------------
Connect to the EasyWebshop App API
easyApp(
[data] Data to send to the API, optional
)
- Returns an array of requested data, view with: print_r($appdata);
-------------------------------*/
header('Content-Type: text/xml; charset=utf-8');
// Show feed in XML format
echo "<?xml version=\"1.0\" encoding=\"UTF-8\" ?" . ">\n<items>\n";
if (DEBUG) {
echo '<debug><![CDATA[';
}
include 'easywebshop.php';
$appdata = easyApp(array('lang' => LANG, 'seconds' => 0, 'start' => 0, 'length' => 1000)); //, 'format' => 'xml'));
if (DEBUG) {
echo "]]></debug>\n";
}
if (isset($appdata['products'])) {
displayProducts($appdata);
// Max 5000 products
for ($i = 1; $i < 5; $i++) {
if (count($appdata['products']) >= 1000) {
$appdata = easyApp(array('lang' => LANG, 'seconds' => 0, 'start' => ($i * 1000), 'length' => 1000)); //, 'format' => 'xml'));
displayProducts($appdata);
}
}
//"<updated>" . gmdate("Ymd\THis\Z") . "</updated>\n";
}
echo '</items>';
die;
}
/*--------------------------------
Block 3: Languages
-------------------------------*/
// Danish
if (LANG == 'da') {
$l_language = 'Sprog';
$l_languages = array('cs' => 'Tjekkisk', 'da' => 'Dansk', 'de' => 'Tysk', 'el' => 'Greek', 'en' => 'Engelsk', 'es' => 'Spansk', 'fi' => 'Finsk', 'fr' => 'Fransk', 'it' => 'Italiensk', 'ja' => 'Japansk', 'ko' => 'Koreansk', 'nl' => 'Nederlandsk', 'no' => 'Norsk', 'pl' => 'Polsk', 'pt' => 'Portugisisk', 'ro' => 'Rumænsk', 'ru' => 'Russisk', 'sv' => 'Svensk', 'tr' => 'Tyrkisk', 'zh' => 'Kinesisk');
$l_generate_feed = 'Generer produktfeed';
$l_feed_url = 'Din <strong>' . $settings->name . '</strong> feedwebadresse er:';
// German
} elseif (LANG == 'de') {
$l_language = 'Sprache';
$l_languages = array('cs' => 'Tschechisch', 'da' => 'Dänisch', 'de' => 'Deutsch', 'el' => 'Griechisch', 'en' => 'Englisch', 'es' => 'Spanisch', 'fi' => 'Finnisch', 'fr' => 'Französisch', 'it' => 'Italienisch', 'ja' => 'Japanisch', 'ko' => 'Koreanisch', 'nl' => 'Niederländisch', 'no' => 'Norwegisch', 'pl' => 'Polnisch', 'pt' => 'Portugiesisch', 'ro' => 'Rumänisch', 'ru' => 'Russisch', 'sv' => 'Schwedisch', 'tr' => 'Türkisch', 'zh' => 'Chinesisch');
$l_generate_feed = 'Produktfeed generieren';
$l_feed_url = 'Ihre Feed-URL für <strong>' . $settings->name . '</strong> lautet:';
// Spanish
} elseif (LANG == 'es') {
$l_language = 'Idioma';
$l_languages = array('cs' => 'Checo', 'da' => 'Danés', 'de' => 'Alemán', 'el' => 'Griego', 'en' => 'Inglés', 'es' => 'Español', 'fi' => 'Finlandés', 'fr' => 'Francés', 'it' => 'Italiano', 'ja' => 'Japonés', 'ko' => 'Coreano', 'nl' => 'Neerlandés', 'no' => 'Noruego', 'pl' => 'Polaco', 'pt' => 'Portugués', 'ro' => 'Rumano', 'ru' => 'Ruso', 'sv' => 'Sueco', 'tr' => 'Turco', 'zh' => 'Chino');
$l_generate_feed = 'Generar feed de producto';
$l_feed_url = 'Su <strong>' . $settings->name . '</strong> URL de feed es:';
// French
} elseif (LANG == 'fr') {
$l_language = 'Langue';
$l_languages = array('cs' => 'Tchèque', 'da' => 'Danois', 'de' => 'Allemand', 'el' => 'Grecque', 'en' => 'Anglais', 'es' => 'Espagnol', 'fi' => 'Finnois', 'fr' => 'Français', 'it' => 'Italien', 'ja' => 'Japonais', 'ko' => 'Coréen', 'nl' => 'Néerlandais', 'no' => 'Norvège', 'pl' => 'Polonais', 'pt' => 'Portugais', 'ro' => 'Roumain', 'ru' => 'Russe', 'sv' => 'Suédois', 'tr' => 'Turc', 'zh' => 'Chinois');
$l_generate_feed = 'Générer le flux de produits';
$l_feed_url = 'Votre URL de flux <strong>' . $settings->name . '</strong> est la suivante:';
// Dutch
} elseif (LANG == 'nl') {
$l_language = 'Taal';
$l_languages = array('cs' => 'Tsjechisch', 'da' => 'Deens', 'de' => 'Duits', 'el' => 'Grieks', 'en' => 'Engels', 'es' => 'Spaans', 'fi' => 'Fins', 'fr' => 'Frans', 'it' => 'Italiaans', 'ja' => 'Japans', 'ko' => 'Koreaans', 'nl' => 'Nederlands', 'no' => 'Noors', 'pl' => 'Pools', 'pt' => 'Portugees', 'ro' => 'Roemeens', 'ru' => 'Russisch', 'sv' => 'Zweeds', 'tr' => 'Turks', 'zh' => 'Chinees');
$l_generate_feed = 'Productfeed genereren';
$l_feed_url = 'Uw <strong>' . $settings->name . '</strong> feed URL is:';
// Norwegian
} elseif (LANG == 'no') {
$l_language = 'Språk';
$l_languages = array('cs' => 'Tsjekkisk', 'da' => 'Danske', 'de' => 'Tysk', 'el' => 'Gresk', 'en' => 'Engelsk', 'es' => 'Spansk', 'fi' => 'Finske', 'fr' => 'Fransk', 'it' => 'Italiensk', 'ja' => 'Japansk', 'ko' => 'Koreansk', 'nl' => 'Nederlandsk', 'no' => 'Norsk', 'pl' => 'Polsk', 'pt' => 'Portugisisk', 'ro' => 'Rumensk', 'ru' => 'Russiske', 'sv' => 'Svenske', 'tr' => 'Turkish', 'zh' => 'Kinesisk');
$l_generate_feed = 'Generer produktmating';
$l_feed_url = 'Din <strong>' . $settings->name . '</strong> feed-nettadresse er:';
// Swedish
} elseif (LANG == 'sv') {
$l_language = 'Språk';
$l_languages = array('cs' => 'Tjeckisk', 'da' => 'Danska', 'de' => 'Tyska', 'el' => 'Grekiska', 'en' => 'Engelska', 'es' => 'Spanska', 'fi' => 'Finska', 'fr' => 'Franska', 'it' => 'Italienska', 'ja' => 'Japansk', 'ko' => 'koreansk', 'nl' => 'Nederländska', 'no' => 'Norska', 'pl' => 'Polska', 'pt' => 'Portugisiska', 'ro' => 'Rumänska', 'ru' => 'Ryska', 'sv' => 'Svenska', 'tr' => 'Turkiska', 'zh' => 'Kinesisk');
$l_generate_feed = 'Generera produktmatning';
$l_feed_url = 'Din <strong>' . $settings->name . '</strong> matningsadress är:';
// English by default
} else {
$l_language = 'Language';
$l_languages = array('cs' => 'Czech', 'da' => 'Danish', 'de' => 'German', 'el' => 'Greek', 'en' => 'English', 'es' => 'Spanish', 'fi' => 'Finnish', 'fr' => 'French', 'it' => 'Italian', 'ja' => 'Japanese', 'ko' => 'Korean', 'nl' => 'Dutch', 'no' => 'Norwegian', 'pl' => 'Polish', 'pt' => 'Portuguese', 'ro' => 'Romanian', 'ru' => 'Russian', 'sv' => 'Swedish', 'tr' => 'Turkish', 'zh' => 'Chinese');
$l_generate_feed = 'Generate product feed';
$l_feed_url = 'Your <strong>' . $settings->name . '</strong> feed URL is:';
}
/*--------------------------------
Block 4: Productfeed form
-------------------------------*/
echo '<!DOCTYPE html><html lang="en"><head><title>' . $settings->name . '</title><meta charset="utf-8">' .
'<link rel="stylesheet" href="style.css"></head>' .
'<body><main><h1>' . $settings->name . '</h1>';
// Show feed URL
if (isset($_POST['shop_id']) && SHOP_ID) {
// Create a token for this feed so the URL cannot be guessed
$feedurl = 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['DOCUMENT_URI'] .
'?shop_id=' . SHOP_ID . '&lang=' . LANG . '&token=' . sha1(SHOP_ID . LANG . 'roor8weiChait0gai');
echo '<p>' . $l_feed_url . '<br><a href="' . $feedurl . '" target="_blank">' . $feedurl . '</a></p>';
// Show generate feed form
} else {
echo '<form method="POST"><table>';
// Shop ID
if (SHOP_ID) {
echo '<input type="hidden" name="shop_id" value="' . SHOP_ID . '">';
} else {
echo '<tr><td>Shop ID</td><td><input type="text" name="shop_id" size="6"></td></tr>';
}
// Language
echo '<tr><td>' . $l_language . '</td><td><select name="lang">';
asort($l_languages);
foreach ($l_languages as $l => $l_name) {
echo '<option value="' . $l . '"' . ($l == $lang ? ' selected' : '') . '>' . $l_name . '</option>';
}
echo '</select></td></tr>';
// Submit form
echo '<tr><td></td><td><input type="submit" name="submit" value="' . $l_generate_feed . '"></td></tr>' .
'</table></form>';
}
echo '</main></body></html>';
/*--------------------------------
Block X: Functions
-------------------------------*/
function displayProducts($appdata) {
/* Google product feed:
https://support.google.com/merchants/answer/7052112?hl=en
*/
foreach ($appdata['products'] as $p) {
if (!isset($p['category'])) {
$p['category'] = '';
}
//echo "<item>\n";
// Image
//echo '<additional_image_link>' . $p['image'] . "</additional_image_link>\n
// ID (mandatory)
echo "<item>\n<id><![CDATA[" . $p['productID'] . "]]></id>\n<availability>" .
// Availability (Mandatory)
$p['status'] . "</availability>\n<brand><![CDATA[" .
// Brand (Mandatory)
$p['category'] . "]]></brand>\n" .
// Color
($p['colors'] ? '<color>' . $p['colors'] . "</color>\n" : '') .
// Condition (Recommended)
'<condition>' . $p['itemCondition'] . "</condition>\n<title><![CDATA[" .
// Title (Mandatory)
$p['name'] . "]]></title>\n<description><![CDATA[" .
// Description (Mandatory)
preg_replace('/[^(\x20-\x7F)]*/', '', $p['description']) . "]]></description>\n";
// EAN (Recommended)
if ($p['ean']) {
echo '<ean>' . $p['ean'] . "</ean>\n";
}
// Product code
//echo '<unique_id><![CDATA[' . $p['productID'] . "]]></unique_id>\n<size>" .
// Size (Mandatory)
echo '<size>' . $p['weight'] . "</size>\n<image_link>" .
// Image link (Mandatory)
$p['image'] . "</image_link>\n";
// Additional image links
for ($i = 2; $i <= 5; $i++) {
if (isset($p['image' . $i])) {
echo '<additional_image_link>' . $p['image' . $i] . "</additional_image_link>\n";
}
}
// Purchase price
if ($p['purchase_price']) {
echo '<cost_of_goods_sold>' . $p['purchase_price'] . "</cost_of_goods_sold>\n";
}
// Price (Mandatory)
echo '<price>' . ($p['old_price'] ? $p['old_price'] : $p['price']) . "</price>\n<sale_price>" .
// Sale price (Mandatory)
$p['price'] . "</sale_price>\n<link>" .
// Link (Mandatory)
$p['url'] . "</link>\n<product_type><![CDATA[" .
// Breadcrumb (Mandatory)
$p['category'] . "]]></product_type>\n<stock>" .
// Stock (Recommended)
$p['stock'] . "</stock>\n";
/* Shipping costs
[shipping] => Array
(
[Worldwide] => Array
(
[Pickup in the store] => 0
[Pickup at collection point] => 0
)
[BE] => Array
(
[Standard delivery] => 10
)
[NL] => Array
(
[Collect on delivery] => 5
)
)
*/
if (isset($p['shipping']) && $p['shipping']) {
$price_set = false;
foreach ($p['shipping'] as $country => $methods) {
// Try to set a shipping price
foreach ($methods as $method => $price) {
if ($price_set) {
break;
}
if ($method != 'Pickup in the store') {
echo '<shipping_price>' . $price . "</shipping_price>\n"; // ' ' . $appdata['webshop']['currency']
$price_set = true;
break;
}
}
}
}
echo "</item>\n";
}
} // displayProducts()
// Check for a valid shop id
function checkId($id) {
return filter_var($id, FILTER_VALIDATE_INT, array('options' => array('min_range' => 1, 'max_range' => 1000000000)));
} // checkId()
?>
body { margin: 0; font-family: Helvetica, Arial, sans-serif; color: #333; background-color: #e4e4e4; }
main { margin: 0 auto; margin-top: 30px; margin-bottom: 30px; padding: 20px; width: 760px; background-color: #fff; border-radius: 8px; border: 1px solid #ccc; box-shadow: 5px 5px 5px #888; }
#logo { float: left; margin-bottom: 10px; }
h1 { font-size: 22px; margin: 0; padding: 0; color: #06c; margin-bottom: 80px; }
hr { clear: both; border-style: solid; border-width: 1px 0 0 0; border-color: #e4e4e4; margin: 20px 0; }
/*--------------------------------
Buttons
-------------------------------*/
a.glowbutton, input[type="submit"], input[type="button"] {
white-space: nowrap; display: inline-block; min-width: 210px; margin: 0 0 10px 0; padding: 0;
text-decoration: none; text-align: center;
color: #fff; background-color: #06c; border: 0; border-radius: 3px;
line-height: 33px; height: 33px; font-weight: bold; font-size: 0.9em;
-webkit-appearance: none; -moz-appearance: none; appearance: none;
transition: background 0.4s;
}
a.glowbutton:hover, input[type="submit"]:hover {
background-color: #06f; text-decoration: none;
}
/*--------------------------------
Fancy
-------------------------------*/
a { color: #06c; text-decoration: none; }
a:hover { text-decoration: underline; }
h2 { font-size: 1.6em; }
h3 { font-size: 1.4em; }
h4 { font-size: 1.1em; color: #666; }
.blue { color: #06c; }
.orange { color: #f60; }
.code { font-family: monospace; color: #090; }
.code a { font-weight: bold; color: #090; }
.warn { background-color: #fc0; padding: 15px 5px; text-align: center; border-radius: 5px; font-size: 0.9em; box-shadow: 2px 2px 2px #888; }
/*--------------------------------
Forms
-------------------------------*/
textarea { width: 99%; height: 200px; font-size: 1.2em; color: #666; }
input, select, textarea { border: 1px solid #ccc; border-radius: 3px; margin: 0px 0 8px 0; padding: 8px; }
input:focus, textarea:focus { background-color: #eee; }
input[type="checkbox"], input[type="radio"] { border: 0;}
input[type="submit"], input[type="button"] { cursor: pointer; float: right; margin: 10px 0 0 0; }
form table { width: 100%; }
form table td:first-child { width: 50%; }
/*--------------------------------
Responsive
-------------------------------*/
@media all and (max-width: 790px) {
main { max-width: calc(100vw - 20px); margin: 0; padding: 20px 10px; border: none; border-radius: 0; }
textarea { width: 97%; }
}
Dostawca Usług Płatniczych
Jest to sposób na połączenie Dostawcy Usług Płatniczych (PSP) z EasyWebshop.
Połączenie musi zostać zainstalowane przez sprzedawcę, a metody płatności muszą zostać połączone poprzez ich wybór.
Po złożeniu zamówienia w sklepie internetowym przez klienta, pojawia się strona z przyciskiem Zapłać teraz. Ten przycisk przesyła formularz HTML.
- Twoje połączenie otrzymuje dane POST z tego formularza, które zawierają kod zamówienia. Za pomocą Tokenu Połączenia API możesz bezpiecznie pobrać dane zamówienia, które są niezbędne do przetworzenia płatności.
- Połącz się z API dostawcy usług płatniczych i wyślij dane zamówienia.
- Jeśli płatność zostanie pomyślnie zrealizowana, dostawca usług płatniczych żąda pliku report.php, który aktualizuje status zamówienia w sklepie internetowym na Płatność otrzymana.
- Klient jest przekierowywany do adresu URL płatność ok lub do adresu URL płatność nieudana, w zależności od powodzenia lub niepowodzenia płatności.
- Jeśli ustawiono wiele metod płatności, klient może wybrać inną metodę płatności po nieudanej płatności.
- settings.xml
- easywebshop.php
- index.php
- report.php
- style.css
<?xml version="1.0" encoding="UTF-8" ?>
<settings>
<name>DemoPSP</name>
<logo>demo-psp.png</logo>
<type>psp</type>
<url>https://www.webshopdata.com/app/easywebshop-psp/index.php</url>
<parameter name="PSP API key">123456789</parameter>
</settings>
<?php
/*
EasyWebshop API Connector
Documentation: https://easywebshop.com/doc/api
*/
function easyApp($data = '') {
// Set your API Connection Token (not API Token!) here
$conn_token = 'YOUR_API_TOKEN';
// No need to change anything below. You can watch, but you can't touch!
if (!isset($_REQUEST['shop_id']) || !$_REQUEST['shop_id'] ||
!filter_var($_REQUEST['shop_id'], FILTER_VALIDATE_INT,
array('options' => array('min_range' => 1, 'max_range' => 1000000000)))) {
die('Error: $_REQUEST[\'shop_id\'] not set');
}
$settings = new SimpleXMLElement(file_get_contents(dirname(__FILE__) . '/settings.xml'));
$method = isset($data['function']) && substr($data['function'], 0, 3) == 'set' ? 'PUT' : 'GET';
$format = isset($data['format']) && in_array(strtolower($data['format']), array('json', 'xml')) ?
strtolower($data['format']) : 'array';
$data = is_array($data) ? ($method == 'GET' ? http_build_query($data) : json_encode($data)) : '';
$apiurl = 'https://easywebshop.jan/api/conn/' . $_REQUEST['shop_id'] . '/' . $settings->name .
($method == 'GET' && $data ? '?' . $data : ''); // HTTPS only
$opts = array(
'http' => array(
'header' => "Content-Type: application/x-www-form-urlencoded\r\n" .
'Authorization: Bearer ' .
hash('sha512', $_REQUEST['shop_id'] . $settings->name . hash('sha256', $conn_token) . $data) . "\r\n",
'method' => $method,
'ignore_errors' => true),
'ssl' => array('verify_peer' => false, 'verify_peer_name' => false)
);
if ($method == 'PUT') { $opts['http']['content'] = $data; }
$response = file_get_contents($apiurl, false, stream_context_create($opts));
$appdata = $format == 'array' ? json_decode($response, true) : $response;
// Output log - only in debug mode
if (defined('DEBUG') && DEBUG) {
echo "<pre>-- easywebshop.php " . $settings->name . "\n> Accessing API: " .
$apiurl . "\n> API response: " . $response . "--\n</pre>";
}
return $appdata; // this can be a PHP array, JSON or XML, depending on the $data['format'] value
} // easyApp()
?>
<?php
/*--------------------------------------------
* This page redirects a customer to the PSP
Install link:
https://easywebshop.com/software/connections?install=https://www.webshopdata.com/app/easywebshop-psp
Block 1: Variables
Block 2: Languages
Block 3: PSP API code
Block 4: Start page
Block X: Functions
--------------------------------------------*/
/*--------------------------------
Block 1: Variables
-------------------------------*/
// Debug mode for testing, set to false in production
define('DEBUG', true);
// Use test data
define('TEST', true);
// Use for testing without POST vars from payment form
if (TEST) {
$_REQUEST = array('shop_id' => 71911, 'ordercode' => '20250-71911-19417-18497', 'lang' => 'en');
}
define('SHOP_ID', isset($_REQUEST['shop_id']) && checkId($_REQUEST['shop_id']) ? $_REQUEST['shop_id'] : 0);
define('ORDERCODE', isset($_REQUEST['ordercode']) && checkOrderCode($_REQUEST['ordercode']) ? $_REQUEST['ordercode'] : '');
$error = '';
if (!ORDERCODE) {
$error = 'Invalid Order code';
}
// Easywebshop API connector
require 'easywebshop.php';
$appdata = easyApp(array('ordercode' => ORDERCODE));
$settings = (array)simplexml_load_file('settings.xml');
$log = "REQUEST variables:\n\n" . print_r($_REQUEST, true) .
"\n\nAppdata: \n\n" . print_r($appdata, true) . "\n\nSettings: \n\n" . print_r($settings, true);
// URL requested by PSP on payment status update
$reporturl = 'https://' . $_SERVER['HTTP_HOST'] .
substr($_SERVER['DOCUMENT_URI'], 0, strrpos($_SERVER['DOCUMENT_URI'], '/')) .
'/report.php?shop_id=' . SHOP_ID;
/*--------------------------------
Block 2: Languages
-------------------------------*/
// Dutch
if ($_REQUEST['lang'] == 'nl') {
$l_paymentok = 'Betaling geslaagd';
$l_paymentfail = 'Betaling mislukt';
// German
} elseif ($_REQUEST['lang'] == 'de') {
$l_paymentok = 'Zahlung erfolgreich';
$l_paymentfail = 'Zahlung fehlgeschlagen';
// Spanish
} elseif ($_REQUEST['lang'] == 'es') {
$l_paymentok = 'Pago efectuado';
$l_paymentfail = 'Pago fallido';
// French
} elseif ($_REQUEST['lang'] == 'fr') {
$l_paymentok = 'Paiement réussi';
$l_paymentfail = 'Échec du paiement';
// Default to English
} else {
$l_paymentok = 'Payment successful';
$l_paymentfail = 'Payment failed';
}
/*--------------------------------
Block 3: PSP API code
-------------------------------*/
/*--------------------------------
Block 4: Start page
-------------------------------*/
echo '<!DOCTYPE html><html lang="en"><head><title>' . $settings['name'] .
'</title><meta charset="utf-8"><link rel="stylesheet" href="style.css"></head>' .
'<body><main><p><img src="' . $settings['logo'] . '" style="margin: 5px"></p>';
// Error message
if ($error) {
echo '<p class="warn">' . $error . '</p>';
}
// Action buttons
if (isset($appdata['order']['code'])) {
echo '<p class="leftbuttons"><a href="' . $reporturl . '&ordercode=' . $appdata['order']['code'] .
'" class="glowbutton" style="background: #5fc331">' . $l_paymentok . '</a><a href="' .
$appdata['webshop']['paymentfailed'] . '" class="glowbutton" style="background: #c00">' .
$l_paymentfail . '</a></p>';
// Back to webshop
echo '<hr><p><a href="' . $appdata['webshop']['url'] . '/payment/' . $appdata['order']['code'] .
'" class="glowbutton">' . $appdata['webshop']['name'] . '</a></p>';
}
// Debug output -- you can find all $_POST, $appdata and $settings variables here
if (DEBUG) {
echo '<h2>Debug log</h2><pre>' . $log . '</pre>';
}
echo '</main></body></html>';
/*--------------------------------
Block X: Functions
-------------------------------*/
// Check for a valid shop id
function checkId($id) {
return filter_var($id, FILTER_VALIDATE_INT, array('options' => array('min_range' => 1, 'max_range' => 1000000000)));
} // checkId()
function checkOrderCode($code) {
return strlen($code) == 23 && preg_match('/\d\d\d\d\d-\d\d\d\d\d-\d\d\d\d\d-\d\d\d\d\d/', $code);
} // checkOrderCode()
?>
<?php
/*--------------------------------------------
* This page is usually requested "under water" by the PSP and updates the payment status
Block 1: Variables for EasyWebshop API
Block 2: PSP API code
Block 3: Set order paid
Block X: Functions
--------------------------------------------*/
header("Content-Type: text/plain; charset=utf-8");
/*--------------------------------
Block 1: Variables
-------------------------------*/
define('DEBUG', true); // Debug mode for testing, set to false in production
define('DEBUG_EMAIL', 'test@ew.ms'); // Send an email with debug log
$error = '';
// Easywebshop API connector
require 'easywebshop.php';
$appdata = easyApp(); // PSP must send shop_id in GET or POST
$settings = (array)simplexml_load_file('settings.xml');
$log = $settings['name'] . " report.php\n\n" .
'X forwarded: ' . (isset($_SERVER['HTTP_X_FORWARDED_FOR']) ?
$_SERVER['HTTP_X_FORWARDED_FOR'] : '') .
', IP: ' . $_SERVER['REMOTE_ADDR'] .
"\n\nGET variables:\n\n" . print_r($_GET, true) .
"\n\nPOST variables:\n\n" . print_r($_POST, true) .
"\n\nAppdata: \n\n" . print_r($appdata, true) .
"\n\nSettings: \n\n" . print_r($settings, true);
// report.php needed variables
$order_code = ''; // PSP must send order_code in GET or POST
$order_paid = false; // Set to TRUE if payment is successful
/*--------------------------------
Block 2: PSP API code
-------------------------------*/
// Check if ordercode is correct
if (isset($_REQUEST['ordercode']) && strlen($_REQUEST['ordercode']) == 23 &&
preg_match('/\d\d\d\d\d-\d\d\d\d\d-\d\d\d\d\d-\d\d\d\d\d/', $_REQUEST['ordercode'])) {
$order_code = $_REQUEST['ordercode']; // this variable is safe now
} else {
$error = 'Invalid order code';
}
// Check if correct GET or POST variables are received
if (!$error) {
/* Here you can check if the payment status update request is valid:
- Calculate a hash
- Make a request to the PSP API
*/
// Calculate hash
if (true) {
$order_paid = true;
}
/* Check payment status with PSP
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, '');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_HEADER, FALSE);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'api_key: ' . $appdata['parameter1'],
'Accept: application/json',
'Content-Type: application/json'
)
);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
if (DEBUG) {
curl_setopt($ch, CURLOPT_VERBOSE, true);
curl_setopt($ch, CURLOPT_STDERR, $verbose = fopen('php://temp', 'rw+'));
curl_setopt($ch, CURLOPT_FILETIME, true);
}
$response = curl_exec($ch);
if (curl_errno($ch)) {
$error_msg = curl_error($ch);
}
curl_close($ch);
if (DEBUG) {
$log .= (isset($error_msg) ? "\n\nHTTP Log:\n" . print_r($error_msg, true) . "\n\n" : '') .
"Verbose information:\n" . !rewind($verbose) . stream_get_contents($verbose) . "\n\n" .
print_r($response, true);
}
$response = json_decode($response, true);
if ($response && isset($response['success']) && $response['success'] &&
isset($response['data']['financial_status']) && $response['data']['financial_status'] == 'completed') {
$order_paid = true;
$order_code = $response['data']['var2'];
}
*/
// Error found
} elseif (DEBUG) {
mailLog($log . "\n\nErrors:\n\n" . $error);
} // no errors
/*--------------------------------
Block 3: Set order paid
-------------------------------*/
if ($order_paid) {
// The connector needs $_REQUEST['shop_id'] and $_REQUEST['ordercode'] for changing the order status
$pmdata = easyApp(array('function' => 'setOrderPaid', 'ordercode' => $order_code));
$log .= "\n\nOrder update result:\n\n" . print_r($pmdata, true);
}
if (DEBUG) {
echo $log;
mailLog($log);
}
// Optional: redirect if customer comes on this page directly
header('Location: ' . $appdata['webshop']['paymentok']);
// Acknowledge we have successfully received a valid notification by returning OK
echo 'OK';
/*--------------------------------
Block X: Functions
-------------------------------*/
// Send mail
function mailLog($log) {
$subject = preg_split('#\r?\n#', ltrim($log), 2)[0]; // get first line
mail(DEBUG_EMAIL, $subject, $log . "\n\n" .
// Username
(isset($_SERVER['PHP_AUTH_USER']) ? 'User: ' . $_SERVER['PHP_AUTH_USER'] . "\n" : '') .
// IP Address
(isset($_SERVER['HTTP_X_FORWARDED_FOR']) ? $_SERVER['HTTP_X_FORWARDED_FOR'] . "\n" : '') .
$_SERVER['REMOTE_ADDR']);
} // mailLog()
die;
?>
body { margin: 0; font-family: Helvetica, Arial, sans-serif; color: #333; background-color: #E4E4E4; }
main {
margin: 0 auto; margin-top: 30px; margin-bottom: 30px; padding: 20px; width: 760px;
background-color: #FFF; border-radius: 8px; border: 1px solid #CCC; box-shadow: 5px 5px 5px #888;
}
h1 { font-size: 22px; margin: 0; padding: 0; color: #06C; margin-bottom: 80px; }
hr { clear: both; border-style: solid; border-width: 1px 0 0 0; border-color: #E4E4E4; margin: 20px 0; }
/*--------------------------------
Navigation
-------------------------------*/
nav { margin: 40px 0; clear: both; }
nav a {
display: block; width: 70%; margin: 30px auto; padding: 20px; vertical-align: top;
border: 1px solid #E4E4E4; box-shadow: 2px 2px 2px #888;
/*border-style: solid; border-width: 0 0 1px 0; border-color: #CCC;*/
text-decoration: none; color: #06C; font-size: 20px; font-weight: bold;
transition: background 0.4s;
}
nav a:hover { background: #EEE; }
nav img { display: inline-block; float: left; width: 100px; height: 100px; vertical-align: top; }
nav span{ display: inline-block; line-height: 100px; text-indent: 30px; }
.langselect { font-size: 0.8em; font-weight: bold; }
/*--------------------------------
Buttons
-------------------------------*/
a.glowbutton, input[type="submit"], input[type="button"] {
white-space: nowrap; display: inline-block; min-width: 210px; margin: 0 0 10px 0; padding: 0;
text-decoration: none; text-align: center;
color: #FFF; background-color: #00abee; border: 0; border-radius: 6px;
line-height: 33px; height: 33px; font-weight: bold; font-size: 0.9em;
-webkit-appearance: none; -moz-appearance: none; appearance: none;
transition: background 0.4s;
}
a.glowbutton:hover, input[type="submit"]:hover {
background-color: #0085c4; text-decoration: none;
}
.leftbuttons a { margin-right: 10px !important; }
/*--------------------------------
Fancy
-------------------------------*/
a { color: #06C; text-decoration: none; }
a:hover { text-decoration: underline; }
h2 { font-size: 1.6em; }
h3 { font-size: 1.4em; }
h4 { font-size: 1.1em; color: #666; }
.blue { color: #06C; }
.orange { color: #F60; }
.code { font-family: monospace; color: #090; }
.code a { font-weight: bold; color: #090; }
.warn {
background-color: #FC0; padding: 15px 5px; text-align: center;
border-radius: 5px; font-size: 0.9em; box-shadow: 2px 2px 2px #888;
}
/*--------------------------------
Forms
-------------------------------*/
textarea { width: 99%; height: 200px; font-size: 1.2em; color: #666; }
input, select, textarea { border: 1px solid #CCC; border-radius: 3px; padding: 3px; }
input:focus, textarea:focus { background-color: #EEE; }
input[type="checkbox"], input[type="radio"] { border: 0;}
input[type="submit"], input[type="button"] { cursor: pointer; float: right; margin: 10px 0 0 0; }
form table { width: 100%; }
form table td:first-child { width: 50%; }
/*--------------------------------
Responsive
-------------------------------*/
@media all and (max-width: 790px) {
main { width: 100%; margin: 0; padding: 20px 0; border: none; border-radius: 0; }
nav a { margin: 0 auto; margin-top: 20px; margin-bottom: 20px; }
textarea { width: 97%; }
}
Instalowanie połączeń
Zmień URL w przykładzie na adres URL swojego połączenia. Nasze zaplecze automatycznie odczytuje plik settings.xml i prosi użytkownika o wprowadzenie niezbędnych danych.
<a href="https://easywebshop.com/software/connections/?install=https://www.webshopdata.com/app/easywebshop-psp">Install</a>
Możesz dodać logo EasyWebshop do swojej witryny, gdy połączenie będzie gotowe.
Rozwiązywanie problemów
Dopracowaliśmy API EasyWebshop, aby było tak łatwe, jak to tylko możliwe. Oferujemy również wysokiej jakości usługę pomocy technicznej z opcjonalną pomocą programisty w przypadku bardziej technicznych pytań. Celem API jest umożliwienie połączenia z innymi platformami i aplikacjami. Mogą one nie mieć łatwego w użyciu API ani poziomu wsparcia, jaki oferujemy. Pamiętaj, kontaktując się z nami, możemy zapewnić pomoc tylko dla EasyWebshop, a nie dla zewnętrznych aplikacji.
Jeśli potrzebujesz pomocy z językami programowania, najlepiej przeczytać ich strony dokumentacji. Większość jest bardzo dobrze udokumentowana. Możliwe, że możesz użyć AI do wygenerowania kodu dla swojego połączenia, ale proszę nie oczekiwać, że nasze wsparcie naprawi błędy w Twoim kodzie.
Podczas Lata projektowania stron internetowych tworzymy niestandardowe połączenia dla naszych użytkowników. Te połączenia są tworzone przez doświadczonych programistów. Jeśli potrzebujesz złożonego połączenia lub funkcji, to jest właściwa droga.
- Otrzymuję błąd: "Nieprawidłowy hash integralności danych"
- Sprawdź, czy Token Połączenia API (nie zwykły Token API) jest ustawiony w pliku easywebshop.php
- Sprawdź, czy adres URL jest poprawnie ustawiony
- Sprawdź, czy połączenie jest zainstalowane przez sklep internetowy
Przydatne linki
- REST (Representational State Transfer)
- JSON-LD (JavaScript Object Notation Linked Data)
- curl
- HTTP Status Codes
- W3Schools JSON Tutorial
- JSON online validator
- PHP.net
Technologie używane przez nasze API zostały wybrane z następujących powodów:
- Łatwe do wdrożenia
- Bezpieczny transfer danych przez HTTPS (brak więcej niebezpiecznych połączeń FTP)
- Komunikacja w czasie rzeczywistym
- Brak konieczności posiadania dodatkowych serwerów lub dodatkowych baz danych
- Skalowalność do większych wolumenów danych
- Może być używane z dowolną platformą, frameworkiem i językiem programowania
- Brak problemów z zaporami sieciowymi
- Wykorzystuje standardy i ogólne praktyki REST, JSON, JSON-LD, XML i HTTPS
- Uwierzytelnianie Bearer z niestandardowymi uprawnieniami
- Kodowanie UTF-8
Jeśli chcesz używać curl w PHP, musisz zainstalować rozszerzenie php-curl. W systemach opartych na Debianie (w tym Ubuntu) użyj następującego polecenia:
sudo apt-get install php-curl