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 thông tin 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 những 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 mới sử dụng 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ở khoá thị trường mới bằng tính năng định giá sản phẩm theo khu vực.
Kiến thứ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 các sản phẩm tính phí một lần.
- Cách sử dụng các API Thư viện Google Play Billing để truy vấn các 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 thứ bạn cần...
- Có 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ý các sản phẩm dùng một lần. Ứng dụng mẫu được thiết kế để trở thành một ứng dụng Android có đầy đủ chức năng và 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à ưu đãi đặt hàng trước có liên quan.
- Thực hiện quy trình mua cho giá theo khu vực.
Video minh hoạ sau đây cho thấy giao diện và cách hoạt động của ứng dụng mẫu 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 bạn 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 bạn đã 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 một ứ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 này là tạo một tệp Android App Bundle có chữ 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 những ứng dụng khác trong Play Console, hãy đảm bảo rằng 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 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 một Android App Bundle đã 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ó đơn đặ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 của bạn.
- Nhấp vào Tạo ứng dụng. Thao tác này sẽ mở trang 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 Tạo ứng dụng. Thao tác này sẽ tạo một ứng dụng trong Google Play Console.
Giờ đây, 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. Bạn chỉ 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 sau khi tải lên.
- Nhấp vào 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 Tiếp theo, rồi nhấp vào Lưu và xuất bản.
Giờ đây, 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 phần Kiếm tiền bằng Play > Sản phẩm > Sản phẩm mua một lần.
- Nhấp vào Tạo sản phẩm tính phí một lần.
- Nhập các thông tin chi tiết sau về sản phẩm:
- 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.
- Tên: Nhập tên sản phẩm. Ví dụ:
Product Movie. - 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 một biểu tượng đại diện cho sản phẩm của bạn lên.
- Mã sản phẩm: Nhập một mã nhận dạng duy nhất. Ví dụ:
- Nhấp vào Tiếp theo.
- Thêm một lựa chọn mua và thiết lập 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, trong đó xác định cách cấp quyền sử dụng, giá và phạm vi cung cấp theo khu vực. Trong lớp học lập trình này, chúng ta sẽ thêm lựa chọn Mua tiêu chuẩn cho sản phẩm.Trong phần Lựa chọn mua, hãy nhập các thông tin sau:
- Mã lựa chọn mua: Nhập một mã nhận dạng duy nhất. Ví dụ:
buy-movie. - Loại giao dịch mua: Chọn Mua.
- (Không bắt buộc) Thẻ: Thêm thẻ dành riêng cho lựa chọn mua này.
- (Không bắt buộc) Nhấp vào Tuỳ chọn nâng cao để định cấu hình các tuỳ chọn nâng cao. Trong phạm vi của lớp học lập trình này, bạn có thể bỏ qua bước định cấu hình các lựa chọn nâng cao.
- 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 thiết lập tình trạng còn hàng và giá theo khu vực cho lựa chọn mua. Trong phần tình trạng còn hàng 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ó ở tất cả các khu vực.Trong phần Phạm vi cung cấp và giá, hãy nhấp vào Chỉnh sửa phạm vi cung cấp và quyền truy cập.
- Chọn Đặt thành không áp dụng.
- Chỉ bỏ chọn quốc gia
United States, rồi nhấp vào Đặt thành không có sẵn. Giờ đây, sản phẩm tính phí một lần sẽ chỉ có trongUnited States. - Trong trình đơn thả xuống Tất cả khu vực, hãy chọn Các quốc gia và khu vực có hỗ trợ. Bạn chỉ nên thấy
United States. - Nhấp vào biểu tượng Giá. Thao tác này sẽ hiển thị một hộp thoại để đặt giá.
- Nhập 100.000 VND rồi nhấp vào Lưu.
- Nhấp vào Lưu dưới dạng bản nháp.
Lưu ý: Đừng kích hoạt lựa chọn mua ngay. Chúng tôi sẽ kích hoạt tính năng này sau khi bạn đị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.
Thêm ưu đãi đặt hàng trước
Bây giờ, bạn sẽ thêm một ư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 Mua và bạn chỉ có thể thiết lập ưu đãi này 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 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 phần Kiếm tiền bằng Play > Sản phẩm > Sản phẩm mua một lần.
- Trên trang 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 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 của lựa chọn mua
buy-moviemà bạn đã tạo trước đó. Thao tác này sẽ mở trang Chỉnh sửa lựa chọn mua. - Nhấp vào Chỉnh sửa phạm vi cung cấp và quyền truy cập, rồi chọn Đặt thành có cung cấp và cho phép người dùng đặt hàng trước.
- Trong trình đơn thả xuống Tất cả khu vực, hãy chọn Các quốc gia và khu vực được hỗ trợ. 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, rồi nhấp vào Đặt thành chỉ có thể đặt hàng trước.
- Nhấp vào 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 phần Kiếm tiền bằng Play > Sản phẩm > Sản phẩm mua một lần.
- Trên trang Sản phẩm tính phí một lần, hãy nhấp vào 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 Thêm đơn đặt hàng trước. - Nhập thông tin chi tiết về đơn đặt hàng trước:
- 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 Không có, Tỷ lệ phần trăm hoặc Số tiền chiết khấu tuyệt đối. Đối với mục đích của lớp học lập trình này, hãy chọn Không có.
- (Không bắt buộc) Thẻ: Thêm các thẻ có liên quan.
- 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.
- Ngày và giờ kết thúc: Đặt ngày sau ngày bắt đầu ít nhất 24 giờ.
- Tình trạng còn hàng sau khi đặt hàng trước: Chọn xem sản phẩm có hàng 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 lựa chọn này nếu bạn muốn người dùng được tính mức giá thấp nhất giữa giá đặt hàng trước và giá tại thời điểm phát hành. Đây có thể là một động lực mạnh mẽ cho những người mua sớm.
- Mã đơn đặt hàng trước: Nhập
- Nhấp vào Lưu.
- Mở trang 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 (upcoming_movie_1).
- Nhấp vào Kích hoạt cho lựa chọn mua (
buy-movie). - Nhấp vào Kích hoạt cho ưu đãi đặt hàng trước (
preorder-offer-1) trong lựa chọn mua. Thao tác này sẽ kích hoạt ưu đãi đặt hàng trước và áp dụng ưu đãi đó vào ngày mà bạn đã định cấu hình trước đó trong phần thông tin chi tiết về đơn đặt hàng trước.
Video hướng dẫn tạo ưu đãi đặt hàng trước
Video sau đây minh hoạ các bước tạo ưu đãi đặt hàng trước như đã 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 Google 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 động BillingClient. BillingClient là SDK ứng dụng khách nằm trên ứng dụng của bạn và giao tiếp với Thư viện Google Play Billing. Đoạn mã sau đây cho biết 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 minh hoạ 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 thông tin chi tiết về 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 thông tin chi tiết về sản phẩm tính phí một lần vào ứng dụng. Đoạn mã sau đây minh hoạ cách tìm nạp thông tin chi tiết về 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 dùng 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ẽ cho bạn một phản hồi tương tự như sau: Xin 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à bạn đã định cấu hình ưu đãi đặt hàng trước trong Play Console. Bạn có thể xác định riêng 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 để khởi chạy 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 tra các lựa chọn mua
Trước khi cung cấp các sản phẩm tính phí một lần trong ứng dụng chính thức, bạn có thể kiểm thử chế độ tích hợp PBL bằng người kiểm thử được cấp 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 codelab Mở khoá thị trường mới bằng tính năng đị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 bỏ ngang khi mua sản phẩm.
- Tìm hiểu cách khai thác thị trường mới bằng cách sử dụng mức giá theo khu vực.
- Tìm hiểu cách tối đa hoá việc tích hợp dịch vụ thanh toán qua Play.
- 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ợ bảo mật của bạn khi người dùng bắt đầu mua những 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 đã truy cập thành công Google Play Console để tạo ưu đãi đặt hàng trước cho một 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 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 cân nhắc dành vài phút để hoàn thành bản khảo sát của chúng tôi.