# Danh sách kiểm tra QA (/vi/in-store/getting-started/checklist)



Trước khi phát hành ứng dụng, hãy rà soát danh sách kiểm tra đảm bảo chất lượng (QA) này. Danh sách bao gồm kiểm thử chức năng, xử lý lỗi và các tình huống trải nghiệm người dùng nhằm giảm thiểu sự cố khi vận hành thực tế. Đánh dấu từng mục sau khi bạn đã kiểm tra.

<ChecklistProgress />

## 1. Kiểm thử chức năng [#1-functional-testing]

### Luồng giao dịch [#transaction-flows]

<ChecklistItem id="TF-1" code="TF-1" title="Thanh toán thành công">
  Kiểm tra một giao dịch được chấp thuận thông thường với số tiền 

  `1.01`

   (mã 

  `00`

  ) trong 

  [môi trường sandbox](./testing)

  .
</ChecklistItem>

<ChecklistItem id="TF-2" code="TF-2" title="Xác thực thẻ bị từ chối">
  Mô phỏng một giao dịch bị từ chối với số tiền 

  `1.07`

   (mã 

  `06`

  ) và đảm bảo ứng dụng xử lý một cách có kiểm soát mà không bị crash.
</ChecklistItem>

<ChecklistItem id="TF-3" code="TF-3" title="Thẻ hết hạn">
  Mô phỏng thẻ hết hạn với số tiền 

  `6.05`

   (mã 

  `54`

  ) và kiểm tra thông báo hiển thị cho người dùng.
</ChecklistItem>

<ChecklistItem id="TF-4" code="TF-4" title="Sai PIN">
  Mô phỏng việc nhập sai PIN với số tiền 

  `6.06`

   (mã 

  `55`

  ) và kiểm tra thông báo hiển thị cho người dùng.
</ChecklistItem>

<ChecklistItem id="TF-5" code="TF-5" title="Vượt quá số lần nhập PIN">
  Mô phỏng việc vượt giới hạn số lần nhập lại PIN với số tiền 

  `8.06`

   (mã 

  `75`

  ) và đảm bảo ứng dụng của bạn coi đây là thất bại dứt khoát.
</ChecklistItem>

<ChecklistItem id="TF-6" code="TF-6" title="Giao dịch bị hủy">
  Bắt đầu một khoản thanh toán rồi hủy nó từ giao diện SDK (nút quay lại hoặc nút đóng). Đảm bảo ứng dụng của bạn quay về đúng màn hình trước đó.
</ChecklistItem>

<ChecklistItem id="TF-7" code="TF-7" title="Tạo biên lai">
  Kiểm tra rằng dữ liệu giao dịch (mã cấp phép, TID, ngày) được ghi nhận chính xác và được in hoặc gửi email trên biên lai.
</ChecklistItem>

### Tương tác phần cứng [#hardware-interactions]

<ChecklistItem id="HI-1" code="HI-1" title="Đọc NFC">
  Kiểm thử với thẻ vật lý (Visa, Mastercard) và ví điện tử (Apple Pay, Google Pay).
</ChecklistItem>

<ChecklistItem id="HI-2" code="HI-2" title="Đọc bị gián đoạn">
  Rút thẻ ra ngay sau khi chạm nhưng trước tiếng “bíp”. Đảm bảo SDK nhắc chạm lại hoặc báo lỗi một cách có kiểm soát.
</ChecklistItem>

<ChecklistItem id="HI-3" code="HI-3" title="Mất kết nối mạng">
  Tắt internet/Wi-Fi trong khi giao dịch đang diễn ra. Kiểm tra rằng ứng dụng báo lỗi kết nối và không bị treo.
</ChecklistItem>

## 2. Onboarding và cấu hình [#2-onboarding--configuration]

### Thiết lập merchant [#merchant-setup]

<ChecklistItem id="MS-1" code="MS-1" title="Onboarding người dùng mới">
  Thực hiện toàn bộ quy trình onboarding với một tài khoản mới.
</ChecklistItem>

<ChecklistItem id="MS-2" code="MS-2" title="Kiểm tra trạng thái">
  Kiểm tra rằng 

  `Accept.merchant.onboardingStatus()`

   trả về 

  `RequiresAction`

   cho merchant đang chờ duyệt và 

  `ReadyForPayments`

   cho merchant đã được duyệt.
</ChecklistItem>

## 3. Bảo mật và tuân thủ [#3-security--compliance]

### Tính toàn vẹn của thiết bị [#device-integrity]

<ChecklistItem id="DI-1" code="DI-1" title="Phát hiện root">
  Nếu bạn có thiết bị thử nghiệm đã root, hãy kiểm tra rằng SDK từ chối khởi tạo.
</ChecklistItem>

<ChecklistItem id="DI-2" code="DI-2" title="Quyền truy cập">
  Thu hồi các quyền (Camera, Vị trí) rồi thử khởi động SDK. Đảm bảo ứng dụng của bạn nhắc người dùng cấp lại các quyền đó.
</ChecklistItem>

### Xử lý dữ liệu [#data-handling]

<ChecklistItem id="DH-1" code="DH-1" title="Quản lý token">
  Kiểm tra rằng token SDK từ 

  `POST /merchant/auth/login`

   được lấy từ backend của bạn cho mỗi phiên và không bao giờ được hardcode.
</ChecklistItem>

<ChecklistItem id="DH-2" code="DH-2" title="Không có dữ liệu nhạy cảm">
  Đảm bảo log của ứng dụng 

  **không**

   in ra số thẻ đầy đủ hoặc dữ liệu track thô.
</ChecklistItem>

## 4. Trường hợp biên [#4-edge-cases]

<ChecklistItem id="EC-1" code="EC-1" title="Ứng dụng chạy nền">
  Thu nhỏ ứng dụng trong khi giao dịch đang diễn ra rồi mở lại. Giao dịch nên tiếp tục hoặc thất bại một cách an toàn.
</ChecklistItem>

<ChecklistItem id="EC-2" code="EC-2" title="Cuộc gọi đến">
  Gọi điện đến thiết bị thử nghiệm trong khi thanh toán. SDK nên xử lý được sự gián đoạn (thường bằng cách tạm dừng hoặc thất bại).
</ChecklistItem>

<ChecklistItem id="EC-3" code="EC-3" title="Pin yếu">
  Kiểm thử hoạt động khi thiết bị ở chế độ “Tiết kiệm pin” (hiệu năng của một số chip NFC bị suy giảm).
</ChecklistItem>

## 5. Phiên đọc tag NFC (tùy chọn) [#5-nfc-tag-sessions-optional]

Chỉ áp dụng nếu ứng dụng của bạn đọc hoặc ghi tag NFC bằng [`com.tapaya:accept-nfc`](../integration/nfc_tags). Thực hiện các bước này trên điện thoại và, nếu bạn hỗ trợ, trên máy thanh toán Sunmi dòng P với `accept-nfc-sunmi`.

<ChecklistItem id="NT-1" code="NT-1" title="Kiểm tra hỗ trợ">
  Kiểm tra rằng 

  `isSupported()`

   trả về 

  `true`

   trên điện thoại và trên máy Sunmi, và 

  `false`

   trên thiết bị không có NFC.
</ChecklistItem>

<ChecklistItem id="NT-2" code="NT-2" title="Đọc và ghi">
  Chạm một tag NTAG hoặc Ultralight, kiểm tra rằng phiên báo đúng UID, sau đó gọi 

  `writePage`

   và đọc lại trang đó bằng 

  `readPages`

  .
</ChecklistItem>

<ChecklistItem id="NT-3" code="NT-3" title="Sai khóa">
  Với MIFARE Classic, xác thực bằng một khóa sai và xác nhận nhận được 

  `AUTH_FAILED`

  , sau đó xác thực thành công bằng khóa đúng.
</ChecklistItem>

<ChecklistItem id="NT-4" code="NT-4" title="Hủy chờ chạm">
  Hủy 

  `openSession()`

   khi nó đang chờ chạm và mở ngay một phiên mới.
</ChecklistItem>

<ChecklistItem id="NT-5" code="NT-5" title="Thanh toán được ưu tiên">
  Bắt đầu một khoản thanh toán trong khi phiên đang mở. Phiên kết thúc với 

  `PAYMENT`

   và khoản thanh toán được thực hiện thành công.
</ChecklistItem>

<ChecklistItem id="NT-6" code="NT-6" title="Tag bị rút ra">
  Rút tag ra trong khi phiên đang mở và xác nhận phiên kết thúc với 

  `CARD_REMOVED`

  .
</ChecklistItem>

<ChecklistItem id="NT-7" code="NT-7" title="NFC bị tắt">
  Trên điện thoại, tắt NFC và xác nhận 

  `openSession()`

   thất bại với 

  `NFC_DISABLED`

  .
</ChecklistItem>

<ChecklistItem id="NT-8" code="NT-8" title="Ứng dụng chạy nền">
  Trên điện thoại, đưa ứng dụng xuống chạy nền trong khi phiên đang mở và xác nhận phiên kết thúc với 

  `ACTIVITY_PAUSED`

  .
</ChecklistItem>

## 6. Sẵn sàng cho production [#6-production-readiness]

<ChecklistItem id="PR-1" code="PR-1" title="Chuyển môi trường">
  **QUAN TRỌNG:**

   Đảm bảo đã đặt 

  `isProduction = true`

   cho bản build production.
</ChecklistItem>

<ChecklistItem id="PR-2" code="PR-2" title="Token production">
  Kiểm tra rằng backend đang trỏ đến các endpoint production của Tapaya API.
</ChecklistItem>

<ChecklistItem id="PR-3" code="PR-3" title="Kiểm tra phiên bản">
  Đảm bảo bạn đang dùng phiên bản ổn định mới nhất của Tapaya Accept SDK.
</ChecklistItem>

<ChecklistProgress />

<Callout title="Duyệt phát hành" type="tip">
  Rà soát danh sách trên bản phát hành ứng viên cuối cùng (release candidate), trên chính các thiết bị bạn sẽ triển khai. Dùng **Reset** để bắt đầu một lượt kiểm tra mới, vì các dấu tích từ những vòng kiểm thử trước vẫn được lưu trong trình duyệt này.
</Callout>
