Lưu ý: Kể từ ngày 2 tháng 8 năm 2022, tất cả các ứng dụng mới phải sử dụng Thư viện Billing phiên bản 4 trở lên. Chậm nhất vào ngày 1 tháng 11 năm 2022, tất cả các bản cập nhật cho ứng dụng hiện có đều phải sử dụng Thư viện Billing phiên bản 4 trở lên. Tìm hiểu thêm.

Ghi chú phát hành về Thư viện Google Play Billing

Sử dụng bộ sưu tập để sắp xếp ngăn nắp các trang Lưu và phân loại nội dung dựa trên lựa chọn ưu tiên của bạn.

Chủ đề này bao gồm các ghi chú phát hành cho Thư viện Google Play Billing.

Bản phát hành Thư viện Google Play Billing phiên bản 5.1 (31/10/2022)

Hiện đã có phiên bản 5.1.0 của Thư viện Google Play Billing và các phần mở rộng Kotlin.

Phiên bản này có các nội dung thay đổi sau.

Tóm tắt nội dung thay đổi

Bản phát hành Thư viện Google Play Billing phiên bản 5.0 (11/05/2022)

Hiện đã có phiên bản 5.0.0 của Thư viện Google Play Billing và các phần mở rộng Kotlin.

Phiên bản này có các nội dung thay đổi sau.

Tóm tắt nội dung thay đổi

  • Giới thiệu mô hình mới cho các gói thuê bao, bao gồm cả các thực thể mới cho phép bạn tạo nhiều ưu đãi cho một sản phẩm thuê bao duy nhất. Để biết thêm thông tin, vui lòng xem hướng dẫn di chuyển.
  • Đã thêm BillingClient.queryProductDetailsAsync() để thay thế BillingClient.querySkuDetailsAsync().
  • Thêm phương thức setIsOfferPersonalized() cho các yêu cầu về thông tin công bố giá được cá nhân hoá ở Liên minh Châu Âu. Để tìm hiểu thêm về cách sử dụng phương thức này, hãy xem bài viết Hiển thị giá được cá nhân hóa.
  • Xóa queryPurchases(), phiên bản trước đây không còn được dùng nữa và thay thế bằng querypurchasesAasync có trong Thư viện Google Play Billing 4.0.0.
  • Ngừng sử dụng và xoá launchPriceChangeFlow trong bản phát hành sau này. Để tìm hiểu thêm về các lựa chọn thay thế, hãy xem Quy trình xác nhận thay đổi giá.
  • Đã xoá setVrPurchaseFlow() mà trước đây bạn từng sử dụng khi tạo quy trình mua. Trong các phiên bản trước, phương thức này đã chuyển hướng người dùng hoàn tất giao dịch mua trên thiết bị Android của họ. Sau khi bạn xoá phương thức này, người dùng sẽ hoàn tất giao dịch mua qua quy trình mua chuẩn.

Bản phát hành Thư viện Google Play Billing phiên bản 4.1 (23/02/2022)

Hiện đã có phiên bản 4.1.0 của Thư viện Google Play Billing và các phần mở rộng Kotlin.

Phiên bản này có các nội dung thay đổi sau.

Tóm tắt nội dung thay đổi

Bản phát hành Thư viện Google Play Billing phiên bản 4.0 (18/05/2021)

Hiện đã có phiên bản 4.0.0 của Thư viện Google Play Billing và các phần mở rộng Kotlin.

Tóm tắt nội dung thay đổi

Thư viện Google Play Billing phiên bản 3.0.3 (12/03/2021)

Hiện đã có phiên bản 3.0.3 của Thư viện Google Play Billing, phần mở rộng Kotlin và trình bổ trợ Unity.

Các bản sửa lỗi Java và Kotlin

  • Khắc phục tình trạng rò rỉ bộ nhớ khi gọi hàm endConnection().
  • Khắc phục vấn đề khi Thư viện Google Play Billing được các ứng dụng dùng chế độ khởi chạy đơn nhiệm sử dụng. Kích hoạt một lệnh gọi lại onPurchasesUpdated() khi tiếp tục chạy một ứng dụng từ trình chạy Android và hộp thoại thanh toán đã hiển thị trước khi bị tạm ngưng.

Các bản sửa lỗi Unity

  • Cập nhật lên phiên bản Java 3.0.3 để khắc phục sự cố rò rỉ bộ nhớ và khắc phục sự cố ngăn giao dịch mua khi ứng dụng được tiếp tục chạy từ trình chạy Android và hộp thoại thanh toán đã hiển thị trước khi bị tạm ngưng.

Bản phát hành Thư viện Google Play Billing phiên bản 3.0.2 (24/11/2020)

Hiện đã có phiên bản 3.0.2 của Thư viện Google Play Billing và phần mở rộng Kotlin.

Bản sửa lỗi

  • Đã khắc phục lỗi trong phần mở rộng Kotlin, trong đó coroutine gặp sự cố với lỗi "Đã tiếp tục".
  • Đã khắc phục các tệp đối chiếu chưa được giải quyết khi sử dụng phần mở rộng Kotlin với thư viện kotlinx.coroutines phiên bản 1.4+.

Bản phát hành Thư viện Google Play Billing phiên bản 3.0.1 (30/09/2020)

Hiện đã có phiên bản 3.0.1 của Thư viện Google Play Billing và phần mở rộng Kotlin.

Bản sửa lỗi

  • Đã khắc phục lỗi PurchasesUpdatedListener có thể không được gọi với kết quả giao dịch mua nếu ứng dụng bị vô hiệu hoá và khôi phục trong quy trình thanh toán.

Bản phát hành Thư viện Google Play Billing phiên bản 3.0 (08/06/2020)

Hiện đã có phiên bản 3.0.0 của Thư viện Google Play Billing, phần mở rộng Kotlin và trình bổ trợ Unity.

Tóm tắt nội dung thay đổi

  • Đã ngừng hỗ trợ SKU thưởng.
  • Đã xoá các thông số ChildDirectedUnderAgeOfConsent.
  • Đã xoá các phương thức trọng tải mà nhà phát triển không dùng nữa.
  • Đã xoá các phương thức BillingFlowParams.setAccountId()BillingFlowParams.setDeveloperId() không dùng nữa.
  • Đã xoá các phương thức BillingFlowParams.setOldSkus(String oldSku)BillingFlowParams.addOldSku(String oldSku) không dùng nữa.
  • Thêm chú thích về giá trị rỗng.

Bản sửa lỗi

  • Hàm SkuDetails.getIntroductoryPriceCycles() hiện trả về int thay vì String.
  • Đã khắc phục lỗi coi luồng thanh toán là có các thông số bổ sung ngay cả khi không có thông số bổ sung nào được thiết lập.

Bản phát hành Thư viện Google Play Billing phiên bản 2.2.1 (20/5/2020)

Đã có bản phát hành Thư viện Google Play Billing phiên bản 2.2.1.

Bản sửa lỗi

  • Đã cập nhật phiên bản mặc định của thư viện Billing của Java Play mà phần mở rộng Kotlin chịu phụ thuộc.

Bản phát hành Thư viện Google Play Billing phiên bản 2.2.0 và hỗ trợ Unity (23/03/2020)

Phiên bản 2.2.0 của Google Play Billing cung cấp chức năng giúp nhà phát triển đảm bảo giao dịch mua được chỉ định cho đúng người dùng. Những nội dung thay đổi này giúp lược bỏ nhu cầu xây dựng các giải pháp tuỳ chỉnh dựa trên trọng tải của nhà phát triển. Trong bản cập nhật này, chúng tôi đã ngừng sử dụng và sẽ xoá chức năng trọng tải dành cho nhà phát triển trong bản phát hành sau này. Để biết thêm thông tin, bao gồm các phương án thay thế được đề xuất, hãy xem phần Trọng tải của nhà phát triển.

Thư viện Google Play Billing 2 dành cho Unity

Ngoài các phiên bản Java và Kotlin hiện tại của Thư viện Google Play Billing 2, chúng tôi còn phát hành một phiên bản thư viện để sử dụng cùng Unity. Các nhà phát triển trò chơi đang sử dụng API mua hàng trong ứng dụng Unity có thể nâng cấp ngay để tận dụng tất cả tính năng của Thư viện Google Play Billing 2 và nâng cấp dễ dàng hơn lên các phiên bản sau của Thư viện Google Play Billing.

Để tìm hiểu thêm, hãy xem bài viết Sử dụng Google Play Billing với Unity.

Tóm tắt nội dung thay đổi

Bản phát hành Thư viện Google Play Billing 2.1.0 và phần mở rộng Kotlin 2.1.0 (10/12/2019)

Phiên bản 2.1.0 của thư viện Google Play Billing và phần mở rộng Kotlin mới đã có sẵn. Phần mở rộng Kotlin của Thư viện Play Billing cung cấp các giải pháp thay thế API tương thích cho việc tiêu thụ Kotlin, với tính năng coroutine và kiểm tra biến null an toàn tốt hơn. Để xem ví dụ về mã, hãy xem phần Sử dụng Thư viện Google Play Billing.

Phiên bản này có các nội dung thay đổi sau.

Tóm tắt nội dung thay đổi

  • Trong BillingFlowParams, ngừng sử dụng hàm setOldSku(String oldSku) và thay thế bằng hàm setOldSku(String oldSku, String purchaseToken), để phân biệt khi nhiều tài khoản trên thiết bị cùng sở hữu một sku.

Bản phát hành Thư viện Google Play Billing phiên bản 2.0.3 (05/08/2019)

Thư viện Google Play Billing phiên bản 2.0.3 hiện đã có.

Bản sửa lỗi

  • Đã khắc phục lỗi trong đó hàm querySkuDetailsAsync() đôi khi gặp sự cố với mã DEVELOPER_ERROR thay vì trả về một kết quả thành công.

Bản phát hành Thư viện Google Play Billing phiên bản 2.0.2 (08/07/2019)

Thư viện Google Play Billing phiên bản 2.0.2 hiện đã có. Bản phát hành này chứa nội dung cập nhật cho tài liệu tham khảo và không thay đổi chức năng của thư viện.

Bản phát hành Thư viện Google Play Billing phiên bản 2.0.1 (06/06/2019)

Thư viện Google Play Billing phiên bản 2.0.1 hiện đã có. Phiên bản này có nội dung thay đổi sau.

Bản sửa lỗi

  • Đã khắc phục lỗi trả về thông báo gỡ lỗi là null trong một số trường hợp.
  • Đã khắc phục khả năng xảy ra sự cố rò rỉ bộ nhớ.

Bản phát hành Thư viện Google Play Billing phiên bản 2.0 (07/05/2019)

Thư viện Google Play Billing phiên bản 2.0 hiện đã có. Phiên bản này có nội dung thay đổi sau.

Giao dịch mua phải được xác nhận trong vòng 3 ngày

Google Play hỗ trợ mua sản phẩm từ bên trong ứng dụng (in-app) hoặc bên ngoài ứng dụng (out-of-app). Để Google Play có thể đảm bảo trải nghiệm mua hàng nhất quán, bất kể người dùng mua sản phẩm của bạn ở đâu, bạn phải xác nhận tất cả giao dịch mua nhận được qua Thư viện Google Play Billing trong thời gian sớm nhất có thể sau khi cấp quyền cho người dùng. Nếu bạn không xác nhận giao dịch mua trong vòng 3 ngày, người dùng sẽ tự động được hoàn tiền và Google Play sẽ thu hồi giao dịch mua đó. Đối với các giao dịch đang chờ xử lý (mới trong phiên bản 2.0), thời hạn 3 ngày bắt đầu khi giao dịch mua chuyển sang trạng thái PURCHASED và không áp dụng khi giao dịch mua đang ở trạng thái PENDING.

Đối với các gói thuê bao, bạn phải xác nhận bất kỳ giao dịch mua nào có một mã thông báo giao dịch mua mới. Điều này có nghĩa là cần xác nhận tất cả giao dịch mua ban đầu, thay đổi gói và đăng ký lại, nhưng bạn không cần xác nhận các lần gia hạn tiếp theo. Để xác định xem một giao dịch mua có cần xác nhận hay không, bạn có thể kiểm tra trường xác nhận trong giao dịch mua.

Đối tượng Purchase hiện bao gồm một phương thức isAcknowledged() cho biết liệu giao dịch mua đã được xác nhận hay chưa. Ngoài ra, API Nhà phát triển Google Play bao gồm các giá trị boolean xác nhận cho cả Purchases.productsPurchases.subscriptions. Trước khi xác nhận giao dịch mua, hãy đảm bảo sử dụng các phương thức này để xác định xem giao dịch mua đã được xác nhận hay chưa.

Bạn có thể xác nhận giao dịch mua bằng một trong những phương thức sau:

  • Đối với các sản phẩm tiêu dùng, hãy sử dụng hàm consumeAsync() trong API ứng dụng.
  • Đối với các sản phẩm không phải hàng tiêu dùng, hãy sử dụng hàm acknowledgePurchase() trong API ứng dụng.
  • Một phương thức acknowledge() mới cũng có trong API máy chủ.

BillingFlowParams.setSku() đã bị xoá

Phương thức BillingFlowParams#setSku() không còn được dùng trước đây đã bị xoá trong bản phát hành này. Trước khi hiển thị sản phẩm trong một quy trình mua, giờ đây bạn phải gọi hàm BillingClient.querySkuDetailsAsync() , truyền kết quả của đối tượng SkuDetails tới hàm BillingFlowParams.Builder.setSkuDetails().

Để xem ví dụ về mã, hãy xem phần Sử dụng Thư viện Google Play Billing.

Trọng tải nhà phát triển được hỗ trợ

Thư viện Google Play Billing phiên bản 2.0 bổ sung tính năng hỗ trợ cho trọng tải nhà phát triển – có thể đính kèm các chuỗi tuỳ ý với các giao dịch mua. Bạn có thể đính kèm thông số trọng tải dành cho nhà phát triển vào giao dịch mua, tuy nhiên chỉ khi giao dịch mua được xác nhận hoặc tiêu thụ. Tài liệu này không giống với trọng tải dành cho nhà phát triển trong AIDL, trong đó, trọng tải có thể được chỉ định khi khởi chạy quy trình mua. Đó là bởi giờ đây bạn có thể bắt đầu mua hàng từ bên ngoài ứng dụng, sự thay đổi này đảm bảo rằng bạn luôn có cơ hội thêm trọng tải vào giao dịch mua.

Để truy cập vào trọng tải trong thư viện mới, các đối tượng Purchase hiện chứa một phương thức getDeveloperPayload().

Các ưu đãi nhất quán

Khi bạn cung cấp SKU chiết khấu, Google Play hiện sẽ trả về giá gốc của SKU để bạn có thể cho người dùng thấy rằng họ đang được chiết khấu.

SkuDetails chứa hai phương thức mới để truy xuất giá SKU ban đầu:

Giao dịch đang chờ xử lý

Với thư viện Google Play Billing phiên bản 2.0, bạn phải hỗ trợ giao dịch mua cần thực hiện thêm thao tác để cấp quyền. Ví dụ: người dùng có thể chọn mua sản phẩm trong ứng dụng tại cửa hàng thực tế bằng cách sử dụng tiền mặt. Điều này có nghĩa là giao dịch được hoàn tất bên ngoài ứng dụng. Trong trường hợp này, bạn chỉ nên cấp quyền sau khi người dùng đã hoàn tất giao dịch.

Để bật các giao dịch mua đang chờ xử lý, hãy gọi hàm enablePendingPurchases() trong quá trình khởi chạy ứng dụng.

Sử dụng Purchase.getPurchaseState() để xác định trạng thái mua hàng là PURCHASED hay PENDING. Lưu ý rằng bạn chỉ nên cấp quyền khi trạng thái là PURCHASED. Bạn nên kiểm tra nội dung cập nhật trạng thái của Purchase bằng cách thực hiện các bước sau:

  1. Khi khởi động ứng dụng, hãy gọi hàm BillingClient.queryPurchases() để lấy danh sách các sản phẩm đã tiêu dùng liên kết với người dùng.
  2. Gọi Purchase.getPurchaseState() trên mỗi đối tượng Purchase được trả về.
  3. Triển khai phương thức onPurchasesUpdated() để phản hồi nội dung thay đổi đối với đối tượng Purchase.

Ngoài ra, API Nhà phát triển Google Play bao gồm trạng thái PENDING cho Purchases.products. Giao dịch đang chờ xử lý không được hỗ trợ đối với các gói thuê bao.

Bản phát hành này cũng giới thiệu một loại thông báo mới theo thời gian thực dành cho nhà phát triển OneTimeProductNotification. Loại thông báo này chứa một thông điệp duy nhất có giá trị là ONE_TIME_PRODUCT_PURCHASED hoặc ONE_TIME_PRODUCT_CANCELED. Loại thông báo này chỉ được gửi cho các giao dịch mua có liên quan đến các phương thức thanh toán bị trì hoãn, chẳng hạn như thanh toán bằng tiền mặt.

Khi xác nhận giao dịch mua hàng đang chờ xử lý, chỉ xác nhận khi trạng thái mua là PURCHASED chứ không phải là PENDING.

Nội dung thay đổi đối với API

Thư viện Google Play Billing phiên bản 2.0 có chứa một số nội dung thay đổi đối với API để hỗ trợ các tính năng mới và làm rõ chức năng hiện có.

consumeAsync

consumeAsync() hiện sẽ lấy đối tượng ConsumeParams thay vì đối tượng purchaseToken. ConsumeParams chứa purchaseToken cũng như một trọng tải không bắt buộc dành cho nhà phát triển.

Phiên bản trước của consumeAsync() đã bị xoá trong bản phát hành này.

queryPurchaseHistoryAsync

Để giảm thiểu nhầm lẫn, hàm queryPurchaseHistoryAsync() hiện sẽ trả về đối tượng PurchaseHistoryRecord thay vì đối tượng Purchase. Đối tượng PurchaseHistoryRecord giống với đối tượng Purchase, ngoại trừ việc đối tượng này chỉ phản ánh các giá trị mà hàm queryPurchaseHistoryAsync() trả về và không chứa các trường autoRenewing, orderIdpackageName. Lưu ý rằng dữ liệu được trả về không thay đổi – hàm queryPurchaseHistoryAsync() sẽ trả về cùng một dữ liệu như trước đây.

Các giá trị trả về BillingResult

Các API trước đây đã trả về một giá trị số nguyên BillingResponse, giờ đây sẽ trả về đối tượng BillingResult. BillingResult chứa số nguyên BillingResponse cũng như một chuỗi gỡ lỗi mà bạn có thể dùng để chẩn đoán lỗi. Chuỗi gỡ lỗi sử dụng ngôn ngữ en-US và không hiển thị cho người dùng cuối.

Bản sửa lỗi

Bản phát hành Thư viện Google Play Billing phiên bản 1.2.2 (07/03/2019)

Thư viện Google Play Billing phiên bản 1.2.2 hiện đã có. Phiên bản này có nội dung thay đổi sau.

Bản sửa lỗi

  • Khắc phục sự cố luồng xuất hiện trong phiên bản 1.2.1. Lệnh gọi trên nền không còn chặn luồng chính.

Nội dung thay đổi khác

  • Mặc dù bạn vẫn nên sử dụng luồng chính, tuy nhiên giờ đây, bạn có thể tạo thực thể cho Thư viện Google Play Billing từ luồng ở chế độ nền.
  • Quá trình tạo bản sao đã được chuyển hoàn toàn sang luồng nền để giảm khả năng gây ra lỗi ANR.

Bản phát hành Thư viện Play Billing phiên bản 1.2.1 (04/03/2019)

Thư viện Google Play Billing phiên bản 1.2.1 hiện đã có. Phiên bản này có nội dung thay đổi sau.

Nội dung thay đổi chính

Nội dung thay đổi khác

  • Thêm các hàm khởi tạo công khai cho PurchasesResultSkuDetailsResult để kiểm thử dễ dàng hơn.
  • Các đối tượng SkuDetails có thể dùng một phương thức mới là getOriginalJson().
  • Tất cả lệnh gọi dịch vụ AIDL hiện được các luồng nền xử lý.

Bản sửa lỗi

  • Trình nghe gọi lại rỗng không còn được truyền vào API công khai.

Bản phát hành Thư viện Google Play Billing phiên bản 1.2 (18/10/2018)

Hiện đã có phiên bản 1.2 của thư viện Google Play Billing. Phiên bản này có nội dung thay đổi sau.

Tóm tắt nội dung thay đổi

  • Thư viện Google Play Billing hiện đã được cấp phép theo Thoả thuận cấp phép cho bộ phát triển phần mềm Android.
  • Đã thêm API launchPriceChangeConfirmationFlow để nhắc người dùng xem lại nội dung thay đổi đang chờ xử lý đối với giá gói đăng ký.
  • Đã thêm tuỳ chọn hỗ trợ cho chế độ chia theo tỷ lệ mới DEFERRED khi nâng cấp hoặc hạ cấp gói thuê bao của người dùng.
  • Trong lớp BillingFlowParams, đã thay thế setSku() bằng setSkuDetails().
  • Các bản sửa lỗi nhỏ và tối ưu hoá mã.

Xác nhận việc thay đổi giá

Bây giờ, bạn có thể thay đổi giá của gói thuê bao trong Google Play Console và nhắc người dùng xem lại và chấp nhận mức giá mới khi họ truy cập vào ứng dụng.

Để sử dụng API này, hãy tạo đối tượng PriceChangeFlowParams bằng cách sử dụng skuDetails của sản phẩm thuê bao, sau đó gọi hàm launchPriceChangeConfirmationFlow(). Triển khai PriceChangeConfirmationListener để xử lý kết quả khi quy trình xác nhận việc thay đổi giá hoàn tất như được hiển thị trong đoạn mã sau:

Kotlin

val priceChangeFlowParams = PriceChangeFlowParams.newBuilder()
    .setSkuDetails(skuDetailsOfThePriceChangedSubscription)
    .build()

billingClient.launchPriceChangeConfirmationFlow(activity,
        priceChangeFlowParams,
        object : PriceChangeConfirmationListener() {
            override fun onPriceChangeConfirmationResult(responseCode: Int) {
                // Handle the result.
            }
        })

Java

PriceChangeFlowParams priceChangeFlowParams =
        PriceChangeFlowParams.newBuilder()
    .setSkuDetails(skuDetailsOfThePriceChangedSubscription)
    .build();

billingClient.launchPriceChangeConfirmationFlow(activity,
        priceChangeFlowParams,
        new PriceChangeConfirmationListener() {
            @Override
            public void onPriceChangeConfirmationResult(int responseCode) {
                // Handle the result.
            }
        });

Quy trình xác nhận thay đổi giá sẽ hiển thị hộp thoại chứa thông tin về giá mới và yêu cầu người dùng chấp nhận giá mới. Quy trình này sẽ trả về một mã phản hồi thuộc loại BillingClient.BillingResponse.

Chế độ chia theo tỷ lệ mới

Khi nâng cấp hoặc hạ cấp gói thuê bao của người dùng, bạn có thể sử dụng chế độ chia theo tỷ lệ mới là DEFERRED. Chế độ này sẽ cập nhật gói thuê bao của người dùng vào lần gia hạn tiếp theo. Để tìm hiểu thêm về cách thiết lập chế độ chia tỷ lệ này, hãy xem phần Thiết lập chế độ chia theo tỷ lệ.

Phương thức mới để thiết lập thông tin chi tiết về SKU

Trong lớp BillingFlowParams, phương thức setSku() không còn được dùng. Thay đổi này nhằm tối ưu hoá quy trình Google Play Billing.

Khi tạo một thực thể mới của BillingFlowParams tại phần thanh toán trong ứng dụng, bạn nên làm việc trực tiếp với đối tượng JSON bằng cách sử dụng hàm setSkuDetails(), như minh hoạ trong đoạn mã sau đây:

Trong lớp Builder BillingFlowParams, phương thức setSku() không còn được dùng. Thay vào đó, hãy sử dụng phương thức setSkuDetails(), như minh hoạ trong đoạn mã sau đây. Đối tượng được truyền vào đối tượng setSkuDetails() từ phương thức querySkuDetailsAsync().

Kotlin

private lateinit var mBillingClient: BillingClient
private val mSkuDetailsMap = HashMap<String, SkuDetails>()

private fun querySkuDetails() {
    val skuDetailsParamsBuilder = SkuDetailsParams.newBuilder()
    mBillingClient.querySkuDetailsAsync(skuDetailsParamsBuilder.build()
    ) { responseCode, skuDetailsList ->
        if (responseCode == 0) {
            for (skuDetails in skuDetailsList) {
                mSkuDetailsMap[skuDetails.sku] = skuDetails
            }
        }
    }
}

private fun startPurchase(skuId: String) {
    val billingFlowParams = BillingFlowParams.newBuilder()
    .setSkuDetails(mSkuDetailsMap[skuId])
    .build()
}

Java

private BillingClient mBillingClient;
private Map<String, SkuDetails> mSkuDetailsMap = new HashMap<>();

private void querySkuDetails() {
    SkuDetailsParams.Builder skuDetailsParamsBuilder
            = SkuDetailsParams.newBuilder();
    mBillingClient.querySkuDetailsAsync(skuDetailsParamsBuilder.build(),
            new SkuDetailsResponseListener() {
                @Override
                public void onSkuDetailsResponse(int responseCode,
                        List<SkuDetails> skuDetailsList) {
                    if (responseCode == 0) {
                        for (SkuDetails skuDetails : skuDetailsList) {
                            mSkuDetailsMap.put(skuDetails.getSku(), skuDetails);
                        }
                    }
                }
            });
}

private void startPurchase(String skuId) {
    BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder()
            .setSkuDetails(mSkuDetailsMap.get(skuId))
            .build();
}

Bản phát hành Play Library 1.1 (07/05/2018)

Thư viện Google Play Billing phiên bản 1.1 hiện đã có. Phiên bản này có nội dung thay đổi sau.

Tóm tắt nội dung thay đổi

  • Đã thêm chức năng hỗ trợ để chỉ định một chế độ phân phối trong BillingFlowParams khi nâng cấp/hạ cấp một gói thuê bao hiện có.
  • Không còn hỗ trợ cờ boolean replaceSkusProration trong BillingFlowParams. Thay vào đó, hãy sử dụng replaceSkusProrationMode.
  • Hàm launchBillingFlow() giờ đây kích hoạt lệnh gọi lại khi có phản hồi không thành công.

Thay đổi về hành vi

Thư viện Google Play Billing phiên bản 1.1 có nội dung thay đổi sau đây về hành vi.

Nhà phát triển có thể thiết lập replaceSkusProrationMode trong lớp BillingFlowParams

ProrationMode cung cấp thêm thông tin chi tiết về việc chia theo tỷ lệ khi nâng cấp hoặc hạ cấp gói thuê bao của người dùng.

Kotlin

BillingFlowParams.newBuilder()
    .setSku(skuId)
    .setType(billingType)
    .setOldSku(oldSku)
    .setReplaceSkusProrationMode(replaceSkusProrationMode)
    .build()

Java

BillingFlowParams.newBuilder()
    .setSku(skuId)
    .setType(billingType)
    .setOldSku(oldSku)
    .setReplaceSkusProrationMode(replaceSkusProrationMode)
    .build();

Hiện tại, Google Play hỗ trợ những chế độ theo tỷ lệ sau:

IMMEDIATE_WITH_TIME_PRORATION Việc thay thế sẽ có hiệu lực ngay lập tức và thời gian hết hạn mới sẽ được tính theo tỷ lệ, ghi có hoặc tính phí cho người dùng. Đây là hành vi mặc định hiện tại.
IMMEDIATE_AND_CHARGE_PRORATED_PRICE Việc thay thế sẽ có hiệu lực ngay lập tức và chu kỳ thanh toán vẫn giữ nguyên. Giá trong khoảng thời gian còn lại sẽ được tính.

Lưu ý: Bạn chỉ có thể dùng tuỳ chọn này để nâng cấp gói thuê bao.

IMMEDIATE_WITHOUT_PRORATION Việc thay thế sẽ có hiệu lực ngay lập tức và mức giá mới sẽ được tính vào lần tiếp theo. Chu kỳ thanh toán vẫn giữ nguyên.

replaceSkusProration không còn được hỗ trợ trong lớp BillingFlowParams

Trước đây nhà phát triển có thể thiết lập một cờ boolean để tính phí số tiền theo tỷ lệ đối với một yêu cầu nâng cấp gói thuê bao. Đó là bởi chúng tôi đang hỗ trợ ProrationMode có chứa hướng dẫn chi tiết hơn về việc chia tỷ lệ, bởi vậy nên cờ boolean này không còn được hỗ trợ nữa.

Giờ đây, hàm launchBillingFlow() sẽ kích hoạt lệnh gọi lại khi có phản hồi không thành công

Thư viện Billing sẽ luôn kích hoạt lệnh gọi lại PurhcasesUpdatedListener và trả về một BillingResponse một cách không đồng bộ. Giá trị trả về đồng bộ của BillingResponse cũng được giữ lại.

Bản sửa lỗi

  • Thoát sớm và đúng cách trong các phương thức không đồng bộ khi dịch vụ bị ngắt kết nối.
  • Các đối tượng tham số Builder không làm biến đổi các đối tượng đã tạo.
  • Vấn đề 68087141: hàm launchBillingFlow() hiện kích hoạt lệnh gọi lại cho phản hồi không thành công.

Bản phát hành Thư viện Google Play Billing phiên bản 1.0 (19/09/2017, Thông báo)

Thư viện Google Play Billing phiên bản 1.0 hiện đã có. Phiên bản này có nội dung thay đổi sau.

Thay đổi quan trọng:

  • Đã nhúng quyền thanh toán bên trong tệp kê khai của thư viện. Bạn không cần thêm quyền com.android.vending.BILLING vào tệp kê khai Android nữa.
  • Đã thêm trình tạo mới vào lớp BillingClient.Builder.
  • Mẫu trình dựng được giới thiệu cho lớp SkuDetailsParams sẽ được sử dụng trong phương thức để truy vấn SKU.
  • Một số phương thức API đã được cập nhật để đảm bảo tính nhất quán (cùng tên của đối số trả về và thứ tự).

Thay đổi về hành vi

Thư viện Google Play Billing phiên bản 1.0 có nội dung thay đổi sau đây về hành vi.

Lớp BillingClient.Builder

BillingClient.Builder hiện đã được khởi chạy thông qua mẫu newBuilder:

Kotlin

billingClient = BillingClient.newBuilder(context).setListener(this).build()

Java

billingClient = BillingClient.newBuilder(context).setListener(this).build();

Phương thức launchBillingFlow giờ đây được gọi bằng lớp BillingFlowParams

Để bắt đầu quy trình thanh toán cho giao dịch mua hàng hoặc gói thuê bao, phương thức launchBillingFlow() sẽ nhận được một bản sao BillingFlowParams được khởi chạy với các thông số dành riêng cho yêu cầu:

Kotlin

BillingFlowParams.newBuilder().setSku(skuId)
        .setType(billingType)
        .setOldSku(oldSku)
        .build()

// Then, use the BillingFlowParams to start the purchase flow
val responseCode = billingClient.launchBillingFlow(builder.build())

Java

BillingFlowParams.newBuilder().setSku(skuId)
                              .setType(billingType)
                              .setOldSku(oldSku)
                              .build();

// Then, use the BillingFlowParams to start the purchase flow
int responseCode = billingClient.launchBillingFlow(builder.build());

Phương pháp mới để truy vấn các sản phẩm có sẵn

Đối số cho các phương thức queryPurchaseHistoryAsync()querySkuDetailsAsync() được gói thành mẫu Bản dựng:

Kotlin

val params = SkuDetailsParams.newBuilder()
params.setSkusList(skuList)
        .setType(itemType)
billingClient.querySkuDetailsAsync(params.build(), object : SkuDetailsResponseListener() {
    ...
})

Java

SkuDetailsParams.Builder params = SkuDetailsParams.newBuilder();
params.setSkusList(skuList)
        .setType(itemType);
billingClient.querySkuDetailsAsync(params.build(), new SkuDetailsResponseListener() {...})

Kết quả hiện được trả về thông qua mã kết quả và một danh sách các đối tượng SkuDetails thay vì lớp trình bao bọc trước đó để thuận tiện cho bạn, đồng thời nhất quán trên API của chúng tôi:

Kotlin

fun onSkuDetailsResponse(@BillingResponse responseCode: Int, skuDetailsList: List<SkuDetails>)

Java

public void onSkuDetailsResponse(@BillingResponse int responseCode, List<SkuDetails> skuDetailsList)

Đã thay đổi thứ tự thông số trên phương thức onConsumeResponse()

Thứ tự của các đối số onConsumeResponse từ giao diện ConsumeResponseListener đã thay đổi để nhất quán trên API của chúng tôi:

Kotlin

fun onConsumeResponse(@BillingResponse responseCode: Int, outToken: String)

Java

public void onConsumeResponse(@BillingResponse int responseCode, String outToken)

Đã mở gói đối tượng PurchaseResult

PurchaseResult đã được mở gói để nhất quán trên API của chúng tôi:

Kotlin

fun onPurchaseHistoryResponse(@BillingResponse responseCode: Int, purchasesList: List<Purchase>)

Java

void onPurchaseHistoryResponse(@BillingResponse int responseCode, List<Purchase> purchasesList)

Bản sửa lỗi

Bản phát hành Bản dùng thử cho nhà phát triển 1 (12/06/2017, Thông báo)

Đã phát hành bản dùng thử cho nhà phát triển nhằm đơn giản hoá quá trình phát triển liên quan đến việc thanh toán, cho phép các nhà phát triển tập trung vào việc triển khai logic dành riêng cho ứng dụng Android, chẳng hạn như cấu trúc ứng dụng và cấu trúc điều hướng.

Thư viện này bao gồm một vài lớp và tính năng tiện lợi để bạn sử dụng khi tích hợp các ứng dụng Android với API Google Play Billing. Thư viện cũng cung cấp lớp trừu tượng bên trên dịch vụ Ngôn ngữ định nghĩa giao diện Android (AIDL), giúp nhà phát triển dễ dàng xác định giao diện giữa ứng dụng và API Google Play Billing.