Lời nhắc
1. Kể từ ngày 2/8/2023, tất cả các ứng dụng mới phải sử dụng Thư viện Billing phiên bản 5 trở lên. Chậm nhất vào ngày 1/11/2023, 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 5 trở lên. Tìm hiểu thêm.
2. Nếu ứng dụng của bạn nhắm đến Android 14 trở lên, bạn phải cập nhật lên PBL 5.2.1 hoặc PBL 6.0.1 trở lên.

Vòng đời giao dịch mua hàng một lần

Các sản phẩm mua một lần có vòng đời đơn giản hơn các sản phẩm thuê bao, nhưng phần phụ trợ của bạn vẫn cần có một số trạng thái và sự kiện chuyển đổi để có thể xử lý đúng cách.

Hình 1 Các trạng thái vòng đời và sự kiện chuyển đổi đối với giao dịch mua hàng một lần.

Giao dịch mới mua sản phẩm tính phí một lần

Sau khi người dùng hoàn tất quy trình thanh toán, ứng dụng của bạn có thể xem thông tin về giao dịch mua mới theo một trong hai cách:

Sau khi nhận được giao dịch mua mới, hãy dùng phương thức getPurchaseState để xác định trạng thái thanh toán của giao dịch mua đó.

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

Chỉ khi ở trạng thái đang chờ xử lý thì các giao dịch mua sản phẩm tính phí một lần mới tạo RTDN. Định dạng của trường data cho loại RTDN này là OneTimeProductNotification. Để cập nhật trạng thái giao dịch mua trong phần phụ trợ, hãy sử dụng mã thông báo giao dịch mua được cung cấp trong đối tượng OneTimeProductNotification để gọi phương thức purchases.products.get. Phương thức này cung cấp trạng thái mua và tiêu thụ mới nhất dựa trên mã thông báo giao dịch mua.

Bạn nên xử lý các RTDN liên quan đến giao dịch trong phần phụ trợ bảo mật của mình.

Xử lý giao dịch đã hoàn tất

Khi người dùng hoàn tất giao dịch mua sản phẩm tính phí một lần đang chờ xử lý, Google Play sẽ gửi thông báo OneTimeProductNotification thuộc loại ONE_TIME_PRODUCT_PURCHASED. Khi bạn nhận được RTDN này, hãy xử lý giao dịch mua như mô tả trong phần Xử lý giao dịch mua sản phẩm tính phí một lần trong phần phụ trợ.

Xử lý giao dịch đã huỷ

Khi một giao dịch mua sản phẩm tính phí một lần đang chờ xử lý bị huỷ, Google Play sẽ gửi thông báo OneTimeProductNotification thuộc loại ONE_TIME_PRODUCT_CANCELED. Ví dụ: điều này có thể xảy ra nếu người dùng không hoàn tất quá trình thanh toán trong khoảng thời gian bắt buộc. Khi máy chủ phụ trợ của bạn nhận được thông báo này, hãy gọi phương thức purchases.products.get để nhận trạng thái mua hàng mới nhất, sau đó cập nhật phần phụ trợ của bạn sao cho phù hợp, bao gồm cả quyền của người dùng.

Bạn chỉ có thể huỷ các giao dịch mua sản phẩm tính phí một lần ở trạng thái Pending. Nếu một giao dịch mua sản phẩm tính phí một lần ở trạng thái Purchased được hoàn tiền, thì bạn sẽ nhận được thông báo qua Voided Purchases API (API Giao dịch mua vô hiệu).

Xử lý các giao dịch mua sản phẩm tính phí một lần trong phần phụ trợ

Dù bạn phát hiện một giao dịch mua mới qua RTDN ONE_TIME_PRODUCT_PURCHASED hay đã được thông báo trong ứng dụng thông qua PurchasesUpdatedListener hoặc tìm nạp thủ công giao dịch mua trong phương thức onResume() của ứng dụng, bạn đều phải xử lý giao dịch mua mới. Bạn nên xử lý quy trình mua hàng trong phần phụ trợ để tăng tính bảo mật.

Thực hiện theo các bước sau để xử lý giao dịch mua hàng một lần mới:

  1. Truy vấn điểm cuối purchases.products.get để nhận trạng thái mới nhất của giao dịch mua sản phẩm tính phí một lần. Để gọi phương thức này cho giao dịch mua, bạn cần có purchaseToken tương ứng từ ứng dụng của mình hoặc từ RTDN ONE_TIME_PRODUCT_PURCHASED.
  2. Gọi getPurchaseState() và đảm bảo trạng thái mua là PURCHASED.
  3. Xác minh giao dịch mua.
  4. Cấp cho người dùng quyền truy cập vào nội dung. Tài khoản người dùng liên kết với giao dịch mua có thể được xác định bằng trường obfuscatedExternalAccountId trong purchases.products.get (nếu bạn đã thiết lập trường này bằng setObfuscatedAccountId() khi giao dịch mua được thực hiện).
    1. Đối với các giao dịch mua sản phẩm không phải sản phẩm tiêu hao, hãy xác nhận việc phân phối nội dung bằng cách gọi phương thức purchases.products.acknowledge. Hãy kiểm tra trường acknowledgementState để đảm bảo giao dịch mua này chưa được xác nhận trước đó.
    2. Nếu sản phẩm là sản phẩm tiêu hao, hãy đánh dấu mặt hàng là đã sử dụng bằng cách gọi phương thức purchases.products.consume để người dùng có thể mua lại mặt hàng đó sau khi tiêu thụ. Phương thức này cũng xác nhận giao dịch mua.

Thư viện Play Billing cũng có các phương thức xác nhận và tiêu thụ giao dịch mua, cho phép bạn xử lý các giao dịch mua hàng trong ứng dụng của mình. Tuy nhiên, bạn nên xử lý trong phần phụ trợ (nếu có) để triển khai một cách an toàn hơn.