1. Giới thiệu
Trong lớp học lập trình này, bạn sẽ tập trung vào việc tạo một sản phẩm tính phí một lần (OTP) và thêm ưu đãi đặt hàng trước cho sản phẩm đó.
Lưu ý: Trước khi bắt đầu lớp học lập trình này, bạn cần yêu cầu quyền truy cập vào tính năng đặt hàng trước bằng cách điền vào Biểu mẫu bày tỏ sự quan tâm với EAP cho sản phẩm tính phí một lần.
Đối tượng người xem
Lớp học lập trình này dành cho các nhà phát triển ứng dụng Android đã quen thuộc với sản phẩm tính phí một lần và muốn tìm hiểu cách thêm ưu đãi đặt hàng trước vào sản phẩm tính phí một lần.
Điều kiện tiên quyết
Nếu bạn mới làm quen với sản phẩm tính phí một lần, bạn nên hoàn thành lớp học lập trình Mở rộng thị trường mới nhờ giá sản phẩm theo khu vực.
Bạn sẽ học được...
- Cách sử dụng Google Play Console để tạo ưu đãi đặt hàng trước cho sản phẩm tính phí một lần.
- Cách sử dụng API Thư viện Play Billing để truy vấn sản phẩm tính phí một lần và thông tin chi tiết tương ứng về ưu đãi đặt hàng trước.
Những điều bạn cần...
- Quyền truy cập vào Google Play Console bằng tài khoản nhà phát triển. Nếu chưa có tài khoản nhà phát triển, bạn cần tạo một tài khoản.
- Một ứng dụng mẫu cho lớp học lập trình này mà bạn có thể tải xuống từ GitHub.
- Android Studio.
2. Tạo ứng dụng mẫu
Lớp học lập trình này sử dụng một ứng dụng Android mẫu để hướng dẫn bạn cách quản lý sản phẩm tính phí một lần. Ứng dụng mẫu được thiết kế để trở thành một ứng dụng Android hoạt động đầy đủ, có mã nguồn hoàn chỉnh cho thấy các khía cạnh sau:
- Tích hợp ứng dụng với PBL.
- Tìm nạp sản phẩm tính phí một lần và các ưu đãi đặt hàng trước liên quan.
- Thực thi quy trình mua cho giá theo khu vực.
Video minh hoạ sau đây cho thấy ứng dụng mẫu sẽ trông như thế nào và hoạt động ra sao sau khi được triển khai và chạy.
Nếu đã quen thuộc với sản phẩm tính phí một lần và Thư viện Play Billing (PBL), bạn có thể tải ứng dụng mẫu xuống và dùng thử.
Điều kiện tiên quyết
Trước khi tạo và triển khai ứng dụng mẫu, hãy làm như sau:
- Tạo tài khoản nhà phát triển trên Google Play Console. Nếu đã có tài khoản nhà phát triển, hãy bỏ qua bước này.
- Tạo một ứng dụng mới trong Play Console. Khi tạo ứng dụng, bạn có thể chỉ định tên ứng dụng bất kỳ cho ứng dụng mẫu.
- Cài đặt Android Studio.
Tạo
Mục tiêu của bước tạo bản dựng này là tạo một tệp gói ứng dụng Android đã ký của ứng dụng mẫu.
Để tạo gói ứng dụng Android, hãy làm theo các bước sau:
- Tải ứng dụng mẫu xuống từ GitHub.
- Tạo ứng dụng mẫu. Trước khi tạo, hãy thay đổi tên gói của ứng dụng mẫu rồi tạo. Nếu bạn có các gói của ứng dụng khác trong Play Console, hãy đảm bảo tên gói mà bạn cung cấp cho ứng dụng mẫu là duy nhất.
Lưu ý: Việc tạo ứng dụng mẫu chỉ tạo ra một tệp APK mà bạn có thể dùng để kiểm thử cục bộ. Tuy nhiên, việc chạy ứng dụng sẽ không tìm nạp sản phẩm và giá vì các sản phẩm chưa được định cấu hình trong Play Console. - Tạo gói ứng dụng Android đã ký.
Bước tiếp theo là tải gói ứng dụng Android lên Google Play Console.
3. Tạo OTP có tính năng đặt hàng trước trong Play Console
Để tạo sản phẩm tính phí một lần (OTP) trong Google Play Console, bạn cần có một ứng dụng trong Play Console. Tạo một ứng dụng trong Play Console, sau đó tải gói ứng dụng đã ký mà bạn đã tạo trước đó lên.
Tạo ứng dụng
Cách tạo ứng dụng:
- Đăng nhập vào Google Play Console bằng tài khoản nhà phát triển.
- Nhấp vào Create app (Tạo ứng dụng). Thao tác này sẽ mở trang Create app (Tạo ứng dụng).
- Nhập tên ứng dụng, chọn ngôn ngữ mặc định và các thông tin khác liên quan đến ứng dụng.
- Nhấp vào Create app (Tạo ứng dụng). Thao tác này sẽ tạo một ứng dụng trong Google Play Console.
Bây giờ, bạn có thể tải gói ứng dụng đã ký của ứng dụng mẫu lên.
Tải gói ứng dụng đã ký lên
- Tải gói ứng dụng đã ký lên kênh kiểm thử nội bộ của Google Play Console. Chỉ sau khi tải lên, bạn mới có thể định cấu hình các tính năng liên quan đến việc kiếm tiền trong Play Console.
- Nhấp vào Test and release > Testing > Internal release > Create new release (Kiểm thử và phát hành > Kiểm thử > Bản phát hành nội bộ > Tạo bản phát hành mới).
- Nhập tên bản phát hành và tải tệp APK đã ký lên.
- Nhấp vào Next (Tiếp theo), sau đó nhấp vào Save and publish (Lưu và phát hành).
Bây giờ, bạn có thể tạo sản phẩm tính phí một lần.
Tạo sản phẩm tính phí một lần
Bây giờ, hãy tạo sản phẩm tính phí một lần mà bạn muốn người dùng mua.
- Mở ứng dụng mẫu trong Google Play Console rồi chuyển đến Monetize with Play > Products > One-time products (Kiếm tiền qua Play > Sản phẩm > Sản phẩm tính phí một lần).
- Nhấp vào Create one-time product (Tạo sản phẩm tính phí một lần).
- Nhập các thông tin sau về sản phẩm:
- Product ID (Mã sản phẩm): Nhập một mã nhận dạng duy nhất. Ví dụ:
upcoming_movie_1. - (Không bắt buộc) Thẻ: Thêm các thẻ có liên quan.
- Name (Tên): Nhập tên sản phẩm. Ví dụ:
Product Movie. - Description (Nội dung mô tả): Nhập nội dung mô tả sản phẩm. Ví dụ:
Product Description. - (Không bắt buộc) Thêm hình ảnh biểu tượng: Tải biểu tượng đại diện cho sản phẩm của bạn lên.
- Product ID (Mã sản phẩm): Nhập một mã nhận dạng duy nhất. Ví dụ:
- Nhấp vào Next (Tiếp theo).
- Thêm lựa chọn mua và định cấu hình phạm vi cung cấp theo khu vực. Sản phẩm tính phí một lần cần có ít nhất một lựa chọn mua. Lựa chọn này xác định cách cấp quyền sử dụng, giá và phạm vi cung cấp theo khu vực. Đối với lớp học lập trình này, chúng ta sẽ thêm lựa chọn Buy (Mua) tiêu chuẩn cho sản phẩm.Trong phần Purchase option (Lựa chọn mua), hãy nhập các thông tin sau:
- Purchase Option ID (Mã lựa chọn mua): Nhập một mã nhận dạng duy nhất. Ví dụ:
buy-movie. - Purchase type (Loại giao dịch mua): Chọn Buy (Mua).
- (Không bắt buộc) Thẻ: Thêm các thẻ dành riêng cho lựa chọn mua này.
- (Không bắt buộc) Nhấp vào Advanced options (Tuỳ chọn nâng cao) để định cấu hình các tuỳ chọn nâng cao. Để phục vụ mục đích của lớp học lập trình này, bạn có thể bỏ qua việc định cấu hình các tuỳ chọn nâng cao.
- Purchase Option ID (Mã lựa chọn mua): Nhập một mã nhận dạng duy nhất. Ví dụ:
- Tiếp theo, bạn phải định cấu hình phạm vi cung cấp theo khu vực và giá cho lựa chọn mua. Trong phạm vi cung cấp theo khu vực, bạn sẽ chỉ định những khu vực cung cấp sản phẩm, kể cả những khu vực mà bạn chưa phát hành ứng dụng. Theo mặc định, lựa chọn mua sẽ có sẵn ở tất cả các khu vực.Trong phần Availability and pricing (Phạm vi cung cấp và giá), hãy nhấp vào Edit availability and access (Chỉnh sửa phạm vi cung cấp và quyền truy cập).
- Chọn Set to unavailable (Đặt thành không áp dụng).
- Chỉ bỏ chọn quốc gia
United States(Hoa Kỳ), sau đó nhấp vào Set to unavailable (Đặt thành không áp dụng). Bây giờ, sản phẩm tính phí một lần sẽ chỉ có ởUnited States(Hoa Kỳ). - Trong trình đơn thả xuống All regions (Tất cả khu vực), hãy chọn Available countries and regions (Các quốc gia và khu vực có cung cấp). Bạn chỉ nên thấy
United States(Hoa Kỳ). - Nhấp vào biểu tượng Price (Giá). Thao tác này sẽ hiển thị một hộp thoại để đặt giá.
- Nhập 10 USD rồi nhấp vào Save (Lưu).
- Nhấp vào Save as draft (Lưu dưới dạng bản nháp).
Lưu ý: Đừng kích hoạt lựa chọn mua vội. Chúng ta sẽ kích hoạt lựa chọn này sau khi định cấu hình ưu đãi đặt hàng trước. Lý do là bạn không thể thêm ưu đãi đặt hàng trước vào một lựa chọn mua đang hoạt động có phạm vi cung cấp theo khu vực đã được đặt.
Thêm ưu đãi đặt hàng trước
Bây giờ, bạn sẽ thêm ưu đãi đặt hàng trước cho lựa chọn mua thuộc loại Mua mà bạn đã tạo trước đó. Ưu đãi đặt hàng trước cho phép người dùng mua mặt hàng của bạn trước khi mặt hàng đó được phát hành chính thức. Xin lưu ý rằng ưu đãi đặt hàng trước chỉ được hỗ trợ cho lựa chọn mua thuộc loại Buy (Mua) và chỉ có thể được định cấu hình cho các sản phẩm mới ở một khu vực.
Việc thêm ưu đãi đặt hàng trước bao gồm 2 bước sau:
- Chuẩn bị lựa chọn mua thuộc loại Buy (Mua) cho ưu đãi đặt hàng trước.
- Thêm ưu đãi đặt hàng trước cho lựa chọn mua.
Chuẩn bị lựa chọn mua thuộc loại Mua cho ưu đãi đặt hàng trước
- Mở ứng dụng mẫu trong Google Play Console rồi chuyển đến Monetize with Play > Products > One-time products (Kiếm tiền qua Play > Sản phẩm > Sản phẩm tính phí một lần).
- Trên trang One-time products (Sản phẩm tính phí một lần), hãy nhấp vào mũi tên bên phải sản phẩm của bạn (
upcoming_movie_1). Thao tác này sẽ mở trang Edit one-time product (Chỉnh sửa sản phẩm tính phí một lần). - Nhấp vào mũi tên bên phải lựa chọn mua
buy-moviemà bạn đã tạo trước đó. Thao tác này sẽ mở trang Edit purchase option (Chỉnh sửa lựa chọn mua). - Nhấp vào Edit availability and access (Chỉnh sửa phạm vi cung cấp và quyền truy cập) rồi chọn Set to available and allow users to pre-order (Đặt thành có sẵn và cho phép người dùng đặt hàng trước).
- Trong trình đơn thả xuống All regions (Tất cả khu vực), hãy chọn Available countries and regions (Các quốc gia và khu vực có cung cấp). Thao tác này chỉ hiển thị
United Statesmà bạn đã định cấu hình trước đó. - Chọn quốc gia, sau đó nhấp vào Set to available for pre-order only (Đặt thành chỉ có thể đặt hàng trước).
- Nhấp vào Save (Lưu).
Xin lưu ý rằng bạn vẫn chưa thêm ưu đãi đặt hàng trước vào lựa chọn mua. Bước tiếp theo là thêm ưu đãi đặt hàng trước.
Thêm ưu đãi đặt hàng trước
- Mở ứng dụng mẫu trong Google Play Console rồi chuyển đến Monetize with Play > Products > One-time products (Kiếm tiền qua Play > Sản phẩm > Sản phẩm tính phí một lần).
- Trên trang One-time products (Sản phẩm tính phí một lần), hãy nhấp vào Add offer > Pre-order (Thêm ưu đãi > Đặt hàng trước) cho sản phẩm của bạn (
upcoming_movie_1). Thao tác này sẽ mở trang Add pre-order (Thêm đơn đặt hàng trước). - Nhập thông tin chi tiết về đơn đặt hàng trước:
- Pre-order ID (Mã đơn đặt hàng trước): Nhập
preorder-offer-1. - (Không bắt buộc) Thêm chiết khấu: Bạn có thể chọn chiết khấu None (Không có), Percentage (Tỷ lệ phần trăm) hoặc Absolute (Số tiền tuyệt đối). Để phục vụ mục đích của lớp học lập trình này, hãy chọn None (Không có).
- (Không bắt buộc) Thẻ: Thêm các thẻ có liên quan.
- Start date and time (Ngày và giờ bắt đầu): Đặt ngày cách thời điểm hiện tại ít nhất 3 ngày.
- End date and time (Ngày và giờ kết thúc): Đặt ngày sau ngày bắt đầu ít nhất 24 giờ.
- Availability after pre-order (Phạm vi cung cấp sau khi đặt hàng trước): Chọn xem sản phẩm sẽ có sẵn ngay sau thời gian đặt hàng trước hay vào một ngày/giờ cụ thể sau đó.
- (Không bắt buộc) Cam kết giá thấp hơn: Chọn tuỳ chọn này nếu bạn muốn tính phí cho người dùng mức giá thấp nhất giữa giá đặt hàng trước và giá khi phát hành. Đây có thể là một động lực mạnh mẽ cho những người mua sớm.
- Pre-order ID (Mã đơn đặt hàng trước): Nhập
- Nhấp vào Save (Lưu).
- Mở trang Edit one-time product (Chỉnh sửa sản phẩm tính phí một lần) cho sản phẩm tính phí một lần của bạn (upcoming_movie_1).
- Nhấp vào Activate (Kích hoạt) cho lựa chọn mua thuộc loại Mua (
buy-movie). - Nhấp vào Activate (Kích hoạt) cho ưu đãi đặt hàng trước (
preorder-offer-1) trong lựa chọn mua thuộc loại Mua. Thao tác này sẽ kích hoạt ưu đãi đặt hàng trước và phát hành ưu đãi đó vào ngày mà bạn đã định cấu hình trước đó trong thông tin chi tiết về đơn đặt hàng trước.
Video về cách tạo ưu đãi đặt hàng trước
Video sau đây cho thấy các bước tạo ưu đãi đặt hàng trước đã được mô tả trước đó.
4. Tích hợp với PBL
Để tích hợp ứng dụng của bạn với Thư viện Play Billing (PBL), hãy làm theo các bước sau:
- Thêm phần phụ thuộc Thư viện Play Billing vào ứng dụng mẫu.
dependencies { val billing_version = "8.1.0" implementation("com.android.billingclient:billing-ktx:$billing_version") } - Khởi chạy BillingClient. BillingClient là SDK ứng dụng nằm trên ứng dụng của bạn và giao tiếp với Thư viện Play Billing. Đoạn mã sau đây cho thấy cách khởi chạy ứng dụng thanh toán.
private BillingClient createBillingClient() { return BillingClient.newBuilder(activity) .enablePendingPurchases(PendingPurchasesParams.newBuilder().enableOneTimeProducts().build()) // For one-time products, add a listener to process and acknowledge the purchases. This will notify // Google the purchase was processed. // For client-only apps, use billingClient.acknowledgePurchase(). // If you have a secure backend, you must acknowledge purchases on your server using the // server-side API. // See https://developer.android.com/google/play/billing/security#acknowledge // In this sample snippet purchases aren't processed. You must // implement your business logic to process and acknowledge the purchases. .setListener((billingResult, purchases) -> {}) .enableAutoServiceReconnection() .build(); } - Kết nối với Google Play.Đoạn mã sau đây cho thấy cách kết nối với Google Play.
/** * Starts the billing connection with Google Play. This method should be called exactly once * before any other methods in this class. * * @param productList The list of products to query for after the connection is established. */ public void startBillingConnection(List<Product> productList) { billingClient.startConnection( new BillingClientStateListener() { @Override public void onBillingSetupFinished(BillingResult billingResult) { if (billingResult.getResponseCode() == BillingResponseCode.OK) { Log.d(TAG, "Billing Client Connection Successful"); queryProductDetails(productList); } else { Log.e(TAG, "Billing Client Connection Failed: " + billingResult.getDebugMessage()); listener.onBillingSetupFailed(billingResult); // Propagate the error to the listener to show a message to the user. } } @Override public void onBillingServiceDisconnected() { Log.e(TAG, "Billing Client Connection Lost"); listener.onBillingError("Billing Connection Lost"); } }); } - Tìm nạp chi tiết sản phẩm tính phí một lần.Sau khi tích hợp ứng dụng với PBL, bạn phải tìm nạp chi tiết sản phẩm tính phí một lần vào ứng dụng. Đoạn mã sau đây cho thấy cách tìm nạp chi tiết sản phẩm tính phí một lần trong ứng dụng.
Việc tìm nạp sản phẩm tính phí một lần (private void queryProductDetails(List<Product> productList) { QueryProductDetailsParams queryProductDetailsParams = QueryProductDetailsParams.newBuilder().setProductList(productList).build(); billingClient.queryProductDetailsAsync( queryProductDetailsParams, new ProductDetailsResponseListener() { @Override public void onProductDetailsResponse( BillingResult billingResult, QueryProductDetailsResult productDetailsResponse) { if (billingResult.getResponseCode() == BillingResponseCode.OK) { List<ProductDetails> productDetailsList = productDetailsResponse.getProductDetailsList(); listener.onProductDetailsResponse(productDetailsList); } else { Log.e(TAG, "QueryProductDetailsAsync Failed: " + billingResult.getDebugMessage()); listener.onBillingError("Query Products Failed: " + billingResult.getResponseCode()); } } }); }upcoming_movie_1trong ví dụ này) trongProductDetailssẽ cung cấp cho bạn một phản hồi tương tự như sau: Lưu ý rằng thông tin chi tiết về ưu đãi đặt hàng trước có trong{ "productId": "upcoming_movie_1", "type": "inapp", "title": "Purrfect Mayhem: The Final Playback (Movies All Day | Play Samples)", "name": "Purrfect Mayhem: The Final Playback", "description": "Yolo and Thorne must reach the original broadcasting site to initiate the \"Final Playback\" and save the timeline. Follow them through their race against the Clockinators.", "skuDetailsToken": "<---skuDetailsToken--->", "oneTimePurchaseOfferDetails": {}, "oneTimePurchaseOfferDetailsList": [ { "priceAmountMicros": 8500000, "priceCurrencyCode": "USD", "formattedPrice": "$8.50", "offerIdToken": "<---offerIdToken--->", "offerId": "preorder", "purchaseOptionId": "buy-option", "offerTags": [], "validTimeWindow": { "startTimeMillis": 1756771200000, "endTimeMillis": 1785542400000 }, "preorderDetails": { "preorderReleaseTimeMillis": 1785542400000, "preorderPresaleEndTimeMillis": 1785542400000 } } ] }oneTimePurchaseOfferDetailsList. Danh sách này có 1 lựa chọn mua (buy-option) mà ưu đãi đặt hàng trước đã được định cấu hình trong Play Console. Bạn có thể xác định duy nhất từng lựa chọn mua bằng offerIdToken. - Tìm nạp mã thông báo ưu đãi cùng với thông tin chi tiết về ưu đãi đặt hàng trước. Bạn cần mã thông báo ưu đãi để bắt đầu quy trình thanh toán ở bước 6.
@Override public void onProductDetailsResponse(List<ProductDetails> productDetailsList) { if (productDetailsList != null && !productDetailsList.isEmpty()) { // Process productDetailsList returned by QueryProductDetailsResult for (ProductDetails productDetails : productDetailsResult.getProductDetailsList()) { for (OneTimePurchaseOfferDetails oneTimePurchaseOfferDetails : productDetails.getOneTimePurchaseOfferDetailsList()) { // Checks if the offer is a preorder offer. if (oneTimePurchaseOfferDetails.getPreorderDetails() != null) { // Process the returned PreorderDetails OneTimePurchaseOfferDetails.PreorderDetails preorderDetails = oneTimePurchaseOfferDetails.getPreorderDetails(); // Get preorder release time in millis. long preorderReleaseTimeMillis = preorderDetails.getPreorderReleaseTimeMillis(); // Get preorder presale end time in millis. long preorderPresaleEndTimeMillis = preorderDetails.getPreorderPresaleEndTimeMillis(); // Get offer ID String offerId = oneTimePurchaseOfferDetails.getOfferId(); // Get the associated purchase option ID if (oneTimePurchaseOfferDetails.getPurchaseOptionId() != null) { String purchaseOptionId = oneTimePurchaseOfferDetails.getPurchaseOptionId(); } } } } } else { Log.e(TAG, "No product details found for " + productId); } } - Bắt đầu quy trình thanh toán.
/** * Launches the billing flow for the product with the given offer token. * * @param activity The activity instance from which the billing flow will be launched. * @param productDetails The product details of the product to purchase. * @param offerToken The offer token of the product to purchase. * @return The result of the billing flow. */ public void launchPurchase(Activity activity, ProductDetails productDetails, String offerToken) { ImmutableList<BillingFlowParams.ProductDetailsParams> productDetailsParamsList = ImmutableList.of( BillingFlowParams.ProductDetailsParams.newBuilder() .setProductDetails(productDetails) .setOfferToken(offerToken) .build()); BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder() .setProductDetailsParamsList(productDetailsParamsList) .build(); billingClient.launchBillingFlow(activity, billingFlowParams); }
5. Kiểm thử các lựa chọn mua
Trước khi cung cấp sản phẩm tính phí một lần trong ứng dụng thực, bạn có thể kiểm thử quá trình tích hợp PBL bằng cách sử dụng trình kiểm thử giấy phép và Play Billing Lab.
Để tìm hiểu cách kiểm thử các lựa chọn mua bằng Play Billing Lab, hãy xem lớp học lập trình Mở rộng thị trường mới nhờ giá sản phẩm theo khu vực.
6. Các bước tiếp theo
- Tìm hiểu cách phân tích tình trạng người dùng bỏ qua giao dịch mua sản phẩm.
- Tìm hiểu cách mở rộng thị trường mới bằng giá theo khu vực.
- Tìm hiểu cách tối đa hoá hiệu quả của việc tích hợp Google Play Billing.
- Hãy nhớ làm theo các phương pháp hay nhất để xác minh và xử lý giao dịch mua trên phần phụ trợ an toàn của bạn sau khi người dùng bắt đầu mua các sản phẩm này.
Tài liệu tham khảo
7. Xin chúc mừng!
Xin chúc mừng! Bạn đã điều hướng thành công Google Play Console để tạo ưu đãi đặt hàng trước cho sản phẩm tính phí một lần. Giờ đây, bạn đã hiểu rõ hơn về danh mục sản phẩm linh hoạt của Google Play cho các giao dịch mua tính phí một lần.
Khảo sát
Chúng tôi rất coi trọng ý kiến phản hồi của bạn về lớp học lập trình này. Hãy dành vài phút để hoàn thành bản khảo sát của chúng tôi.