Thực hiện mua hàng trong ứng dụng di động với Unity SDK
Hiển thị paywall trong ứng dụng là bước quan trọng để 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ỉ hiển thị paywall là đủ để hỗ trợ mua hàng nếu bạn sử dụng Paywall Builder để tuỳ chỉnh paywall của mình.
Nếu bạn không dùng Paywall Builder, bạn cần sử dụng một phương thức riêng là .makePurchase() để hoàn tất giao dịch và mở khóa nội dung mong muốn. Phương thức này là cổng để người dùng tương tác với paywall và thực hiện giao dịch của họ.
Nếu paywall của bạn có ưu đãi đang hoạt động cho sản phẩm mà người dùng đang muốn mua, Adapty sẽ tự động áp dụng ưu đãi đó tại thời điểm mua hàng.
Lưu ý rằng ưu đãi giới thiệu chỉ được áp dụng tự động nếu bạn sử dụng paywall được thiết lập qua Paywall Builder.
Trong các trường hợp khác, bạn cần xác minh điều kiện của người dùng để nhận ưu đãi giới thiệu trên iOS. Bỏ qua bước này có thể khiến ứng dụng của bạn bị từ chối khi phát hành. Hơn nữa, điều này có thể dẫn đến việc 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ỏ sót bất kỳ bước nào. Nếu không, chúng tôi không thể xác thực các giao dịch mua hàng.
Thực hiện mua hàng
Đang sử dụng Paywall Builder? Việc mua hàng đượ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.
using AdaptySDK;
void MakePurchase(AdaptyPaywallProduct product) {
Adapty.MakePurchase(product, (result, error) => {
switch (result.Type) {
case AdaptyPurchaseResultType.Pending:
// handle pending purchase
break;
case AdaptyPurchaseResultType.UserCancelled:
// handle purchase cancellation
break;
case AdaptyPurchaseResultType.Success:
var profile = result.Profile;
// handle successfull purchase
break;
default:
break;
}
});
}
Tham số yêu cầu:
| Tham số | Bắt buộc | Mô tả |
|---|---|---|
| Product | bắt buộc | Mộ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 đầy đủ về mức độ truy cập, gói đăng ký và các 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. |
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ợ.
Thay đổi gói đăng ký khi mua hàng
Khi người dùng chọn một gói đăng ký mới thay vì gia hạn gói hiện tại, cách hoạt động phụ thuộc vào cửa hàng:
- Đối với App Store, gói đăng ký được tự động cập nhật trong cùng nhóm gói đăng ký. Nếu người dùng mua gói đăng ký từ một nhóm trong khi đã có gói đăng ký từ nhóm khác, cả hai gói sẽ được kích hoạt đồng thời.
- Đối với Google Play, gói đăng ký không được tự động cập nhật. Bạn cần quản lý việc chuyển đổi trong code ứng dụng như mô tả bên dưới.
Để thay thế gói đăng ký bằng một gói khác trên Android, gọi phương thức .makePurchase() với tham số bổ sung:
// Create subscription update parameters
var subscriptionUpdateParams = new AdaptySubscriptionUpdateParameters(
"old_product_id", // Product ID of the current subscription
AdaptySubscriptionUpdateReplacementMode.WithTimeProration
);
Adapty.MakePurchase(product, subscriptionUpdateParams, (profile, error) => {
if(error != null) {
// Handle the error
return;
}
// successful cross-grade
});
Tham số yêu cầu bổ sung:
| Tham số | Bắt buộc | Mô tả |
|---|---|---|
| subscriptionUpdateParams | bắt buộc | Một đối tượng AdaptySubscriptionUpdateParameters. |
Bạn có thể đọc thêm về gói đăng ký và các chế độ thay thế trong tài liệu Google Developer:
- Về các chế độ thay thế
- Khuyến nghị của Google về các chế độ thay thế
- Chế độ thay thế
CHARGE_PRORATED_PRICE. Lưu ý: phương thức này chỉ áp dụng cho việc nâng cấp gói đăng ký. Không hỗ trợ hạ cấp. - Chế độ thay thế
DEFERRED. Lưu ý: Việc thay đổi gói đăng ký thực sự chỉ xảy ra khi chu kỳ thanh toán hiện tại kết thúc.
Đổ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ợ)
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((error) => {
// handle the error
});
Theo quan sát của chúng tôi, trang Offer Code Redemption trong một số ứng dụng có thể không hoạt độ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.
Để thực hiện đ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}
In-app purchase từ App Store
Promoted in-app purchase được hỗ trợ từ phiên bản SDK 4.1 trở lên và yêu cầu iOS 16.4 hoặc mới hơn. Trên các thiết bị chạy iOS thấp hơn 16.4, chúng sẽ không đến được ứng dụng của bạn.
Khi người dùng khởi tạo một giao dịch mua từ trang sản phẩm App Store và giao dịch đó được chuyển sang ứng dụng của bạn, SDK sẽ tự động hoàn tất — màn hình thanh toán của Apple hiện ra ngay lập tức, và Adapty xử lý giao dịch đó như mọi in-app purchase thông thường.
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ừ purchase intent của App Store, chỉ khả dụng trên iOS 18.0 trở lên. Trên iOS 16.4–17.x, giao dịch mua sẽ được thực hiện với giá gốc.
Để xử lý các giao dịch mua được quảng bá trong code của bạn, IAdaptyEventListener cung cấp phương thức OnReceivePromotedPurchase(AdaptyPromotedProduct), kết hợp với Adapty.MakePromotedPurchase để hoàn tất giao dịch mua nhận được:
public void OnReceivePromotedPurchase(AdaptyPromotedProduct product) {
Adapty.MakePromotedPurchase(product, (result, error) => {
// process the purchase result
});
}
SDK hiện chưa chuyển promoted purchase đến phương thức này — thay vào đó, SDK sẽ tự động hoàn tất chúng — vì vậy bạn chưa thể trì hoãn promoted purchase để hiển thị gì đó tùy chỉnh trước. Dù vậy, hãy triển khai phương thức này (bắt buộc theo interface); phần thân rỗng là một cách triển khai hợp lệ.
Quản lý prepaid plans (Android)
Nếu người dùng ứng dụng của bạn có thể mua prepaid plans (ví dụ: mua gói đăng ký không tự gia hạn trong vài tháng), bạn có thể bật pending transactions cho prepaid plans.
using UnityEngine;
using AdaptySDK;
var builder = new AdaptyConfiguration.Builder("YOUR_API_KEY")
.SetGoogleEnablePendingPrepaidPlans(true);
Adapty.Activate(builder.Build(), (error) => {
if (error != null) {
// handle the error
return;
}
});