ข้ามไปยังเนื้อหาหลัก
เวอร์ชัน: ล่าสุด

การจัดการข้อผิดพลาด

ทำความเข้าใจข้อผิดพลาด Omise API และนำการจัดการข้อผิดพลาดที่แข็งแกร่งมาใช้สำหรับการผสานรวมการชำระเงินที่เชื่อถือได้ เรียนรู้เกี่ยวกับรหัสสถานะ HTTP รูปแบบการตอบกลับข้อผิดพลาด และแนวทางปฏิบัติที่ดีที่สุดสำหรับการดีบัก

ภาพรวม

Omise API ใช้รหัสตอบกลับ HTTP แบบดั้งเดิมเพื่อระบุความสำเร็จหรือความล้มเหลวของคำขอ API ข้อผิดพลาดจะส่งคืนการตอบกลับในรูปแบบ JSON พร้อมข้อมูลโดยละเอียดเพื่อช่วยในการดีบักและจัดการความล้มเหลวอย่างเหมาะสม

อ้างอิงอย่างรวดเร็ว
  • รหัส 2xx → สำเร็จ
  • รหัส 4xx → ข้อผิดพลาดฝั่งไคลเอนต์ (คำขอของคุณไม่ถูกต้อง)
  • รหัส 5xx → ข้อผิดพลาดเซิร์ฟเวอร์ (เกิดปัญหาฝั่ง Omise)
  • ข้อผิดพลาดทั้งหมดส่งคืน JSON พร้อม object: "error" และฟิลด์คำอธิบาย

รูปแบบการตอบกลับข้อผิดพลาด

ข้อผิดพลาด API ทั้งหมดส่งคืนโครงสร้าง JSON ที่สอดคล้องกัน

{
"object": "error",
"location": "https://www.omise.co/api-errors#authentication-failure",
"code": "authentication_failure",
"message": "authentication failed"
}

ฟิลด์ของออบเจ็กต์ข้อผิดพลาด

ฟิลด์ประเภทคำอธิบาย
objectstringเป็น "error" เสมอสำหรับการตอบกลับข้อผิดพลาด
locationstringURL ไปยังเอกสารสำหรับข้อผิดพลาดประเภทนี้
codestringรหัสข้อผิดพลาดที่อ่านได้ด้วยเครื่อง (ตัวพิมพ์เล็กพร้อมขีดล่าง)
messagestringข้อความข้อผิดพลาดภาษาอังกฤษที่อ่านได้ด้วยมนุษย์
ฟิลด์เพิ่มเติม

ข้อผิดพลาดบางประเภทอาจมีฟิลด์เพิ่มเติมเฉพาะบริบท เช่น charge_id, customer_id หรือ validation_errors เพื่อการดีบักโดยละเอียด


รหัสสถานะ HTTP

2xx สำเร็จ

200 OK

ความหมาย: คำขอสำเร็จ

{
"object": "charge",
"id": "chrg_test_5xuy4w91xqz7d1w9u0t",
"amount": 100000,
"status": "successful"
}

เกิดขึ้นเมื่อ:

  • ✅ คำขอ GET ส่งคืนข้อมูลสำเร็จ
  • ✅ คำขอ POST/PATCH เสร็จสมบูรณ์สำเร็จ
  • ✅ คำขอ DELETE ลบทรัพยากรสำเร็จ

201 Created

ความหมาย: สร้างทรัพยากรสำเร็จแล้ว

เกิดขึ้นเมื่อ:

  • ✅ คำขอ POST สร้างทรัพยากรใหม่ (หายาก โดยปกติจะส่งคืน 200)

4xx ข้อผิดพลาดฝั่งไคลเอนต์

ข้อผิดพลาดฝั่งไคลเอนต์ระบุว่ามีปัญหากับคำขอที่คุณส่ง แก้ไขคำขอและลองใหม่อีกครั้ง

400 Bad Request

ความหมาย: คำขอมีรูปแบบผิดหรือมีพารามิเตอร์ที่ไม่ถูกต้อง

{
"object": "error",
"location": "https://www.omise.co/api-errors#bad-request",
"code": "bad_request",
"message": "amount must be at least 2000 (in subunits)"
}

สาเหตุทั่วไป:

  • ❌ พารามิเตอร์ที่จำเป็นหายไป
  • ❌ ค่าพารามิเตอร์ไม่ถูกต้อง
  • ❌ จำนวนเงินต่ำกว่าเกณฑ์ขั้นต่ำ
  • ❌ สกุลเงินที่ไม่รองรับ
  • ❌ JSON payload มีรูปแบบผิด
  • ❌ ประเภทพารามิเตอร์ไม่ถูกต้อง

ตัวอย่างสถานการณ์:

# พารามิเตอร์ที่จำเป็นหายไป
curl https://api.omise.co/charges \
-X POST \
-u skey_test_...: \
-d "currency=thb"
# Error: amount is required

# จำนวนเงินน้อยเกินไป
curl https://api.omise.co/charges \
-X POST \
-u skey_test_...: \
-d "amount=100" \
-d "currency=thb"
# Error: amount must be at least 2000 (20 THB)

วิธีแก้ไข:

  1. ✅ ตรวจสอบเอกสาร API สำหรับพารามิเตอร์ที่จำเป็น
  2. ✅ ตรวจสอบความถูกต้องของค่าพารามิเตอร์ก่อนส่ง
  3. ✅ ตรวจสอบให้แน่ใจว่าประเภทข้อมูลถูกต้อง (ตัวเลขเป็นตัวเลข ไม่ใช่สตริง)
  4. ✅ ยืนยันจำนวนเงินขั้นต่ำเฉพาะสกุลเงิน

401 Unauthorized

ความหมาย: การยืนยันตัวตนล้มเหลว - คีย์ API ไม่ถูกต้องหรือหายไป

{
"object": "error",
"location": "https://www.omise.co/api-errors#authentication-failure",
"code": "authentication_failure",
"message": "authentication failed"
}

สาเหตุทั่วไป:

  • ❌ ไม่ได้ให้คีย์ API
  • ❌ รูปแบบคีย์ API ไม่ถูกต้อง
  • ❌ คีย์ API ถูกเพิกถอนหรือหมดอายุ
  • ❌ คีย์ผิดสำหรับสภาพแวดล้อม (คีย์ทดสอบในการใช้งานจริง)
  • ❌ คีย์ API ไม่ได้เข้ารหัสอย่างถูกต้องใน Authorization header

ตัวอย่างสถานการณ์:

# คีย์ API หายไป
curl https://api.omise.co/account
# Error: authentication failed

# คีย์ API ไม่ถูกต้อง
curl https://api.omise.co/account \
-u invalid_key:
# Error: authentication failed

# ใช้คีย์สาธารณะสำหรับการดำเนินการคีย์ลับ
curl https://api.omise.co/charges \
-X POST \
-u pkey_test_...: \
-d "amount=100000" \
-d "currency=thb"
# Error: authentication failed

วิธีแก้ไข:

  1. ✅ ยืนยันว่าคีย์ API ถูกต้อง (คัดลอกจาก Dashboard)
  2. ✅ ตรวจสอบช่องว่างหรืออักขระพิเศษ
  3. ✅ ใช้คีย์ลับสำหรับการดำเนินการฝั่งเซิร์ฟเวอร์
  4. ✅ ใช้คีย์สาธารณะเฉพาะสำหรับโทเค็น/แหล่งที่มา
  5. ✅ ตรวจสอบให้แน่ใจว่าคีย์ไม่ถูกเพิกถอน
  6. ✅ ยืนยันว่าคีย์ทดสอบ/จริงตรงกับสภาพแวดล้อม

เรียนรู้เพิ่มเติมเกี่ยวกับการยืนยันตัวตน →


402 Payment Required

ความหมาย: บัตรหรือวิธีการชำระเงินถูกปฏิเสธ

{
"object": "error",
"location": "https://www.omise.co/api-errors#payment-declined",
"code": "payment_declined",
"message": "Your card was declined",
"charge_id": "chrg_test_5xuy4w91xqz7d1w9u0t"
}

สาเหตุทั่วไป:

  • ❌ ยอดเงินไม่เพียงพอ
  • ❌ บัตรหมดอายุ
  • ❌ รายละเอียดบัตรไม่ถูกต้อง (CVV, วันหมดอายุ)
  • ❌ ผู้ออกบัตรปฏิเสธ (สงสัยว่าเป็นการฉ้อโกง)
  • ❌ บัตรไม่เปิดใช้งานสำหรับการชำระเงินออนไลน์
  • ❌ เกินขีดจำกัดธุรกรรม

รหัสข้อผิดพลาดเฉพาะการชำระเงิน:

รหัสความหมายการดำเนินการ
insufficient_fundบัตรมีเงินไม่เพียงพอขอให้ลูกค้าใช้บัตรอื่น
invalid_cardหมายเลขบัตรไม่ถูกต้องยืนยันหมายเลขบัตร
stolen_or_lost_cardบัตรถูกรายงานว่าสูญหาย/ถูกขโมยขอให้ลูกค้าติดต่อธนาคาร
failed_processingการประมวลผลล้มเหลวลองใหม่หรือใช้บัตรอื่น
payment_cancelledลูกค้ายกเลิกการชำระเงินการดำเนินการของลูกค้า ไม่ต้องแก้ไข
payment_expiredหมดเวลาชำระเงินสร้างการเรียกเก็บเงินใหม่

ตัวอย่างสถานการณ์:

# พยายามเรียกเก็บเงินที่มียอดไม่เพียงพอ
curl https://api.omise.co/charges \
-X POST \
-u skey_test_...: \
-d "amount=1000000" \
-d "currency=thb" \
-d "card=tokn_test_..."
# Error: insufficient_fund

วิธีแก้ไข:

  1. ✅ แสดงข้อความข้อผิดพลาดที่ชัดเจนแก่ลูกค้า
  2. ✅ ขอให้ลูกค้าลองวิธีการชำระเงินอื่น
  3. ✅ อย่าลองบัตรเดียวกันหลายครั้ง (เพื่อหลีกเลี่ยงการบล็อกบัตร)
  4. ✅ แนะนำให้ลูกค้าติดต่อธนาคาร
  5. ✅ บันทึกเหตุผลการปฏิเสธเพื่อการวิเคราะห์
อย่าลองใหม่กับความล้มเหลวในการชำระเงิน

การพยายามบัตรที่ถูกปฏิเสธซ้ำๆ อาจทำให้เกิดการแจ้งเตือนการฉ้อโกงและบัตรอาจถูกบล็อก แทนที่จะเป็นเช่นนั้น ให้ขอให้ลูกค้ายืนยันรายละเอียดการชำระเงินหรือใช้วิธีการชำระเงินอื่น


404 Not Found

ความหมาย: ทรัพยากรที่ร้องขอไม่มีอยู่

{
"object": "error",
"location": "https://www.omise.co/api-errors#not-found",
"code": "not_found",
"message": "charge chrg_test_invalid was not found"
}

สาเหตุทั่วไป:

  • ❌ ID ทรัพยากรไม่ถูกต้อง
  • ❌ ทรัพยากรถูกลบแล้ว
  • ❌ URL endpoint API ผิด
  • ❌ พิมพ์ผิดใน ID ทรัพยากร
  • ❌ ใช้ ID ทดสอบในโหมดจริง (หรือในทางกลับกัน)

ตัวอย่างสถานการณ์:

# ID charge ไม่ถูกต้อง
curl https://api.omise.co/charges/chrg_invalid \
-u skey_test_...:
# Error: not found

# endpoint ผิด
curl https://api.omise.co/charge/chrg_test_... \
-u skey_test_...:
# Error: not found (should be /charges not /charge)

วิธีแก้ไข:

  1. ✅ ยืนยันว่า ID ทรัพยากรถูกต้อง
  2. ✅ ตรวจสอบว่าทรัพยากรไม่ถูกลบ
  3. ✅ ตรวจสอบให้แน่ใจว่าโหมดทดสอบ/จริงตรงกับคีย์
  4. ✅ ยืนยันการสะกด URL endpoint
  5. ✅ ค้นหาทรัพยากรโดยใช้ list endpoint

422 Unprocessable Entity

ความหมาย: คำขอมีรูปแบบถูกต้อง แต่มีข้อผิดพลาดเชิงความหมาย

{
"object": "error",
"location": "https://www.omise.co/api-errors#invalid-charge",
"code": "invalid_charge",
"message": "charge has already been captured"
}

สาเหตุทั่วไป:

  • ❌ พยายามเปลี่ยนสถานะที่ไม่ถูกต้อง
  • ❌ การละเมิดตรรกะทางธุรกิจ
  • ❌ ทรัพยากรถูกประมวลผลแล้ว
  • ❌ การรวมพารามิเตอร์ที่ไม่ถูกต้อง

ตัวอย่างสถานการณ์:

# capture charge ที่ capture แล้ว
curl https://api.omise.co/charges/chrg_test_.../capture \
-X POST \
-u skey_test_...:
# Error: charge has already been captured

# คืนเงินมากกว่าจำนวน charge
curl https://api.omise.co/charges/chrg_test_.../refunds \
-X POST \
-u skey_test_...: \
-d "amount=200000"
# Error: refund amount exceeds available amount

วิธีแก้ไข:

  1. ✅ ตรวจสอบสถานะทรัพยากรก่อนการดำเนินการ
  2. ✅ ยืนยันข้อจำกัดของตรรกะทางธุรกิจ
  3. ✅ อย่าลองการดำเนินการเดียวกันซ้ำ (อาจสำเร็จแล้ว)
  4. ✅ ดึงทรัพยากรเพื่อตรวจสอบสถานะปัจจุบัน

429 Too Many Requests

ความหมาย: คุณเกินขีดจำกัดอัตรา

{
"object": "error",
"location": "https://www.omise.co/api-errors#rate-limit-exceeded",
"code": "rate_limit_exceeded",
"message": "too many requests, please try again later"
}

Response Headers:

X-RateLimit-Limit: 1000
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 1612137600
Retry-After: 60

วิธีแก้ไข:

  1. ✅ ใช้ exponential backoff
  2. ✅ ตรวจสอบ header Retry-After
  3. ✅ ลดความถี่ของคำขอ
  4. ✅ รวมการดำเนินการเมื่อเป็นไปได้
  5. ✅ แคชการตอบกลับเมื่อเหมาะสม

เรียนรู้เพิ่มเติมเกี่ยวกับการจำกัดอัตรา →


5xx ข้อผิดพลาดเซิร์ฟเวอร์

ข้อผิดพลาดเซิร์ฟเวอร์บ่งชี้ถึงปัญหาฝั่ง Omise ซึ่งหายาก แต่ควรได้รับการจัดการอย่างเหมาะสม

500 Internal Server Error

ความหมาย: เกิดปัญหาบนเซิร์ฟเวอร์ของ Omise

{
"object": "error",
"location": "https://www.omise.co/api-errors#internal-server-error",
"code": "internal_server_error",
"message": "An internal server error occurred"
}

เกิดขึ้นเมื่อ:

  • ⚠️ ข้อผิดพลาดฝั่งเซิร์ฟเวอร์ที่ไม่คาดคิด
  • ⚠️ การหยุดชะงักของบริการชั่วคราว
  • ⚠️ ปัญหาการเชื่อมต่อฐานข้อมูล

วิธีจัดการ:

  1. ✅ ลองคำขอใหม่ด้วย exponential backoff
  2. ✅ ตรวจสอบ status.omise.co สำหรับเหตุการณ์
  3. ✅ ติดต่อฝ่ายสนับสนุนหากยังคงเกิดขึ้นต่อเนื่อง
  4. ✅ บันทึกรายละเอียดข้อผิดพลาดเพื่อการดีบัก

503 Service Unavailable

ความหมาย: บริการไม่พร้อมใช้งานชั่วคราว

{
"object": "error",
"location": "https://www.omise.co/api-errors#service-unavailable",
"code": "service_unavailable",
"message": "Service temporarily unavailable"
}

เกิดขึ้นเมื่อ:

  • ⚠️ การบำรุงรักษาตามกำหนดการ
  • ⚠️ บริการโอเวอร์โหลด
  • ⚠️ ปัญหาผู้ให้บริการ upstream

วิธีจัดการ:

  1. ✅ ลองใหม่หลังจากหน่วงเวลา (ตรวจสอบ header Retry-After)
  2. ✅ แสดงข้อความบำรุงรักษาแก่ผู้ใช้
  3. ✅ จัดคิวคำขอเพื่อประมวลผลภายหลัง
  4. ✅ ตรวจสอบหน้าสถานะ

รายการรหัสข้อผิดพลาดที่สมบูรณ์

400 Bad Request

รหัสข้อความคำอธิบาย
backend_error"backend error"การสื่อสารกับผู้ให้บริการชำระเงินล้มเหลว
bad_request"bad request"พารามิเตอร์คำขอไม่ถูกต้อง
brand_not_supported"brand not supported"แบรนด์บัตรไม่ได้รับการยอมรับในบัญชี
documents_locked"documents list cannot be modified"ข้อพิพาทไม่เปิดให้อัปโหลดไฟล์แล้ว
expired_charge"charge expired"หมดเวลาการอนุมัติหรือรหัสชำระเงินหมดอายุ
failed_capture"capture failed"การจับยึด charge ไม่สำเร็จ
failed_expire"expire failed"ไม่สามารถตั้งค่าการหมดอายุของ charge
failed_fraud_check"fraud check failed"บัตรถูกระบุว่าเป็นการฉ้อโกง
failed_multi_currency"the currency conversion could not be completed"ข้อผิดพลาดการแปลงสกุลเงิน
failed_refund"refund failed"ข้อผิดพลาดการประมวลผลการคืนเงิน
failed_reverse"reverse failed"การย้อนกลับ charge ไม่สำเร็จ
failed_void"void failed"การยกเลิก charge ไม่สำเร็จ
feature_not_supported"feature not supported"บัญชีไม่มีการเข้าถึงฟีเจอร์นี้
invalid_amount"invalid amount"ส่งจำนวนเงินที่ไม่ใช่จำนวนเต็ม
invalid_bank_account"invalid bank account"รายละเอียดบัญชีธนาคารไม่ถูกต้อง
invalid_card"invalid card"การสร้างโทเค็นบัตรล้มเหลว
invalid_card_token"invalid card token"ส่งอ็อบเจกต์โทเค็นที่ไม่ใช่สตริง
invalid_charge"invalid charge"charge ไม่ตรงตามข้อกำหนดขั้นต่ำ
invalid_dispute"invalid dispute"การแก้ไขข้อพิพาทนอกเหนือพารามิเตอร์
invalid_domain"request must be made with the vault.omise.co domain"ใช้โดเมนผิดสำหรับการสร้างโทเค็น
invalid_file_type"invalid content-type"อัปโหลดไฟล์ประเภทที่ไม่รองรับ
invalid_link"invalid link"ลิงก์ขาดสกุลเงินหรือคำอธิบาย
invalid_recipient"invalid recipient"ผู้รับไม่ถูกต้องหรือไม่มีอยู่
invalid_transfer"invalid transfer"ข้อผิดพลาดการสร้าง/อัปเดตการโอน
missing_card"request contains no card parameters"ไม่มีพารามิเตอร์บัตรในคำขอ
missing_file"missing file or filename"อัปโหลดไฟล์โดยไม่มีเนื้อหาไฟล์
used_token"token was already used"ใช้โทเค็นแบบใช้ครั้งเดียวซ้ำ

401 Unauthorized

รหัสข้อความคำอธิบาย
authentication_failure"authentication failed"คีย์ API ไม่ถูกต้องหรือหายไป

402 Payment Required

รหัสข้อความคำอธิบาย
insufficient_fund"insufficient funds"เงินในบัตรไม่เพียงพอ
invalid_card"invalid card"หมายเลขบัตรไม่ถูกต้อง
stolen_or_lost_card"stolen or lost card"บัตรถูกรายงานว่าสูญหาย/ถูกขโมย
failed_processing"processing failed"การประมวลผลล้มเหลว
payment_cancelled"payment cancelled"ลูกค้ายกเลิกการชำระเงิน
payment_expired"payment expired"หมดเวลาชำระเงิน
payment_rejected"payment rejected"การชำระเงินถูกปฏิเสธ

403 Forbidden

รหัสข้อความคำอธิบาย
key_expired_error"expired key"คีย์ API หมดอายุแล้ว
locked_account_error"account locked"บัญชีถูกล็อก
not_authorized"not authorized"ไม่อนุญาตให้ดำเนินการด้วยคีย์นี้

404 Not Found

รหัสข้อความคำอธิบาย
not_found"the requested object was not found"ทรัพยากรไม่มีอยู่
serializer_not_found"your current API version does not support this action"เวอร์ชัน API ไม่เข้ากัน
service_not_found"you are using an api version that does not support this operation"การดำเนินการไม่รองรับในเวอร์ชัน API

422 Unprocessable Entity

รหัสข้อความคำอธิบาย
failed_deletion"this object could not be deleted"การดำเนินการลบล้มเหลว
invalid_filter"invalid filters"ฟิลเตอร์การค้นหา/รายการไม่ถูกต้อง
invalid_page"invalid page"หมายเลขหน้าไม่ถูกต้อง
invalid_per_page"invalid per page"จำนวนรายการต่อหน้าไม่ถูกต้อง
invalid_scope"invalid scope"ขอบเขตการค้นหาไม่ถูกต้อง

429 Too Many Requests

รหัสข้อความคำอธิบาย
too_many_requests"you have sent too many requests in too little time"เกินขีดจำกัดอัตรา

500 Internal Server Error

รหัสข้อความคำอธิบาย
internal_error"request could not be completed due to an internal error"ข้อผิดพลาดฝั่งเซิร์ฟเวอร์

503 Service Unavailable

รหัสข้อความคำอธิบาย
search_unavailable"search is temporarily unavailable"บริการค้นหาหยุดทำงานชั่วคราว

รหัสข้อผิดพลาดตามหมวดหมู่

ข้อผิดพลาดการยืนยันตัวตน

รหัสสถานะ HTTPคำอธิบายวิธีแก้ไข
authentication_failure401คีย์ API ไม่ถูกต้องหรือหายไปยืนยันว่าคีย์ API ถูกต้อง
key_expired_error403คีย์ API หมดอายุแล้วสร้างคีย์ API ใหม่จากแดชบอร์ด
locked_account_error403บัญชีถูกล็อกติดต่อฝ่ายสนับสนุน
not_authorized403ไม่อนุญาตให้ดำเนินการใช้ประเภทคีย์ที่ถูกต้อง (public/secret)

ข้อผิดพลาดคำขอ

รหัสสถานะ HTTPคำอธิบายวิธีแก้ไข
bad_request400พารามิเตอร์คำขอไม่ถูกต้องยืนยันพารามิเตอร์และรูปแบบที่จำเป็น
invalid_amount400จำนวนเงินที่ไม่ใช่จำนวนเต็มใช้จำนวนเต็มในหน่วยเล็กสุด
invalid_card_token400รูปแบบโทเค็นไม่ถูกต้องตรวจสอบให้แน่ใจว่าโทเค็นเป็นสตริง
invalid_domain400ใช้โดเมนผิดสำหรับคำขอใช้ vault.omise.co สำหรับโทเค็น
missing_card400ไม่มีพารามิเตอร์บัตรรวมบัตรหรือโทเค็นในคำขอ
used_token400โทเค็นถูกใช้แล้วโทเค็นใช้ได้ครั้งเดียว สร้างใหม่
invalid_charge422สถานะ charge ไม่อนุญาตให้ดำเนินการยืนยันสถานะ charge ก่อน
not_found404ทรัพยากรไม่มีอยู่ยืนยัน ID ทรัพยากร

ข้อผิดพลาดการชำระเงิน

รหัสสถานะ HTTPคำอธิบายวิธีแก้ไข
insufficient_fund402ยอดเงินไม่เพียงพอขอวิธีการชำระเงินอื่น
invalid_card400/402รายละเอียดบัตรไม่ถูกต้องยืนยันหมายเลขบัตรและ CVV
stolen_or_lost_card402บัตรถูกรายงานว่าสูญหาย/ถูกขโมยลูกค้าต้องติดต่อธนาคาร
failed_processing402การประมวลผลการชำระเงินล้มเหลวลองใหม่หรือใช้บัตรอื่น
failed_fraud_check400บัตรถูกระบุว่าเป็นการฉ้อโกงลูกค้าต้องติดต่อธนาคาร
payment_cancelled402ลูกค้ายกเลิกการชำระเงินการดำเนินการของลูกค้า
payment_expired402หมดเวลาชำระเงินสร้าง charge ใหม่
expired_charge400การอนุมัติหมดอายุสร้าง charge ใหม่
brand_not_supported400ไม่รองรับแบรนด์บัตรใช้แบรนด์บัตรที่รองรับ

ข้อผิดพลาดการดำเนินการ

รหัสสถานะ HTTPคำอธิบายวิธีแก้ไข
failed_capture400การจับยึดล้มเหลวตรวจสอบสถานะ charge อาจถูกจับยึดแล้ว
failed_refund400การคืนเงินล้มเหลวตรวจสอบสถานะ charge และจำนวนที่คืนได้
failed_reverse400การย้อนกลับล้มเหลวตรวจสอบสถานะ charge
failed_void400การยกเลิกล้มเหลวตรวจสอบสถานะ charge
failed_expire400การหมดอายุล้มเหลวตรวจสอบสถานะ charge
failed_deletion422การลบล้มเหลวทรัพยากรอาจมีการพึ่งพา

ข้อผิดพลาดการโอน/ผู้รับ

รหัสสถานะ HTTPคำอธิบายวิธีแก้ไข
invalid_bank_account400บัญชีธนาคารไม่ถูกต้องยืนยันรายละเอียดบัญชีธนาคาร
invalid_recipient400ผู้รับไม่ถูกต้องยืนยันว่าผู้รับมีอยู่และใช้งานได้
invalid_transfer400การโอนไม่ถูกต้องตรวจสอบพารามิเตอร์การโอน

ข้อผิดพลาดข้อพิพาท

รหัสสถานะ HTTPคำอธิบายวิธีแก้ไข
invalid_dispute400การดำเนินการข้อพิพาทไม่ถูกต้องตรวจสอบสถานะข้อพิพาท
documents_locked400ไม่สามารถแก้ไขเอกสารได้ข้อพิพาทถูกปิดแล้ว
invalid_file_type400ประเภทไฟล์ไม่ถูกต้องใช้รูปแบบไฟล์ที่รองรับ
missing_file400ไม่มีไฟล์รวมไฟล์ในการอัปโหลด

ข้อผิดพลาดระบบ

รหัสสถานะ HTTPคำอธิบายวิธีแก้ไข
internal_error500ข้อผิดพลาดฝั่งเซิร์ฟเวอร์ลองใหม่ด้วย backoff
backend_error400ข้อผิดพลาดผู้ให้บริการชำระเงินลองใหม่หรือติดต่อฝ่ายสนับสนุน
search_unavailable503บริการค้นหาหยุดทำงานรอและลองใหม่
too_many_requests429เกินขีดจำกัดอัตราใช้การจำกัดอัตรา
feature_not_supported400ฟีเจอร์ไม่ได้เปิดใช้งานติดต่อฝ่ายสนับสนุนเพื่อเปิดใช้งาน
failed_multi_currency400การแปลงสกุลเงินล้มเหลวตรวจสอบการรองรับสกุลเงิน

แนวทางปฏิบัติที่ดีที่สุดสำหรับการจัดการข้อผิดพลาด

1. ตรวจสอบสถานะ HTTP ก่อนเสมอ

# ✅ ดี - ตรวจสอบรหัสสถานะ
require 'omise'

begin
charge = Omise::Charge.create({
amount: 100000,
currency: 'thb',
card: params[:token]
})

# สำเร็จ
render json: charge

rescue Omise::Error => e
# จัดการข้อผิดพลาดตามประเภท
case e.http_status
when 400
render json: { error: 'คำขอไม่ถูกต้อง' }, status: 400
when 401
render json: { error: 'การยืนยันตัวตนล้มเหลว' }, status: 401
when 402
render json: { error: 'การชำระเงินถูกปฏิเสธ', code: e.code }, status: 402
when 404
render json: { error: 'ไม่พบทรัพยากร' }, status: 404
when 422
render json: { error: 'การดำเนินการไม่ถูกต้อง', message: e.message }, status: 422
when 429
render json: { error: 'เกินขีดจำกัดอัตรา' }, status: 429
when 500, 503
render json: { error: 'บริการไม่พร้อมใช้งานชั่วคราว' }, status: 503
else
render json: { error: 'เกิดข้อผิดพลาด' }, status: 500
end
end

2. แยกวิเคราะห์รายละเอียดข้อผิดพลาด

# ✅ ดี - แยกรายละเอียดข้อผิดพลาด
import omise

try:
charge = omise.Charge.create(
amount=100000,
currency='thb',
card=token
)
return charge

except omise.errors.BaseError as e:
error_code = e.code
error_message = e.message

# บันทึกสำหรับการดีบัก
logger.error(f"Charge failed: {error_code} - {error_message}")

# ส่งคืนข้อความที่เป็นมิตรกับผู้ใช้
if error_code == 'insufficient_fund':
return {'error': 'เงินไม่เพียงพอ กรุณาลองบัตรอื่น'}
elif error_code == 'invalid_card':
return {'error': 'รายละเอียดบัตรไม่ถูกต้อง กรุณาตรวจสอบและลองใหม่'}
else:
return {'error': 'การชำระเงินล้มเหลว กรุณาลองใหม่'}

3. ใช้ตรรกะการลองใหม่สำหรับข้อผิดพลาดเซิร์ฟเวอร์

// ✅ ดี - ลองใหม่ด้วย exponential backoff
const omise = require('omise')({ secretKey: process.env.OMISE_SECRET_KEY });

async function createChargeWithRetry(chargeData, maxRetries = 3) {
for (let attempt = 0; attempt < maxRetries; attempt++) {
try {
const charge = await omise.charges.create(chargeData);
return { success: true, charge };

} catch (error) {
const isServerError = error.statusCode >= 500;
const isLastAttempt = attempt === maxRetries - 1;

if (isServerError && !isLastAttempt) {
// Exponential backoff: 1s, 2s, 4s
const delay = Math.pow(2, attempt) * 1000;
await new Promise(resolve => setTimeout(resolve, delay));
continue;
}

// ไม่ลองข้อผิดพลาดฝั่งไคลเอนต์หรือความพยายามสุดท้าย
return {
success: false,
error: {
code: error.code,
message: error.message,
statusCode: error.statusCode
}
};
}
}
}

4. ตรวจสอบก่อนส่งคำขอ

<?php
// ✅ ดี - ตรวจสอบก่อนเรียก API
function createCharge($amount, $currency, $token) {
// ตรวจสอบจำนวนเงิน
$minAmounts = [
'thb' => 2000, // 20 THB
'jpy' => 50, // 50 JPY
'sgd' => 100, // 1 SGD
];

if ($amount < $minAmounts[$currency]) {
return [
'error' => 'จำนวนเงินต่ำกว่าขั้นต่ำสำหรับ ' . strtoupper($currency),
'min_amount' => $minAmounts[$currency]
];
}

// ตรวจสอบสกุลเงิน
$supportedCurrencies = ['thb', 'jpy', 'sgd', 'myr', 'usd'];
if (!in_array($currency, $supportedCurrencies)) {
return [
'error' => 'สกุลเงินไม่รองรับ',
'supported' => $supportedCurrencies
];
}

// ตรวจสอบรูปแบบโทเค็น
if (!preg_match('/^tokn_test_[a-z0-9]+$/', $token) &&
!preg_match('/^tokn_[a-z0-9]+$/', $token)) {
return ['error' => 'รูปแบบโทเค็นไม่ถูกต้อง'];
}

try {
$charge = OmiseCharge::create([
'amount' => $amount,
'currency' => $currency,
'card' => $token
]);

return ['success' => true, 'charge' => $charge];

} catch (Exception $e) {
return [
'error' => $e->getMessage(),
'code' => $e->getCode()
];
}
}

5. แสดงข้อความที่เป็นมิตรกับผู้ใช้

// ✅ ดี - แปลรหัสข้อผิดพลาดเป็นข้อความผู้ใช้
package main

import (
"github.com/omise/omise-go"
)

func getUserMessage(err error) string {
if omiseErr, ok := err.(*omise.Error); ok {
switch omiseErr.Code {
case "authentication_failure":
return "เกิดข้อผิดพลาดของระบบ กรุณาลองใหม่ภายหลัง"
case "insufficient_fund":
return "บัตรของคุณมีเงินไม่เพียงพอ กรุณาใช้บัตรอื่น"
case "invalid_card":
return "รายละเอียดบัตรไม่ถูกต้อง กรุณาตรวจสอบและลองใหม่"
case "stolen_or_lost_card":
return "ไม่สามารถใช้บัตรนี้ได้ กรุณาติดต่อธนาคารของคุณ"
case "payment_cancelled":
return "การชำระเงินถูกยกเลิก คุณสามารถลองใหม่เมื่อพร้อม"
case "payment_expired":
return "เซสชันการชำระเงินหมดอายุ กรุณาเริ่มการชำระเงินใหม่"
case "rate_limit_exceeded":
return "พยายามหลายครั้งเกินไป กรุณารอสักครู่แล้วลองใหม่"
case "service_unavailable":
return "บริการชำระเงินไม่พร้อมใช้งานชั่วคราว กรุณาลองใหม่ภายหลัง"
default:
return "การชำระเงินล้มเหลว กรุณาลองใหม่หรือใช้วิธีการชำระเงินอื่น"
}
}
return "เกิดข้อผิดพลาดที่ไม่คาดคิด กรุณาลองใหม่"
}

func createCharge(amount int64, currency string, token string) (string, error) {
client, _ := omise.NewClient(
os.Getenv("OMISE_PUBLIC_KEY"),
os.Getenv("OMISE_SECRET_KEY"),
)

charge, err := client.CreateCharge(&omise.ChargeParams{
Amount: amount,
Currency: currency,
Card: token,
})

if err != nil {
userMessage := getUserMessage(err)
return userMessage, err
}

return "การชำระเงินสำเร็จ!", nil
}

6. บันทึกข้อผิดพลาดเพื่อการดีบัก

# ✅ ดี - บันทึกข้อผิดพลาดที่ครอบคลุม
require 'logger'

logger = Logger.new('omise_errors.log')

begin
charge = Omise::Charge.create({
amount: 100000,
currency: 'thb',
card: token
})

rescue Omise::Error => e
# บันทึกข้อมูลข้อผิดพลาดโดยละเอียด
logger.error({
timestamp: Time.now.iso8601,
error_type: 'omise_api_error',
http_status: e.http_status,
error_code: e.code,
error_message: e.message,
request_id: e.request_id,
charge_params: {
amount: 100000,
currency: 'thb',
token: token[0..10] + '...' # โทเค็นบางส่วนเพื่อความปลอดภัย
},
backtrace: e.backtrace.first(5)
}.to_json)

# re-raise หรือจัดการ
raise
end

7. อย่าเปิดเผยรายละเอียดข้อผิดพลาดที่ละเอียดอ่อน

// ❌ ไม่ดี - เปิดเผยรายละเอียดภายใน
app.post('/charge', async (req, res) => {
try {
const charge = await omise.charges.create(req.body);
res.json(charge);
} catch (error) {
// อย่าทำแบบนี้ - เปิดเผยคีย์ API, เส้นทางภายใน ฯลฯ
res.status(500).json({ error: error.toString() });
}
});

// ✅ ดี - ข้อความข้อผิดพลาดที่ปลอดภัย
app.post('/charge', async (req, res) => {
try {
const charge = await omise.charges.create({
amount: req.body.amount,
currency: req.body.currency,
card: req.body.token
});
res.json({ success: true, charge_id: charge.id });

} catch (error) {
// บันทึกข้อผิดพลาดทั้งหมดฝั่งเซิร์ฟเวอร์
console.error('Charge failed:', error);

// ส่งคืนข้อความที่ปลอดภัยให้ไคลเอนต์
const safeMessage = {
success: false,
error: {
code: error.code || 'unknown',
message: getUserFriendlyMessage(error.code)
}
};

res.status(error.statusCode || 500).json(safeMessage);
}
});

การดีบักข้อผิดพลาด

1. ใช้โหมดทดสอบสำหรับการพัฒนา

ใช้คีย์ API ทดสอบเสมอระหว่างการพัฒนา

# ✅ โหมดทดสอบ - ปลอดภัยสำหรับการดีบัก
export OMISE_SECRET_KEY=skey_test_5xuy4w91xqz7d1w9u0t

# ข้อผิดพลาดโหมดทดสอบเหมือนกับโหมดจริง
curl https://api.omise.co/charges \
-X POST \
-u $OMISE_SECRET_KEY: \
-d "amount=100000" \
-d "currency=thb" \
-d "card=tokn_test_no1t4tnemucod0e51mo"

2. ตรวจสอบคำขอ/การตอบกลับใน Dashboard

  1. ไปที่ DashboardLogs
  2. ดูคำขอและการตอบกลับ API ทั้งหมด
  3. ตรวจสอบรายละเอียดข้อผิดพลาดที่แน่นอน
  4. ยืนยันพารามิเตอร์คำขอ

3. เปิดใช้งานการบันทึกการดีบัก

# Ruby - เปิดใช้งานการบันทึกการดีบัก
require 'omise'

Omise.api_key = ENV['OMISE_SECRET_KEY']
Omise.debug = true # พิมพ์คำขอ/การตอบกลับ HTTP

charge = Omise::Charge.create({
amount: 100000,
currency: 'thb',
card: token
})
# Python - เปิดใช้งานการบันทึกการดีบัก
import omise
import logging

# เปิดใช้งาน HTTP debugging
logging.basicConfig(level=logging.DEBUG)

omise.api_secret = os.environ['OMISE_SECRET_KEY']
// Node.js - ใช้การสกัดกั้นคำขอ
const omise = require('omise')({
secretKey: process.env.OMISE_SECRET_KEY
});

// บันทึกคำขอ/การตอบกลับทั้งหมด
omise.interceptor = {
request: (config) => {
console.log('Request:', config);
return config;
},
response: (response) => {
console.log('Response:', response);
return response;
},
responseError: (error) => {
console.error('Error:', error);
throw error;
}
};

4. ทดสอบด้วย Curl

# verbose output แสดงการแลกเปลี่ยน HTTP แบบเต็ม
curl -v https://api.omise.co/charges \
-X POST \
-u skey_test_...: \
-d "amount=100000" \
-d "currency=thb" \
-d "card=tokn_test_..."

# แสดง:
# > POST /charges HTTP/1.1
# > Authorization: Basic ...
# > Content-Type: application/x-www-form-urlencoded
# < HTTP/1.1 200 OK
# < Content-Type: application/json

5. ขั้นตอนการดีบักทั่วไป

สำหรับข้อผิดพลาดการยืนยันตัวตน:

  1. ✅ คัดลอกคีย์ API จาก Dashboard (อย่าพิมพ์ด้วยตนเอง)
  2. ✅ ตรวจสอบช่องว่างหรือการขึ้นบรรทัดใหม่พิเศษ
  3. ✅ ยืนยันว่าคีย์ทดสอบ/จริงตรงกับสภาพแวดล้อม
  4. ✅ ยืนยันรูปแบบ Authorization header: Basic base64(key:)

สำหรับข้อผิดพลาดการชำระเงิน:

  1. ✅ ลองด้วยหมายเลขบัตรทดสอบก่อน
  2. ✅ ยืนยันว่ารายละเอียดบัตรถูกต้อง
  3. ✅ ตรวจสอบว่าบัตรรองรับการชำระเงินออนไลน์
  4. ✅ ทดสอบด้วยบัตรอื่นเพื่อแยกปัญหา

สำหรับข้อผิดพลาดการตรวจสอบ:

  1. ✅ อ่านข้อความข้อผิดพลาดอย่างรอบคอบ
  2. ✅ ตรวจสอบเอกสาร API สำหรับข้อกำหนดพารามิเตอร์
  3. ✅ ยืนยันประเภทข้อมูล (ตัวเลข vs สตริง)
  4. ✅ ยืนยันค่าขั้นต่ำ/สูงสุด

สำหรับข้อผิดพลาดเซิร์ฟเวอร์:

  1. ✅ ตรวจสอบ status.omise.co
  2. ✅ ลองใหม่หลังจากหน่วงเวลา
  3. ✅ ติดต่อฝ่ายสนับสนุนหากยังคงเกิดขึ้นต่อเนื่อง
  4. ✅ บันทึกคำขอ/การตอบกลับสำหรับการดีบัก

รายการตรวจสอบการจัดการข้อผิดพลาด

ก่อนเริ่มใช้งานจริง ตรวจสอบให้แน่ใจว่าการจัดการข้อผิดพลาดของคุณ:

  • จับข้อยกเว้น/ข้อผิดพลาด API ทั้งหมด
  • ตรวจสอบรหัสสถานะ HTTP
  • แยกวิเคราะห์รหัสข้อผิดพลาดสำหรับการจัดการเฉพาะ
  • แสดงข้อความข้อผิดพลาดที่เป็นมิตรกับผู้ใช้
  • บันทึกข้อผิดพลาดพร้อมบริบทเต็มรูปแบบ (ฝั่งเซิร์ฟเวอร์เท่านั้น)
  • ใช้ตรรกะการลองใหม่สำหรับข้อผิดพลาดเซิร์ฟเวอร์
  • ใช้ exponential backoff สำหรับการลองใหม่
  • ไม่ลองความล้มเหลวในการชำระเงิน
  • ตรวจสอบคำขอก่อนส่ง
  • ไม่เปิดเผยรายละเอียดข้อผิดพลาดที่ละเอียดอ่อนให้ผู้ใช้
  • จัดการหมดเวลาเครือข่าย
  • มีทางเลือกสำหรับความไม่พร้อมใช้งานของบริการ
  • ตรวจสอบอัตราข้อผิดพลาด
  • แจ้งเตือนสำหรับรูปแบบข้อผิดพลาดผิดปกติ
  • ทดสอบสถานการณ์ข้อผิดพลาดในการพัฒนา

การทดสอบสถานการณ์ข้อผิดพลาด

ทดสอบข้อผิดพลาดการยืนยันตัวตน

# คีย์ API ไม่ถูกต้อง
curl https://api.omise.co/account \
-u invalid_key:
# Returns 401 authentication_failure

# ประเภทคีย์ผิด
curl https://api.omise.co/charges \
-X POST \
-u pkey_test_...: \
-d "amount=100000"
# Returns 401 authentication_failure

ทดสอบข้อผิดพลาดการตรวจสอบ

# จำนวนเงินน้อยเกินไป
curl https://api.omise.co/charges \
-X POST \
-u skey_test_...: \
-d "amount=100" \
-d "currency=thb"
# Returns 400 bad_request

# สกุลเงินไม่ถูกต้อง
curl https://api.omise.co/charges \
-X POST \
-u skey_test_...: \
-d "amount=100000" \
-d "currency=invalid"
# Returns 400 bad_request

ทดสอบข้อผิดพลาดการชำระเงิน

ใช้บัตรทดสอบพิเศษที่ทริกเกอร์ข้อผิดพลาดเฉพาะ

# ยอดเงินไม่เพียงพอ
curl https://vault.omise.co/tokens \
-X POST \
-u pkey_test_...: \
-d "card[number]=4111111111111111" \
-d "card[name]=Test User" \
-d "card[expiration_month]=12" \
-d "card[expiration_year]=2025" \
-d "card[security_code]=123"
# ใช้โทเค็นในการ charge - จะถูกปฏิเสธด้วย insufficient_fund

# การประมวลผลล้มเหลว
curl https://vault.omise.co/tokens \
-X POST \
-u pkey_test_...: \
-d "card[number]=4000000000000002" \
-d "card[name]=Test User" \
-d "card[expiration_month]=12" \
-d "card[expiration_year]=2025" \
-d "card[security_code]=123"
# ใช้โทเค็นในการ charge - จะถูกปฏิเสธด้วย failed_processing

ดูบัตรทดสอบทั้งหมด →


คำถามที่พบบ่อย

ฉันควรลองการชำระเงินที่ล้มเหลวโดยอัตโนมัติหรือไม่?

ไม่ อย่าลองความล้มเหลวในการชำระเงิน (ข้อผิดพลาด 4xx) โดยอัตโนมัติ การพยายามบัตรที่ถูกปฏิเสธซ้ำๆ อาจ:

  • ทริกเกอร์การแจ้งเตือนการฉ้อโกง
  • ทำให้บัตรถูกบล็อกโดยผู้ออก
  • ทำให้ลูกค้ารู้สึกหงุดหงิด

แทนที่จะเป็นเช่นนั้น:

  • แสดงข้อความข้อผิดพลาดที่ชัดเจน
  • ขอให้ลูกค้ายืนยันรายละเอียดการชำระเงิน
  • แนะนำวิธีการชำระเงินอื่น
  • ให้ลูกค้าลองใหม่ด้วยตนเองเมื่อพร้อม

คุณสามารถลองใหม่กับ ข้อผิดพลาดเซิร์ฟเวอร์ (5xx) ด้วย exponential backoff

ฉันจะทราบได้อย่างไรว่าการ charge ล้มเหลว?

ตรวจสอบรหัสสถานะ HTTP และสถานะการ charge:

สำเร็จ:

  • HTTP 200 OK
  • charge.status = "successful" (capture แล้ว)
  • charge.status = "pending" (authorize แล้ว ยังไม่ capture)

ล้มเหลว:

  • HTTP 402 Payment Required
  • การตอบกลับข้อผิดพลาดพร้อมรหัสเช่น payment_declined
  • charge.status = "failed" หรือ "expired"
ความแตกต่างระหว่างข้อผิดพลาด 4xx และ 5xx คืออะไร?

4xx = ข้อผิดพลาดฝั่งไคลเอนต์ (ความผิดของคุณ)

  • คำขอของคุณไม่ถูกต้อง
  • แก้ไขคำขอและลองใหม่
  • ตัวอย่าง: พารามิเตอร์ไม่ดี, การชำระเงินถูกปฏิเสธ, การยืนยันตัวตนไม่ถูกต้อง

5xx = ข้อผิดพลาดเซิร์ฟเวอร์ (ความผิดของเรา)

  • เกิดปัญหาฝั่ง Omise
  • คำขอถูกต้อง แต่ไม่สามารถประมวลผลได้
  • ลองใหม่ด้วย backoff
  • ตัวอย่าง: บริการหยุด, ข้อผิดพลาดภายใน
ฉันควรรอนานแค่ไหนก่อนลองใหม่?

ใช้ exponential backoff:

  1. การลองครั้งแรก: รอ 1 วินาที
  2. การลองครั้งที่สอง: รอ 2 วินาที
  3. การลองครั้งที่สาม: รอ 4 วินาที
  4. การลองครั้งที่สี่: รอ 8 วินาที
  5. ยกเลิกหลังจาก 3-5 ครั้ง
async function retryWithBackoff(fn, maxAttempts = 5) {
for (let attempt = 0; attempt < maxAttempts; attempt++) {
try {
return await fn();
} catch (error) {
if (error.statusCode < 500 || attempt === maxAttempts - 1) {
throw error;
}
const delay = Math.pow(2, attempt) * 1000;
await new Promise(resolve => setTimeout(resolve, delay));
}
}
}
ฉันสามารถรับรายละเอียดเพิ่มเติมเกี่ยวกับความล้มเหลวในการชำระเงินได้หรือไม่?

เหตุผลความล้มเหลวในการชำระเงินถูกจำกัดโดยเจตนาเพื่อความปลอดภัย ผู้ออกบัตรไม่ได้ให้เหตุผลการปฏิเสธที่เฉพาะเจาะจงเสมอเพื่อป้องกันการฉ้อโกง

สิ่งที่คุณได้รับ:

  • ✅ รหัสข้อผิดพลาดระดับสูง (insufficient_fund, invalid_card)
  • ✅ ข้อความข้อผิดพลาดทั่วไป

สิ่งที่คุณไม่ได้รับ:

  • ❌ ยอดเงินในบัตรที่แน่นอน
  • ❌ แฟล็กการฉ้อโกงเฉพาะ
  • ❌ รหัสธนาคารภายใน

สิ่งนี้ปกป้องเจ้าของบัตรจากผู้โจมตีที่ทดสอบบัตรที่ถูกขโมย


อ้างอิงอย่างรวดเร็ว

โครงสร้างการตอบกลับข้อผิดพลาด

{
"object": "error",
"location": "https://www.omise.co/api-errors#<error-code>",
"code": "<error_code>",
"message": "<human-readable message>"
}

รหัสสถานะทั่วไป

สถานะความหมายการดำเนินการ
200สำเร็จประมวลผลการตอบกลับ
400คำขอไม่ถูกต้องแก้ไขพารามิเตอร์
401ไม่ได้รับอนุญาตแก้ไขคีย์ API
402การชำระเงินล้มเหลวแสดงข้อผิดพลาด อย่าลองใหม่
404ไม่พบยืนยัน ID ทรัพยากร
422สถานะไม่ถูกต้องตรวจสอบสถานะทรัพยากร
429จำกัดอัตราใช้ backoff
500ข้อผิดพลาดเซิร์ฟเวอร์ลองใหม่ด้วย backoff
503บริการหยุดลองใหม่ภายหลัง

รูปแบบการจัดการข้อผิดพลาด

1. ลองคำขอ API
2. จับข้อผิดพลาด
3. ตรวจสอบสถานะ HTTP
4. แยกวิเคราะห์รหัสข้อผิดพลาด
5. บันทึกข้อผิดพลาด (ฝั่งเซิร์ฟเวอร์)
6. แสดงข้อความผู้ใช้ (ปลอดภัย)
7. ลองใหม่เฉพาะหาก 5xx
8. ตรวจสอบอัตราข้อผิดพลาด

ทรัพยากรที่เกี่ยวข้อง


ถัดไป: เรียนรู้เกี่ยวกับ การแบ่งหน้า เพื่อจัดการชุดผลลัพธ์ขนาดใหญ่อย่างมีประสิทธิภาพ