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
- Phạm vi kiểm thử giới hạn trong ứng dụng hoặc tài nguyên đã uỷ quyền.
- Khoá CaptchaAI nằm trong CI secret hoặc vault, không trong mã nguồn.
- Mỗi lần chạy ghi lại thời gian gọi và mã trạng thái phản hồi.
- Có chính sách thử lại idempotent, có giới hạn, cho lỗi tạm thời.
- 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 method — turnstile 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
- Bắt đầu nhanh với CaptchaAI
- Kiểm thử QA CAPTCHA được uỷ quyền
- Kiểm thử endpoint CAPTCHA trên biểu mẫu của bạn
- Khi test trình duyệt fail nhưng API pass: cách gỡ lỗi
- Giải reCAPTCHA v2 qua API
- Giải Cloudflare Turnstile qua API
- Giải GeeTest v3 qua API
Xác thực tích hợp CAPTCHA của bạn trong môi trường nội bộ với CaptchaAI.