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

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 6.1.0 (14/11/2023)

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

Tóm tắt các thay đổi

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

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

Tóm tắt các thay đổi

Cập nhật Thư viện Play Billing để tương thích với Android 14.

Bản phát hành Thư viện Google Play Billing phiên bản 6.0 (10/5/2023)

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

Tóm tắt các thay đổi

  • Thêm enum ReplacementMode mới thay cho ProrationMode.

    Xin lưu ý rằng ProrationMode vẫn hoạt động vì lý do tương thích ngược.

  • Xoá mã đơn hàng đối với các giao dịch mua PENDING.

    Trước đây, mã đơn hàng sẽ luôn được tạo ngay cả khi giao dịch mua đang chờ xử lý. Kể từ phiên bản 6.0.0, mã đơn hàng sẽ không được tạo cho các giao dịch mua đang chờ xử lý. Đối với các giao dịch mua hàng này, mã đơn hàng sẽ được điền sau khi giao dịch mua chuyển sang trạng thái PURCHASED.

  • Xoá các phương thức queryPurchaseslaunchPriceConfirmationFlow.

    Các phương thức queryPurchaseslaunchPriceConfirmationFlow trước đây được đánh dấu là không dùng nữa, giờ đã bị xoá trong Thư viện Play Billing 6.0.0. Nhà phát triển nên dùng queryPurchasesAsync thay vì queryPurchases. Để biết các lựa chọn thay thế launchPriceConfirmationFlow, hãy xem bài viết Các thay đổi về giá.

  • Thêm mã phản hồi mới đối với lỗi mạng.

    NETWORK_ERROR là mã phản hồi mới cho lỗi mạng, được thêm kể từ phiên bản PBL 6.0.0. Mã này được trả về khi xảy ra lỗi do sự cố kết nối mạng. Trước đây, các lỗi kết nối mạng được báo cáo là SERVICE_UNAVAILABLE.

  • Cập nhật SERVICE_UNAVAILABLESERVICE_TIMEOUT.

    Kể từ PBL phiên bản 6.0.0, các lỗi do hết thời gian chờ trong quá trình xử lý sẽ được trả về là SERVICE_UNAVAILABLE thay vì SERVICE_TIMEOUT như hiện tại.

    Hành vi này không thay đổi trong các phiên bản PBL trước đây.

  • Xoá SERVICE_TIMEOUT.

    Kể từ phiên bản PBL 6.0.0, SERVICE_TIMEOUT sẽ không được trả về nữa. Các phiên bản PBL trước đó sẽ vẫn trả về mã này.

  • Thêm tính năng ghi nhật ký bổ sung.

    Bản phát hành Thư viện Play Billing 6 có tính năng ghi nhật ký bổ sung, giúp cung cấp thông tin chi tiết về hoạt động sử dụng API (chẳng hạn như thành công và không thành công) cũng như các vấn đề về kết nối dịch vụ. Thông tin này sẽ dùng để cải thiện hiệu suất của Thư viện Play Billing và hỗ trợ tốt hơn cho các lỗi.

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

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

Tóm tắt các thay đổi

Cập nhật Thư viện Play Billing để tương thích với Android 14.

Bản phát hành Thư viện Google Play Billing phiên bản 5.2 (6/4/2023)

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

Tóm tắt các thay đổi

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 các 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 các 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 hoá.
  • Xoá queryPurchases(), vốn đã không dùng nữa và được thay thế bằng queryPurchasesAsync kể từ phiên bản 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 Khởi chạy quy trình xác nhận thay đổi giá.
  • Xoá setVrPurchaseFlow(), trước đây được dùng để thực thể hoá 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 các 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 các 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.

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 "Already resumed" ("Đã 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.

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 các thay đổi

  • Đã ngừng hỗ trợ SKU thưởng.
  • Đã xoá các tham 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ề tính chất rỗng.

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 tham số bổ sung ngay cả khi không có tham 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.

Sửa lỗi

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

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 các 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 các 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ó.

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.

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.

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.

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ý.

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 các 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 các 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.

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)

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.