Kích hoạt mua hàng bằng Flow Builder trong Unity SDK
Hướng dẫn này sử dụng API của Adapty Unity SDK v4 (beta). Nếu bạn đang dùng v3, hãy xem hướng dẫn migration để biết tên phương thức tương ứng.
Để bật tính năng in-app purchase, bạn cần hiểu ba khái niệm chính:
- Sản phẩm – bất cứ thứ gì người dùng có thể mua (gói đăng ký, consumable, quyền truy cập trọn đời)
- Flow – chuỗi màn hình trình bày sản phẩm cho người dùng, được xây dựng trong Flow Builder dạng no-code. SDK lấy chúng qua
GetFlow. Nếu bạn muốn tự xây dựng giao diện bằng code, hãy dùng paywall thay thế — xem Triển khai paywall thủ công. - Placement – nơi và thời điểm bạn hiển thị flow trong ứng dụng (ví dụ:
main,onboarding,settings). Bạn gắn flow vào placement trên dashboard, sau đó yêu cầu chúng theo placement ID trong code. Điều này giúp dễ dàng chạy A/B test và hiển thị các flow khác nhau cho những người dùng khác nhau.
Adapty cung cấp cho bạn ba cách để bật tính năng mua hàng trong ứng dụng. Hãy chọn một trong số đó tùy theo yêu cầu của ứng dụng:
| Cách triển khai | Độ phức tạp | Khi nào nên dùng |
|---|---|---|
| Adapty Flow Builder | ✅ Dễ | Bạn tạo một flow hoàn chỉnh, sẵn sàng để mua trong trình tạo không cần code. Adapty tự động hiển thị và xử lý toàn bộ flow mua hàng, xác thực biên lai và quản lý gói đăng ký. |
| Paywall tự tạo | 🟡 Trung bình | Bạn tự triển khai giao diện paywall trong code ứng dụng, nhưng vẫn lấy đối tượng flow từ Adapty để duy trì tính linh hoạt trong danh sách sản phẩm. Xem hướng dẫn. |
| Chế độ Observer | 🔴 Khó | Bạn đã có cơ sở hạ tầng xử lý giao dịch riêng và muốn tiếp tục sử dụng nó. Lưu ý rằng chế độ observer có một số hạn chế trong Adapty. Xem bài viết. |
Các bước dưới đây hướng dẫn cách triển khai một flow được tạo trong Adapty Flow Builder.
Nếu bạn muốn tự xây dựng giao diện paywall, hãy xem Triển khai paywall thủ công.
Để hiển thị một flow được tạo trong Adapty Flow Builder, trong code ứng dụng của bạn, bạn chỉ cần:
- Lấy flow: Lấy nó từ Adapty.
- Hiển thị nó và Adapty sẽ xử lý việc mua hàng cho bạn: Hiển thị view trong ứng dụng của bạn.
- Xử lý các hành động nút: Liên kết các tương tác của người dùng với phản hồi của ứng dụng. Ví dụ: mở liên kết hoặc đóng flow khi người dùng nhấn nút.
Trước khi bắt đầu
Trước khi bắt đầu, hãy hoàn thành các bước sau:
- Kết nối ứng dụng của bạn với App Store và/hoặc Google Play trong Adapty Dashboard.
- Tạo sản phẩm trong Adapty.
- Tạo một flow và thêm sản phẩm vào đó.
- Tạo một placement và thêm flow vào đó.
- Cài đặt và kích hoạt SDK trong code ứng dụng của bạn.
Cách nhanh nhất để hoàn thành các bước này là làm theo hướng dẫn quickstart hoặc tạo flow và placement bằng Developer CLI.
1. Lấy flow
Các flow của bạn được liên kết với các placement được cấu hình trong dashboard. Placement cho phép bạn chạy các flow khác nhau cho các đối tượng khác nhau hoặc chạy A/B test.
Để lấy một flow đã tạo trong Adapty Flow Builder, bạn cần:
-
Lấy đối tượng
flowtheo placement ID bằng phương thứcGetFlow. -
Tạo flow view bằng phương thức
CreateFlowView. View chứa các phần tử UI và styling cần thiết để hiển thị flow. Nếu flow chưa được cấu hình view,CreateFlowViewsẽ trả về lỗi — hãy xử lý lỗi này trong callback.
Để xem được giao diện, bạn phải bật toggle Show on device trong Flow Builder. Nếu không, CreateFlowView sẽ trả về lỗi và flow sẽ không được hiển thị.
Adapty.GetFlow("YOUR_PLACEMENT_ID", (flow, error) => {
if (error != null) {
// handle the error
return;
}
// Create the flow view
AdaptyUI.CreateFlowView(flow, (view, error) => {
if (error != null) {
// the flow has no view configured, or view creation failed
return;
}
// view - the flow view ready to be presented
});
});
Phần khởi động nhanh này cung cấp cấu hình tối thiểu cần thiết để hiển thị một flow. Để biết chi tiết cấu hình nâng cao, xem hướng dẫn lấy flow của chúng tôi.
2. Hiển thị flow
Sau khi có được flow view, chỉ cần thêm vài dòng code để hiển thị nó.
Để hiển thị flow, sử dụng phương thức view.Present() trên view được tạo bởi phương thức CreateFlowView. Mỗi view chỉ có thể dùng một lần: sau khi đóng lại, hãy gọi CreateFlowView để hiển thị flow thêm một lần nữa.
view.Present((error) => {
// handle the error
});
Để biết thêm chi tiết về cách hiển thị flow, xem hướng dẫn của chúng tôi.
3. Xử lý hành động nút bấm
Khi người dùng nhấn các nút trong flow, Unity SDK tự động xử lý việc mua hàng và khôi phục. Tuy nhiên, các nút khác có ID tùy chỉnh hoặc được định sẵn và cần bạn xử lý hành động trong code.
Ví dụ, flow của bạn có thể có nút đóng và các URL cần mở (như điều khoản sử dụng và chính sách bảo mật). Để xử lý các hành động này, class của bạn cần implement interface IAdaptyFlowsEventsListener và đăng ký làm listener.
Lưu ý rằng flow vẫn giữ nguyên sau khi mua hàng thành công. Nếu bạn muốn đóng nó lại khi giao dịch hoàn tất, hãy dismiss view trong callback FlowViewDidFinishPurchase.
public class YourClass : MonoBehaviour, IAdaptyFlowsEventsListener
{
void Start()
{
// Register this class as the flows events listener
Adapty.SetFlowsEventsListener(this);
}
// IAdaptyFlowsEventsListener method - handles button actions
public void FlowViewDidPerformAction(
AdaptyUIFlowView view,
AdaptyUIUserAction action
) {
switch (action.Type) {
case AdaptyUIUserActionType.Close:
view.Dismiss(null);
break;
case AdaptyUIUserActionType.OpenUrl:
AdaptyUI.OpenUrl(action.Value, AdaptyWebPresentation.ExternalBrowser, null);
break;
default:
break;
}
}
// IAdaptyFlowsEventsListener method - dismiss the flow after a purchase
public void FlowViewDidFinishPurchase(
AdaptyUIFlowView view,
AdaptyPaywallProduct product,
AdaptyPurchaseResult purchasedResult
) {
if (purchasedResult.Type != AdaptyPurchaseResultType.UserCancelled) {
view.Dismiss(null);
}
}
}
Các bước tiếp theo
Bạn có câu hỏi hoặc gặp sự cố? Hãy xem diễn đàn hỗ trợ của chúng tôi — nơi bạn có thể tìm câu trả lời cho các câu hỏi thường gặp hoặc đặt câu hỏi của riêng mình. Đội ngũ và cộng đồng của chúng tôi luôn sẵn sàng giúp đỡ!
Flow của bạn đã sẵn sàng để hiển thị trong ứng dụng. Hãy kiểm tra giao dịch mua trong sandbox App Store hoặc trong Google Play Store để đảm bảo bạn có thể hoàn tất một giao dịch mua thử nghiệm từ flow.
Tiếp theo, bạn cần kiểm tra mức độ truy cập của người dùng để đảm bảo bạn chỉ hiển thị flow hoặc cấp quyền truy cập vào các tính năng trả phí cho đúng người dùng.
Ví dụ đầy đủ
Dưới đây là cách tích hợp tất cả các bước đó vào ứng dụng của bạn.
using System;
using System.Collections.Generic;
using UnityEngine;
using AdaptySDK;
public class FlowManager : MonoBehaviour, IAdaptyFlowsEventsListener
{
[SerializeField] private string placementId = "YOUR_PLACEMENT_ID";
void Start()
{
// Register for flow events
Adapty.SetFlowsEventsListener(this);
GetAndDisplayFlow();
}
private void GetAndDisplayFlow()
{
Adapty.GetFlow(placementId, (flow, error) => {
if (error != null) {
Debug.LogError("Error getting flow: " + error.Message);
return;
}
CreateAndPresentFlowView(flow);
});
}
private void CreateAndPresentFlowView(AdaptyFlow flow)
{
AdaptyUI.CreateFlowView(flow, (view, error) => {
if (error != null) {
// the flow has no view configured — use custom logic
Debug.LogError("Error creating flow view: " + error.Message);
return;
}
view.Present((presentError) => {
if (presentError != null) {
Debug.LogError("Error presenting flow: " + presentError.Message);
return;
}
Debug.Log("Flow presented successfully");
});
});
}
// IAdaptyFlowsEventsListener implementation
public void FlowViewDidPerformAction(
AdaptyUIFlowView view,
AdaptyUIUserAction action
) {
switch (action.Type) {
case AdaptyUIUserActionType.Close:
Debug.Log("Close button pressed");
view.Dismiss(null);
break;
case AdaptyUIUserActionType.OpenUrl:
AdaptyUI.OpenUrl(action.Value, AdaptyWebPresentation.ExternalBrowser, null);
break;
default:
break;
}
}
public void FlowViewDidFinishPurchase(
AdaptyUIFlowView view,
AdaptyPaywallProduct product,
AdaptyPurchaseResult purchasedResult
) {
if (purchasedResult.Type != AdaptyPurchaseResultType.UserCancelled) {
view.Dismiss(null);
}
}
// Required interface methods (implement as needed)
public void FlowViewDidAppear(AdaptyUIFlowView view) { }
public void FlowViewDidDisappear(AdaptyUIFlowView view) { }
public void FlowViewDidSelectProduct(AdaptyUIFlowView view, string productId) { }
public void FlowViewDidStartPurchase(AdaptyUIFlowView view, AdaptyPaywallProduct product) { }
public void FlowViewDidFailPurchase(AdaptyUIFlowView view, AdaptyPaywallProduct product, AdaptyError error) { }
public void FlowViewDidStartRestore(AdaptyUIFlowView view) { }
public void FlowViewDidFinishRestore(AdaptyUIFlowView view, AdaptyProfile profile) { }
public void FlowViewDidFailRestore(AdaptyUIFlowView view, AdaptyError error) { }
public void FlowViewDidReceiveError(AdaptyUIFlowView view, AdaptyError error) { }
public void FlowViewDidFailLoadingProducts(AdaptyUIFlowView view, AdaptyError error) { }
public void FlowViewDidFinishWebPaymentNavigation(AdaptyUIFlowView view, AdaptyPaywallProduct product, AdaptyError error) { }
public void FlowViewDidReceiveAnalyticEvent(AdaptyUIFlowView view, string name, IDictionary<string, object> @params) { }
public void ShowFlow()
{
GetAndDisplayFlow();
}
}