Phạm vi an toàn: Hướng dẫn này chỉ áp dụng cho môi trường QA, staging hoặc pre-production thuộc sở hữu hoặc được uỷ quyền của bạn. Nội dung bao gồm các mẫu chẩn đoán, kiểm thử và quan sát cho tích hợp CAPTCHA của chính bạn — không áp dụng cho bên thứ ba hoặc luồng không được phép.
Đội QA thường cần xác thực luồng checkout e-commerce nội bộ dưới tải thực tế. Hướng dẫn này trình bày cách kiểm thử tích hợp CAPTCHA trong checkout staging của bạn với CaptchaAI — không can thiệp vào cửa hàng bên thứ ba và không thực hiện thanh toán thật.
Phạm vi an toàn
- Chỉ áp dụng cho QA e-commerce thuộc sở hữu hoặc được uỷ quyền.
- Kiểm thử tích hợp checkout trong staging.
- Smoke test CAPTCHA trên biểu mẫu checkout của bạn.
- Dữ liệu giả lập: tồn kho, sản phẩm, token thanh toán thử nghiệm.
- Kiểm thử tính liên tục phiên trên endpoint nội bộ.
- Không mua hàng thật, không cửa hàng bên thứ ba.
Kiến trúc QA cho checkout trong staging
Sao chép kiến trúc production: triển khai front-end checkout và backend đơn hàng tại https://staging.example.com/checkout-test. Dùng một bản sao cơ sở dữ liệu riêng với SKU giả lập và cấu hình cổng thanh toán ở chế độ sandbox.
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 tác vụ CaptchaAI từ kiểm thử nội bộ
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']
Xác thực token tại endpoint QA thuộc sở hữu của bạn
Gửi token Turnstile vừa nhận 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, kiểm tra SKU giả lập và trả về order_id mô phỏng.
Logging và chỉ số QA
Với mỗi qa_case ghi: thời gian giải (giây), mã trả về backend, độ trễ end-to-end và số lần retry. Tổng hợp trung vị, P90 và P99 từ pipeline nội bộ — các giá trị chỉ là tham khảo cho môi trường staging của bạn.
Khắc phục sự cố
| Vấn đề | Nguyên nhân thường gặp | Cách xử lý |
|---|---|---|
| Test không tìm thấy widget | Thay đổi selector hoặc thời điểm load | Kiểm tra selector và wait_for_selector trên staging |
CaptchaAI trả ERROR_NO_SLOT_AVAILABLE |
Hàng đợi đầy tạm thời | Thử lại với backoff trong pipeline nội bộ |
| Backend QA từ chối token | Sai action/sitekey/secret | Đối chiếu cấu hình backend với staging |
Khả năng quan sát
Hãy ghi nhật ký có cấu trúc cho mỗi lần chạy QA. Các chỉ số nên thu thập bao gồm: tổng thời gian lấy token, mã trạng thái HTTP, ID tác vụ và độ sâu hàng đợi. Tách các môi trường (development, staging, pre-production) thành các kênh riêng biệt và liên kết các bước thông qua một correlation id (ví dụ với OpenTelemetry). Khả năng phát lại toàn bộ kịch bản từ một id duy nhất sẽ cắt giảm thời gian chẩn đoán sự cố ít nhất một nửa.
Danh mục kiểm tra
- Phạm vi kiểm thử chỉ giới hạn trong ứng dụng của bạn hoặc tài nguyên đã được uỷ quyền.
- Khoá CaptchaAI nằm trong CI secret hoặc vault, không nằm trong mã nguồn.
- Mỗi lần chạy có thời gian gọi và mã trạng thái phản hồi được ghi lại.
- Có chính sách thử lại idempotent với giới hạn cho lỗi tạm thời.
- Bài kiểm thử có thể tái lập trên CI mà không cần can thiệp thủ công.
Ví dụ gọi QA
Đoạn mã Python dưới đây minh hoạ luồng tối thiểu để kiểm thử một CAPTCHA widget trên môi trường staging của bạn thông qua CaptchaAI.
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
Quy trình này có chạm vào lưu lượng production không?
Không. Mọi ví dụ giả định một môi trường được uỷ quyền như staging.example.com hoặc một domain QA do bạn sở hữu. Hãy tái tạo cấu hình CAPTCHA của production trong bản sao staging của riêng bạn.
Có thể đặt API key trực tiếp trong mã không?
Không. Hãy nạp khoá thông qua trình quản lý secret của CI, biến môi trường hoặc vault. Khoá đã bị commit vào kho mã phải được xoay vòng ngay lập tức.
Bạn khuyến nghị gì cho lỗi tạm thời?
Thử lại idempotent kèm exponential backoff (ví dụ 1s, 2s, 4s) và một giới hạn trên. Lỗi mạng, mã 5xx và ERROR_NO_SLOT_AVAILABLE đều phù hợp để thử lại; lỗi xác thực kéo dài thì không nên.
Hướng dẫn liên quan an toàn
- CaptchaAI quickstart
- 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 kiểm thử trình duyệt thất bại còn API thành công: 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.