Trường Hợp Sử Dụng

Kiểm thử CAPTCHA cho checkout e-commerce có nhu cầu cao

Phạm vi an toàn: Bài viết chỉ áp dụng cho checkout QA, staging hoặc pre-production mà bạn sở hữu hoặc được uỷ quyền kiểm thử. Mọi mẫu bên dưới dùng dữ liệu giả lập, không chạm vào cửa hàng bên thứ ba hay giao dịch thật.

Làm sao xác nhận CAPTCHA trong checkout không nghẽn đơn hàng khi lưu lượng tăng đột biến, mà không đụng vào dữ liệu khách thật? Cách làm chuẩn: tái tạo luồng — sản phẩm, tồn kho, cổng thanh toán — trên staging, rồi gửi task tới CaptchaAI đúng như production và đo kết quả.

Phạm vi kiểm thử được cho phép

Trong phạm vi Ngoài phạm vi
QA e-commerce thuộc sở hữu/uỷ quyền Cửa hàng bên thứ ba
Checkout trên staging Giao dịch thật trên production
Smoke test widget CAPTCHA Mua hàng bằng thẻ thật
SKU, tồn kho, token thanh toán giả lập Dữ liệu khách hàng thật
Tính liên tục phiên trên endpoint nội bộ Phiên/tài khoản người dùng khác

Vì sao phải kiểm thử trên staging trước khi release

Nhiều đội QA ở TP.HCM và Hà Nội — nhất là đội kiểm thử cho các nền tảng thương mại điện tử quy mô lớn kiểu Shopee hay Tiki — phải xác nhận checkout chịu được tải cao trước mỗi đợt flash sale. Widget CAPTCHA chậm hoặc rớt ngay bước thanh toán khiến đơn hàng nghẽn hàng loạt, và đội vận hành thường chỉ phát hiện sau khi khách đã kêu ca. Tái tạo lưu lượng giờ cao điểm trên staging, đúng cấu hình CAPTCHA của production, là cách duy nhất để bắt lỗi đó trước.

Dựng môi trường staging giống hệt production

Sao chép kiến trúc production sang môi trường riêng: đưa front-end checkout và backend đơn hàng lên https://staging.example.com/checkout-test, dùng bản sao cơ sở dữ liệu riêng với SKU giả lập, và chuyển cổng thanh toán sang chế độ sandbox. Giữ nguyên sitekey pattern, action và ngưỡng điểm CAPTCHA của production — staging dùng widget khác thì số liệu đo được sẽ sai lệch.

Chuẩn bị SKU, tồn kho và thanh toán giả lập

FAKE_PRODUCTS = [
    {'sku': 'QA-SKU-001', 'price_cents': 9900, 'stock': 1000},
    {'sku': 'QA-SKU-002', 'price_cents': 19900, 'stock': 500},
]

FAKE_PAYMENT_TOKEN = 'qa_pm_token_demo'
STAGING_CHECKOUT = 'https://staging.example.com/checkout-test'

Gửi task Turnstile tới CaptchaAI trong kịch bản QA

Gửi task thật tới CaptchaAI từ kịch bản kiểm thử, không mock phản hồi — chỉ vậy mới đo được độ trễ và tỷ lệ lỗi sát production.

import os, time, requests

API_KEY = os.environ['CAPTCHAAI_API_KEY']
SITEKEY = os.environ['QA_TURNSTILE_SITEKEY']
PAGEURL = 'https://staging.example.com/checkout-test'

def solve_turnstile():
    r = requests.post('https://ocr.captchaai.com/in.php', data={
        'key': API_KEY, 'method': 'turnstile',
        'sitekey': SITEKEY, 'pageurl': PAGEURL, 'json': 1,
    }).json()
    task_id = r['request']
    while True:
        time.sleep(5)
        rr = requests.get('https://ocr.captchaai.com/res.php', params={
            'key': API_KEY, 'action': 'get', 'id': task_id, 'json': 1,
        }).json()
        if rr['status'] == 1:
            return rr['request']

Token Turnstile chỉ dùng được một lần và hết hạn sau vài phút. Đưa token vào endpoint checkout ngay khi nhận được, đừng giữ lại để dùng cho lần chạy sau.

Đưa token vào endpoint checkout QA

Gửi token tới endpoint đặt hàng nội bộ (https://staging.example.com/qa-checkout) trong trường cf-turnstile-response. Endpoint QA xác thực token, đối chiếu SKU giả lập, trả về order_id mô phỏng.

Đo lường: các chỉ số cần theo dõi cho mỗi lần chạy

Chỉ số Ý nghĩa
Thời gian giải (giây) CaptchaAI mất bao lâu để trả token
Mã trạng thái HTTP Endpoint QA phản hồi thành công hay lỗi
Độ trễ end-to-end Từ lúc gửi task tới lúc backend QA xác nhận order
Số lần retry Số lần phải thử lại trước khi có kết quả

Nối các bước bằng một correlation id chung theo từng qa_case — dùng OpenTelemetry nếu pipeline đã có sẵn. Tổng hợp trung vị, P90 và P99 theo lô chạy; các con số chỉ tham khảo cho staging của bạn.

Lỗi thường gặp khi kiểm thử và cách xử lý

Vấn đề Nguyên nhân thường gặp Cách xử lý
Test không tìm thấy widget Selector đổi hoặc thời điểm load khác production Kiểm tra selector và wait_for_selector
CaptchaAI trả ERROR_NO_SLOT_AVAILABLE Hàng đợi đầy tạm thời Retry với backoff, không hard-fail ngay
Backend QA từ chối token Sai action, sitekey hoặc secret Đối chiếu tham số backend với production

Checklist trước khi đưa vào pipeline CI

  1. Phạm vi kiểm thử giới hạn trong ứng dụng hoặc tài nguyên đã uỷ quyền.
  2. Khoá CaptchaAI nằm trong CI secret hoặc vault, không trong mã nguồn.
  3. Mỗi lần chạy ghi lại thời gian gọi và mã trạng thái phản hồi.
  4. Có chính sách thử lại idempotent, có giới hạn, cho lỗi tạm thời.
  5. Bài test chạy lại được trên CI mà không cần can thiệp thủ công.

Ví dụ: gửi task reCAPTCHA qua createTask

Nếu backend QA dùng interface hướng task (createTask/getTaskResult) thay vì in.php/res.php, đoạn Python dưới đây minh hoạ luồng tối thiểu cho một widget trên staging.

import os
import requests

API_KEY = os.environ['CAPTCHAAI_KEY']
QA_PAGE_URL = os.environ['QA_PAGE_URL']  # ví dụ https://staging.example.com/qa-login
QA_SITE_KEY = os.environ['QA_SITE_KEY']


def submit_qa_recaptcha() -> str:
    payload = {
        'clientKey': API_KEY,
        'task': {
            'type': 'NoCaptchaTaskProxyless',
            'websiteURL': QA_PAGE_URL,
            'websiteKey': QA_SITE_KEY,
        },
    }
    response = requests.post(
        'https://api.captchaai.com/createTask',
        json=payload,
        timeout=30,
    )
    response.raise_for_status()
    return response.json()['taskId']


def fetch_qa_result(task_id: str) -> dict:
    payload = {'clientKey': API_KEY, 'taskId': task_id}
    response = requests.post(
        'https://api.captchaai.com/getTaskResult',
        json=payload,
        timeout=30,
    )
    response.raise_for_status()
    return response.json()

Câu hỏi thường gặp

CaptchaAI có hỗ trợ đúng loại CAPTCHA đang chạy trên production không?

Có, nếu cấu hình đúng methodturnstile cho Turnstile, userrecaptcha cho reCAPTCHA v2/v3. GA gồm reCAPTCHA v2/v3, Turnstile/Challenge, GeeTest v3, ảnh/OCR, BLS; hCaptcha, FunCaptcha, GeeTest v4 chưa hỗ trợ — đừng đưa vào bộ test.

Nên polling hay dùng webhook khi kiểm thử CAPTCHA trong CI?

Pipeline CI ngắn hạn: polling res.php mỗi vài giây, dễ debug. Webhook/callback phù hợp hơn cho job QA chạy nền dài.

Kiểm thử CAPTCHA nhiều lần mỗi ngày trong CI có tốn kém không?

CaptchaAI tính phí theo thread song song, không theo từng lần giải. BASIC ($15/tháng, 5 thread) đủ cho phần lớn pipeline QA nội bộ; nhiều test song song hơn thì lên STANDARD ($30/tháng, 15 thread).

Xử lý lỗi tạm thời trong pipeline QA như thế nào?

Retry idempotent với backoff tăng dần (1s, 2s, 4s), có giới hạn số lần. Lỗi mạng, 5xx và ERROR_NO_SLOT_AVAILABLE nên retry; lỗi xác thực dai dẳng thì dừng và báo lỗi cấu hình.

Tài nguyên liên quan an toàn

Xác thực tích hợp CAPTCHA của bạn trong môi trường nội bộ với CaptchaAI.

Os comentários estão desativados para este artigo.