Hướng dẫn sử dụng Magento 2 API: Tích hợp E-commerce toàn diện (2026)

@apidog

@apidog

25 tháng 3 2026

Hướng dẫn sử dụng Magento 2 API: Tích hợp E-commerce toàn diện (2026)

Tóm tắt

API Magento 2 (Adobe Commerce) cho phép các nhà phát triển tích hợp với các cửa hàng thương mại điện tử theo lập trình. Nó sử dụng các điểm cuối REST, SOAP và GraphQL với xác thực OAuth 1.0a và xác thực dựa trên token, cung cấp quyền truy cập vào sản phẩm, đơn hàng, khách hàng, kho hàng và nhiều hơn nữa, với giới hạn tốc độ có thể cấu hình. Hướng dẫn này bao gồm thiết lập xác thực, các hoạt động CRUD, webhooks, điểm cuối tùy chỉnh và các chiến lược tích hợp sản xuất.

Giới thiệu

Adobe Commerce (Magento) cung cấp năng lượng cho hơn 250.000 cửa hàng thương mại điện tử với tổng giá trị hàng hóa hàng năm hơn 155 tỷ USD. Đối với các nhà phát triển xây dựng tích hợp thương mại điện tử, trình kết nối ERP hoặc ứng dụng di động, tích hợp API Magento không phải là tùy chọn—nó rất cần thiết để tiếp cận lượng lớn nhà bán lẻ này.

Đây là thực tế: các nhà bán lẻ quản lý nhiều kênh bán hàng mất 20-30 giờ hàng tuần để nhập dữ liệu thủ công giữa Magento và các hệ thống khác. Một tích hợp API Magento vững chắc sẽ tự động hóa đồng bộ hóa sản phẩm, xử lý đơn hàng, cập nhật kho hàng và quản lý dữ liệu khách hàng.

Hướng dẫn này sẽ trình bày toàn bộ quá trình tích hợp API Magento 2. Bạn sẽ tìm hiểu về xác thực OAuth 1.0a và token, các điểm cuối REST/SOAP/GraphQL, quản lý sản phẩm và đơn hàng, webhooks, phát triển API tùy chỉnh và các chiến lược triển khai sản xuất. Cuối cùng, bạn sẽ có một tích hợp Magento sẵn sàng cho sản xuất.

💡
Apidog đơn giản hóa việc kiểm thử tích hợp API. Kiểm thử các điểm cuối Magento của bạn, xác thực luồng xác thực, kiểm tra phản hồi API và gỡ lỗi các vấn đề tích hợp trong một không gian làm việc. Nhập thông số kỹ thuật API, mô phỏng phản hồi và chia sẻ các kịch bản kiểm thử với nhóm của bạn.
button

API Magento 2 là gì?

Magento 2 cung cấp ba loại API để truy cập dữ liệu thương mại điện tử:

API xử lý:

Các tính năng chính

Tính năng Mô tả
Nhiều giao thức REST, SOAP, GraphQL
OAuth 1.0a Truy cập an toàn của bên thứ ba
Xác thực token Token quản trị và tích hợp
Webhooks Các hoạt động bất đồng bộ thông qua hàng đợi
Giới hạn tốc độ Có thể cấu hình theo từng cài đặt
Điểm cuối tùy chỉnh Mở rộng với các API tùy chỉnh
Đa cửa hàng Một API, nhiều chế độ xem cửa hàng

So sánh API

Loại API Giao thức Trường hợp sử dụng
REST JSON Ứng dụng di động, tích hợp
SOAP XML Hệ thống doanh nghiệp (SAP, Oracle)
GraphQL GraphQL Mặt tiền cửa hàng, PWA

Các phiên bản Magento

Phiên bản Trạng thái Hết hỗ trợ
Magento 2.4.x Hiện hành Đang hoạt động
Adobe Commerce 2.4.x Hiện hành Đang hoạt động
Magento 1.x Hết vòng đời (EOL) Tháng 6 năm 2020 (Không sử dụng)

Bắt đầu: Thiết lập xác thực

Bước 1: Tạo tài khoản quản trị hoặc tích hợp

Trước khi truy cập API:

  1. Đăng nhập vào Bảng quản trị Magento
  2. Điều hướng đến System > Permissions > All Users (Hệ thống > Quyền > Tất cả người dùng)
  3. Tạo người dùng quản trị (cho token quản trị) HOẶC
  4. Điều hướng đến System > Extensions > Integrations (Hệ thống > Tiện ích mở rộng > Tích hợp)
  5. Tạo tích hợp mới (cho OAuth)

Bước 2: Chọn phương thức xác thực

Phương thức Tốt nhất cho Thời gian tồn tại của token
Token quản trị Tích hợp nội bộ Có thể cấu hình (mặc định: 4 giờ)
Token tích hợp Ứng dụng bên thứ ba Cho đến khi bị thu hồi
OAuth 1.0a Ứng dụng thị trường công cộng Cho đến khi bị thu hồi
Token khách hàng Ứng dụng hướng tới khách hàng Có thể cấu hình

Bước 3: Lấy token quản trị (Phương pháp đơn giản nhất)

Tạo token quản trị cho tích hợp nội bộ:

const MAGENTO_BASE_URL = process.env.MAGENTO_BASE_URL;
const MAGENTO_ADMIN_USERNAME = process.env.MAGENTO_ADMIN_USERNAME;
const MAGENTO_ADMIN_PASSWORD = process.env.MAGENTO_ADMIN_PASSWORD;

const getAdminToken = async () => {
  const response = await fetch(`${MAGENTO_BASE_URL}/rest/V1/integration/admin/token`, {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({
      username: MAGENTO_ADMIN_USERNAME,
      password: MAGENTO_ADMIN_PASSWORD
    })
  });

  if (!response.ok) {
    throw new Error('Invalid admin credentials'); // Thông tin đăng nhập quản trị không hợp lệ
  }

  // Phản hồi là một chuỗi đơn thuần (token), không phải JSON
  const token = await response.text();
  return token;
};

// Cách sử dụng
const token = await getAdminToken();
console.log(`Admin token: ${token}`);
// Lưu trữ an toàn - sử dụng cho các cuộc gọi API tiếp theo

Lưu ý bảo mật: Lưu trữ token một cách an toàn:

# .env file
MAGENTO_BASE_URL="https://store.example.com"
MAGENTO_ADMIN_USERNAME="api_user"
MAGENTO_ADMIN_PASSWORD="secure_password_here"
MAGENTO_ACCESS_TOKEN="obtained_via_auth"

Bước 4: Tạo tích hợp (Khuyến nghị cho bên thứ ba)

Tạo tích hợp qua Bảng quản trị:

Đi tới System > Extensions > Integrations (Hệ thống > Tiện ích mở rộng > Tích hợp)

Nhấp vào Add New Integration (Thêm tích hợp mới)

Điền thông tin chi tiết:

Đặt API Permissions (Quyền API):

Nhấp vào Save (Lưu)

Nhấp vào Activate (Kích hoạt) trên tích hợp mới

Sao chép Access TokenToken Secret

Bước 5: Lấy token khách hàng

Dành cho các ứng dụng hướng tới khách hàng:

const getCustomerToken = async (email, password) => {
  const response = await fetch(`${MAGENTO_BASE_URL}/rest/V1/integration/customer/token`, {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({
      username: email,
      password: password
    })
  });

  if (!response.ok) {
    throw new Error('Invalid customer credentials'); // Thông tin đăng nhập khách hàng không hợp lệ
  }

  const token = await response.text();
  return token;
};

// Cách sử dụng
const customerToken = await getCustomerToken('customer@example.com', 'password123');

Bước 6: Thực hiện các cuộc gọi API đã xác thực

Tạo client API có thể tái sử dụng:

const magentoRequest = async (endpoint, options = {}) => {
  const token = await getAdminToken(); // Hoặc lấy token đã lưu trữ

  const response = await fetch(`${MAGENTO_BASE_URL}/rest${endpoint}`, {
    ...options,
    headers: {
      'Authorization': `Bearer ${token}`,
      'Content-Type': 'application/json',
      ...options.headers
    }
  });

  if (!response.ok) {
    const error = await response.json();
    throw new Error(`Magento API Error: ${error.message}`); // Lỗi API Magento
  }

  return response.json();
};

// Cách sử dụng
const products = await magentoRequest('/V1/products');
console.log(`Found ${products.items.length} products`); // Đã tìm thấy ${products.items.length} sản phẩm

Quản lý sản phẩm

Lấy sản phẩm

Lấy sản phẩm với bộ lọc:

const getProducts = async (filters = {}) => {
  const params = new URLSearchParams();

  // Xây dựng tiêu chí tìm kiếm
  if (filters.search) {
    params.append('searchCriteria[filterGroups][0][filters][0][field]', 'sku');
    params.append('searchCriteria[filterGroups][0][filters][0][value]', `%${filters.search}%`);
    params.append('searchCriteria[filterGroups][0][filters][0][conditionType]', 'like');
  }

  if (filters.priceFrom) {
    params.append('searchCriteria[filterGroups][1][filters][0][field]', 'price');
    params.append('searchCriteria[filterGroups][1][filters][0][value]', filters.priceFrom);
    params.append('searchCriteria[filterGroups][1][filters][0][conditionType]', 'gteq');
  }

  params.append('searchCriteria[pageSize]', filters.limit || 20);
  params.append('searchCriteria[currentPage]', filters.page || 1);

  const response = await magentoRequest(`/V1/products?${params.toString()}`);
  return response;
};

// Cách sử dụng
const products = await getProducts({ search: 'shirt', priceFrom: 20, limit: 50 });

products.items.forEach(product => {
  console.log(`${product.sku}: ${product.name} - $${product.price}`);
});

Lấy một sản phẩm

Lấy sản phẩm bằng SKU:

const getProduct = async (sku) => {
  const response = await magentoRequest(`/V1/products/${sku}`);
  return response;
};

// Cách sử dụng
const product = await getProduct('TSHIRT-001');
console.log(`Name: ${product.name}`); // Tên
console.log(`Price: $${product.price}`); // Giá
console.log(`Stock: ${product.extension_attributes?.stock_item?.qty}`); // Kho hàng

Tạo sản phẩm

Tạo sản phẩm đơn giản:

const createProduct = async (productData) => {
  const product = {
    product: {
      sku: productData.sku,
      name: productData.name,
      attribute_set_id: productData.attributeSetId || 4, // Bộ mặc định
      type_id: 'simple',
      price: productData.price,
      status: productData.status || 1, // 1=đã bật, 2=đã tắt
      visibility: productData.visibility || 4, // 4=Danh mục & Tìm kiếm
      weight: productData.weight || 1,
      extension_attributes: {
        stock_item: {
          qty: productData.qty || 0,
          is_in_stock: productData.qty > 0 ? true : false
        }
      },
      custom_attributes: [
        {
          attribute_code: 'description',
          value: productData.description
        },
        {
          attribute_code: 'short_description',
          value: productData.shortDescription
        },
        {
          attribute_code: 'color',
          value: productData.color
        },
        {
          attribute_code: 'size',
          value: productData.size
        }
      ]
    }
  };

  const response = await magentoRequest('/V1/products', {
    method: 'POST',
    body: JSON.stringify(product)
  });

  return response;
};

// Cách sử dụng
const newProduct = await createProduct({
  sku: 'TSHIRT-NEW-001',
  name: 'Premium Cotton T-Shirt',
  price: 29.99,
  qty: 100,
  description: 'High-quality cotton t-shirt', // Áo thun cotton chất lượng cao
  shortDescription: 'Premium cotton tee', // Áo thun cotton cao cấp
  color: 'Blue',
  size: 'M'
});

console.log(`Product created: ${newProduct.id}`); // Sản phẩm đã được tạo

Cập nhật sản phẩm

Cập nhật thông tin sản phẩm:

const updateProduct = async (sku, updates) => {
  const product = {
    product: {
      sku: sku,
      ...updates
    }
  };

  const response = await magentoRequest(`/V1/products/${sku}`, {
    method: 'PUT',
    body: JSON.stringify(product)
  });

  return response;
};

// Cách sử dụng - Cập nhật giá và kho hàng
await updateProduct('TSHIRT-001', {
  price: 24.99,
  extension_attributes: {
    stock_item: {
      qty: 150,
      is_in_stock: true
    }
  }
});

Xóa sản phẩm

Xóa sản phẩm:

const deleteProduct = async (sku) => {
  await magentoRequest(`/V1/products/${sku}`, {
    method: 'DELETE'
  });

  console.log(`Product ${sku} deleted`); // Sản phẩm ${sku} đã bị xóa
};

Các loại sản phẩm

Loại Mô tả Trường hợp sử dụng
Simple (Đơn giản) Một SKU, không có biến thể Sản phẩm tiêu chuẩn
Configurable (Có thể cấu hình) Cha với các biến thể con Tùy chọn kích thước/màu sắc
Grouped (Nhóm) Bộ sưu tập các sản phẩm đơn giản Gói sản phẩm
Virtual (Ảo) Sản phẩm phi vật lý Dịch vụ, tải xuống
Bundle (Gói) Gói sản phẩm có thể tùy chỉnh Bộ tự làm
Downloadable (Có thể tải xuống) Sản phẩm kỹ thuật số Sách điện tử, phần mềm

Quản lý đơn hàng

Lấy đơn hàng

Lấy đơn hàng với bộ lọc:

const getOrders = async (filters = {}) => {
  const params = new URLSearchParams();

  if (filters.status) {
    params.append('searchCriteria[filterGroups][0][filters][0][field]', 'status');
    params.append('searchCriteria[filterGroups][0][filters][0][value]', filters.status);
    params.append('searchCriteria[filterGroups][0][filters][0][conditionType]', 'eq');
  }

  if (filters.dateFrom) {
    params.append('searchCriteria[filterGroups][1][filters][0][field]', 'created_at');
    params.append('searchCriteria[filterGroups][1][filters][0][value]', filters.dateFrom);
    params.append('searchCriteria[filterGroups][1][filters][0][conditionType]', 'gteq');
  }

  params.append('searchCriteria[pageSize]', filters.limit || 20);
  params.append('searchCriteria[currentPage]', filters.page || 1);

  const response = await magentoRequest(`/V1/orders?${params.toString()}`);
  return response;
};

// Cách sử dụng - Lấy các đơn hàng đang chờ xử lý từ 7 ngày trước
const orders = await getOrders({
  status: 'pending',
  dateFrom: '2026-03-18 00:00:00',
  limit: 50
});

orders.items.forEach(order => {
  console.log(`Order #${order.increment_id}: ${order.customer_email} - $${order.grand_total}`);
});

Lấy một đơn hàng

Lấy đơn hàng bằng ID:

const getOrder = async (orderId) => {
  const response = await magentoRequest(`/V1/orders/${orderId}`);
  return response;
};

// Cách sử dụng
const order = await getOrder(12345);
console.log(`Order #${order.increment_id}`); // Đơn hàng
console.log(`Status: ${order.status}`); // Trạng thái
console.log(`Total: $${order.grand_total}`); // Tổng cộng
console.log(`Items:`); // Mặt hàng
order.items.forEach(item => {
  console.log(`  - ${item.name} x ${item.qty_ordered}`);
});

Luồng trạng thái đơn hàng

đang chờ → đang xử lý → hoàn tất
        → đã hủy
        → đang giữ
        → chờ xét duyệt thanh toán

Cập nhật trạng thái đơn hàng

Thay đổi trạng thái đơn hàng:

const updateOrderStatus = async (orderId, newStatus) => {
  // Lưu ý: Cập nhật trạng thái trực tiếp yêu cầu điểm cuối tùy chỉnh
  // Thay vào đó, hãy sử dụng quy trình quản lý đơn hàng:

  // Để hủy:
  await magentoRequest(`/V1/orders/${orderId}/cancel`, {
    method: 'POST'
  });

  // Để giữ:
  await magentoRequest(`/V1/orders/${orderId}/hold`, {
    method: 'POST'
  });

  // Để bỏ giữ:
  await magentoRequest(`/V1/orders/${orderId}/unhold`, {
    method: 'POST'
  });
};

Tạo hóa đơn

Tạo hóa đơn cho đơn hàng:

const createInvoice = async (orderId, items = [], notify = true, appendComment = false, comment = null) => {
  const invoice = {
    capture: true, // true = thu tiền thanh toán
    last: true,
    items: items // Mảng gồm {order_item_id, qty}
  };

  if (comment) {
    invoice.comment = comment;
    invoice.notify_customer = notify ? 1 : 0;
    invoice.append_comment = appendComment ? 1 : 0;
  }

  const response = await magentoRequest(`/V1/order/${orderId}/invoice`, {
    method: 'POST',
    body: JSON.stringify(invoice)
  });

  return response;
};

// Cách sử dụng - Lập hóa đơn và thu toàn bộ đơn hàng
const invoiceId = await createInvoice(12345, [], true, false, 'Thank you for your order!'); // Cảm ơn quý khách đã đặt hàng!
console.log(`Invoice created: ${invoiceId}`); // Hóa đơn đã được tạo

Tạo lô hàng

Vận chuyển đơn hàng:

const createShipment = async (orderId, items = [], notify = true, appendComment = false, comment = null, tracks = []) => {
  const shipment = {
    items: items, // Mảng gồm {order_item_id, qty}
    notify: notify ? 1 : 0,
    append_comment: appendComment ? 1 : 0,
    comment: comment,
    tracks: tracks // Mảng gồm {track_number, title, carrier_code}
  };

  const response = await magentoRequest(`/V1/order/${orderId}/ship`, {
    method: 'POST',
    body: JSON.stringify(shipment)
  });

  return response;
};

// Cách sử dụng - Vận chuyển có theo dõi
const shipmentId = await createShipment(12345, [], true, false, 'Your order has shipped!', [ // Đơn hàng của bạn đã được vận chuyển!
  {
    track_number: '1Z999AA10123456784',
    title: 'Tracking Number', // Mã theo dõi
    carrier_code: 'ups'
  }
]);
console.log(`Shipment created: ${shipmentId}`); // Lô hàng đã được tạo

Quản lý khách hàng

Lấy khách hàng

Lấy khách hàng:

const getCustomers = async (filters = {}) => {
  const params = new URLSearchParams();

  if (filters.email) {
    params.append('searchCriteria[filterGroups][0][filters][0][field]', 'email');
    params.append('searchCriteria[filterGroups][0][filters][0][value]', filters.email);
    params.append('searchCriteria[filterGroups][0][filters][0][conditionType]', 'eq');
  }

  params.append('searchCriteria[pageSize]', filters.limit || 20);

  const response = await magentoRequest(`/V1/customers/search?${params.toString()}`);
  return response;
};

// Cách sử dụng
const customers = await getCustomers({ email: 'customer@example.com' });
customers.items.forEach(customer => {
  console.log(`${customer.firstname} ${customer.lastname} - ${customer.email}`);
});

Tạo khách hàng

Đăng ký khách hàng mới:

const createCustomer = async (customerData) => {
  const customer = {
    customer: {
      websiteId: customerData.websiteId || 1,
      email: customerData.email,
      firstname: customerData.firstname,
      lastname: customerData.lastname,
      middlename: customerData.middlename || '',
      gender: customerData.gender || 0,
      store_id: customerData.storeId || 0,
      extension_attributes: {
        is_subscribed: customerData.subscribed || false
      }
    },
    password: customerData.password
  };

  const response = await magentoRequest('/V1/customers', {
    method: 'POST',
    body: JSON.stringify(customer)
  });

  return response;
};

// Cách sử dụng
const newCustomer = await createCustomer({
  email: 'newcustomer@example.com',
  firstname: 'John',
  lastname: 'Doe',
  password: 'SecurePass123!',
  subscribed: true
});

console.log(`Customer created: ID ${newCustomer.id}`); // Khách hàng đã được tạo: ID ${newCustomer.id}

Quản lý kho hàng (MSI)

Lấy trạng thái kho hàng

Kiểm tra kho hàng của sản phẩm:

const getStockStatus = async (sku) => {
  const response = await magentoRequest(`/V1/products/${sku}/stockItems/1`);
  return response;
};

// Cách sử dụng
const stock = await getStockStatus('TSHIRT-001');
console.log(`Qty: ${stock.qty}`); // Số lượng
console.log(`In Stock: ${stock.is_in_stock}`); // Trong kho
console.log(`Min Qty: ${stock.min_qty}`); // Số lượng tối thiểu

Cập nhật kho hàng

Cập nhật số lượng sản phẩm:

const updateStock = async (sku, qty, isInStock = null) => {
  const stockItem = {
    stockItem: {
      qty: qty,
      is_in_stock: isInStock !== null ? isInStock : qty > 0
    }
  };

  const response = await magentoRequest(`/V1/products/${sku}/stockItems/1`, {
    method: 'PUT',
    body: JSON.stringify(stockItem)
  });

  return response;
};

// Cách sử dụng
await updateStock('TSHIRT-001', 100, true);

Webhooks và các hoạt động bất đồng bộ

Thiết lập Webhooks

Magento sử dụng hàng đợi tin nhắn cho các thông báo bất đồng bộ:

// Magento không có webhooks gốc
// Thay vào đó, hãy sử dụng các phương pháp này:

// 1. Thăm dò điểm cuối đơn hàng định kỳ
const pollNewOrders = async (lastOrderId) => {
  const orders = await getOrders({
    dateFrom: new Date().toISOString()
  });

  const newOrders = orders.items.filter(o => o.id > lastOrderId);
  return newOrders;
};

// 2. Sử dụng Sự kiện Adobe I/O (chỉ dành cho Adobe Commerce)
// Cấu hình sự kiện trong Adobe Developer Console

// 3. Tạo mô-đun webhook tùy chỉnh
// Xem: https://devdocs.magento.com/guides/v2.4/extension-dev-guide/message-queues/message-queues.html

Giới hạn tốc độ

Hiểu về giới hạn tốc độ

Giới hạn tốc độ của Magento có thể cấu hình được:

Cấu hình trong Admin: Stores > Configuration > Services > Web API > Security (Cửa hàng > Cấu hình > Dịch vụ > Web API > Bảo mật)

Thực hiện xử lý giới hạn tốc độ

const makeRateLimitedRequest = async (endpoint, options = {}, maxRetries = 3) => {
  for (let attempt = 1; attempt <= maxRetries; attempt++) {
    try {
      const response = await magentoRequest(endpoint, options);
      return response;
    } catch (error) {
      if (error.message.includes('429') && attempt < maxRetries) {
        const delay = Math.pow(2, attempt) * 1000;
        await new Promise(resolve => setTimeout(resolve, delay));
      } else {
        throw error;
      }
    }
  }
};

Danh sách kiểm tra triển khai sản xuất

Trước khi ra mắt:

Các trường hợp sử dụng trong thực tế

Tích hợp ERP

Một nhà sản xuất đồng bộ hóa kho hàng:

Ứng dụng di động

Một nhà bán lẻ xây dựng ứng dụng mua sắm:

Kết luận

API Magento 2 cung cấp chức năng thương mại điện tử toàn diện. Các điểm chính:

button

Phần hỏi đáp

Làm cách nào để xác thực với API Magento?

Sử dụng token quản trị cho tích hợp nội bộ hoặc tạo Tích hợp trong System > Extensions (Hệ thống > Tiện ích mở rộng) cho OAuth. Token khách hàng cho ứng dụng hướng tới khách hàng.

Sự khác biệt giữa REST và GraphQL trong Magento là gì?

REST cung cấp các hoạt động CRUD đầy đủ. GraphQL được tối ưu hóa cho các truy vấn frontend với việc tìm nạp dữ liệu hiệu quả.

Làm cách nào để tạo sản phẩm qua API?

Gửi POST tới /V1/products với dữ liệu sản phẩm bao gồm SKU, tên, giá và stock_item trong extension_attributes.

Tôi có thể nhận webhooks cho các đơn hàng mới không?

Magento không có webhooks gốc. Sử dụng thăm dò, Sự kiện Adobe I/O (Adobe Commerce) hoặc tạo mô-đun tùy chỉnh.

Làm cách nào để cập nhật số lượng kho hàng?

Gửi PUT tới /V1/products/{sku}/stockItems/1 với các giá trị qtyis_in_stock.

Thực hành thiết kế API trong Apidog

Khám phá cách dễ dàng hơn để xây dựng và sử dụng API