Thực hiện mua hàng trong ứng dụng với iOS SDK

Hiển thị paywall trong ứng dụng di động là bước thiết yếu để cung cấp cho người dùng quyền truy cập vào nội dung hoặc dịch vụ cao cấp. Tuy nhiên, chỉ việc hiển thị paywall mới tự động xử lý giao dịch mua khi Adapty tự render màn hình — tức là flow hoặc paywall từ Paywall Builder cũ.

Nếu bạn tự render màn hình trong code của mình, bạn phải dùng một phương thức riêng biệt là .makePurchase() để hoàn tất giao dịch mua và mở khóa nội dung mong muốn. Phương thức này đóng vai trò là cầu nối để người dùng tương tác với các paywall và thực hiện giao dịch theo ý muốn.

Nếu paywall của bạn có ưu đãi đang hoạt động cho sản phẩm mà người dùng muốn mua, Adapty sẽ tự động áp dụng ưu đãi đó vào thời điểm thanh toán.

Warning

Lưu ý rằng ưu đãi giới thiệu chỉ được áp dụng tự động nếu Adapty render màn hình đó.

Trong các trường hợp khác, bạn cần xác minh tư cách đủ điều kiện nhận ưu đãi giới thiệu của người dùng trên iOS. Bỏ qua bước này có thể dẫn đến việc ứng dụng bị từ chối khi phát hành, đồng thời có thể tính giá đầy đủ cho những người dùng đủ điều kiện nhận ưu đãi giới thiệu.

Hãy đảm bảo bạn đã hoàn tất cấu hình ban đầu mà không bỏ qua bất kỳ bước nào. Nếu không, chúng tôi không thể xác thực giao dịch mua hàng.

Thực hiện mua hàng

Note

Adapty có tự render màn hình của bạn không? Với paywall dạng flow hoặc Paywall Builder, các giao dịch mua hàng sẽ được xử lý tự động — bạn có thể bỏ qua bước này.

Cần hướng dẫn từng bước? Xem hướng dẫn quickstart để có hướng dẫn triển khai đầy đủ từ đầu đến cuối.

Tham số yêu cầu:

Tham sốBắt buộcMô tả
Productbắt buộcMột đối tượng AdaptyPaywallProduct lấy từ paywall.

Tham số phản hồi:

Tham sốMô tả
Profile

Nếu yêu cầu thành công, phản hồi sẽ chứa đối tượng này. Đối tượng AdaptyProfile cung cấp thông tin toàn diện về các mức độ truy cập, gói đăng ký và sản phẩm mua một lần của người dùng trong ứng dụng.

Kiểm tra trạng thái mức độ truy cập để xác định xem người dùng có quyền truy cập cần thiết vào ứng dụng hay không.

Warning

Lưu ý: nếu bạn vẫn đang dùng StoreKit của Apple phiên bản thấp hơn v2.0 và Adapty SDK phiên bản thấp hơn v2.9.0, bạn cần cung cấp Apple App Store shared secret thay thế. Phương thức này hiện đã bị Apple ngừng hỗ trợ.

Các in-app purchase được quảng bá từ App Store

Khi người dùng khởi tạo một giao dịch mua trong App Store và giao dịch đó được chuyển tiếp vào ứng dụng của bạn, SDK sẽ gọi phương thức delegate didReceivePromotedPurchase với một đối tượng AdaptyPromotedProduct. Bạn có hai lựa chọn:

  • Xử lý giao dịch ngay lập tức: Không cần implement didReceivePromotedPurchase. Phần implementation mặc định sẽ bắt đầu mua hàng ngay lập tức, và màn hình mua hàng của Apple sẽ tự động hiển thị.
  • Lưu trữ đối tượng sản phẩm để xử lý sau: Implement didReceivePromotedPurchase, lưu trữ sản phẩm, sau đó gọi makePurchase với sản phẩm đã lưu vào lúc khác. Cách này hữu ích khi bạn cần hiển thị nội dung tùy chỉnh cho người dùng trước khi thực hiện giao dịch mua.

Nếu sản phẩm được quảng bá có kèm ưu đãi gói đăng ký, SDK sẽ tự động áp dụng ưu đãi đó khi mua. Ưu đãi được đọc từ App Store purchase intent, chỉ hiển thị trên iOS 18.0 trở lên. Trên iOS 16.4–17.x, subscriptionOffer luôn là nil và giao dịch mua sẽ thực hiện theo giá gốc.

Đây là đoạn code hoàn chỉnh:

final class YourAdaptyDelegateImplementation: AdaptyDelegate {
    // 1. Store the product object to defer the transaction.
    // To process the transaction immediately instead, don't implement this method —
    // the default implementation starts the purchase right away.
    nonisolated func didReceivePromotedPurchase(_ product: AdaptyPromotedProduct) {
        // store the product object
    }

    // 2. Continue the deferred purchase later on by passing the product to `makePurchase` when the timing is appropriate
    func continueDeferredPurchase() async {
        let storedProduct: AdaptyPromotedProduct = // get the product object from 1.
        do {
            let purchaseResult = try await Adapty.makePurchase(product: storedProduct)
            // process the purchase result
        } catch {
            // handle the error
        }
    }
}
Warning

API didReceivePromotedPurchase khả dụng từ SDK phiên bản 4.1 trở lên và yêu cầu iOS 16.4 trở lên. SDK phiên bản 4.0 không hỗ trợ promoted in-app purchase, và trên các thiết bị chạy iOS thấp hơn 16.4 thì phương thức này sẽ không bao giờ được kích hoạt. Nếu bạn cần promoted purchase trên các phiên bản iOS cũ hơn, hãy tiếp tục dùng SDK 3.x và sử dụng shouldAddStorePayment như hướng dẫn bên dưới.

Đang dùng Adapty SDK 3.x?

Trong SDK 3.x, SDK sẽ gọi delegate method shouldAddStorePayment thay thế:

  • Xử lý giao dịch ngay lập tức: Trả về true trong shouldAddStorePayment. Thao tác này sẽ kích hoạt màn hình hệ thống mua hàng của Apple ngay lập tức.
  • Lưu đối tượng sản phẩm để xử lý sau: Trả về false trong shouldAddStorePayment, sau đó gọi makePurchase với sản phẩm đã lưu vào lúc khác.
final class YourAdaptyDelegateImplementation: AdaptyDelegate {
    nonisolated func shouldAddStorePayment(for product: AdaptyDeferredProduct) -> Bool {
        // 1a.
        // Return `true` to continue the transaction in your app. The Apple purchase system screen will show automatically.

        // 1b.
        // Store the product object and return `false` to defer or cancel the transaction.
        false
    }
    
    // 2. Continue the deferred purchase later on by passing the product to `makePurchase` when the timing is appropriate
    func continueDeferredPurchase() async {
        let storedProduct: AdaptyDeferredProduct = // get the product object from 1b.
        do {
            try await Adapty.makePurchase(product: storedProduct)
        } catch {
            // handle the error
        }
    }
}

Đổi mã ưu đãi trên iOS

Về offer code

Offer code cho phép bạn cung cấp giảm giá hoặc dùng thử miễn phí cho những người dùng cụ thể. Khác với các ưu đãi thông thường được áp dụng tự động, offer code được phân phối bên ngoài ứng dụng — qua email marketing, mạng xã hội, hoặc tài liệu in ấn. Người dùng đổi code bằng cách nhập code trong App Store, truy cập URL đổi thưởng, hoặc thông qua hộp thoại trong ứng dụng.

Để thiết lập offer code, mở một gói đăng ký trong App Store Connect và vào mục Offer Codes. Bạn có thể tạo ba loại offer code:

  • Free — gói đăng ký miễn phí trong một khoảng thời gian nhất định, sau đó gia hạn theo giá đầy đủ.
  • Pay as you go — người dùng trả giá giảm mỗi chu kỳ thanh toán trong một khoảng thời gian nhất định, sau đó gói đăng ký gia hạn theo giá đầy đủ.
  • Pay up front — người dùng trả một mức giá giảm duy nhất cho toàn bộ thời gian ưu đãi, sau đó gói đăng ký gia hạn theo giá đầy đủ.

Bạn không cần thêm offer code vào Adapty. Apple gắn thẻ mọi giao dịch trong thời gian ưu đãi với danh mục offer code. Điều này bao gồm lần đổi code đầu tiên và tất cả các lần gia hạn có giảm giá tiếp theo. Adapty phát hiện thẻ này và ghi lại mỗi giao dịch với danh mục ưu đãi offer_code. Khi thời gian ưu đãi kết thúc và gói đăng ký gia hạn theo giá đầy đủ, thẻ sẽ không còn nữa. Bạn có thể lọc analytics theo loại ưu đãi Offer Code trong Adapty Dashboard.

Xử lý sự chênh lệch doanh thu

Nếu bạn nhận thấy một giao dịch offer code xuất hiện trong Adapty với giá sản phẩm đầy đủ thay vì giá ưu đãi đã giảm, hãy kiểm tra các điều sau trong App Store Connect:

  • Offer code đã được cấu hình đúng giá cho tất cả các khu vực mà người dùng có thể đổi.
  • Giá ưu đãi được thiết lập cho quốc gia hoặc khu vực cụ thể của người dùng. Apple gửi giá theo khu vực trong giao dịch. Nếu không có giá theo khu vực được cấu hình cho ưu đãi, Apple có thể gửi giá sản phẩm đầy đủ thay thế.

Bạn có thể lọc và xác minh các giao dịch offer code trong Adapty Dashboard theo loại ưu đãi Offer Code và bộ lọc Offer Discount Type.

Promo code cũ (đã ngừng hỗ trợ)

Warning

Apple đã ngừng hỗ trợ promo code cho in-app purchase vào tháng 3 năm 2026. Offer code thay thế chúng với nhiều tính năng hơn: điều kiện đủ điều kiện có thể cấu hình, ngày hết hạn, và lên đến 1 triệu code mỗi quý. Nếu trước đây bạn sử dụng promo code cho in-app purchase, hãy chuyển sang offer code trong App Store Connect.

Promo code cũ (giới hạn 100 code mỗi ứng dụng mỗi phiên bản) cấp quyền truy cập miễn phí vào gói đăng ký. Khác với offer code, Apple không bao gồm thông tin giảm giá trong các giao dịch promo code — Apple gửi giá sản phẩm đầy đủ trong biên lai. Kết quả là Adapty đã ghi lại những giao dịch này theo giá đầy đủ, gây ra sự chênh lệch doanh thu giữa analytics Adapty và App Store Connect.

Nếu bạn thấy các giao dịch lịch sử theo giá đầy đủ mà đáng ra phải miễn phí, nhiều khả năng chúng đến từ promo code cũ. Vì những code này hiện đã ngừng hỗ trợ, hãy chuyển sang offer code để theo dõi doanh thu chính xác.

Để hiển thị trang đổi mã trong ứng dụng của bạn:

Adapty.presentCodeRedemptionSheet()
Danger

Qua quan sát của chúng tôi, trang Offer Code Redemption trong một số ứng dụng có thể hoạt động không ổn định. Chúng tôi khuyến nghị chuyển hướng người dùng trực tiếp đến App Store.

Để làm điều này, bạn cần mở URL theo định dạng sau: https://apps.apple.com/redeem?ctx=offercodes&id={apple_app_id}&code={code}