Hướng dẫn tạo Webhook ghi nhận giao dịch từ Pay2S

Bài viết này Pay2S sẽ hướng dẫn cách tạo webhook cơ bản để lưu thông tin giao dịch cho website bán hàng bằng ngôn ngữ PHP và sử dụng database MySQL

Webhook là gì?

Webhook là một cơ chế cho phép ứng dụng hoặc hệ thống này gửi thông báo (thường là dưới dạng HTTP POST request) tới một ứng dụng hoặc hệ thống khác khi một sự kiện cụ thể xảy ra. Thay vì liên tục yêu cầu (poll) dữ liệu từ server để kiểm tra xem có sự thay đổi nào không, Webhook tự động gửi dữ liệu ngay khi có sự thay đổi, giúp giảm thiểu tài nguyên và tăng hiệu quả.

Công dụng hay nhất của Webhook:

  1. Tự động hóa quy trình công việc: Webhook thường được sử dụng để tự động hóa các quy trình liên quan đến nhiều hệ thống khác nhau. Ví dụ, khi có một giao dịch thanh toán thành công, webhook có thể tự động cập nhật hệ thống kế toán, gửi email xác nhận tới khách hàng, hoặc kích hoạt các quy trình vận chuyển.
  2. Cập nhật thời gian thực: Webhook cung cấp cập nhật theo thời gian thực khi có sự kiện diễn ra, giúp hệ thống nhận được dữ liệu ngay lập tức mà không cần yêu cầu lặp lại.
  3. Tích hợp giữa các dịch vụ: Webhook giúp dễ dàng tích hợp giữa các dịch vụ khác nhau. Ví dụ, khi có một sự kiện trong ứng dụng A, Webhook có thể được sử dụng để thông báo cho ứng dụng B để thực hiện hành động tương ứng.

Webhook cho giao dịch thanh toán trên website mua bán:

Trong bối cảnh giao dịch thanh toán trên website mua bán, webhook có thể được sử dụng để:

  • Xác nhận thanh toán: Khi khách hàng hoàn thành thanh toán, cổng thanh toán (như PayPal, Stripe, Web2M hoặc Pay2S) sẽ gửi một webhook tới hệ thống của bạn để xác nhận rằng giao dịch đã thành công.
  • Cập nhật trạng thái đơn hàng: Ngay sau khi thanh toán thành công, webhook có thể tự động cập nhật trạng thái đơn hàng trên website, chẳng hạn như chuyển trạng thái từ “Đang chờ thanh toán” sang “Đã thanh toán” và bắt đầu quy trình chuẩn bị hàng.
  • Quản lý tồn kho: Webhook có thể tự động điều chỉnh số lượng hàng tồn kho khi một giao dịch được hoàn tất.
  • Thông báo cho khách hàng: Hệ thống có thể sử dụng webhook để gửi email hoặc SMS xác nhận cho khách hàng ngay sau khi thanh toán thành công.

Lập trình Webhook cơ bản

Bước 1: Tạo database

Nhập lệnh bên dưới vào SQL query để tạo database

CREATE DATABASE webhooks_checkout;
CREATE USER 'webhooks_checkout'@'localhost' IDENTIFIED BY 'SO@)ux-y]u=o5*E-S';
GRANT ALL PRIVILEGES ON webhooks_checkout.* TO 'webhooks_checkout'@'localhost';
FLUSH PRIVILEGES;

Bạn cần đổi lại thông tin phù hợp với website của bạn, ở tất cả vị trí:

  • Tên database và user: webhooks_checkout
  • Mật khẩu trong nháy đơn: SO@)ux-y]u=o5*E-S

Lưu lại thông tin tên database, user và mật khẩu để điền vào file webhook kết nối với database

Bước 2: Tạo bảng trong database để lưu thông tin giao dịch

Chọn database vừa tạo -> nhập lệnh tạo bảng bên dưới vào SQL query

USE webhooks_checkout;

CREATE TABLE `order_transactions` (
    `id` VARCHAR(255) NOT NULL,
    `gateway` VARCHAR(100) NOT NULL,
    `transactionDate` DATE NOT NULL,
    `transactionNumber` VARCHAR(100) DEFAULT NULL,
    `accountNumber` VARCHAR(100) DEFAULT NULL,
    `content` TEXT DEFAULT NULL,
    `transferType` VARCHAR(50) DEFAULT NULL,
    `transferAmount` DECIMAL(20,2) NOT NULL DEFAULT 0.00,
    PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
Tạo database chứa thông tin giao dịch nhận từ webhook

Bước 3: Tạo file webhook

Tạo và đặt tên file là webhook-pay2s.php

<?php
// Lấy tiêu đề của yêu cầu để kiểm tra token Authorization
$headers = apache_request_headers();
$webhookToken = isset($headers['Authorization']) ? $headers['Authorization'] : '';
$expectedToken = 'Bearer 12345678901234567890'; 
// Thay 12345678901234567890 thành token webhook của bạn, token webhook sinh ra khi tạo webhook trên pay2s, nhấp vào biểu tượng chìa khoá để lấy token webhook

// Lấy dữ liệu JSON từ yêu cầu
$requestBody = file_get_contents('php://input');
$data = json_decode($requestBody, true);

if (json_last_error() === JSON_ERROR_NONE) {
    if (isset($data['transactions']) && is_array($data['transactions'])) {
        $servername = "localhost";
        $dbname = "webhooks_checkout";
        $username = "webhooks_checkout";
        $password = "SO@)ux-y]u=o5*E-S";

        $conn = new mysqli($servername, $username, $password, $dbname);

        // Kiểm tra kết nối
        if ($conn->connect_error) {
            $response = [
                'success' => false,
                'message' => 'MySQL connection failed: ' . $conn->connect_error
            ];
            error_log("MySQL connection failed: " . $conn->connect_error);
            http_response_code(500);
            echo json_encode($response);
            die();
        }

        // Chuẩn bị câu lệnh SQL để lưu giao dịch vào cơ sở dữ liệu
        $stmt = $conn->prepare("INSERT INTO order_transactions (id, gateway, transactionDate, transactionNumber, accountNumber, content, transferType, transferAmount) 
        VALUES (?, ?, ?, ?, ?, ?, ?, ?)");

        if (!$stmt) {
            $response = [
                'success' => false,
                'message' => 'Failed to prepare SQL statement: ' . $conn->error
            ];
            error_log("Failed to prepare SQL statement: " . $conn->error);
            http_response_code(500);
            echo json_encode($response);
            die();
        }

        // Xử lý từng giao dịch trong danh sách
        foreach ($data['transactions'] as $transaction) {
            $id = $transaction['id'] ?? null;
            $gateway = $transaction['gateway'] ?? '';
            $transactionDate = $transaction['transactionDate'] ?? '';
            $transactionNumber = $transaction['transactionNumber'] ?? '';
            $accountNumber = $transaction['accountNumber'] ?? '';
            $content = $transaction['content'] ?? '';
            $transferType = $transaction['transferType'] ?? '';
            $transferAmount = $transaction['transferAmount'] ?? 0.00;

            // Nếu thiếu ID giao dịch thì bỏ qua giao dịch này
            if ($id === null) {
                file_put_contents($logFile, "Transaction skipped due to missing ID: " . json_encode($transaction) . "\n", FILE_APPEND);
                continue;
            }

            // Ràng buộc tham số và thực thi câu lệnh SQL
            $stmt->bind_param("issssssd", $id, $gateway, $transactionDate, $transactionNumber, $accountNumber, $content, $transferType, $transferAmount);

            if (!$stmt->execute()) {
                $response = [
                    'success' => false,
                    'message' => 'Failed to insert transaction: ' . $stmt->error
                ];
                file_put_contents($logFile, "Failed to insert transaction: " . $stmt->error . "\n", FILE_APPEND);
                http_response_code(500);
                echo json_encode($response);
                $stmt->close();
                $conn->close();
                die();
            } else {
                file_put_contents($logFile, "Transaction inserted successfully: " . json_encode($transaction) . "\n", FILE_APPEND);
            }
        }

        // Đóng câu lệnh và kết nối
        $stmt->close();
        $conn->close();

        // Phản hồi thành công
        $response = [
            'success' => true,
            'message' => 'Giao dịch được xử lý và xác nhận thành công'
        ];
        http_response_code(200);
    } else {
        // Phản hồi lỗi nếu không có 'transactions'
        $response = [
            'success' => false,
            'message' => 'Thông tin không hợp lệ, không tìm thấy giao dịch'
        ];
        error_log("Thông tin không hợp lệ, không tìm thấy giao dịch");
        http_response_code(400);
    }
} else {
    // Phản hồi lỗi nếu JSON không hợp lệ
    $response = [
        'success' => false,
        'message' => 'JSON không hợp lệ'
    ];
    error_log("Invalid JSON: " . $requestBody);
    http_response_code(400);
}

// Thiết lập header Content-Type là application/json
header('Content-Type: application/json');

// Xuất phản hồi JSON
echo json_encode($response);
Tạo bảng trong database lưu thông tin giao dịch nhận từ webhook

Kết luận

Vậy là đã tạo thành công file webhook cơ bản để nhận giao dịch từ Pay2S, bước tiếp theo bạn cần tạo webhook và tích hợp webhook với Pay2S. Bạn có thể xem thêm bài viết Hướng dẫn tích hợp webhook Pay2S. Nếu có thắc mắc hoặc cần hỗ trợ hãy liên hệ với Pay2S để được giải đáp nhanh chóng.

5/5 – (172 votes)

Bài viết khác