EasyWebshop API
La Interfaz de Programación de Aplicaciones (API) conecta su tienda en línea con plataformas externas como proveedores de pago, servicios de entrega y aplicaciones de oficina. Hemos realizado un esfuerzo considerable para que la API sea fácil de usar, incluso para quienes no son expertos en tecnología. Esto permitirá en algunos casos que nuestros usuarios conecten su tienda en línea por sí mismos, en lugar de tener que depender de un desarrollador costoso.
Gracias a la compatibilidad con las prácticas generales y los estándares de la industria, las conexiones a nuestra API se pueden realizar rápidamente y, posiblemente, con la ayuda de código generado por IA. Lea esta página detenidamente si desea crear una conexión usted mismo.
Resumen de características
- Conexión con proveedores de servicios de pago
- Conexión con servicios de entrega
- Conexión con software TPV (Terminal Punto de Venta), local y en la nube
- Importación de productos desde proveedores o mayoristas
- Exportación de productos a sitios de comparación
- Conexión con software de facturación
- Conexión con software CRM
- Conexión con software de gestión logística
- Actualización de existencias (inventario) en tiempo real
- Aceptar o denegar clientes según ciertos criterios
- Exportación de pedidos en tiempo real para dropshipping
- Exportación de clientes para aplicaciones de boletines informativos
- Exportación de datos para informes y análisis
- Creación de conexiones que instalan widgets HTML/JavaScript/CSS con solo pulsar un botón
- Creación de informes personalizados de inventario, pedidos, clientes y ventas
API, API Push y Conexiones
API | API Push | Conexiones |
---|---|---|
Para importar y exportar categorías, productos, pedidos y clientes. | Para sincronizar existencias o aceptar clientes en tiempo real. | Para conectar proveedores de pago, servicios de entrega, sitios de comparación, puntos de venta, aplicaciones de facturación e instalar widgets. |
Autenticación con token Bearer. | Ingrese la URL de Push en el módulo API. | Autenticación con token Bearer (conexión) e instalación de la conexión (usuario). |
Personalizado para un usuario. | Personalizado para un usuario. | Puede ser instalado por todos los usuarios. |
API
Active la API de EasyWebshop en Configuración > Módulos > API de Easywebshop utilizando el código de activación MODA.
Si la API de EasyWebshop no se muestra en el menú, navegue a Configuración > Más opciones > Nivel de experiencia del usuario y cambie el nivel de experiencia del usuario a Experto.
Active la API solo si la va a utilizar. Por razones de seguridad, desactive la API cuando no esté en uso.
- Punto de conexión de la APICopiar
- https://easywebshop.com/api¡Utilice siempre la versión https! Autenticarse mediante http de texto sin formato puede provocar la filtración de su Token de API.
No incluya el subdominio www. - ?format=xml
- Cambie el formato de salida de JSON a XML.
- ?pretty=1
- Salida formateada para mejorar la legibilidad humana. Elimine esto para ahorrar ancho de banda en sistemas automatizados.
Cuando utilice múltiples parámetros, sepárelos con & (ampersand). Por ejemplo: ?format=xml&pretty=1.
En la línea de comandos, escape los ampersands de esta manera: ?format=xml\&pretty=1.
Utilice nuestra API con precaución y solo consulte o actualice lo que necesite. No utilice sondeo (polling) si en su lugar se puede utilizar la función API Push. Se imponen límites para evitar el desperdicio de recursos del servidor.
Autenticación
Haga clic en el botón Agregar para crear un Token de API y seleccione los permisos deseados para este token.
Para mayor seguridad, seleccione únicamente los permisos que sean estrictamente necesarios. Revoque los permisos cuando no sean necesarios.
Después de guardar, copie su Token de API para usarlo en su aplicación o para enviarlo a un desarrollador. Solo puede hacer esto una vez: si pierde su Token de API, deberá eliminarlo y crear uno nuevo.
Utilice su Token de API con precaución.
No envíe su Token de API a través de un canal de comunicación inseguro como el correo electrónico o WhatsApp. Recomendamos SimpleX Chat si necesita enviar su Token de API a un desarrollador. No almacene su Token de API en un dispositivo inseguro. Nosotros no almacenamos su Token de API en absoluto, solo un hash del mismo.
- Solicitud
- Respuesta
- 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"
}
Recupera el estado de la API
curl -D - https://easywebshop.com/api/status
Guarda la respuesta en un archivo 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);
?>
En esta documentación, proporcionamos ejemplos para curl y PHP. La IA moderna es cada vez más eficaz para convertir código a otros lenguajes de programación como C, Java o Python.
Categorías
Visualización de categorías
- GET /api/category
- Recupera todas las categorías
- GET /api/category/[categoryName]
- Recupera todos los productos dentro de una categoría específica
Utilice el nombre de la categoría en el idioma predeterminado de la tienda en línea
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"
}
}
]
}
}
]
}
Recupera todas las categorías
curl -H "Authorization: Bearer YOUR_API_TOKEN" -D - https://easywebshop.com/api/category
Recupera todos los productos dentro de una categoría específica
curl -H "Authorization: Bearer YOUR_API_TOKEN" -D - https://easywebshop.com/api/category/Cocktails
Recupera todas las categorías en formato JSON legible por humanos
curl -H "Authorization: Bearer YOUR_API_TOKEN" -D - https://easywebshop.com/api/category?pretty=1
Recupera todas las categorías en formato XML legible por humanos
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>
Las categorías solo se pueden visualizar. No existe una implementación de API para crear, editar y eliminar categorías porque estas funciones se utilizan raramente y crearían una superficie de ataque adicional. La gestión de categorías se puede realizar utilizando la interfaz web.
Productos
Visualización de productos
EasyWebshop sigue el formato schema.org/Product siempre que sea posible.
- GET /api/product
- Recupera los últimos 1000 productos
- GET /api/product?offset=1000
- Recupera los últimos 1000 productos, pero omite los primeros 1000 productos
- GET /api/product/86400
- Recupera productos que fueron agregados o modificados en las últimas 24 horas
- GET /api/product/[productID]
- Busca un producto por ID de producto (productID), distingue entre mayúsculas y minúsculas
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"
}
}
]
}
Recupera los últimos 1000 productos
curl -H "Authorization: Bearer YOUR_API_TOKEN" -D - https://easywebshop.com/api/product
Recupera los últimos 1000 productos, pero omite los primeros 1000 productos
curl -H "Authorization: Bearer YOUR_API_TOKEN" -D - https://easywebshop.com/api/product?offset=1000
Recupera productos que fueron agregados o modificados en las últimas 24 horas
curl -H "Authorization: Bearer YOUR_API_TOKEN" -D - https://easywebshop.com/api/product/86400
Busca un producto por ID de producto (productID), distingue entre mayúsculas y minúsculas
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>
Importación de productos
- POST /api/product
- En caso de éxito, se devolverá 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>
Puede encontrar una explicación detallada de todos los campos de producto en la página de documentación de Gestión básica de productos y Gestión avanzada de productos.
Parámetro | Tipo | Descripción |
---|---|---|
productID | string | Artículo. Un identificador único y definido por el usuario para el producto. Evite caracteres especiales e identificadores duplicados o ambiguos. Al editar un producto, el ID de producto (productID) se utiliza como identificador. El ID de producto solo se puede cambiar con la gestión de productos. |
parent_productID | string | Si desea que este producto sea una variación de producto, ingrese aquí el ID de producto (productID) del producto principal. Las variaciones actúan como productos independientes. Están conectadas a un producto principal en lugar de a una categoría y, por lo tanto, no son visibles en las listas de productos. No se recomiendan las subvariaciones y solo se pueden configurar con la gestión de productos. |
category | string | El nombre de la categoría en el idioma predeterminado de la tienda en línea. No aplicable para variaciones de producto. |
name:lang | string | Nombre. Puede establecer nombres y descripciones para todos los idiomas, incluso si no están activados en la tienda en línea. Idiomas disponibles (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 | Descripción Idiomas disponibles (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 | Precio. Puede ser decimal, entero, vacío o una cadena de texto. |
stock | integer | Stock. Dejar en 0 para existencias infinitas o existencias deshabilitadas. |
status | string | Estatus 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 | Incluya una URL de imagen para cargar fotos de producto. La primera imagen es la foto principal, las siguientes cuatro son fotos secundarias. Si ya existe una foto de producto, será reemplazada. Después de la carga, las imágenes se escalarán proporcionalmente según la configuración de la tienda en línea, las miniaturas se crearán automáticamente y la imagen se sincronizará con múltiples servidores de archivos. Asegúrese de que cada imagen tenga una URL válida, un tamaño máximo de archivo de 25 MB, una extensión válida (.jpg, .jpeg, .png o .gif) y un tipo MIME válido (image/jpeg, image/jpg, image/png, image/gif). La carga de imágenes consume tiempo y recursos del servidor. Evite reemplazar las mismas imágenes al actualizar productos. Si experimenta tiempos de espera agotados (time-outs), cargue un número limitado de productos en lotes de 25 imágenes cada uno.1 - 5 |
thumbnail:no | string | Las miniaturas se generan automáticamente. Este es un parámetro de solo lectura. |
weight | decimal | Peso. Unidad SI: kilogramo. |
vat_code | integer | Tipo del IVA. Tasa de IVA configurada en configuración de facturas. 0, 1, 2 |
condition | string | Condición New, Used, Refurbished |
gtin | string | Código EAN |
old_price | string | Precio anterior |
units | string | Unidades |
mpq | integer | Compra mínima |
purchase_price | decimal | Precio de compra |
promo | boolean | Promocionar este producto en la página principal de mi tienda online. No aplicable para variaciones de producto. |
label_id | integer | Etiqueta. Dejar en 0 para sin etiqueta. No aplicable para variaciones de producto. 0 - 100 |
colors | string | Colores. Elija entre los 256 nombres de colores seguros para la web en inglés, separados por comas. |
params | string | Personalización del producto. Los parámetros tienen un formato especial y se configuran mejor utilizando la interfaz de gestión de productos. Una vez que tenga un ejemplo, puede copiarlo para importar. |
review | boolean | Opiniones. Habilitar o deshabilitar reseñas de productos. |
last_update | datetime | Última actividad. Solo lectura. |
Estas secciones solo se pueden configurar utilizando la interfaz de gestión: descuentos por volumen, grupos de clientes, vales de regalo, reservaciones, productos descargables, filtros, productos relacionados.
Se pueden importar hasta 100 productos a la vez. Si desea importar más productos, puede repetir el comando una vez cada 5 minutos.
Edición de productos
También puede editar productos utilizando la función de edición rápida, la función de importación y la función de operaciones masivas.
- PUT /api/product
- En caso de éxito, se devolverá 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>
Si desea actualizar las existencias del producto, actualice solo los campos de estado y existencias. Recuerde establecer el estado de producto apropiado para situaciones como Agotado o Existencias infinitas.
Se pueden actualizar hasta 100 productos a la vez. Si desea actualizar más productos, puede repetir el comando una vez cada 5 minutos.
Eliminación de productos
- DELETE /api/product/[productID]
- En caso de éxito, se devolverá 204 No Content
- Solicitud
- Respuesta
- 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);
?>
Clientes
Visualización de clientes
EasyWebshop sigue el formato schema.org/Person.
- GET /api/customer
- Recupera los últimos 1000 clientes
- GET /api/customer?offset=1000
- Recupera los últimos 1000 clientes, pero omite los primeros 1000 clientes
- GET /api/customer/86400
- Recupera clientes que fueron agregados o modificados en las últimas 24 horas
- GET /api/customer/[email]
- Recupera un cliente específico por dirección de correo electrónico
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
}
}
]
}
Recupera los últimos 1000 clientes
curl -H "Authorization: Bearer YOUR_API_TOKEN" -D - https://easywebshop.com/api/customer
Recupera los últimos 1000 clientes, pero omite los primeros 1000 clientes
curl -H "Authorization: Bearer YOUR_API_TOKEN" -D - https://easywebshop.com/api/customer?offset=1000
Recupera clientes que fueron agregados o modificados en las últimas 24 horas
curl -H "Authorization: Bearer YOUR_API_TOKEN" -D - https://easywebshop.com/api/customer/86400
Recupera un cliente específico por dirección de correo electrónico
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>
Importación de clientes
Cada cliente recibe un correo electrónico para verificar la dirección de correo electrónico.
- POST /api/customer
- En caso de éxito, se devolverá 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>
Puede encontrar información detallada en la página wiki de gestión de clientes.
Parámetro | Tipo | Descripción |
---|---|---|
string | Correo electrónico. La dirección de correo electrónico es el identificador único del cliente. | |
givenName | string | Nombre |
familyName | string | Apellidos |
brand | string | Empresa |
vatID | string | CIF / NIF |
knowsLanguage | string | Idioma (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 | País (ISO_3166-1) |
addressLocality | string | Ciudad |
addressRegion | string | Provincia. No es obligatorio para la mayoría de los países y a menudo se omite para acortar el formulario de pago. |
postalCode | string | Código postal. No todos los países tienen códigos postales. |
streetAddress | string | Calle |
houseNo | string | Número de casa. Algunos lugares no tienen número de casa. |
telephone | string | Teléfono |
memberOf | string | Grupo de clientes |
status | string | Estatus Unconfirmed, Confirmed, Denied |
denied | boolean | No aceptado 0 - 1 |
newsletter | boolean | Recibir el boletín. Solo los propios clientes pueden activar esto. |
registration_date | datetime | Fecha de registro. Solo lectura. |
Se pueden importar hasta 100 clientes a la vez. Si desea importar más clientes, puede repetir el comando una vez cada 5 minutos.
Edición de clientes
Tenga en cuenta que solo los clientes pueden actualizar sus datos como medida de seguridad. Puede actualizar el grupo de clientes y el estado del cliente (permitido o denegado).
- PUT /api/customer
- En caso de éxito, se devolverá 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>
Se pueden actualizar hasta 100 clientes a la vez. Si desea actualizar más clientes, puede repetir el comando una vez cada 5 minutos.
Eliminación de clientes
- DELETE /api/customer/[email]
- En caso de éxito, se devolverá 204 No Content
- Solicitud
- Respuesta
- 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);
?>
Pedidos
Visualización de pedidos
EasyWebshop sigue el formato schema.org/Order siempre que sea posible.
- GET /api/order
- Recupera los últimos 1000 pedidos
- GET /api/order?offset=1000
- Recupera los últimos 1000 pedidos, pero omite los primeros 1000 pedidos
- GET /api/order/86400
- Recupera pedidos que fueron realizados o modificados en las últimas 24 horas
- GET /api/order/[orderNumber]
- Recupera un pedido específico por número de pedido
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"
}
}
]
}
Recupera los últimos 1000 pedidos
curl -H "Authorization: Bearer YOUR_API_TOKEN" -D - https://easywebshop.com/api/order
Recupera los últimos 1000 pedidos, pero omite los primeros 1000 pedidos
curl -H "Authorization: Bearer YOUR_API_TOKEN" -D - https://easywebshop.com/api/order?offset=1000
Recupera pedidos que fueron realizados o modificados en las últimas 24 horas
curl -H "Authorization: Bearer YOUR_API_TOKEN" -D - https://easywebshop.com/api/order/86400
Recupera un pedido específico por número de pedido
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>
Importación de pedidos
Debido a la naturaleza compleja del proceso de pago, los pedidos solo se pueden insertar realizando el pedido en la tienda en línea o utilizando la aplicación TPV.
Edición de pedidos
- PUT /api/order
- En caso de éxito, se devolverá 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>
Puede encontrar información detallada en la página wiki de gestión de pedidos.
Parámetro | Tipo | Descripción | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
orderNumber | string | Número de pedido. El número de pedido o código de pedido es el identificador único del pedido. | ||||||||||||||||
status | string | Estatus | ||||||||||||||||
| ||||||||||||||||||
reference | string | Esta es una referencia para fines internos que se puede establecer para cada pedido. La referencia no se mostrará al cliente. | ||||||||||||||||
mail_customer | boolean | Enviar una notificación por correo electrónico al cliente. |
Se pueden actualizar hasta 100 pedidos a la vez. Si desea actualizar más pedidos, puede repetir el comando una vez cada 5 minutos.
Eliminación de pedidos
- DELETE /api/order/[orderNumber]
- En caso de éxito, se devolverá 204 No Content
- Solicitud
- Respuesta
- 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);
?>
Tenga en cuenta que al eliminar pedidos o cambiar el estado a Cancelado, las existencias se volverán a agregar (si los productos aún existen) y los productos cambiarán de estado de Agotado a Disponible, si corresponde. Al anular la cancelación de un pedido, las existencias se restarán nuevamente de los productos.
Límites
EasyWebshop está optimizado para ofrecer redundancia y tiempos de carga de sitios web extremadamente rápidos. En segundo plano, existe un clúster de servidores distribuido geográficamente en múltiples centros de datos en diversos países. Esto conlleva un coste: al añadir y actualizar datos y archivos, estos deben sincronizarse a través del clúster de servidores y las cachés deben borrarse en todos los servidores. Las imágenes deben comprimirse y redimensionarse a varios formatos para fotos con zoom y miniaturas, los nombres de archivo optimizados para SEO deben verificarse y crearse, y todos los datos deben sincronizarse a través de servidores de archivos distribuidos y servidores de respaldo.
El propósito de los límites es evitar que un solo usuario sobrecargue nuestros sistemas, lo que perjudicaría a otros usuarios.
Solicitudes de API | 300 solicitudes por 24 h |
---|---|
Visualización de elementos | 1000 elementos por solicitud |
Importación de elementos | 100 elementos por solicitud |
Actualización de elementos | 100 elementos por solicitud |
Carga de imágenes | 100 imágenes por solicitud (25 Megabyte per image) |
Límites de API elevados
En situaciones normales, los límites predeterminados deberían ser suficientes. Solo para tiendas en línea con una gran cantidad de productos, los límites podrían representar un obstáculo.
En Configuración > Más opciones > API de EasyWebshop, se puede activar la función Límites de API elevados. Esto permite adquirir solicitudes de API adicionales.
API Push
API Push envía una solicitud HTTPS con datos JSON o XML. Estos datos pueden ser "capturados" por un servidor y procesados.
Si simplemente desea recibir un correo electrónico de sus pedidos en un destino adicional, utilice cuentas de administrador. También puede recibir notificaciones instantáneos para los pedidos entrantes.
En Configuración > Módulos > API de EasyWebshop > API Push, ingrese la URL de su aplicación y guarde. Después de guardar, aparecerá un botón de Prueba que le permitirá enviar una solicitud de ejemplo. Para desactivar, simplemente deje las URL vacías y guarde.
Customer Push | Order Push |
---|---|
Se envía una solicitud HTTPS cuando un cliente crea una cuenta que contiene toda la información sobre el cliente, similar a la API de Clientes. | Se envía una solicitud HTTPS cuando un cliente realiza un pedido en la tienda en línea o cuando se realiza un pedido utilizando el TPV. Esta solicitud contiene todos los datos del pedido, los productos comprados e información sobre el cliente, similar a la API de Pedidos. |
- 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');
?>
Conexiones
Las conexiones son pequeñas aplicaciones web que residen en su propio servidor y tienen su propia URL. Pueden ser instaladas por todas las tiendas en línea, por lo que su código puede ser reutilizado por todos los usuarios de EasyWebshop.
En Configuración > Módulos > API de EasyWebshop > Tokens de Conexión, haga clic en el botón Añadir para crear un nuevo Token de Conexión API. Deberá ingresar la URL de la conexión.
Asegúrese de que está creando un Token de Conexión API y no un Token de API regular.
Los tipos de conexiones son:
Servicio de entrega, Widget HTML, Factura, Feed de productos, Proveedor de Servicios de Pago.
Las conexiones suelen tener varios archivos:
Archivo | Descripción |
---|---|
settings.xml | Este es el archivo de configuración de la conexión.
|
easywebshop.php | Este es el archivo que se conecta a la API de EasyWebshop. Establezca su Token de Conexión API (no un Token de API regular) en este archivo. |
index.php | Este es el archivo principal y el primer archivo al que se accede cuando se utiliza la conexión. En el caso de un servicio de entrega, los campos GET con la dirección del cliente se envían a este archivo. En el caso de un PSP, los campos POST del pedido se envían a este archivo. |
report.php | Este archivo se utiliza en caso de PSP y Factura, y normalmente el PSP lo solicita en segundo plano para enviar actualizaciones sobre el estado del pago. Este archivo actualiza entonces el estado del pedido en la tienda en línea a Pago recibido. |
Para facilitar la creación de nuevas conexiones, hemos mantenido los ejemplos siguientes tan simples y directos como ha sido posible.
Servicio de entrega
Utilice el ejemplo siguiente para crear conexiones con servicios de entrega o transporte.
La conexión debe ser instalada por el comerciante y los métodos de envío deben conectarse seleccionándolos.
- El cliente se encuentra en la página de pago y selecciona un método de envío. Dado que su conexión está vinculada a un método de envío, esto activa una ventana emergente con un iframe que apunta a su archivo index.php.
- Los datos de la dirección del cliente se envían como variables GET en la cadena de consulta.
- En su conexión, el cliente puede elegir un método de envío o seleccionar un punto de recogida en un mapa.
- Su conexión envía el nombre del método de envío, el precio, la descripción y un logotipo a nuestra URL de confirmación (/dsconfirm).
- Los datos se añaden al pedido y el cliente recibe una confirmación.
- 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
Los widgets se pueden utilizar para insertar fácilmente código HTML, CSS y JavaScript. El usuario puede elegir en qué páginas del sitio web desea instalar este código. Básicamente es lo mismo que copiar y pegar, pero más fácil de usar.
- 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>
Factura
Factura funciona de la misma manera que un Proveedor de Servicios de Pago, pero se centra en el pago mediante factura, donde se necesitan los datos del cliente. Cuando el tipo se establece en psp, solo están disponibles los datos necesarios que un PSP necesita para procesar un pago. Cuando el tipo es factura, los datos del cliente también están disponibles.
Feed de productos
Se utiliza para recuperar datos de productos, por ejemplo, para su uso en sitios de comparación.
- 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%; }
}
Proveedor de Servicios de Pago
Esta es la forma de conectar un Proveedor de Servicios de Pago (PSP) a EasyWebshop.
La conexión debe ser instalada por el comerciante y los métodos de pago deben conectarse seleccionándolos.
Después de que el cliente haya realizado un pedido en la tienda en línea, aparece la página con el botón Pagar ahora. Este botón envía un formulario HTML.
- Su conexión recibe los datos POST de este formulario, que incluye el código de pedido. Con el Token de Conexión API puede recuperar de forma segura los datos del pedido necesarios para procesar el pago.
- Conéctese a la API del PSP y envíe los datos del pedido.
- Si el pago se ejecuta con éxito, el proveedor de servicios de pago solicita el archivo report.php, que actualiza el estado del pedido en la tienda en línea a Pago recibido.
- El cliente es redirigido a la URL de pago correcto o de pago fallido, dependiendo del éxito o fracaso del pago.
- Si se han configurado múltiples métodos de pago, el cliente puede elegir otro método de pago después de un pago fallido.
- 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%; }
}
Instalación de conexiones
Cambie la URL del ejemplo por la URL de su aplicación. Nuestro sistema backend lee automáticamente su archivo settings.xml y solicita al usuario que ingrese los datos necesarios.
<a href="https://easywebshop.com/software/connections/?install=https://www.webshopdata.com/app/easywebshop-psp">Install</a>
Puede añadir el logotipo de EasyWebshop a su sitio web cuando la conexión esté lista.
Solución de problemas
Hemos perfeccionado la API de EasyWebshop para que sea lo más fácil de usar posible. También ofrecemos un servicio de asistencia técnica de alta calidad con asistencia opcional por parte de un desarrollador para preguntas más técnicas. El propósito de la API es que pueda conectarse a otras plataformas y aplicaciones. Es posible que estas no dispongan de una API fácil de usar ni del nivel de soporte que ofrecemos. Recuerde que al contactarnos, solo podemos ofrecer ayuda para EasyWebshop y no para aplicaciones externas.
Si necesita ayuda con lenguajes de programación, lo mejor es leer sus páginas de documentación. La mayoría están muy bien documentadas. Posiblemente pueda utilizar IA para generar el código para su conexión, pero no espere que nuestro soporte corrija errores en su código.
Durante el Verano del diseño web, desarrollamos conexiones personalizadas para nuestros usuarios. Estas conexiones son realizadas por desarrolladores experimentados. Si necesita una conexión o característica compleja, este es el camino a seguir.
- Estoy recibiendo el error: "Hash de integridad de datos no válido"
- Verifique que el Token de Conexión API (no un Token de API regular) esté configurado en el archivo easywebshop.php
- Verifique que la URL esté configurada correctamente
- Verifique que la conexión esté instalada por una tienda en línea
Enlaces útiles
- REST (Representational State Transfer)
- JSON-LD (JavaScript Object Notation Linked Data)
- curl
- HTTP Status Codes
- W3Schools JSON Tutorial
- JSON online validator
- PHP.net
Las tecnologías que utiliza nuestra API fueron elegidas por las siguientes razones:
- Fácil de implementar
- Transferencia segura de datos a través de HTTPS (se acabaron las conexiones FTP inseguras)
- Comunicación en tiempo real
- No se requieren servidores adicionales ni bases de datos extra
- Escalable a mayores volúmenes de datos
- Se puede utilizar con cualquier plataforma, framework y lenguaje de programación
- Sin problemas con cortafuegos
- Utiliza estándares y prácticas generales de REST, JSON, JSON-LD, XML y HTTPS
- Autenticación Bearer con permisos personalizados
- Codificación UTF-8
Si desea utilizar curl en PHP, necesita instalar la extensión php-curl. En sistemas basados en Debian (incluido Ubuntu), utilice el siguiente comando:
sudo apt-get install php-curl