EasyWebshop API
應用程式介面(API)將您的網店連接到外部平台,如支付提供商、配送服務和辦公應用程式。我們付出了巨大努力使 API 易於使用,即使對非技術專家也是如此。在某些情況下,這將使我們的用戶能夠自行連接他們的網店,而不必依賴昂貴的開發人員。
由於與通用實踐和行業標準的兼容性,可以快速建立與我們 API 的連接,並可能借助 AI 生成的代碼。如果您想自己創建連接,請仔細閱讀此頁面。
功能概覽
- 連接支付服務提供商
- 連接配送服務
- 連接POS軟體,本地和雲端
- 從供應商或批發商導入產品
- 將產品導出至比價網站
- 連接發票軟體
- 連接CRM軟體
- 連接物流管理軟體
- 實時更新庫存
- 根據特定條件接受或拒絕客戶
- 實時導出訂單用於直接發貨
- 導出客戶資料用於電子報應用
- 導出數據用於報告和分析
- 創建可一鍵安裝HTML/JavaScript/CSS小工具的連接
- 為庫存、訂單、客戶和銷售創建自定義報告
API、API推送和連接
API | API Push | 聯絡人 |
---|---|---|
用於導入和導出類別、產品、訂單和客戶。 | 用於實時同步庫存或接受客戶。 | 用於連接支付提供商、配送服務、比價網站、銷售點、發票應用程式和安裝小工具。 |
使用Bearer令牌進行身份驗證。 | 在API模組中輸入推送URL。 | 使用Bearer令牌(連接)進行身份驗證並安裝連接(用戶)。 |
針對一位用戶定制。 | 針對一位用戶定制。 | 可由所有用戶安裝。 |
API
在設定 > 模組 > Easywebshop API使用啟用碼MODA啟用EasyWebshop API。
如果選單中未顯示EasyWebshop API,請導航至設定 > 更多選項 > 用戶體驗級別,並將用戶體驗級別更改為專家。
僅在需要使用API時才啟用它。出於安全考慮,不使用時請停用API。
- API端點複製
- https://easywebshop.com/api始終使用https版本!通過純文本http進行身份驗證可能導致您的API令牌洩露。
不要包含www子域名。 - ?format=xml
- 將輸出格式從JSON更改為XML。
- ?pretty=1
- 美化輸出以提高人類可讀性。在自動化系統中移除此項可節省頻寬。
使用多個參數時,用&(連字符)分隔。例如:?format=xml&pretty=1。
在命令行中,這樣轉義連字符:?format=xml\&pretty=1。
謹慎使用我們的API,只查詢或更新您需要的內容。如果可以使用API推送功能,請不要使用輪詢。 實施限制是為了防止浪費伺服器資源。
身份驗證
點擊添加按鈕創建API令牌,並為此令牌選擇所需的權限。
為了增強安全性,僅選擇絕對必要的權限。不需要時撤銷權限。
保存後,複製您的API令牌以在應用程式中使用或發送給開發人員。 您只能執行一次此操作:如果您丟失了API令牌,則必須刪除它並創建一個新的。
謹慎使用您的 API 令牌。
不要通過不安全的通信渠道(如電子郵件或 WhatsApp)發送您的 API 令牌。如果您需要將 API 令牌發送給開發人員,我們推薦使用 SimpleX Chat。 不要在不安全的設備上存儲您的 API 令牌。我們根本不存儲您的 API 令牌,只存儲它的哈希值。
- 請求
- 回應
- 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"
}
獲取API狀態
curl -D - https://easywebshop.com/api/status
將回應保存在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);
?>
在本文檔中,我們提供curl和PHP的示例。現代人工智能在將代碼轉換為其他程式語言(如C、Java或Python)方面越來越出色。
商品類別
查看類別
- GET /api/category
- 檢索所有類別
- GET /api/category/[categoryName]
- 檢索特定類別內的所有產品
使用網店預設語言的類別名稱
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"
}
}
]
}
}
]
}
檢索所有類別
curl -H "Authorization: Bearer YOUR_API_TOKEN" -D - https://easywebshop.com/api/category
檢索特定類別內的所有產品
curl -H "Authorization: Bearer YOUR_API_TOKEN" -D - https://easywebshop.com/api/category/Cocktails
以人類可讀的JSON格式檢索所有類別
curl -H "Authorization: Bearer YOUR_API_TOKEN" -D - https://easywebshop.com/api/category?pretty=1
以人類可讀的XML格式檢索所有類別
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>
類別僅可查看。由於創建、編輯和刪除類別的功能很少使用,且會增加額外的攻擊面,因此沒有實施相關API。管理類別可通過使用網頁界面完成。
商品品項
查看產品
EasyWebshop盡可能遵循schema.org/Product格式。
- GET /api/product
- 檢索最近的1000個產品
- GET /api/product?offset=1000
- 檢索最近的1000個產品,但跳過前1000個產品
- GET /api/product/86400
- 檢索在過去24小時內添加或修改的產品
- GET /api/product/[productID]
- 通過產品ID搜索產品,區分大小寫
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"
}
}
]
}
檢索最近的1000個產品
curl -H "Authorization: Bearer YOUR_API_TOKEN" -D - https://easywebshop.com/api/product
檢索最近的1000個產品,但跳過前1000個產品
curl -H "Authorization: Bearer YOUR_API_TOKEN" -D - https://easywebshop.com/api/product?offset=1000
檢索在過去24小時內添加或修改的產品
curl -H "Authorization: Bearer YOUR_API_TOKEN" -D - https://easywebshop.com/api/product/86400
通過產品ID搜索產品,區分大小寫
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>
導入產品
- POST /api/product
- 成功時,將返回 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>
您可以在基本產品管理和進階產品管理的文檔頁面上找到所有產品欄位的詳細說明。
參數 | 類型 | 說明 |
---|---|---|
productID | string | 文章. 產品的唯一且用戶定義的標識符。 避免使用特殊字符以及重複或模糊的標識符。編輯產品時,產品ID用作標識符。產品ID只能通過產品管理進行更改。 |
parent_productID | string | 如果您希望此產品成為產品變體,請在此處輸入父產品的產品ID。變體的行為如同獨立產品。它們連接到父產品而非類別,因此在產品列表中不可見。不建議使用子變體,且只能通過產品管理設置。 |
category | string | 網店預設語言中類別的名稱。不適用於產品變體。 |
name:lang | string | 姓名. 您可以為所有語言設置名稱和描述,即使它們在網店中未啟用。 可使用的語言 (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 | 說明 可使用的語言 (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 | 價格. 可以是小數、整數、空值或字符串。 |
stock | integer | 庫存. 對於無限庫存或禁用庫存,保留為0。 |
status | string | 使用版本 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 | 包含圖片URL以上傳產品照片。第一張圖片是主照片,接下來的四張是子照片。當產品照片已存在時,它將被替換。上傳後,圖片將根據網店設置按比例縮放,縮略圖將自動創建,並且圖片將同步到多個文件服務器。確保每張圖片都有有效的URL,最大文件大小為25MB,有效的擴展名(.jpg、.jpeg、.png或.gif)和有效的MIME類型(image/jpeg、image/jpg、image/png、image/gif)。 上傳圖片需要時間和服務器資源。更新產品時避免替換相同的圖片。如果遇到超時,請以每批25張圖片的方式上傳有限數量的產品。1 - 5 |
thumbnail:no | string | 縮略圖會自動生成。這是一個只讀參數。 |
weight | decimal | 重量. 國際單位制千克。 |
vat_code | integer | 稅率. 增值稅率在發票設置中設定。 0, 1, 2 |
condition | string | 條件 New, Used, Refurbished |
gtin | string | EAN 碼 |
old_price | string | 舊價格 |
units | string | 單位 |
mpq | integer | 最低購買量 |
purchase_price | decimal | 購買價格 |
promo | boolean | 在我的店鋪首頁推廣這項產品. 不適用於產品變體。 |
label_id | integer | 標籤. 無標籤時保留為0。不適用於產品變體。 0 - 100 |
colors | string | 顏色. 從英文的256種網頁安全色名稱中選擇,以逗號分隔。 |
params | string | 產品自訂. 參數具有特殊格式,最好使用產品管理界面設置。一旦您有了示例,您可以複製它用於導入。 |
review | boolean | 評價. 啟用或禁用產品評論。 |
last_update | datetime | 上次活動. 唯讀. |
這些部分只能使用管理界面設置: 大量折扣, 客戶群組, 禮券, 預訂功能, 數位產品, 篩選器, 相關產品.
一次最多可導入100個產品。如果您想導入更多產品,可以每5分鐘重複一次命令。
編輯產品
您也可以使用快速編輯功能、導入功能和批量操作功能來編輯產品。
- PUT /api/product
- 成功時,將返回 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>
如果您想更新產品庫存,僅更新狀態和庫存欄位。請記得為諸如售罄或無限庫存等情況設置適當的產品狀態。
一次最多可更新100個產品。如果您想更新更多產品,可以每5分鐘重複一次命令。
刪除產品
- DELETE /api/product/[productID]
- 成功時,將返回 204 No Content
- 請求
- 回應
- 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);
?>
客戶管理
查看客戶
EasyWebshop遵循schema.org/Person格式。
- GET /api/customer
- 檢索最近的1000名客戶
- GET /api/customer?offset=1000
- 檢索最近的1000名客戶,但跳過前1000名客戶
- GET /api/customer/86400
- 檢索在過去24小時內添加或修改的客戶
- GET /api/customer/[email]
- 通過電子郵件地址檢索特定客戶
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
}
}
]
}
檢索最近的1000名客戶
curl -H "Authorization: Bearer YOUR_API_TOKEN" -D - https://easywebshop.com/api/customer
檢索最近的1000名客戶,但跳過前1000名客戶
curl -H "Authorization: Bearer YOUR_API_TOKEN" -D - https://easywebshop.com/api/customer?offset=1000
檢索在過去24小時內添加或修改的客戶
curl -H "Authorization: Bearer YOUR_API_TOKEN" -D - https://easywebshop.com/api/customer/86400
通過電子郵件地址檢索特定客戶
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>
導入客戶
每位客戶都會收到一封用於驗證電子郵件地址的電子郵件。
- POST /api/customer
- 成功時,將返回 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>
詳細信息可在客戶管理維基頁面上找到。
參數 | 類型 | 說明 |
---|---|---|
string | 電子郵件位址. 電子郵件地址是客戶的唯一標識符。 | |
givenName | string | 名字 |
familyName | string | 姓氏 |
brand | string | 公司 |
vatID | string | 增值稅號 |
knowsLanguage | string | 語言 (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 | 國家 (ISO_3166-1) |
addressLocality | string | 城市/鄉鎮 |
addressRegion | string | 區/鄉鎮. 對大多數國家不是必需的,通常省略以縮短結帳表單。 |
postalCode | string | 郵遞區號. 並非所有國家都有郵政編碼。 |
streetAddress | string | 街道 |
houseNo | string | 門牌號碼。有些地方沒有門牌號碼。 |
telephone | string | 電話 |
memberOf | string | 客戶群組 |
status | string | 使用版本 Unconfirmed, Confirmed, Denied |
denied | boolean | 已拒絕 0 - 1 |
newsletter | boolean | 接收電子報. 只有客戶自己可以啟用此功能。 |
registration_date | datetime | 註冊日期. 唯讀. |
一次最多可導入100名客戶。如果您想導入更多客戶,可以每5分鐘重複一次命令。
編輯客戶
請注意,作為安全措施,只有客戶可以更新他們的資料。您可以更新客戶群組和客戶狀態(允許或拒絕)。
- PUT /api/customer
- 成功時,將返回 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>
一次最多可更新100名客戶。如果您想更新更多客戶,可以每5分鐘重複一次命令。
刪除客戶
- DELETE /api/customer/[email]
- 成功時,將返回 204 No Content
- 請求
- 回應
- 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);
?>
訂單管理
查看訂單
EasyWebshop盡可能遵循schema.org/Order格式。
- GET /api/order
- 檢索最近的1000個訂單
- GET /api/order?offset=1000
- 檢索最近的1000個訂單,但跳過前1000個訂單
- GET /api/order/86400
- 檢索在過去24小時內下單或修改的訂單
- GET /api/order/[orderNumber]
- 通過訂單號檢索特定訂單
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"
}
}
]
}
檢索最近的1000個訂單
curl -H "Authorization: Bearer YOUR_API_TOKEN" -D - https://easywebshop.com/api/order
檢索最近的1000個訂單,但跳過前1000個訂單
curl -H "Authorization: Bearer YOUR_API_TOKEN" -D - https://easywebshop.com/api/order?offset=1000
檢索在過去24小時內下單或修改的訂單
curl -H "Authorization: Bearer YOUR_API_TOKEN" -D - https://easywebshop.com/api/order/86400
通過訂單號檢索特定訂單
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>
導入訂單
由於結帳流程的複雜性,訂單只能通過在網店下單或使用POS應用程式插入。
編輯訂單
- PUT /api/order
- 成功時,將返回 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>
詳細信息可在訂單管理維基頁面上找到。
參數 | 類型 | 說明 | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
orderNumber | string | 訂單號碼. 訂單號或訂單代碼是訂單的唯一標識符。 | ||||||||||||||||
status | string | 使用版本 | ||||||||||||||||
| ||||||||||||||||||
reference | string | 這是一個可為每個訂單設置的內部用途參考。該參考不會顯示給客戶。 | ||||||||||||||||
mail_customer | boolean | 向客戶發送電子郵件通知。 |
一次最多可更新100個訂單。如果您想更新更多訂單,可以每5分鐘重複一次命令。
刪除訂單
- DELETE /api/order/[orderNumber]
- 成功時,將返回 204 No Content
- 請求
- 回應
- 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);
?>
請注意,當刪除訂單或將狀態更改為已取消時,庫存將被重新添加(如果產品仍然存在),並且產品狀態將從售罄更改為可用(如適用)。當取消訂單取消時,庫存將再次從產品中扣除。
限制
EasyWebshop經過優化,具有冗餘性和極快的網站載入時間。在背後,有一個伺服器集群地理上分佈在不同國家的多個數據中心。這是有代價的:當添加和更新數據和文件時,它們需要在伺服器集群上同步,並且所有伺服器上的快取必須被清除。圖像需要被壓縮並調整為各種格式,用於縮放照片和縮略圖,SEO文件名需要被檢查和創建,所有數據需要在分佈式文件伺服器和備份伺服器上同步。
這些限制的目的是確保一個用戶不會使我們的系統超載,這會對其他用戶造成損害。
API請求 | 300 每24小時的請求數 |
---|---|
查看項目 | 1000 每個請求的項目數 |
導入項目 | 100 每個請求的項目數 |
更新項目 | 100 每個請求的項目數 |
上傳圖像 | 100 每個請求的圖像數 (25 Megabyte per image) |
高API限制
在正常情況下,預設限制應該足夠。只有對於擁有大量產品的網上商店,這些限制可能成為障礙。
在設置 > 更多選項 > EasyWebshop API中,可以啟用高API限制功能。這允許購買額外的API請求。
API Push
API推送發送帶有JSON或XML數據的HTTPS請求。這些數據可以被伺服器「捕獲」並處理。
如果您只是想在額外的目的地接收訂單的電子郵件,請使用管理員帳戶。您還可以接收即時通知,了解收到的訂單。
在設置 > 模組 > EasyWebshop API > API推送中,輸入您的應用程式的URL並保存。保存後,將出現測試按鈕,允許您發送示例請求。要停用,只需將URL留空並保存。
Customer Push | Order Push |
---|---|
當客戶創建帳戶時,會發送一個HTTPS請求,其中包含有關客戶的所有信息,類似於客戶API。 | 當客戶在網上商店下訂單或使用POS下訂單時,會發送一個HTTPS請求。此請求包含訂單的所有數據、購買的產品和有關客戶的信息,類似於訂單API。 |
- 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');
?>
聯絡人
連接是在自己的伺服器上運行並擁有自己URL的小型網絡應用程式。它們可以被所有網上商店安裝,因此它們的代碼可以被所有EasyWebshop用戶重複使用。
在設置 > 模組 > EasyWebshop API > 連接令牌中,點擊添加按鈕創建新的API連接令牌。您需要輸入連接的URL。
確保您創建的是API連接令牌而不是普通的API令牌。
連接的類型有:
配送服務, HTML小工具, 發票, 產品源, 支付服務提供商.
連接通常有以下文件:
檔案 | 說明 |
---|---|
settings.xml | 這是連接的配置文件。
|
easywebshop.php | 這是連接到EasyWebshop API的文件。 在此文件中設置您的API連接令牌(不是普通API令牌)。 |
index.php | 這是主文件,也是使用連接時首先訪問的文件。 對於配送服務,帶有客戶地址的GET字段會發送到此文件。 對於PSP,訂單的POST字段會發送到此文件。 |
report.php | 此文件用於PSP和發票,通常由PSP在後台請求,以發送有關支付狀態的更新。然後此文件將網上商店中的訂單狀態更新為「已收到付款」。 |
為了便於創建新連接,我們盡可能保持以下示例簡單明了。
配送服務
使用以下示例創建與配送或運輸服務的連接。
- 客戶在結帳頁面上選擇配送方式。由於您的連接已連接到配送方式,這會觸發一個指向您的index.php文件的iframe彈出窗口。
- 客戶的地址數據作為GET變量在查詢字符串中發送。
- 在您的連接中,客戶可以選擇配送方式或從地圖上選擇取貨點。
- 您的連接將配送方式名稱、價格、描述和標誌發送到我們的確認URL(/dsconfirm)。
- 數據添加到訂單中,客戶收到確認。
- 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%; }
}
HTML小工具
小工具可用於輕鬆插入HTML、CSS和JavaScript代碼。用戶可以選擇在網站的哪些頁面上安裝此代碼。基本上與複製粘貼相同,但更加用戶友好。
- 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>
發票
發票的工作方式與支付服務提供商相同,但專注於需要客戶數據的發票支付。當類型設置為psp時,只有PSP處理支付所需的必要數據可用。當類型設置為invoice時,客戶數據也變得可用。
產品源
用於檢索產品數據,例如用於比較網站。
- 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%; }
}
支付服務提供商
這是將支付服務提供商(PSP)連接到EasyWebshop的方式。
客戶在網上商店下訂單後,會出現帶有立即支付按鈕的頁面。此按鈕提交HTML表單。
- 您的連接接收來自此表單的POST數據,其中包括訂單代碼。使用API連接令牌,您可以安全地檢索處理支付所需的訂單數據。
- 連接到PSP的API並發送訂單數據。
- 如果支付成功執行,支付服務提供商會請求report.php文件,該文件將網上商店中的訂單狀態更新為已收到付款。
- 根據支付的成功或失敗,客戶被重定向到支付成功或支付失敗URL。
- 如果設置了多種支付方式,客戶可以在支付失敗後選擇另一種支付方式。
- 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%; }
}
安裝連接
將示例中的URL更改為您的連接的URL。我們的後端會自動讀取您的settings.xml文件,並要求用戶輸入必要的數據。
<a href="https://easywebshop.com/software/connections/?install=https://www.webshopdata.com/app/easywebshop-psp">Install</a>
當連接準備就緒時,您可以將EasyWebshop標誌添加到您的網站。
故障排除
我們盡可能地完善了EasyWebshop API,使其易於使用。我們還提供高質量的幫助台服務,對於更技術性的問題,可選擇開發人員協助。API的目的是讓您可以連接到其他平台和應用程式。它們可能沒有易於使用的API,也沒有我們提供的支持水平。請記住,在聯繫我們時,我們只能為EasyWebshop提供幫助,而不能為外部應用程式提供幫助。
如果您需要編程語言方面的幫助,最好閱讀它們的文檔頁面。大多數都有很好的文檔。您可能可以使用AI生成連接代碼,但請不要期望我們的支持會修復您代碼中的錯誤。
在網頁設計之夏期間,我們為用戶開發自定義連接。這些連接由經驗豐富的開發人員製作。如果您需要複雜的連接或功能,這是最佳選擇。
- 我收到錯誤:「無效的數據完整性哈希」
- 檢查easywebshop.php文件中是否設置了API連接令牌(不是普通API令牌)
- 檢查URL是否正確設置
- 檢查連接是否由網上商店安裝
有用的鏈接
- REST (Representational State Transfer)
- JSON-LD (JavaScript Object Notation Linked Data)
- curl
- HTTP Status Codes
- W3Schools JSON Tutorial
- JSON online validator
- PHP.net
我們的API使用的技術是基於以下原因選擇的:
- 易於實施
- 通過HTTPS進行安全數據傳輸(不再有不安全的FTP連接)
- 實時通信
- 不需要額外的伺服器或額外的數據庫
- 可擴展到更大量的數據
- 可與任何平台、框架和編程語言一起使用
- 不會有防火牆問題
- 使用REST、JSON、JSON-LD、XML和HTTPS標準及一般做法
- 具有自定義權限的Bearer認證
- UTF-8編碼
如果您想在PHP中使用curl,您需要安裝php-curl擴展。在基於Debian的系統(包括Ubuntu)上,使用以下命令:
sudo apt-get install php-curl