Gói thuê bao có tiện ích bổ sung

Gói thuê bao có tiện ích bổ sung cho phép bạn kết hợp nhiều sản phẩm thuê bao với nhau để có thể mua, thanh toán và quản lý cùng một lúc. Bạn có thể cung cấp liền mạch các gói thuê bao danh mục sản phẩm hiện có dưới dạng tiện ích bổ sung mà không cần bất kỳ thông số kỹ thuật trước hoặc cấu hình bổ sung nào. Bạn có thể chạy quy trình mua hàng với nhiều sản phẩm thuê bao hiện có và bán các sản phẩm đó dưới dạng sản phẩm bổ sung.

Những yếu tố nên cân nhắc

Hãy cân nhắc những điểm sau đây khi sử dụng tính năng gói thuê bao có tiện ích bổ sung:

  • Gói thuê bao có tiện ích bổ sung chỉ được hỗ trợ cho các gói cơ bản tự động gia hạn.

  • Tất cả các mặt hàng trong giao dịch mua phải có cùng một kỳ thanh toán định kỳ. Ví dụ: bạn không thể có gói thuê bao thanh toán hằng năm với các tiện ích bổ sung thanh toán hằng tháng.

  • Bạn có thể mua tối đa 50 mặt hàng trong một gói thuê bao có mặt hàng bổ sung.

  • Tính năng này không dùng được ở khu vực Ấn Độ (IN) và Hàn Quốc (KR).

Tích hợp với Thư viện Play Billing

Phần này mô tả cách tích hợp tính năng thuê bao với tiện ích bổ sung bằng Thư viện Play Billing (PBL). Bài viết này giả định rằng bạn đã quen thuộc với các bước tích hợp PBL ban đầu, chẳng hạn như thêm phần phụ thuộc PBL vào ứng dụng, khởi chạy BillingClientkết nối với Google Play. Phần này tập trung vào các khía cạnh tích hợp PBL dành riêng cho gói thuê bao có gói bổ sung.

Bắt đầu quy trình mua

Để bắt đầu quy trình mua gói thuê bao có tiện ích bổ sung, hãy làm theo các bước sau:

  1. Truy xuất tất cả các mục thuê bao bằng cách sử dụng phương thức BillingClient.queryProductDetailsAsync.

  2. Đặt đối tượng ProductDetailsParams cho từng mục.

    Mục do đối tượng ProductDetailsParams biểu thị, chỉ định cả ProductDetails cho biết mục thuê bao và offerToken chọn một gói thuê bao cụ thể base plan hoặc offer.

  3. Chỉ định thông tin chi tiết về mặt hàng trong phương thức BillingFlowParams.Builder.setProductDetailsParamsList. Lớp BillingFlowParams chỉ định thông tin chi tiết về quy trình mua hàng.

    Mẫu sau đây cho biết cách chạy quy trình thanh toán cho giao dịch mua gói thuê bao có nhiều mặt hàng:

    Java

       BillingClient billingClient = ;
    
        // ProductDetails obtained from queryProductDetailsAsync().
        ProductDetailsParams productDetails1 = ...;
        ProductDetailsParams productDetails2 = ...;
        ArrayList productDetailsList = new ArrayList<>();
        productDetailsList.add(productDetails1);
        productDetailsList.add(productDetails2);
    
        BillingFlowParams billingFlowParams =
            BillingFlowParams.newBuilder()
               .setProductDetailsParamsList(productDetailsList)
               .build();
        billingClient.launchBillingFlow(billingFlowParams);

Quy tắc áp dụng cho các mặt hàng trong giao dịch mua

  • Để đảm bảo ngày gia hạn gói bổ sung cuối cùng khớp với ngày gia hạn của mặt hàng cơ bản, Google Play có thể chèn khoản phí theo tỷ lệ sau mọi giai đoạn dùng thử hoặc giá ưu đãi.
  • Điều kiện áp dụng ưu đãi sẽ được đánh giá riêng cho từng mặt hàng.

Xử lý giao dịch mua

Quy trình xử lý gói thuê bao có tiện ích bổ sung cũng giống như quy trình xử lý giao dịch mua một mặt hàng như mô tả trong phần Tích hợp Thư viện Google Play Billing vào ứng dụng. Điểm khác biệt duy nhất là người dùng có thể nhận được nhiều quyền trong một giao dịch mua. Một giao dịch mua gói thuê bao có tiện ích bổ sung sẽ trả về nhiều mặt hàng có thể được truy xuất bằng Purchase.getProducts() trong Thư viện Google Play Billing, sau đó là danh sách lineItems trong purchases.subscriptionsv2.get của API Nhà phát triển Google Play.

Sửa đổi gói thuê bao bằng tiện ích bổ sung

Mọi thay đổi đối với gói thuê bao có tiện ích bổ sung đều dẫn đến việc nâng cấp hoặc hạ cấp. Để biết thêm thông tin, hãy xem phần nâng cấp hoặc hạ cấp gói thuê bao.

Để thay đổi hoặc khôi phục giao dịch mua gói thuê bao hiện có kèm theo tiện ích bổ sung trong ứng dụng, bạn phải gọi API launchBillingFlow kèm theo các tham số bổ sung và đảm bảo những điều sau:

  • Luôn gọi setOldPurchaseToken bằng mã thông báo giao dịch mua của giao dịch mua gói thuê bao hiện tại.
  • Để nâng cấp, hạ cấp hoặc chuyển cấp mặt hàng cơ bản, hãy gọi setSubscriptionReplacementMode để chỉ định cách xử lý thay đổi gói giữa các mặt hàng cơ bản của gói cũ và giao dịch mua gói thuê bao mới có tiện ích bổ sung. Nếu không, bạn không cần đặt tham số này.
  • Khi mục cơ sở không thay đổi, bạn vẫn có thể gọi setSubscriptionReplacementMode để áp dụng một hành vi chia theo tỷ lệ cụ thể. Để biết các quy tắc áp dụng trong trường hợp này, hãy xem bài viết Đăng ký lại hoặc chuyển đổi gói trong cùng một gói thuê bao.
  • Các tiện ích bổ sung mới sẽ được áp dụng ngay lập tức với mức phí tính theo tỷ lệ để điều chỉnh ngày gia hạn tiếp theo cho phù hợp với mặt hàng cơ bản trong gói thuê bao.
  • Các tiện ích bổ sung đã bị xoá sẽ hết hạn vào cuối kỳ thanh toán hiện tại.
  • Khi chạy quy trình thanh toán, bạn cần chỉ định tất cả các mục đang hoạt động trong gói thuê bao có các tiện ích bổ sung, ngoại trừ các mục sẽ bị xoá, cùng với mọi tiện ích bổ sung mới.

Mẫu sau đây cho biết cách gọi API launchBillingFlow khi thay đổi giao dịch mua gói thuê bao hiện có bằng các tiện ích bổ sung:

Java

BillingClient billingClient = ;

int replacementMode =;

// ProductDetails obtained from queryProductDetailsAsync().
ProductDetailsParams productDetails1 = ...;
ProductDetailsParams productDetails2 = ...;
ProductDetailsParams productDetails3 = ...;

ArrayList newProductDetailsList = new ArrayList<>();
newProductDetailsList.add(productDetails1);
newProductDetailsList.add(productDetails1);
newProductDetailsList.add(productDetails1);

BillingFlowParams billingFlowParams =
    BillingFlowParams.newBuilder()
        .setSubscriptionUpdateParams(
          SubscriptionUpdateParams.newBuilder()
              .setOldPurchaseToken(purchaseTokenOfExistingSubscription)
              // No need to set if change does not affect the base item.
             .setSubscriptionReplacementMode(replacementMode)
             .build())
        .setProductDetailsParamsList(productDetailsList)
        .build();

billingClient.launchBillingFlow(billingFlowParams);

Tình huống sửa đổi gói thuê bao

Bảng sau đây liệt kê các tình huống sửa đổi khác nhau cho gói thuê bao có tiện ích bổ sung và hành vi tương ứng.

Mục hiện có Các mục đã sửa đổi Bạn có cần đặt chế độ thay thế không? Hành vi
A (mặt hàng cơ sở), B A (mục cơ sở) Không Mục B được lên lịch gỡ bỏ sau.
A A (mặt hàng cơ sở), B Không Mục B được thêm ngay lập tức với mức phí tính theo tỷ lệ.
A (mặt hàng cơ sở), B A (mục cơ sở), C Không
  • B đã được lên lịch gỡ bỏ sau này.
  • C được thêm ngay lập tức với mức phí tính theo tỷ lệ.
A (mặt hàng cơ sở), B B (mặt hàng cơ sở) Không A được lên lịch gỡ bỏ sau.
A (mặt hàng cơ sở), B C (mặt hàng cơ sở)
A (mặt hàng cơ sở), B C (mục cơ sở), B Việc thay thế A -> C phụ thuộc vào setSubscriptionReplacementMode.
A (mặt hàng cơ sở), B C (mục cơ sở), D
  • Việc thay thế A -> C phụ thuộc vào setSubscriptionReplacementMode.
  • B đã được lên lịch gỡ bỏ sau này.
  • D được thêm ngay lập tức với mức phí tính theo tỷ lệ.

Thông báo theo thời gian thực dành cho nhà phát triển

Trường subscriptionId không được cung cấp trong RTDN cho các giao dịch mua gói thuê bao có tiện ích bổ sung, trong đó có nhiều quyền đối với mặt hàng. Thay vào đó, bạn có thể sử dụng API Nhà phát triển Play để nhận giao dịch mua và xem các quyền đối với mặt hàng được liên kết.

Thay đổi giá đối với người đăng ký hiện có

Việc thay đổi giá gói thuê bao cho người đăng ký hiện tại của một gói thuê bao có giao dịch mua tiện ích bổ sung cũng tương tự như việc thay đổi giá gói thuê bao của gói thuê bao có một mặt hàng như mô tả trong phần Thay đổi giá gói thuê bao. Tuy nhiên, có một số giới hạn và điểm khác biệt về chức năng như mô tả trong phần này.

Chấm dứt một nhóm thuần tập theo giá cũ

Việc chấm dứt một nhóm thuần tập cũ cũng ảnh hưởng đến gói thuê bao có giao dịch mua tiện ích bổ sung. Các quy tắc sau đây được áp dụng:

  • Tất cả các yêu cầu tăng giá theo lựa chọn đồng ý hiện có phải có cùng thời gian gia hạn với giá mới. Nếu một mặt hàng trong giao dịch mua gói thuê bao có mặt hàng bổ sung có mức tăng giá cần có sự đồng ý mà người dùng chưa xác nhận, thì mọi mức tăng giá cần có sự đồng ý mới cho các mặt hàng khác trong giao dịch mua sẽ bị bỏ qua, trừ phi thời gian gia hạn áp dụng giá mới giống với thời gian gia hạn áp dụng mức tăng giá hiện tại ở trạng thái CHƯA XỬ LÝ. Sau khi người dùng xác nhận việc tăng giá, mọi thay đổi về giá mới hơn sẽ được đăng ký. Ngoài ra, người dùng chỉ có thể chấp nhận tất cả các lần tăng giá cần có sự đồng ý chưa được xác nhận cùng một lúc.

    Ví dụ:

    • Hãy xem xét một gói thuê bao có các tiện ích bổ sung (mặt hàng A và B), gia hạn vào ngày 7 hằng tháng.
    • Mặt hàng A đang trong quá trình thay đổi giá từ 7 USD lên 10 USD và dự kiến sẽ áp dụng mức giá mới từ ngày 7 tháng 7.
    • Mức giá mới sẽ bắt đầu được áp dụng cho mặt hàng B từ ngày 2 tháng 6, tăng từ 5 USD lên 6 USD. Vì việc tăng giá không cần có sự đồng ý bắt đầu 37 ngày sau khi di chuyển, nên thời điểm tăng giá sớm nhất cho mặt hàng B sẽ là ngày 7 tháng 8.

    Trong trường hợp này, cho đến khi người dùng chấp nhận thay đổi giá cho mục A (cho đến khi mục này ở trạng thái CONFIRMED), thay đổi giá cho mục B sẽ không được đăng ký cho giao dịch mua gói thuê bao này và SubscriptionPurchaseV2 sẽ không trả về thông tin chi tiết về thay đổi giá cho mục B. Sau khi người dùng xác nhận thay đổi giá của mặt hàng A, quá trình thay đổi giá của mặt hàng B sẽ bắt đầu. Người dùng chỉ nhận được mức tăng giá cần có sự đồng ý cho mặt hàng B sau khi chấp nhận mức tăng giá cần có sự đồng ý cho mặt hàng A.

  • Email của Google Play chứa danh sách tất cả các mặt hàng có mức giá tăng hoặc giảm có hiệu lực vào cùng một ngày.

Huỷ gói thuê bao có tiện ích bổ sung

Người dùng có thể huỷ toàn bộ giao dịch mua gói thuê bao có tiện ích bổ sung trên Trung tâm đăng ký của Play. Còn bạn chỉ có thể huỷ toàn bộ giao dịch mua gói thuê bao có tiện ích bổ sung bằng cách sử dụng API Nhà phát triển Google Play.

Khi một giao dịch mua gói thuê bao bị huỷ mà không bị thu hồi, thì không có mục nào trong giao dịch mua đó sẽ tự động gia hạn, nhưng người dùng sẽ tiếp tục có quyền truy cập vào các mục đủ điều kiện cho đến khi kết thúc kỳ thanh toán tương ứng.

Thu hồi và hoàn tiền cho các gói thuê bao có tiện ích bổ sung

Sau đây là một số nguyên tắc về việc thu hồi và hoàn tiền cho gói thuê bao:

  • Sử dụng Play Console để hoàn tiền theo số tiền cho một Đơn đặt hàng cụ thể mà không thu hồi quyền truy cập vào gói thuê bao.

  • Gọi orders.refund để hoàn lại toàn bộ các khoản thanh toán cụ thể cho gói thuê bao mà người dùng đã thực hiện mà không thu hồi quyền truy cập vào gói thuê bao đó.

  • Gọi purchases.subscriptionsv2.revoke để thu hồi ngay quyền truy cập vào tất cả các mục thuê bao. Với API này, bạn có thể:

    • Thu hồi quyền truy cập vào tất cả các mặt hàng và hoàn tiền theo tỷ lệ.

    • Khi thu hồi một gói thuê bao có các tiện ích bổ sung bằng cách hoàn tiền theo tỷ lệ, hệ thống sẽ hoàn tiền cho đơn đặt hàng mới nhất của từng mặt hàng theo tỷ lệ dựa trên thời gian còn lại cho đến lần gia hạn tiếp theo.

    • Thu hồi quyền truy cập cho tất cả các mặt hàng và cung cấp FullRefund (Hoàn tiền toàn bộ).

    • Thu hồi quyền truy cập của từng mục kèm theo việc hoàn tiền toàn bộ cho mục đó.

Thu hồi từng mục trong gói thuê bao có tiện ích bổ sung

Để thu hồi từng mục thuê bao trong một gói thuê bao có các tiện ích bổ sung mà không thu hồi toàn bộ giao dịch mua, hãy gọi purchases.subscriptionsv2.revoke với trường ItemBasedRefund được đặt trong RevocationContext. Bạn có thể đặt productId của mặt hàng cần thu hồi và hoàn tiền trong trường ItemBasedRefund.

Bạn có thể đặt trường ItemBasedRefund cho các giao dịch mua có một hoặc nhiều mục thuê bao tự động gia hạn.

  • Nếu vẫn còn các mặt hàng đang hoạt động trong giao dịch mua gói thuê bao sau khi thu hồi mặt hàng được chỉ định trong ItemBasedRefund, thì chỉ mặt hàng đó sẽ bị thu hồi và hoàn tiền toàn bộ mà không làm gián đoạn trạng thái gói thuê bao.
  • Nếu không còn mục nào đang hoạt động trong giao dịch mua gói thuê bao sau khi thu hồi mục được chỉ định trong ItemBasedRefund, thì mục đó sẽ bị thu hồi, hoàn tiền toàn bộ và gói thuê bao sẽ bị huỷ.

Những yếu tố nên cân nhắc

  • Khi sử dụng ItemBasedRefund, bạn chỉ có thể thu hồi một mục tại mỗi thời điểm. Bạn có thể gọi yêu cầu nhiều lần nếu cần thu hồi nhiều mục.
  • Khi giao dịch mua gói thuê bao ở bất kỳ trạng thái từ chối thanh toán nào hoặc mục được chỉ định trong ItemBasedRefund không thuộc quyền sở hữu hoặc đã hết hạn, thì thao tác từ chối mục sẽ bị chặn.
  • Không hỗ trợ tính năng từ chối mặt hàng trong gói thuê bao trả trước.

Mặt hàng hết hạn trong khi giao dịch thanh toán bị từ chối

Đối với giao dịch mua gói thuê bao có các tiện ích bổ sung, một số giao dịch gia hạn có thể chỉ cần kéo dài một số quyền của mặt hàng mà không ảnh hưởng đến các mặt hàng có ngày hết hạn trong tương lai.

Bất kể giao dịch gia hạn bao gồm những mặt hàng nào, nếu khoản thanh toán gia hạn bị từ chối, thì giao dịch mua gói thuê bao tổng thể sẽ chuyển sang thời gian ân hạn và tài khoản sẽ bị tạm ngưng như mô tả trong tài liệu sau.

Lựa chọn khoảng thời gian khôi phục

Vì thời gian ân hạn vẫn cấp quyền cho người dùng, nên khi người dùng mua gói thuê bao có các tiện ích bổ sung, giao dịch thanh toán gia hạn sẽ bị từ chối, mục có thời gian ân hạn tối thiểu trong số tất cả các mục đang hoạt động sẽ được chọn và thời gian ân hạn cũng như thời gian tạm ngưng tài khoản sẽ được áp dụng cho lần gia hạn này.

Mục đang hoạt động bao gồm các mục đang hoạt động trong giao dịch mua gói thuê bao có tiện ích bổ sung ngay trước khi bạn thử gia hạn, loại trừ mọi mục mới thêm (sẽ không được cấp quyền cho đến sau khi khôi phục) và loại trừ mọi mục không còn hoạt động do bị xoá hoặc bị từ chối.

Chế độ cài đặt tạm ngưng tài khoản của mục có thời gian gia hạn tối thiểu được chọn sẽ được áp dụng. Nếu có nhiều mặt hàng có thời gian gia hạn tối thiểu, nhưng thời gian tạm ngưng tài khoản khác nhau, thì thời gian tạm ngưng tài khoản dài nhất sẽ được áp dụng.

Thời gian ân hạn

Khi khoản thanh toán gia hạn gói thuê bao bị từ chối, giao dịch mua gói thuê bao sẽ chuyển sang trạng thái thời gian ân hạn. Trong thời gian ân hạn, người dùng sẽ tiếp tục có quyền truy cập vào tất cả các mục đang hoạt động từ kỳ gia hạn trước. Sau thời gian ân hạn, nếu phương thức thanh toán chưa được khắc phục, thì toàn bộ giao dịch mua gói thuê bao sẽ chuyển sang trạng thái tạm ngưng tài khoản. Nếu có mặt hàng nào khác đến ngày gia hạn trong thời gian ân hạn, thì hệ thống sẽ bắt đầu một lần tính phí mới cho các mặt hàng đó sau khi gói thuê bao khôi phục sau khi bị từ chối thanh toán.

Tạm ngưng tài khoản

Trong khi giao dịch mua gói thuê bao đang bị tạm ngưng tài khoản, quyền truy cập vào tất cả các mục trong gói thuê bao sẽ bị tạm ngưng cho đến khi khoản thanh toán được khôi phục.

Nếu gói thuê bao bị tạm ngưng tài khoản được khôi phục, thì giao dịch mua gói thuê bao sẽ tiếp tục như cũ. Nếu gói thuê bao không được khôi phục, thì các mặt hàng bị từ chối thanh toán sẽ hết hạn và quyền truy cập vào các mặt hàng khác sẽ được tiếp tục trong thời gian còn lại của chu kỳ thanh toán.

Ví dụ:

  • Một người dùng có gói thuê bao Gói cơ bản của tôi gia hạn vào ngày 1 hằng tháng, sau đó vào ngày 15 tháng 8, người dùng này thêm một Gói bổ sung với giá 10 USD/tháng và thời gian dùng thử miễn phí 7 ngày. Cả hai mặt hàng này đều không có thời gian ân hạn và đều có thời gian tạm ngưng tài khoản là 30 ngày.

  • Vào ngày 22 tháng 8, người dùng sẽ bị tính phí 2, 9 đô la (10*9/31) theo tỷ lệ phần trăm cho đến ngày 31 tháng 8, nhưng phương thức thanh toán của người dùng sẽ hết hạn trước đó và gói thuê bao sẽ bị từ chối thanh toán vào ngày 22 tháng 8.

Khi gói thuê bao chuyển sang trạng thái tạm ngưng tài khoản do bị từ chối thanh toán, người dùng sẽ không có quyền truy cập vào bất kỳ mục nào trong gói thuê bao có tiện ích bổ sung. Thời gian còn lại của các mục không được gia hạn sẽ được trả lại cho người dùng khi gói thuê bao thoát khỏi trạng thái tạm ngưng tài khoản, do khoản thanh toán đã được khôi phục hoặc bị huỷ.

Trong ví dụ trước, một gói thuê bao chuyển sang trạng thái tạm ngưng tài khoản vào ngày 22 tháng 8.

  • Nếu tài khoản được khôi phục vào ngày 25 tháng 8, trước ngày gia hạn rộng hơn vào ngày 1 tháng 9, thì người dùng sẽ lấy lại quyền truy cập vào cả Gói cơ bản của tôiGói bổ sung vào cùng ngày. Ngày thanh toán tiếp theo được thay đổi thành ngày 4 tháng 9.

  • Nếu tài khoản không được khôi phục sau 30 ngày, thì gói thuê bao sẽ bị huỷ vào ngày 21 tháng 9 và người dùng sẽ mất quyền truy cập vào Gói bổ sung, đồng thời tiếp tục sử dụng Gói cơ bản của tôi cho đến hết ngày 30 tháng 9.

Trong ví dụ này, bạn phải nhận expiryTime đã cập nhật cho TẤT CẢ các mặt hàng trong gói thuê bao có tiện ích bổ sung, vì một số mặt hàng có thể tiếp tục sử dụng quyền sau thời gian ân hạn và tạm ngưng tài khoản.

Báo cáo tài chính và đối chiếu

Sử dụng Báo cáo thu nhập để điều chỉnh các gói thuê bao đang hoạt động với các giao dịch trên Play. Mỗi mục hàng trong giao dịch đều có mã đơn đặt hàng. Khi một giao dịch mua hàng bao gồm nhiều mặt hàng, báo cáo Thu nhập và Doanh số ước tính sẽ bao gồm các hàng riêng biệt cho từng giao dịch, chẳng hạn như khoản phí, lệ phí, thuế và khoản hoàn tiền cho từng mặt hàng liên quan.

Đối với trang tổng quan trong Play Console:

  • Số liệu thống kê về doanh thu được trình bày trong phần Báo cáo tài chính của bảng điều khiển được chia nhỏ theo các mục.

  • Tính năng quản lý đơn đặt hàng phản ánh giao dịch mua gói thuê bao có tiện ích bổ sung và hiển thị danh sách chi tiết về những gì đã mua. Trong phần quản lý đơn đặt hàng, bạn có thể thu hồi, huỷ hoặc hoàn tiền toàn bộ cho giao dịch mua của người dùng.