Giao tiếp với API bên ngoài

Tạo bởi Hoàng Vũ, chỉnh sửa cuối lúc 7 tháng 4, 2025
  • Hiểu cách giao tiếp với các API bên ngoài trong EC-CUBE.
  • Biết cách gửi và nhận dữ liệu từ các hệ thống bên ngoài như hệ thống thanh toán hoặc vận chuyển.
  • Tạo plugin hoặc chức năng có thể tích hợp với API bên ngoài và hiển thị kết quả lên giao diện frontend hoặc admin.

Giao tiếp với API bên ngoài

1. Cấu trúc gọi API bằng HTTP Client trong EC-CUBE

EC-CUBE cung cấp một HTTP Client (Dùng Symfony HTTP Client) để giao tiếp với API bên ngoài. Bạn có thể sử dụng HTTP Client để gửi các yêu cầu HTTP như GET, POST, PUT, DELETE đến các dịch vụ web.

1.1 Cấu trúc cơ bản

Đầu tiên, bạn cần cài đặt Symfony HTTP Client nếu chưa có.

composer require symfony/http-client

Sau đó, bạn có thể sử dụng HTTP Client để gửi các yêu cầu.

use Symfony\Contracts\HttpClient\HttpClientInterface;

class ApiService
{
    private $client;

    public function __construct(HttpClientInterface $client)
    {
        $this->client = $client;
    }

    public function getWeatherData()
    {
        $response = $this->client->request('GET', 'https://api.weatherapi.com/v1/current.json', [
            'query' => [
                'key' => 'YOUR_API_KEY',
                'q' => 'Hanoi'
            ]
        ]);
        
        return $response->toArray();  // Trả về kết quả dưới dạng mảng
    }
}

1.2 Gửi yêu cầu POST

Để gửi yêu cầu POST (ví dụ gửi đơn hàng qua webhook):

public function sendOrderData($orderData)
{
    $response = $this->client->request('POST', 'https://external-api.com/orders', [
        'json' => $orderData,  // Gửi dữ liệu JSON
    ]);

    return $response->toArray();
}

2. Ví dụ: Gọi API vận chuyển (Giao hàng tiết kiệm, GHN…) để lấy phí ship

Giả sử bạn muốn tích hợp với Giao hàng tiết kiệm (GHN) để lấy phí vận chuyển cho đơn hàng của khách, bạn có thể gửi yêu cầu API để nhận phí ship.

2.1 Lấy phí ship từ API GHN

public function getShippingCost($weight, $fromPostalCode, $toPostalCode)
{
    $response = $this->client->request('POST', 'https://api.giaohangtietkiem.vn/v2/price', [
        'json' => [
            'from_postal_code' => $fromPostalCode,
            'to_postal_code' => $toPostalCode,
            'weight' => $weight
        ]
    ]);

    $data = $response->toArray();
    return $data['data']['price'];  // Trả về phí ship
}

2.2 Hiển thị phí vận chuyển lên frontend

Bạn có thể sử dụng kết quả này để hiển thị phí vận chuyển lên trang giỏ hàng hoặc trang checkout.

3. Gửi đơn hàng qua webhook đến bên thứ ba

Khi người dùng đặt hàng, bạn có thể gửi đơn hàng đến một hệ thống bên ngoài qua webhook. Webhook là một cách gửi dữ liệu HTTP POST đến một URL bên ngoài khi một sự kiện xảy ra.

public function sendOrderToWebhook($order)
{
    $response = $this->client->request('POST', 'https://third-party-system.com/webhook', [
        'json' => [
            'order_id' => $order->getId(),
            'total_price' => $order->getTotalPrice(),
            'customer_email' => $order->getCustomer()->getEmail()
        ]
    ]);

    return $response->getStatusCode();  // Trả về mã trạng thái HTTP (200, 400...)
}

4. Hiển thị kết quả API lên giao diện (frontend hoặc admin)

Sau khi lấy dữ liệu từ API, bạn có thể hiển thị thông tin lên giao diện người dùng (frontend) hoặc quản trị viên (admin). Ví dụ, bạn có thể hiển thị thời tiết trên trang chủ hoặc phí vận chuyển trong quá trình checkout.

4.1 Hiển thị thông tin trên frontend

Sử dụng Twig để hiển thị kết quả API (ví dụ kết quả thời tiết) lên trang chủ.

// Controller
public function index(ApiService $apiService)
{
    $weatherData = $apiService->getWeatherData();
    return $this->render('index.twig', [
        'weather' => $weatherData['current']['temp_c'], // Hiển thị nhiệt độ
    ]);
}

// index.twig
<p>The current temperature is: {{ weather }} °C</p>

Kết luận

  • Giao tiếp với API bên ngoài là một tính năng quan trọng giúp bạn tích hợp các dịch vụ bên ngoài vào website EC-CUBE như thanh toán, vận chuyển, thông tin thời tiết, v.v.
  • Bạn có thể sử dụng Symfony HTTP Client để gửi các yêu cầu HTTP và xử lý phản hồi từ API bên ngoài.
  • Webhooks giúp bạn gửi dữ liệu về hệ thống bên ngoài khi có sự kiện, ví dụ như khi có đơn hàng mới.
Website Logo

Với hơn 10 năm kinh nghiệm lập trình web và từng làm việc với nhiều framework, ngôn ngữ như PHP, JavaScript, React, jQuery, CSS, HTML, CakePHP, Laravel..., tôi hy vọng những kiến thức được chia sẻ tại đây sẽ hữu ích và thiết thực cho các bạn.

Bình luận

Website Logo

Chào, tôi là Vũ. Đây là blog hướng dẫn lập trình của tôi.

Liên hệ công việc qua email dưới đây.

lhvuctu@gmail.com

Chúng Tôi Trên

Bạn đang muốn học về lập trình website?

Bạn cần nâng cao kiến thức chuyên nghiệp hơn để nâng cao cơ hội nghề nghiệp? Liên hệ