---
title: "Kiểm thử Sandbox"
description: "Kiểm thử in-app purchase trong môi trường sandbox để đảm bảo giao dịch diễn ra suôn sẻ."
---

Sau khi đã cấu hình xong mọi thứ trong Adapty Dashboard và ứng dụng mobile, đã đến lúc thực hiện kiểm thử in-app purchase.

**Lưu ý:** Không có công cụ kiểm thử nào tính phí người dùng khi họ thử mua sản phẩm. App Store không gửi email cho các giao dịch mua hoặc hoàn tiền được thực hiện trong môi trường kiểm thử.

---
no_index: true
---
import Callout from '../../../components/Callout.astro';

<Callout type="note">
**Các giao dịch sandbox bị loại khỏi tất cả các biểu đồ phân tích.** Chúng vẫn hiển thị trên các trang hồ sơ người dùng cá nhân và trong event feed.
</Callout>

:::info
Để tiến hành kiểm thử in-app purchase, hãy đảm bảo:
- Bạn đã hoàn thành hướng dẫn [quickstart](quickstart) về tích hợp cửa hàng, thêm sản phẩm và tích hợp Adapty SDK.
- Sản phẩm của bạn đã được đánh dấu [**Ready to submit**](InvalidProductIdentifiers#step-2-check-products) trong App Store Connect.
:::

## Kiểm thử Sandbox \{#sandbox-testing\}

<div style={{
    maxWidth: '560px',
    margin: '0 auto 2rem',
    position: 'relative',
    aspectRatio: '16/9',
    width: '100%'
}}>
    <iframe
        style={{
            position: 'absolute',
            top: 0,
            left: 0,
            width: '100%',
            height: '100%'
        }}
        src="https://www.youtube.com/embed/hq4PRU-vuik?si=m5F5Sj6iLEJ-2q6n"
        title="YouTube video player"
        frameBorder="0"
        allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
        referrerPolicy="strict-origin-when-cross-origin"
        allowFullScreen
    />
</div>

:::info
Chúng tôi khuyến nghị kiểm thử in-app purchase trên thiết bị thật. Mặc dù có thể thực hiện mua hàng sandbox trên simulator, bạn cần thiết bị thật để kiểm thử đầy đủ tất cả các flow, bao gồm hộp thoại thanh toán và xác thực sinh trắc học.
:::

Có hai cách chính để kiểm thử in-app purchase:

- **Build trong Xcode và chạy trên thiết bị kiểm thử**: Tiện lợi cho lập trình viên và kỹ sư QA.
- **Dùng tài khoản kiểm thử sandbox với TestFlight**: Phù hợp cho những người khác.

Cả hai tùy chọn này đều được hướng dẫn chi tiết bên dưới.

### Bước 1. Tạo tài khoản kiểm thử Sandbox trong App Store Connect \{#step-1-create-sandbox-test-account-in-app-store-connect\}

:::warning
Hãy tạo tài khoản kiểm thử Sandbox mới để đảm bảo lịch sử mua hàng của bạn sạch. Nếu dùng lại tài khoản cũ, các sản phẩm đã mua trước đó vẫn còn hiệu lực và bạn sẽ không thể kiểm thử việc mua lại chúng.
:::

Bạn có thể tạo tài khoản kiểm thử Sandbox mới chỉ trong vài thao tác:

1. Truy cập [**Users and Access** > **Sandbox** > **Test Accounts**](https://appstoreconnect.apple.com/access/users/sandbox) trong App Store Connect và nhấn **+**.

  <img src="/assets/shared/img/add-sandbox-user.webp"
  style={{
    border: '1px solid #727272', /* border width and color */
    width: '700px', /* image width */
    display: 'block', /* for alignment */
    margin: '0 auto' /* center alignment */
  }}
/>

2. Nhập thông tin người dùng kiểm thử. Hãy chắc chắn xác định **Country or Region** mà bạn muốn kiểm thử vì điều này ảnh hưởng đến tình trạng sẵn có của sản phẩm theo khu vực và đơn vị tiền tệ giao dịch.

:::tip
- Nếu bạn dùng Gmail hoặc iCloud, bạn có thể tái sử dụng địa chỉ email hiện có với [plus sign subaddressing](https://www.wikihow.com/Use-Plus-Addressing-in-Gmail).
- Bạn có thể dùng một địa chỉ email ngẫu nhiên thậm chí không tồn tại, nhưng hãy nhớ từ chối xác thực hai yếu tố (2FA) khi đăng nhập trên thiết bị kiểm thử sau này.
:::

  <img src="/assets/shared/img/57c3a7c-apple_new_test_account.webp"
  style={{
    border: '1px solid #727272', /* border width and color */
    width: '700px', /* image width */
    display: 'block', /* for alignment */
    margin: '0 auto' /* center alignment */
  }}
/>

3. Nhấn **Create**.

### Bước 2. Bật chế độ Developer \{#step-2-enable-the-developer-mode\}

:::note
Bỏ qua bước này nếu chế độ Developer **đã được bật** trên thiết bị kiểm thử của bạn hoặc nếu bạn **không có thiết bị Mac**.
:::

Bạn sẽ cần một máy Mac đã cài Xcode và cáp kết nối thiết bị kiểm thử:

1. Mở Xcode trên máy Mac. Nếu bạn định kiểm thử in-app purchase với TestFlight, bạn chỉ cần có XCode được cài đặt; bạn không cần phải có ứng dụng ở đó.
2. Kết nối thiết bị kiểm thử với máy Mac bằng cáp.
3. Vào **Settings > Privacy & Security > Developer Mode** trên thiết bị kiểm thử và bật **Developer Mode**.

### Bước 3. Tải ứng dụng từ TestFlight \{#step-3-download-the-app-from-testflight\}

:::info
Bước này chỉ áp dụng nếu bạn đang kiểm thử với TestFlight. Nếu bạn đang build ứng dụng trong Xcode, hãy bỏ qua bước này.
:::

Để biết chi tiết về cách gửi ứng dụng lên TestFlight, hãy xem [tài liệu của Apple](https://developer.apple.com/documentation/StoreKit/testing-in-app-purchases-with-sandbox#Prepare-for-sandbox-testing).

Trước khi tải ứng dụng TestFlight, trên thiết bị kiểm thử của bạn, hãy đảm bảo bạn đã đăng nhập bằng Apple Account thật (production) của mình. Sau đó tải ứng dụng cần kiểm thử từ TestFlight.

:::danger
Đừng mở ứng dụng ngay sau khi tải về. Hãy tiếp tục với các bước tiếp theo.
Nếu vô tình mở, hãy xóa ứng dụng khỏi thiết bị kiểm thử và tải lại. Nếu không, lịch sử mua hàng của bạn có thể không sạch và việc kiểm thử in-app purchase sẽ dẫn đến lỗi.
:::

### Bước 4. Chuyển sang tài khoản kiểm thử Sandbox \{#step-4-switch-to-sandbox-test-account\}

<Details>
    <summary>Không dùng Mac? Đây là cách làm thay thế cho bạn</summary>

    Nếu bạn không làm việc trên macOS, bạn không thể chuyển sang tài khoản sandbox bằng Xcode. Tuy nhiên, bạn vẫn có thể thực hiện trực tiếp trên thiết bị kiểm thử của mình:
1. Vào **Settings > Your Apple Account > Media & Purchases** trên thiết bị kiểm thử.
2. Chọn **Sign Out** từ menu pop-up.
3. Mở ứng dụng đã tải từ TestFlight và thử mua một sản phẩm.
4. Khi được yêu cầu đăng nhập, nhập thông tin đăng nhập tài khoản sandbox để chuyển sang môi trường sandbox.

</Details>

Để chuyển sang tài khoản sandbox của bạn:

1. Vào **Settings > Your Apple Account > Media & Purchases** trên thiết bị kiểm thử.
2. Chọn **Sign Out** từ menu pop-up.
3. Vào **Settings > Developer**. Nếu tùy chọn **Developer** không hiển thị, hãy đảm bảo bạn đã [bật nó ở bước 2](#step-2-enable-the-developer-mode).

  <img src="/assets/shared/img/devmode.png"
  style={{
    border: '1px solid #727272', /* border width and color */
    width: '400px', /* image width */
    display: 'block', /* for alignment */
    margin: '0 auto' /* center alignment */
  }}
/>

4. Cuộn xuống phần **Sandbox Apple Account** và nhấn **Sign In**.

  <img src="/assets/shared/img/sandbox-acc.png"
  style={{
    border: '1px solid #727272', /* border width and color */
    width: '400px', /* image width */
    display: 'block', /* for alignment */
    margin: '0 auto' /* center alignment */
  }}
/>

5. Đăng nhập bằng thông tin đăng nhập của tài khoản Apple Sandbox.

### Bước 5. Xóa lịch sử mua hàng \{#step-5-clear-purchase-history\}

Nếu bạn vừa tạo tài khoản kiểm thử Sandbox mới và đã chuyển sang nó, bạn có thể bỏ qua bước này vì nó chỉ áp dụng cho việc kiểm thử lặp lại bằng cùng một tài khoản kiểm thử Sandbox.

1. Vào **Settings > Developer > Sandbox Apple Account** trên thiết bị kiểm thử.
2. Chọn **Manage** từ menu pop-up.
3. Vào **Account Settings** và nhấn **Clear Purchase History**.

:::danger
Bước này là bắt buộc mỗi khi bạn lặp lại việc kiểm thử bằng cùng một tài khoản kiểm thử Sandbox. Trong trường hợp này, bạn cũng sẽ cần [đăng xuất khỏi tài khoản kiểm thử Sandbox](#step-4-switch-to-sandbox-test-account), sau đó đăng nhập lại để xóa bộ nhớ cache lịch sử mua hàng trên thiết bị kiểm thử.
:::

### Bước 6. Build trong Xcode và chạy \{#step-6-build-in-xcode-and-run\}

:::info
Bước này chỉ áp dụng nếu bạn đang kiểm thử với bản build từ Xcode. Nếu bạn đang dùng TestFlight, hãy bỏ qua bước này.
:::

1. Kết nối thiết bị kiểm thử với máy Mac.
2. Mở Xcode.
3. Nhấn **Run** trong thanh công cụ hoặc chọn **Product > Run** để build và chạy ứng dụng trên thiết bị đã kết nối.

Nếu build thành công, Xcode sẽ khởi chạy ứng dụng trên thiết bị của bạn và mở phiên gỡ lỗi trong khu vực debug.

Ứng dụng của bạn giờ đã sẵn sàng để kiểm thử trên thiết bị.

### Bước 7. Thực hiện giao dịch mua kiểm thử \{#step-7-make-test-purchase\}

Mở ứng dụng và thực hiện giao dịch mua kiểm thử thông qua một paywall.

Sau khi hoàn tất, hãy xem bài viết về [xác nhận giao dịch mua kiểm thử](validate-test-purchases) để kiểm tra kết quả.

### Bước 8. Tiếp tục kiểm thử \{#step-8-keep-testing\}

Môi trường kiểm thử của bạn đã được thiết lập xong. Nếu muốn kiểm thử lại, hãy [xóa lịch sử mua hàng của tài khoản sandbox](https://developer.apple.com/help/app-store-connect/test-in-app-purchases/manage-sandbox-apple-account-settings/).

## Các vấn đề khi kiểm thử \{#testing-issues\}

Dưới đây là các vấn đề phổ biến bạn có thể gặp khi kiểm thử ứng dụng.

### Vấn đề với TestFlight \{#testflight-issues\}

Bạn không thể xóa lịch sử mua hàng **nếu dùng TestFlight mà không có tài khoản kiểm thử Sandbox**, dẫn đến các vấn đề khác nhau và kết quả kiểm thử không chính xác.

Nếu bạn vô tình quên [chuyển sang tài khoản kiểm thử Sandbox](#step-4-switch-to-sandbox-test-account) và đã mở ứng dụng dù chỉ một lần, TestFlight sẽ gán lịch sử mua hàng của bạn vào tài khoản Apple production, gây ra các vấn đề không mong muốn.

Để khắc phục, hãy làm theo các bước sau:

1. Xóa ứng dụng khỏi thiết bị kiểm thử.
2. Làm theo các bước [Kiểm thử Sandbox](#sandbox-testing).

:::note
Quan trọng là không chỉ cài lại ứng dụng, mà còn phải chuyển sang tài khoản kiểm thử Sandbox, xóa lịch sử mua hàng và khởi chạy ứng dụng bằng tài khoản kiểm thử Sandbox.
:::

### Vấn đề với mức độ truy cập được chia sẻ \{#shared-access-levels-issues\}

Nếu bạn lặp lại kiểm thử bằng cùng một tài khoản kiểm thử Sandbox, bạn có thể gặp hành vi bất ngờ với [mức độ truy cập được chia sẻ](sharing-paid-access-between-user-accounts) cho người dùng kiểm thử.

Để kiểm tra xem người dùng có mức độ truy cập kế thừa hay không, hãy vào [Profiles & Segments](https://app.adapty.io/profiles/users) từ Adapty Dashboard và mở hồ sơ người dùng.

  <img src="/assets/shared/img/profile-access-level-origin.webp"
  style={{
    border: '1px solid #727272', /* border width and color */
    width: '700px', /* image width */
    display: 'block', /* for alignment */
    margin: '0 auto' /* center alignment */
  }}
/>

Nếu người dùng có mức độ truy cập kế thừa, hãy làm theo các bước sau để có kết quả kiểm thử chính xác:

1. Xóa hồ sơ cha.
2. Xóa ứng dụng khỏi thiết bị kiểm thử.
3. [Tải ứng dụng từ TestFlight](#step-3-download-the-app-from-testflight).
4. [Chuyển sang tài khoản kiểm thử Sandbox](#step-4-switch-to-sandbox-test-account).
5. [Xóa lịch sử mua hàng](#step-5-clear-purchase-history).
6. [Mở ứng dụng và thực hiện giao dịch mua kiểm thử](#step-6-make-test-purchase).

:::note
Xóa lịch sử mua hàng là thao tác đặt lại giao dịch mua ở phía cửa hàng. Xóa hồ sơ cha chỉ xóa bản ghi ở phía Adapty. Để hiểu tại sao tài khoản được dùng lại vẫn giữ quyền truy cập và những thao tác đặt lại nào thực sự có hiệu quả, hãy xem [Đặt lại gói đăng ký của người kiểm thử](#resetting-a-testers-subscription).
:::

### Cập nhật ứng dụng trong TestFlight \{#updating-app-in-testflight\}

Nếu ứng dụng TestFlight đã được cập nhật:

1. Xóa ứng dụng khỏi thiết bị kiểm thử.
2. [Tải ứng dụng từ TestFlight](#step-3-download-the-app-from-testflight).
3. [Chuyển sang tài khoản kiểm thử Sandbox](#step-4-switch-to-sandbox-test-account).
4. [Xóa lịch sử mua hàng](#step-5-clear-purchase-history).
5. [Mở ứng dụng và thực hiện giao dịch mua kiểm thử](#step-6-make-test-purchase).

## Đặt lại gói đăng ký của người kiểm thử \{#resetting-a-testers-subscription\}

Trong môi trường sandbox, một giao dịch mua thuộc về **tài khoản Apple sandbox**, không phải hồ sơ người dùng Adapty. Các thao tác bạn thực hiện trên hồ sơ — xóa nó hoặc chỉnh sửa mức độ truy cập — không xóa giao dịch mua khỏi tài khoản cửa hàng. Lần cài đặt lại hoặc đồng bộ tiếp theo, SDK sẽ gán lại cùng giao dịch đó và người kiểm thử lại có quyền truy cập.

Bảng dưới đây cho thấy mỗi thao tác đặt lại thay đổi điều gì và người kiểm thử thấy gì sau đó.

| Thao tác                                                                            | Hồ sơ người dùng Adapty                                          | Tài khoản Apple sandbox  | Quyền truy cập của người kiểm thử sau đó                                                                          |
| :-------------------------------------------------------------------------------- | :------------------------------------------------------ | :--------------------- | :------------------------------------------------------------------------------------------------- |
| Xóa hồ sơ trong Adapty Dashboard                                        | Đã xóa                                            | Không thay đổi              | **Trở lại** — khi cài lại, một hồ sơ mới sẽ gán lại cùng chuỗi giao dịch                   |
| Xóa hồ sơ qua [Delete profile API](api-adapty/operations/deleteProfile) | Đã xóa                                         | Không thay đổi              | **Trở lại** — tương tự như xóa trong Dashboard                                                    |
| Thêm ngày hết hạn trong quá khứ qua **Add access level**                               | Bị ghi đè ở lần đồng bộ tiếp theo                             | Không thay đổi              | **Trở lại** ở lần gia hạn tiếp theo — gói đăng ký đang hoạt động sẽ áp dụng lại ngày hết hạn trong tương lai        |
| Gọi [Revoke access level API](api-adapty/operations/revokeAccessLevel)       | Hết hạn ngay, kích hoạt `access_level_updated` (`is_active=false`) | Không thay đổi         | **Trở lại** ở lần gia hạn hoặc cài lại tiếp theo — không phải cách đặt lại sandbox đáng tin cậy                        |
| Hủy gói đăng ký trong tài khoản sandbox                                    | Không thay đổi trực tiếp                                        | Gói đăng ký đã bị hủy | Việc gia hạn dừng lại, quyền truy cập kết thúc khi chu kỳ hiện tại hết hạn, và người kiểm thử có thể mua lại sản phẩm |
| Đăng nhập bằng tài khoản Apple sandbox mới                                        | Hồ sơ mới                                             | Tài khoản mới, trống     | **Sạch** — được khuyến nghị cho kiểm thử lặp lại                                                         |

### Đặt lại người kiểm thử về trạng thái sạch \{#reset-a-tester-to-a-clean-state\}

Để kiểm thử flow mua hàng lặp lại, hãy dùng một tài khoản Apple sandbox mới cho mỗi lần kiểm thử thay vì đặt lại hồ sơ. Làm theo [Bước 1](#step-1-create-sandbox-test-account-in-app-store-connect) để tạo tài khoản và [Bước 4](#step-4-switch-to-sandbox-test-account) để chuyển sang nó trên thiết bị. Nếu bạn tái sử dụng tài khoản sandbox hiện có, hãy [xóa lịch sử mua hàng của nó](#step-5-clear-purchase-history) trước — xóa hồ sơ Adapty không xóa được lịch sử đó.

### Xóa quyền truy cập của người kiểm thử hiện tại \{#remove-access-from-an-existing-tester\}

Để xóa quyền truy cập của người kiểm thử, đừng đặt ngày hết hạn về quá khứ hoặc gọi Revoke access level API. Trong sandbox, gói đăng ký tự gia hạn sau vài phút. Mỗi lần gia hạn sẽ khôi phục lại ngày hết hạn trong tương lai trên cùng chuỗi giao dịch, vì vậy quyền truy cập sẽ tự động trở lại. Revoke access level API có kích hoạt sự kiện `access_level_updated` (`is_active=false`), nhưng lần gia hạn tiếp theo sẽ ghi đè nó.

Để thực sự dừng quyền truy cập, hãy hủy gói đăng ký ở phía cửa hàng. Trên thiết bị kiểm thử, vào **Settings > Developer > Sandbox Apple Account**, chọn **Manage** và hủy gói đăng ký. Việc gia hạn sẽ dừng và quyền truy cập kết thúc khi chu kỳ hiện tại hết hạn.

### Tại sao xóa hồ sơ lại khiến quyền truy cập trở lại \{#why-deleting-the-profile-brings-access-back\}

Khi người kiểm thử cài lại ứng dụng, Adapty nhận lịch sử mua hàng của tài khoản sandbox và liên kết lần cài đặt mới với giao dịch hiện có. Giao dịch mua được gắn với tài khoản cửa hàng, không phải với hồ sơ bạn đã xóa.

- **Hồ sơ ẩn danh**: Việc cài lại mà không có `customer_user_id` luôn kế thừa mức độ truy cập của tài khoản cửa hàng, bất kể cài đặt [chia sẻ quyền truy cập có phí](sharing-paid-access-between-user-accounts) của bạn.
- **Hồ sơ đã xác định**: Quyền truy cập có được chuyển sang `customer_user_id` mới hay không phụ thuộc vào cài đặt chia sẻ quyền truy cập có phí của bạn.

Để biết cách Adapty liên kết các hồ sơ này thành một chuỗi, hãy xem [Cách hồ sơ hoạt động](how-profiles-work#parent-and-inheritor-profiles).

## Gói đăng ký kiểm thử \{#test-subscriptions\}

Khi kiểm thử ứng dụng bằng tài khoản kiểm thử Sandbox, bạn có thể thiết lập tốc độ gia hạn gói đăng ký cho mỗi người kiểm thử trong sandbox. Tìm hiểu thêm về cách chỉnh sửa tốc độ gia hạn gói đăng ký trong [tài liệu chính thức của Apple](https://developer.apple.com/help/app-store-connect/test-in-app-purchases/manage-sandbox-apple-account-settings).

Mặc định, gói đăng ký gia hạn tối đa 12 lần trước khi dừng, theo lịch sau:

| Thời hạn gói đăng ký          | 1 tuần     | 1 tháng    | 2 tháng   | 3 tháng   | 6 tháng   | 1 năm     |
| :----------------------------- | :--------- | :--------- | :--------- | :--------- | :--------- | :--------- |
| Tốc độ gia hạn gói đăng ký     | 3 phút  | 5 phút  | 10 phút | 15 phút | 30 phút | 1 giờ     |
| Thời gian thử lại thanh toán        | 10 phút | 10 phút | 10 phút | 10 phút | 10 phút | 10 phút |
| Thời gian ân hạn thanh toán | 3 phút  | 5 phút  | 5 phút  | 5 phút  | 5 phút  | 5 phút  |

:::note
Lưu ý rằng các giao dịch kiểm thử có thể mất đến 10 phút để xuất hiện trong [Event feed](validate-test-purchases).
:::

Hãy dùng sandbox để xác nhận rằng ứng dụng và backend của bạn xử lý đúng các lần gia hạn, thử lại thanh toán và thời gian ân hạn — không phải để dự đoán thời gian gia hạn trong môi trường production. Lịch gia hạn được tăng tốc và giới hạn ở trên không phản ánh thực tế production. Để phát lại giao dịch trên server phục vụ kiểm thử backend, hãy dùng [Set transaction API](api-adapty/operations/setTransaction).

## Kiểm thử ưu đãi \{#test-offers\}

Việc kiểm thử ưu đãi yêu cầu tất cả biên lai của người dùng phải được xóa để tính đủ điều kiện hoạt động chính xác.

Cách đáng tin cậy nhất để kiểm thử ưu đãi là dùng một [tài khoản kiểm thử Sandbox](#step-1-create-sandbox-test-account-in-app-store-connect) hoàn toàn mới. Việc kiểm thử lặp lại bằng cùng một tài khoản kiểm thử Sandbox có thể gây ra hành vi bất ngờ.

:::danger
Nếu bạn lặp lại kiểm thử bằng cùng một tài khoản kiểm thử Sandbox, hãy nhớ [xóa lịch sử mua hàng](#step-5-clear-purchase-history) để tránh các vấn đề liên quan đến điều kiện đủ điều kiện.
:::