Đăng Ký Gói Thành Viên
API đăng ký gói thành viên cho user. Khi đăng ký, hệ thống sẽ tự động cập nhật hạng thành viên dựa trên tổng điểm tích lũy hiện tại của user. Lưu ý: API này chỉ cập nhật package_id trong database, không xử lý thanh toán. Nếu gói có giá (price > 0), cần tích hợp thanh toán riêng trước khi gọi API này.
POST https://api.socdo.vn/mini-app/v1/register-membership
Request Headers
Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...
Shop-ID: 23933
Content-Type: application/json
Tham số
Tham số Loại Bắt buộc Mô tả
Authorization header JWT token từ API login (Bearer token) hoặc Token-Seller
Shop-ID header ID của shop (có thể lấy từ token nếu không có trong header)
package_id body (JSON) ID của gói thành viên muốn đăng ký (integer)
Request Body
{
    "package_id": 1
}
Response thành công (200/201)
{
    "success": true,
    "message": "Đăng ký gói thành viên thành công",
    "data": {
        "package_id": 1,
        "package_name": "Gói Vàng",
        "level_id": 2
    }
}
Response lỗi (400 - package_id không hợp lệ)
{
    "success": false,
    "message": "package_id không hợp lệ"
}
Response lỗi (404 - Gói không tồn tại)
{
    "success": false,
    "message": "Gói thành viên không tồn tại hoặc đã bị vô hiệu hóa"
}
Response lỗi (401 - Token không hợp lệ)
{
    "success": false,
    "message": "Token không hợp lệ hoặc đã hết hạn: Invalid token"
}
Response lỗi (500 - Lỗi database)
{
    "success": false,
    "message": "Lỗi khi đăng ký gói thành viên: [error message]"
}
Ví dụ JavaScript
// Đăng ký gói thành viên
async function registerMembership(packageId) {
    try {
        const authToken = localStorage.getItem('auth_token');
        const shopId = localStorage.getItem('shop_id');
        
        if (!authToken || !shopId) {
            throw new Error('Chưa đăng nhập hoặc thiếu Shop-ID');
        }
        
        // Nếu gói có giá, cần xử lý thanh toán trước
        // Ví dụ: await processPayment(packageId);
        
        const response = await fetch('https://api.socdo.vn/mini-app/v1/register-membership', {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json',
                'Authorization': `Bearer ${authToken}`,
                'Shop-ID': shopId
            },
            body: JSON.stringify({
                package_id: packageId
            })
        });
        
        const result = await response.json();
        
        if (result.success) {
            console.log('Đăng ký thành công:', result.data);
            
            // Hiển thị thông báo thành công
            showNotification('Đăng ký gói thành viên thành công!', 'success');
            
            // Reload danh sách gói để cập nhật is_current
            await getMembershipPackages();
            
            return result;
        } else {
            console.error('Lỗi đăng ký:', result.message);
            showNotification(result.message, 'error');
            return result;
        }
    } catch (error) {
        console.error('Lỗi kết nối:', error);
        showNotification('Lỗi kết nối mạng', 'error');
        return { success: false, message: 'Lỗi kết nối mạng' };
    }
}

// Xử lý thanh toán (nếu gói có giá)
async function processPayment(packageId) {
    // Lấy thông tin gói để kiểm tra giá
    const packages = await getMembershipPackages();
    const packageInfo = packages.data.packages.find(p => p.id === packageId);
    
    if (packageInfo && packageInfo.price > 0) {
        // Gọi API thanh toán (tùy vào hệ thống thanh toán của bạn)
        // Ví dụ: Zalo Pay, VNPay, etc.
        const paymentResult = await callPaymentAPI({
            amount: packageInfo.price,
            description: `Thanh toán gói ${packageInfo.package_name}`,
            order_id: `MEMBERSHIP_${packageId}_${Date.now()}`
        });
        
        if (!paymentResult.success) {
            throw new Error('Thanh toán thất bại');
        }
        
        return paymentResult;
    }
    
    return { success: true };
}

// Hiển thị thông báo
function showNotification(message, type) {
    const notification = document.createElement('div');
    notification.className = `notification ${type}`;
    notification.textContent = message;
    document.body.appendChild(notification);
    
    setTimeout(() => {
        notification.remove();
    }, 3000);
}

// Sử dụng
document.getElementById('register-btn').addEventListener('click', async function() {
    const packageId = parseInt(this.dataset.packageId);
    
    // Xác nhận trước khi đăng ký
    if (confirm('Bạn có chắc chắn muốn đăng ký gói này?')) {
        await registerMembership(packageId);
    }
});
Lưu ý quan trọng
  • Token Required: API yêu cầu JWT token từ login (Bearer token trong Authorization header) hoặc Token-Seller
  • Shop-ID Required: Bắt buộc phải có Shop-ID trong header hoặc trong token
  • Thanh toán: API này KHÔNG xử lý thanh toán. Nếu gói có giá (price > 0), cần tích hợp thanh toán riêng trước khi gọi API này
  • Tự động cập nhật level: Sau khi đăng ký, hệ thống tự động cập nhật level_id dựa trên total_point hiện tại
  • Gói miễn phí: Nếu gói có price = 0, có thể đăng ký trực tiếp mà không cần thanh toán
  • Gói đã đăng ký: Nếu user đã có gói, API sẽ cập nhật package_id mới thay vì tạo mới
  • Validation: API kiểm tra gói có tồn tại, active và thuộc đúng shop
  • Level tự động: Hệ thống tự động tìm level phù hợp với điểm hiện tại (level có min_point <= total_point)
Cấu trúc dữ liệu trả về
Trường Loại Mô tả
success boolean True nếu đăng ký thành công
message string Thông báo kết quả
data.package_id integer ID gói thành viên đã đăng ký
data.package_name string Tên gói thành viên đã đăng ký
data.level_id integer | null ID hạng thành viên được tự động cập nhật (null nếu không tìm thấy level phù hợp)
Bảo mật
  • JWT Verification: Sử dụng Firebase JWT để xác thực token
  • Shop Validation: Kiểm tra gói thành viên thuộc đúng shop
  • Status Check: Chỉ cho phép đăng ký gói có status = 1 (active)
  • Database Security: Sử dụng prepared statement để tránh SQL injection
  • CORS Headers: Cấu hình CORS để bảo mật cross-origin requests
API Liên Quan
Quy trình đăng ký gói có giá
  1. Bước 1: Gọi API get-membership-packages để lấy danh sách gói và kiểm tra giá
  2. Bước 2: Nếu gói có giá (price > 0), tích hợp thanh toán (Zalo Pay, VNPay, etc.)
  3. Bước 3: Sau khi thanh toán thành công, gọi API register-membership với package_id
  4. Bước 4: Hệ thống tự động cập nhật package_id và level_id trong user_membership
  5. Bước 5: Reload danh sách gói để cập nhật UI