Kích hoạt mua hàng bằng cách sử dụng paywall trong Flutter SDK
Để kích hoạt in-app purchase, bạn cần nắm vững ba khái niệm cốt lõi:
- 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)
- Paywall là các cấu hình xác định sản phẩm nào sẽ được cung cấp. Trong Adapty, paywall là cách duy nhất để lấy sản phẩm, nhưng thiết kế này cho phép bạn thay đổi ưu đãi, giá cả và tổ hợp sản phẩm mà không cần chỉnh sửa code của ứng dụng.
- Placement – nơi và thời điểm bạn hiển thị paywall trong ứng dụng (ví dụ:
main,onboarding,settings). Bạn thiết lập paywall cho các placement trên dashboard, sau đó yêu cầu chúng bằng placement ID trong code. Điều này giúp bạn dễ dàng chạy A/B test và hiển thị các paywall khác nhau cho các nhóm người dùng khác nhau.
Adapty cung cấp ba cách để kích hoạt mua hàng trong ứng dụng của bạn. 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 dùng |
|---|---|---|
| Adapty Paywall Builder | ✅ Dễ | Bạn tạo một paywall hoàn chỉnh, sẵn sàng để mua hàng trong no-code builder. Adapty tự động render và xử lý toàn bộ quy trình mua hàng phức tạp, xác thực biên lai và quản lý gói đăng ký ở phía sau. |
| Paywall tạo thủ công | 🟡 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 paywall từ Adapty để duy trì sự linh hoạt trong việc cung cấp sản phẩm. Xem hướng dẫn. |
| Chế độ Observer | 🔴 Khó | Bạn đã có cơ sở hạ tầng xử lý mua hàng 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 paywall được tạo trong Adapty paywall builder.
Nếu bạn không muốn sử dụng paywall builder, hãy xem hướng dẫn xử lý mua hàng trong paywall tạo thủ công.
Để hiển thị paywall được tạo trong Adapty paywall builder, trong code ứng dụng, bạn chỉ cần:
- Lấy paywall: Lấy paywall từ Adapty.
- Hiển thị paywall và Adapty sẽ xử lý mua hàng cho bạn: Hiển thị container paywall mà bạn đã lấy trong ứng dụng.
- Xử lý hành động nút: Liên kết tương tác của người dùng với paywall với phản hồi của ứng dụng. Ví dụ: mở liên kết hoặc đóng paywall 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 paywall và thêm sản phẩm vào đó.
- Tạo placement và thêm paywall 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 nhanh hoặc tạo paywall và placement bằng Developer CLI.
1. Lấy paywall
Các paywall của bạn được liên kết với các placement được cấu hình trên dashboard. Placement cho phép bạn chạy các paywall khác nhau cho các đối tượng khác nhau hoặc chạy A/B test.
Để lấy paywall được tạo trong Adapty paywall builder, bạn cần:
-
Lấy đối tượng
paywalltheo placement ID bằng phương thứcgetPaywallvà kiểm tra xem đó có phải là paywall được tạo trong builder hay không thông qua thuộc tínhhasViewConfiguration. -
Tạo paywall view bằng phương thức
createPaywallView. View chứa các phần tử giao diện và kiểu dáng cần thiết để hiển thị paywall.
Để lấy cấu hình view, bạn phải bật toggle Show on device trong Paywall Builder. Nếu không, bạn sẽ nhận được cấu hình view rỗng và paywall sẽ không được hiển thị.
try {
final paywall = await Adapty().getPaywall(placementId: "YOUR_PLACEMENT_ID", locale: "en");
// the requested paywall
} on AdaptyError catch (adaptyError) {
// handle the error
} catch (e) {
}
try {
final view = await AdaptyUI().createPaywallView(
paywall: paywall,
);
} on AdaptyError catch (e) {
// handle the error
} catch (e) {
// handle the error
}
2. Hiển thị paywall
Khi bạn đã có cấu hình paywall, chỉ cần thêm vài dòng code là đủ để hiển thị paywall của mình.
Để hiển thị paywall, sử dụng phương thức view.present() trên view được tạo bởi phương thức createPaywallView. Mỗi view chỉ có thể được sử dụng một lần. Nếu bạn cần hiển thị lại paywall, hãy gọi createPaywallView thêm một lần nữa để tạo một instance view mới.
try {
await view.present();
} on AdaptyError catch (e) {
// handle the error
} catch (e) {
// handle the error
}
Để biết thêm chi tiết về cách hiển thị paywall, hãy xem hướng dẫn của chúng tôi.
3. Xử lý hành động nút
Khi người dùng nhấn các nút trong paywall, Flutter 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 nghĩa sẵn và yêu cầu xử lý hành động trong code của bạn.
Để kiểm soát hoặc theo dõi các tiến trình trên màn hình paywall, hãy triển khai các phương thức AdaptyUIPaywallsEventsObserver và đặt observer trước khi hiển thị bất kỳ màn hình nào. Nếu người dùng đã thực hiện một hành động nào đó, paywallViewDidPerformAction sẽ được gọi và ứng dụng của bạn cần phản hồi tùy theo action ID.
Ví dụ: paywall của bạn có thể có nút đóng và các URL cần mở (ví dụ: điều khoản sử dụng và chính sách bảo mật). Vì vậy, bạn cần phản hồi các hành động với ID Close và OpenUrl.
class _PaywallScreenState extends State<PaywallScreen> implements AdaptyUIPaywallsEventsObserver {
@override
void initState() {
super.initState();
// Register this class as the paywalls event observer
AdaptyUI().setPaywallsEventsObserver(this);
}
// This method is called when user performs an action on the paywall UI
@override
void paywallViewDidPerformAction(AdaptyUIPaywallView view, AdaptyUIAction action) {
switch (action) {
case const CloseAction():
case const AndroidSystemBackAction():
view.dismiss();
break;
case OpenUrlAction(url: final url):
// Open the URL using url_launcher package
_launchUrl(url);
break;
}
}
// Helper method to launch URLs
Future<void> _launchUrl(String url) async {
try {
final Uri uri = Uri.parse(url);
if (await canLaunchUrl(uri)) {
await launchUrl(uri, mode: LaunchMode.externalApplication);
} else {
// Handle case where URL cannot be launched
print('Could not launch $url');
}
} catch (e) {
// Handle any errors
print('Error launching URL: $e');
}
}
}
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 đỡ!
Paywall của bạn đã sẵn sàng để hiển thị trong ứng dụng. Hãy kiểm tra mua hàng trong sandbox App Store hoặc Google Play Store để đảm bảo bạn có thể hoàn thành một lần mua thử từ paywall.
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 hiển thị paywall 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 đủ
Đây là cách tất cả các bước đó có thể được tích hợp cùng nhau trong ứng dụng của bạn.
void main() async {
runApp(MaterialApp(home: PaywallScreen()));
}
class PaywallScreen extends StatefulWidget {
@override
State<PaywallScreen> createState() => _PaywallScreenState();
}
class _PaywallScreenState extends State<PaywallScreen> implements AdaptyUIPaywallsEventsObserver {
@override
void initState() {
super.initState();
// Register this class as the paywalls event observer
AdaptyUI().setPaywallsEventsObserver(this);
_showPaywallIfNeeded();
}
Future<void> _showPaywallIfNeeded() async {
try {
final paywall = await Adapty().getPaywall(
placementId: 'YOUR_PLACEMENT_ID',
);
if (!paywall.hasViewConfiguration) return;
final view = await AdaptyUI().createPaywallView(paywall: paywall);
await view.present();
} catch (_) {
// Handle any errors (network, SDK issues, etc.)
}
}
// This method is called when user performs an action on the paywall UI
@override
void paywallViewDidPerformAction(AdaptyUIPaywallView view, AdaptyUIAction action) {
switch (action) {
case const CloseAction():
case const AndroidSystemBackAction():
view.dismiss();
break;
case OpenUrlAction(url: final url):
// Open the URL using url_launcher package
_launchUrl(url);
break;
}
}
// Helper method to launch URLs
Future<void> _launchUrl(String url) async {
try {
final Uri uri = Uri.parse(url);
if (await canLaunchUrl(uri)) {
await launchUrl(uri, mode: LaunchMode.externalApplication);
} else {
// Handle case where URL cannot be launched
print('Could not launch $url');
}
} catch (e) {
// Handle any errors
print('Error launching URL: $e');
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Adapty Paywall Example')),
body: Center(
// Add a button to re-trigger the paywall for testing purposes
child: ElevatedButton(
onPressed: _showPaywallIfNeeded,
child: Text('Show Paywall'),
),
),
);
}
}