Hướng dẫn add a payment method google play năm 2024

Chủ đề này bao gồm các mã ví dụ dựa trên ứng dụng mẫu chính thức trên GitHub. Bạn có thể xem để biết danh sách đầy đủ các ứng dụng mẫu và tài nguyên khác mà bạn có thể dùng trong khi tích hợp.

Vòng đời của một giao dịch mua hàng

Dưới đây là quy trình mua điển hình cho giao dịch mua hàng một lần hoặc một gói thuê bao.

  1. Hiển thị cho người dùng những sản phẩm mà họ có thể mua.
  2. Bắt đầu quy trình mua để người dùng chấp nhận giao dịch mua hàng.
  3. Xác minh giao dịch mua hàng trên máy chủ.
  4. Cung cấp nội dung cho người dùng.
  5. Xác nhận việc phân phối nội dung. Đối với các sản phẩm tiêu dùng, hãy tiến hành giao dịch mua để người dùng có thể mua lại mặt hàng đó.

Các gói thuê bao sẽ tự động gia hạn cho đến khi bị huỷ. Một gói thuê bao có thể trải qua các trạng thái sau:

  • Đang hoạt động: Người dùng hiện ở trạng thái tốt và có quyền truy cập vào gói thuê bao.
  • Đã huỷ: Người dùng đã huỷ nhưng vẫn có quyền truy cập vào gói thuê bao cho đến khi hết hạn.
  • Trong thời gian gia hạn: Người dùng gặp phải một vấn đề thanh toán nhưng vẫn có quyền truy cập trong khi Google đang thử lại phương thức thanh toán.
  • Tạm ngưng: Người dùng gặp phải một vấn đề thanh toán và không còn quyền truy cập trong khi Google đang thử lại phương thức thanh toán.
  • Bị tạm dừng: Người dùng đã tạm dừng quyền truy cập và không có quyền truy cập cho đến khi họ tiếp tục.
  • Đã hết hạn: Người dùng đã huỷ và mất quyền truy cập vào gói thuê bao. Người dùng được coi là rời bỏ ứng dụng khi gói thuê bao hết hạn.

Khởi động kết nối với Google Play

Bước đầu tiên để tích hợp với hệ thống thanh toán của Google Play là thêm Thư viện Google Play Billing vào ứng dụng của bạn và khởi động kết nối.

Thêm phần phụ thuộc Thư viện Google Play Billing

Thêm phần phụ thuộc Thư viện Google Play Billing vào tệp

dependencies {

def billing_version = "6.1.0"
implementation "com.android.billingclient:billing-ktx:$billing_version"
}

5 của ứng dụng như dưới đây:

Groovy

dependencies {

def billing_version = "6.1.0"
implementation "com.android.billingclient:billing:$billing_version"
}

Kotlin

dependencies {

val billing_version = "6.1.0"
implementation("com.android.billingclient:billing:$billing_version")
}

Nếu bạn đang sử dụng Kotlin, mô-đun KTX của Thư viện Google Play Billing chứa các tiện ích và coroutine của Kotlin, cho phép bạn viết mã Kotlin tương thích khi sử dụng Thư viện Google Play Billing. Để đưa các phần mở rộng này vào dự án, hãy thêm phần phụ thuộc sau vào tệp

dependencies {

def billing_version = "6.1.0"
implementation "com.android.billingclient:billing-ktx:$billing_version"
}

5 của ứng dụng như sau:

Groovy

dependencies {

def billing_version = "6.1.0"
implementation "com.android.billingclient:billing-ktx:$billing_version"
}

Kotlin

dependencies {

val billing_version = "6.1.0"
implementation("com.android.billingclient:billing-ktx:$billing_version")
}

Khởi động BillingClient

Sau khi thêm một phần phụ thuộc vào Thư viện Google Play Billing, bạn cần khởi động một bản sao của

dependencies {

def billing_version = "6.1.0"
implementation "com.android.billingclient:billing-ktx:$billing_version"
}

7.

dependencies {

def billing_version = "6.1.0"
implementation "com.android.billingclient:billing-ktx:$billing_version"
}

7 là giao diện chính để giao tiếp giữa Thư viện Google Play Billing và các phần còn lại của ứng dụng.

dependencies {

def billing_version = "6.1.0"
implementation "com.android.billingclient:billing-ktx:$billing_version"
}

7 cung cấp các phương thức thuận tiện (cả đồng bộ và không đồng bộ) cho nhiều hoạt động thanh toán phổ biến. Chúng tôi đặc biệt khuyên bạn mỗi lần chỉ nên có một kết nối

dependencies {

def billing_version = "6.1.0"
implementation "com.android.billingclient:billing-ktx:$billing_version"
}

7 hoạt động để tránh tạo ra nhiều lệnh gọi lại

dependencies {

val billing_version = "6.1.0"
implementation("com.android.billingclient:billing-ktx:$billing_version")
}

1 cho một sự kiện duy nhất.

Để tạo

dependencies {

def billing_version = "6.1.0"
implementation "com.android.billingclient:billing-ktx:$billing_version"
}

7, hãy sử dụng . Bạn có thể truyền bất kỳ ngữ cảnh nào đến hàm

dependencies {

val billing_version = "6.1.0"
implementation("com.android.billingclient:billing-ktx:$billing_version")
}

3, đồng thời

dependencies {

def billing_version = "6.1.0"
implementation "com.android.billingclient:billing-ktx:$billing_version"
}

7 sử dụng hàm này để nhận ngữ cảnh của ứng dụng. Điều đó có nghĩa là bạn không cần lo lắng về việc rò rỉ bộ nhớ. Để nhận thông tin cập nhật về giao dịch mua, bạn cũng phải gọi hàm bằng cách truyền tham chiếu đến một

dependencies {

val billing_version = "6.1.0"
implementation("com.android.billingclient:billing-ktx:$billing_version")
}

1. Trình nghe này nhận nội dung cập nhật cho tất cả giao dịch mua trong ứng dụng.

Kotlin

private val purchasesUpdatedListener = PurchasesUpdatedListener { billingResult, purchases ->

   // To be implemented in a later section.
} private var billingClient = BillingClient.newBuilder(context) .setListener(purchasesUpdatedListener) .enablePendingPurchases() .build()

Java

private PurchasesUpdatedListener purchasesUpdatedListener = new PurchasesUpdatedListener() {

@Override
public void onPurchasesUpdated(BillingResult billingResult, List purchases) {
    // To be implemented in a later section.
}
}; private BillingClient billingClient = BillingClient.newBuilder(context)
.setListener(purchasesUpdatedListener)
.enablePendingPurchases()
.build();

Kết nối với Google Play

Sau khi đã tạo một

dependencies {

def billing_version = "6.1.0"
implementation "com.android.billingclient:billing-ktx:$billing_version"
}

7, bạn cần thiết lập kết nối với Google Play.

Để kết nối với Google Play, hãy gọi hàm . Quá trình kết nối không đồng bộ và bạn phải triển khai

private val purchasesUpdatedListener = PurchasesUpdatedListener { billingResult, purchases ->

   // To be implemented in a later section.
} private var billingClient = BillingClient.newBuilder(context) .setListener(purchasesUpdatedListener) .enablePendingPurchases() .build()

0 để nhận một lệnh gọi lại sau khi ứng dụng được thiết lập và sẵn sàng tạo thêm yêu cầu.

Bạn cũng phải triển khai logic thử lại để xử lý việc mất kết nối với Google Play. Để triển khai logic thử lại, hãy ghi đè phương pháp gọi lại và đảm bảo rằng

dependencies {

def billing_version = "6.1.0"
implementation "com.android.billingclient:billing-ktx:$billing_version"
}

7 gọi phương thức để kết nối lại với Google Play trước khi tạo yêu cầu tiếp theo.

Ví dụ sau đây minh hoạ cách bắt đầu một kết nối và kiểm thử xem kết nối đã sẵn sàng để sử dụng chưa:

Kotlin

billingClient.startConnection(object : BillingClientStateListener {

override fun onBillingSetupFinished(billingResult: BillingResult) {
    if (billingResult.responseCode ==  BillingResponseCode.OK) {
        // The BillingClient is ready. You can query purchases here.
    }
}
override fun onBillingServiceDisconnected() {
    // Try to restart the connection on the next request to
    // Google Play by calling the startConnection() method.
}
})

Java

billingClient.startConnection(new BillingClientStateListener() {

@Override
public void onBillingSetupFinished(BillingResult billingResult) {
    if (billingResult.getResponseCode() ==  BillingResponseCode.OK) {
        // The BillingClient is ready. You can query purchases here.
    }
}
@Override
public void onBillingServiceDisconnected() {
    // Try to restart the connection on the next request to
    // Google Play by calling the startConnection() method.
}
});

Hiện các sản phẩm có sẵn để mua

Sau khi thiết lập kết nối với Google Play, bạn có thể truy vấn các sản phẩm mà mình hiện có và cho người dùng thấy các sản phẩm đó.

Truy vấn thông tin chi tiết về sản phẩm là một bước quan trọng trước khi hiển thị sản phẩm cho người dùng vì việc truy vấn này sẽ trả về thông tin sản phẩm đã bản địa hoá. Đối với gói thuê bao, hãy đảm bảo cách sản phẩm xuất hiện phải tuân thủ tất cả các chính sách của Play.

Để truy vấn thông tin chi tiết về sản phẩm trong ứng dụng, hãy gọi .

Để xử lý kết quả của hoạt động không đồng bộ, bạn cũng phải chỉ định một trình nghe có chức năng triển khai giao diện

private val purchasesUpdatedListener = PurchasesUpdatedListener { billingResult, purchases ->

   // To be implemented in a later section.
} private var billingClient = BillingClient.newBuilder(context) .setListener(purchasesUpdatedListener) .enablePendingPurchases() .build()

5. Sau đó, bạn có thể ghi đè để thông báo cho trình nghe khi truy vấn kết thúc, như minh hoạ trong ví dụ sau:

Kotlin

val queryProductDetailsParams =

QueryProductDetailsParams.newBuilder()
    .setProductList(
        ImmutableList.of(
            Product.newBuilder()
                .setProductId("product_id_example")
                .setProductType(ProductType.SUBS)
                .build()))
    .build()
billingClient.queryProductDetailsAsync(queryProductDetailsParams) {
billingResult,
productDetailsList ->
  // check billingResult
  // process returned productDetailsList
} )

Java

QueryProductDetailsParams queryProductDetailsParams =

QueryProductDetailsParams.newBuilder()
    .setProductList(
        ImmutableList.of(
            Product.newBuilder()
                .setProductId("product_id_example")
                .setProductType(ProductType.SUBS)
                .build()))
    .build();
billingClient.queryProductDetailsAsync(
queryProductDetailsParams,
new ProductDetailsResponseListener() {
    public void onProductDetailsResponse(BillingResult billingResult,
            List productDetailsList) {
        // check billingResult
        // process returned productDetailsList
    }
}
)

Khi truy vấn thông tin chi tiết về sản phẩm, hãy chuyển một bản sao của

private val purchasesUpdatedListener = PurchasesUpdatedListener { billingResult, purchases ->

   // To be implemented in a later section.
} private var billingClient = BillingClient.newBuilder(context) .setListener(purchasesUpdatedListener) .enablePendingPurchases() .build()

7 để chỉ định danh sách các chuỗi mã sản phẩm được tạo trong Google Play Console cùng với một

private val purchasesUpdatedListener = PurchasesUpdatedListener { billingResult, purchases ->

   // To be implemented in a later section.
} private var billingClient = BillingClient.newBuilder(context) .setListener(purchasesUpdatedListener) .enablePendingPurchases() .build()

8.

private val purchasesUpdatedListener = PurchasesUpdatedListener { billingResult, purchases ->

   // To be implemented in a later section.
} private var billingClient = BillingClient.newBuilder(context) .setListener(purchasesUpdatedListener) .enablePendingPurchases() .build()

8 có thể là

private PurchasesUpdatedListener purchasesUpdatedListener = new PurchasesUpdatedListener() {

@Override
public void onPurchasesUpdated(BillingResult billingResult, List purchases) {
    // To be implemented in a later section.
}
}; private BillingClient billingClient = BillingClient.newBuilder(context)
.setListener(purchasesUpdatedListener)
.enablePendingPurchases()
.build();
0 đối với các sản phẩm tính phí một lần hoặc

private PurchasesUpdatedListener purchasesUpdatedListener = new PurchasesUpdatedListener() {

@Override
public void onPurchasesUpdated(BillingResult billingResult, List purchases) {
    // To be implemented in a later section.
}
}; private BillingClient billingClient = BillingClient.newBuilder(context)
.setListener(purchasesUpdatedListener)
.enablePendingPurchases()
.build();
1 đối với các gói thuê bao.

Truy vấn bằng tiện ích Kotlin

Nếu đang , bạn có thể truy vấn thông tin chi tiết về sản phẩm trong ứng dụng bằng cách gọi hàm mở rộng

private PurchasesUpdatedListener purchasesUpdatedListener = new PurchasesUpdatedListener() {

@Override
public void onPurchasesUpdated(BillingResult billingResult, List purchases) {
    // To be implemented in a later section.
}
}; private BillingClient billingClient = BillingClient.newBuilder(context)
.setListener(purchasesUpdatedListener)
.enablePendingPurchases()
.build();
2.

private PurchasesUpdatedListener purchasesUpdatedListener = new PurchasesUpdatedListener() {

@Override
public void onPurchasesUpdated(BillingResult billingResult, List purchases) {
    // To be implemented in a later section.
}
}; private BillingClient billingClient = BillingClient.newBuilder(context)
.setListener(purchasesUpdatedListener)
.enablePendingPurchases()
.build();
2 tận dụng coroutine của Kotlin để bạn không cần xác định một trình nghe riêng biệt. Thay vào đó, hàm này sẽ tạm ngưng cho đến khi truy vấn hoàn tất, sau đó bạn có thể xử lý kết quả:

dependencies {

val billing_version = "6.1.0"
implementation("com.android.billingclient:billing:$billing_version")
}

0

Trong một số ít trường hợp, một số thiết bị không thể hỗ trợ

private PurchasesUpdatedListener purchasesUpdatedListener = new PurchasesUpdatedListener() {

@Override
public void onPurchasesUpdated(BillingResult billingResult, List purchases) {
    // To be implemented in a later section.
}
}; private BillingClient billingClient = BillingClient.newBuilder(context)
.setListener(purchasesUpdatedListener)
.enablePendingPurchases()
.build();
4 và

private val purchasesUpdatedListener = PurchasesUpdatedListener { billingResult, purchases ->

   // To be implemented in a later section.
} private var billingClient = BillingClient.newBuilder(context) .setListener(purchasesUpdatedListener) .enablePendingPurchases() .build()

4, thường là do các phiên bản Dịch vụ Google Play đã lỗi thời. Để đảm bảo nhận được sự hỗ trợ phù hợp cho trường hợp này, hãy tìm hiểu cách sử dụng tính năng tương thích ngược trong .

Xử lý kết quả

Thư viện Google Play Billing lưu trữ các kết quả truy vấn trong một

private PurchasesUpdatedListener purchasesUpdatedListener = new PurchasesUpdatedListener() {

@Override
public void onPurchasesUpdated(BillingResult billingResult, List purchases) {
    // To be implemented in a later section.
}
}; private BillingClient billingClient = BillingClient.newBuilder(context)
.setListener(purchasesUpdatedListener)
.enablePendingPurchases()
.build();
6 các đối tượng

private PurchasesUpdatedListener purchasesUpdatedListener = new PurchasesUpdatedListener() {

@Override
public void onPurchasesUpdated(BillingResult billingResult, List purchases) {
    // To be implemented in a later section.
}
}; private BillingClient billingClient = BillingClient.newBuilder(context)
.setListener(purchasesUpdatedListener)
.enablePendingPurchases()
.build();
4. Sau đó, bạn có thể gọi nhiều phương thức cho mỗi đối tượng

private PurchasesUpdatedListener purchasesUpdatedListener = new PurchasesUpdatedListener() {

@Override
public void onPurchasesUpdated(BillingResult billingResult, List purchases) {
    // To be implemented in a later section.
}
}; private BillingClient billingClient = BillingClient.newBuilder(context)
.setListener(purchasesUpdatedListener)
.enablePendingPurchases()
.build();
4 trong danh sách để xem thông tin liên quan về một sản phẩm trong ứng dụng, chẳng hạn như giá hoặc phần mô tả. Để xem thông tin chi tiết về sản phẩm có sẵn, hãy xem danh sách các phương thức trong lớp

private PurchasesUpdatedListener purchasesUpdatedListener = new PurchasesUpdatedListener() {

@Override
public void onPurchasesUpdated(BillingResult billingResult, List purchases) {
    // To be implemented in a later section.
}
}; private BillingClient billingClient = BillingClient.newBuilder(context)
.setListener(purchasesUpdatedListener)
.enablePendingPurchases()
.build();
4.

Trước khi chào bán một mặt hàng, hãy kiểm tra để đảm bảo rằng người dùng chưa sở hữu mặt hàng đó. Nếu người dùng có một sản phẩm tiêu dùng vẫn còn trong thư viện mặt hàng, họ phải dùng mặt hàng đó thì mới có thể mua lại.

Trước khi đưa ra đề nghị về một gói thuê bao, hãy xác minh rằng người dùng chưa đăng ký. Ngoài ra, hãy lưu ý những điều sau:

  • private val purchasesUpdatedListener = PurchasesUpdatedListener { billingResult, purchases ->
       // To be implemented in a later section.  
    
    } private var billingClient = BillingClient.newBuilder(context) .setListener(purchasesUpdatedListener) .enablePendingPurchases() .build() 4 trả về thông tin chi tiết của sản phẩm thuê bao và tối đa 50 lựa chọn cho mỗi thuê bao.
  • private val purchasesUpdatedListener = PurchasesUpdatedListener { billingResult, purchases ->
       // To be implemented in a later section.  
    
    } private var billingClient = BillingClient.newBuilder(context) .setListener(purchasesUpdatedListener) .enablePendingPurchases() .build() 4 chỉ trả về những lựa chọn người dùng đủ điều kiện. Nếu người dùng cố gắng mua một lựa chọn họ không đủ điều kiện (ví dụ: nếu ứng dụng đang đưa ra danh sách lựa chọn đủ điều kiện nhưng đã hết hạn), thì Play sẽ thông báo cho người dùng rằng họ không đủ điều kiện, và họ có thể chuyển sang mua gói cơ bản.

Bắt đầu quy trình mua

Để bắt đầu một yêu cầu mua hàng từ ứng dụng của bạn, hãy gọi phương thức từ luồng chính của ứng dụng. Phương thức này tham chiếu đến một đối tượng

billingClient.startConnection(object : BillingClientStateListener {

override fun onBillingSetupFinished(billingResult: BillingResult) {
    if (billingResult.responseCode ==  BillingResponseCode.OK) {
        // The BillingClient is ready. You can query purchases here.
    }
}
override fun onBillingServiceDisconnected() {
    // Try to restart the connection on the next request to
    // Google Play by calling the startConnection() method.
}
})

3 chứa đối tượng

private PurchasesUpdatedListener purchasesUpdatedListener = new PurchasesUpdatedListener() {

@Override
public void onPurchasesUpdated(BillingResult billingResult, List purchases) {
    // To be implemented in a later section.
}
}; private BillingClient billingClient = BillingClient.newBuilder(context)
.setListener(purchasesUpdatedListener)
.enablePendingPurchases()
.build();
4 liên quan đã nhận được từ việc gọi . Để tạo một đối tượng

billingClient.startConnection(object : BillingClientStateListener {

override fun onBillingSetupFinished(billingResult: BillingResult) {
    if (billingResult.responseCode ==  BillingResponseCode.OK) {
        // The BillingClient is ready. You can query purchases here.
    }
}
override fun onBillingServiceDisconnected() {
    // Try to restart the connection on the next request to
    // Google Play by calling the startConnection() method.
}
})

3, hãy dùng lớp

billingClient.startConnection(object : BillingClientStateListener {

override fun onBillingSetupFinished(billingResult: BillingResult) {
    if (billingResult.responseCode ==  BillingResponseCode.OK) {
        // The BillingClient is ready. You can query purchases here.
    }
}
override fun onBillingServiceDisconnected() {
    // Try to restart the connection on the next request to
    // Google Play by calling the startConnection() method.
}
})

7.

Kotlin

dependencies {

val billing_version = "6.1.0"
implementation("com.android.billingclient:billing:$billing_version")
}

1

Java

dependencies {

val billing_version = "6.1.0"
implementation("com.android.billingclient:billing:$billing_version")
}

2

Phương thức

billingClient.startConnection(object : BillingClientStateListener {

override fun onBillingSetupFinished(billingResult: BillingResult) {
    if (billingResult.responseCode ==  BillingResponseCode.OK) {
        // The BillingClient is ready. You can query purchases here.
    }
}
override fun onBillingServiceDisconnected() {
    // Try to restart the connection on the next request to
    // Google Play by calling the startConnection() method.
}
})

2 trả về một trong nhiều mã phản hồi được liệt kê trong

billingClient.startConnection(object : BillingClientStateListener {

override fun onBillingSetupFinished(billingResult: BillingResult) {
    if (billingResult.responseCode ==  BillingResponseCode.OK) {
        // The BillingClient is ready. You can query purchases here.
    }
}
override fun onBillingServiceDisconnected() {
    // Try to restart the connection on the next request to
    // Google Play by calling the startConnection() method.
}
})

9. Hãy kiểm tra kết quả này để đảm bảo không có lỗi khi bắt đầu quy trình mua.

billingClient.startConnection(new BillingClientStateListener() {

@Override
public void onBillingSetupFinished(BillingResult billingResult) {
    if (billingResult.getResponseCode() ==  BillingResponseCode.OK) {
        // The BillingClient is ready. You can query purchases here.
    }
}
@Override
public void onBillingServiceDisconnected() {
    // Try to restart the connection on the next request to
    // Google Play by calling the startConnection() method.
}
});

0 là

billingClient.startConnection(new BillingClientStateListener() {

@Override
public void onBillingSetupFinished(BillingResult billingResult) {
    if (billingResult.getResponseCode() ==  BillingResponseCode.OK) {
        // The BillingClient is ready. You can query purchases here.
    }
}
@Override
public void onBillingServiceDisconnected() {
    // Try to restart the connection on the next request to
    // Google Play by calling the startConnection() method.
}
});

1 cho biết đã chạy thành công.

Khi bạn gọi hàm

billingClient.startConnection(object : BillingClientStateListener {

override fun onBillingSetupFinished(billingResult: BillingResult) {
    if (billingResult.responseCode ==  BillingResponseCode.OK) {
        // The BillingClient is ready. You can query purchases here.
    }
}
override fun onBillingServiceDisconnected() {
    // Try to restart the connection on the next request to
    // Google Play by calling the startConnection() method.
}
})

2 thành công, hệ thống sẽ hiển thị màn hình mua hàng trên Google Play. Hình 1 hiển thị màn hình mua cho một gói thuê bao:

Hướng dẫn add a payment method google play năm 2024
Hình 1. Màn hình mua hàng trên Google Play hiện một gói thuê bao mà bạn có thể mua.

Google Play gọi hàm

billingClient.startConnection(new BillingClientStateListener() {

@Override
public void onBillingSetupFinished(BillingResult billingResult) {
    if (billingResult.getResponseCode() ==  BillingResponseCode.OK) {
        // The BillingClient is ready. You can query purchases here.
    }
}
@Override
public void onBillingServiceDisconnected() {
    // Try to restart the connection on the next request to
    // Google Play by calling the startConnection() method.
}
});

3 để cung cấp kết quả của thao tác mua hàng cho một trình nghe có nhiệm vụ triển khai giao diện

dependencies {

val billing_version = "6.1.0"
implementation("com.android.billingclient:billing-ktx:$billing_version")
}

1. Trình nghe này được chỉ định bằng phương thức

dependencies {

val billing_version = "6.1.0"
implementation("com.android.billingclient:billing-ktx:$billing_version")
}

6 khi bạn .

Bạn phải thực thi

billingClient.startConnection(new BillingClientStateListener() {

@Override
public void onBillingSetupFinished(BillingResult billingResult) {
    if (billingResult.getResponseCode() ==  BillingResponseCode.OK) {
        // The BillingClient is ready. You can query purchases here.
    }
}
@Override
public void onBillingServiceDisconnected() {
    // Try to restart the connection on the next request to
    // Google Play by calling the startConnection() method.
}
});

3 để xử lý các mã phản hồi khả thi. Ví dụ sau đây trình bày cách ghi đè

billingClient.startConnection(new BillingClientStateListener() {

@Override
public void onBillingSetupFinished(BillingResult billingResult) {
    if (billingResult.getResponseCode() ==  BillingResponseCode.OK) {
        // The BillingClient is ready. You can query purchases here.
    }
}
@Override
public void onBillingServiceDisconnected() {
    // Try to restart the connection on the next request to
    // Google Play by calling the startConnection() method.
}
});

3:

Kotlin

dependencies {

val billing_version = "6.1.0"
implementation("com.android.billingclient:billing:$billing_version")
}

3

Java

dependencies {

val billing_version = "6.1.0"
implementation("com.android.billingclient:billing:$billing_version")
}

4

Giao dịch mua thành công sẽ tạo ra một màn hình mua hàng thành công trên Google Play, tương tự như hình 2.

Hướng dẫn add a payment method google play năm 2024
Hình 2. Màn hình giao dịch mua thành công của Google Play.

Một lượt mua hàng thành công cũng tạo ra một mã mua hàng. Mã này là giá trị nhận dạng duy nhất, đại diện cho người dùng và mã sản phẩm của sản phẩm trong ứng dụng mà họ đã mua. Ứng dụng có thể lưu trữ cục bộ mã thông báo giao dịch mua, nhưng bạn nên truyền mã thông báo này tới máy chủ phụ trợ bảo mật của bạn. Tại máy chủ đó, bạn có thể xác minh và bảo vệ giao dịch mua khỏi hành vi gian lận. Quy trình này được mô tả kỹ hơn trong phần tiếp theo.

Người dùng cũng sẽ nhận được biên nhận giao dịch chứa mã đơn hàng hoặc một mã nhận dạng duy nhất của giao dịch qua email. Người dùng sẽ nhận được một email kèm mã đơn hàng duy nhất cho mỗi lần mua sản phẩm tính phí một lần, cũng như giao dịch mua gói thuê bao lần đầu và những lần gia hạn tự động định kỳ tiếp theo. Bạn có thể sử dụng mã đơn hàng để quản lý việc hoàn tiền trong Google Play Console.

Báo giá dành riêng cho bạn

Nếu bạn có thể phân phối ứng dụng cho người dùng ở Liên minh Châu Âu, hãy sử dụng phương thức

billingClient.startConnection(new BillingClientStateListener() {

@Override
public void onBillingSetupFinished(BillingResult billingResult) {
    if (billingResult.getResponseCode() ==  BillingResponseCode.OK) {
        // The BillingClient is ready. You can query purchases here.
    }
}
@Override
public void onBillingServiceDisconnected() {
    // Try to restart the connection on the next request to
    // Google Play by calling the startConnection() method.
}
});

8 để cho người dùng biết rằng giá của mặt hàng đã được cá nhân hoá bằng tính năng ra quyết định tự động.

Hướng dẫn add a payment method google play năm 2024
Hình 3. Màn hình mua hàng trên Google Play cho biết giá này được điều chỉnh cho phù hợp với người dùng.

Bạn phải tham khảo Điều 6 (1) (ea) CRD trong Chỉ thị về quyền của người tiêu dùng (2011/83/EU) để xác định xem giá bạn cung cấp cho người dùng có được áp dụng cho từng cá nhân hay không.

billingClient.startConnection(new BillingClientStateListener() {

@Override
public void onBillingSetupFinished(BillingResult billingResult) {
    if (billingResult.getResponseCode() ==  BillingResponseCode.OK) {
        // The BillingClient is ready. You can query purchases here.
    }
}
@Override
public void onBillingServiceDisconnected() {
    // Try to restart the connection on the next request to
    // Google Play by calling the startConnection() method.
}
});

8 nhận giá trị nhập boolean. Khi

val queryProductDetailsParams =

QueryProductDetailsParams.newBuilder()
    .setProductList(
        ImmutableList.of(
            Product.newBuilder()
                .setProductId("product_id_example")
                .setProductType(ProductType.SUBS)
                .build()))
    .build()
billingClient.queryProductDetailsAsync(queryProductDetailsParams) {
billingResult,
productDetailsList ->
  // check billingResult
  // process returned productDetailsList
} )

0, giao diện người dùng Play có bao gồm thông tin công bố. Khi

val queryProductDetailsParams =

QueryProductDetailsParams.newBuilder()
    .setProductList(
        ImmutableList.of(
            Product.newBuilder()
                .setProductId("product_id_example")
                .setProductType(ProductType.SUBS)
                .build()))
    .build()
billingClient.queryProductDetailsAsync(queryProductDetailsParams) {
billingResult,
productDetailsList ->
  // check billingResult
  // process returned productDetailsList
} )

1, giao diện người dùng bỏ qua thông tin công bố. Giá trị mặc định là

val queryProductDetailsParams =

QueryProductDetailsParams.newBuilder()
    .setProductList(
        ImmutableList.of(
            Product.newBuilder()
                .setProductId("product_id_example")
                .setProductType(ProductType.SUBS)
                .build()))
    .build()
billingClient.queryProductDetailsAsync(queryProductDetailsParams) {
billingResult,
productDetailsList ->
  // check billingResult
  // process returned productDetailsList
} )

1.

Hãy truy cập vào Trung tâm trợ giúp người tiêu dùng để biết thêm thông tin.

Xử lý giao dịch mua hàng

Sau khi người dùng hoàn tất giao dịch mua, ứng dụng cần xử lý giao dịch mua đó. Trong hầu hết các trường hợp, ứng dụng sẽ nhận được thông báo về giao dịch mua hàng thông qua

dependencies {

val billing_version = "6.1.0"
implementation("com.android.billingclient:billing-ktx:$billing_version")
}

1. Tuy nhiên, trong một số trường hợp, ứng dụng sẽ ghi nhận giao dịch mua hàng bằng cách gọi như mô tả trong phần .

Ngoài ra, nếu có ứng dụng Thông báo theo thời gian thực dành cho nhà phát triển trong phần phụ trợ bảo mật, bạn có thể đăng ký giao dịch mua hàng mới bằng cách nhận một

val queryProductDetailsParams =

QueryProductDetailsParams.newBuilder()
    .setProductList(
        ImmutableList.of(
            Product.newBuilder()
                .setProductId("product_id_example")
                .setProductType(ProductType.SUBS)
                .build()))
    .build()
billingClient.queryProductDetailsAsync(queryProductDetailsParams) {
billingResult,
productDetailsList ->
  // check billingResult
  // process returned productDetailsList
} )

5 hoặc

val queryProductDetailsParams =

QueryProductDetailsParams.newBuilder()
    .setProductList(
        ImmutableList.of(
            Product.newBuilder()
                .setProductId("product_id_example")
                .setProductType(ProductType.SUBS)
                .build()))
    .build()
billingClient.queryProductDetailsAsync(queryProductDetailsParams) {
billingResult,
productDetailsList ->
  // check billingResult
  // process returned productDetailsList
} )

6 (chỉ dành cho các giao dịch mua hàng đang chờ xử lý) thông báo cho bạn về một giao dịch mua hàng mới. Sau khi nhận được những thông báo này, hãy gọi API Nhà phát triển Google Play để nhận trạng thái đầy đủ và cập nhật trạng thái phụ trợ của riêng bạn.

Ứng dụng nên xử lý giao dịch mua hàng theo cách sau:

  1. Xác minh giao dịch mua hàng.
  2. Cung cấp nội dung cho người dùng và xác nhận việc phân phối nội dung. Đánh dấu mặt hàng là đã mua để người dùng có thể mua lại (không bắt buộc).

Để xác minh một giao dịch mua hàng, trước tiên, hãy kiểm tra nhằm đảm bảo rằng là

val queryProductDetailsParams =

QueryProductDetailsParams.newBuilder()
    .setProductList(
        ImmutableList.of(
            Product.newBuilder()
                .setProductId("product_id_example")
                .setProductType(ProductType.SUBS)
                .build()))
    .build()
billingClient.queryProductDetailsAsync(queryProductDetailsParams) {
billingResult,
productDetailsList ->
  // check billingResult
  // process returned productDetailsList
} )

7. Nếu giao dịch mua là

val queryProductDetailsParams =

QueryProductDetailsParams.newBuilder()
    .setProductList(
        ImmutableList.of(
            Product.newBuilder()
                .setProductId("product_id_example")
                .setProductType(ProductType.SUBS)
                .build()))
    .build()
billingClient.queryProductDetailsAsync(queryProductDetailsParams) {
billingResult,
productDetailsList ->
  // check billingResult
  // process returned productDetailsList
} )

8, thì bạn nên xử lý giao dịch mua như mô tả trong phần . Đối với các giao dịch mua nhận được qua hoặc , bạn nên xác minh thêm để đảm bảo tính hợp pháp của giao dịch mua trước khi cấp quyền cho ứng dụng. Để tìm hiểu cách xác minh giao dịch mua một cách chính xác, hãy xem phần .

Sau khi bạn xác minh xong giao dịch mua hàng, ứng dụng sẽ sẵn sàng cấp quyền cho người dùng này. Tài khoản người dùng liên kết với giao dịch mua hàng có thể được xác định bằng do

QueryProductDetailsParams queryProductDetailsParams =

QueryProductDetailsParams.newBuilder()
    .setProductList(
        ImmutableList.of(
            Product.newBuilder()
                .setProductId("product_id_example")
                .setProductType(ProductType.SUBS)
                .build()))
    .build();
billingClient.queryProductDetailsAsync(
queryProductDetailsParams,
new ProductDetailsResponseListener() {
    public void onProductDetailsResponse(BillingResult billingResult,
            List productDetailsList) {
        // check billingResult
        // process returned productDetailsList
    }
}
)

2 trả về trong các giao dịch mua sản phẩm trong ứng dụng và do

QueryProductDetailsParams queryProductDetailsParams =

QueryProductDetailsParams.newBuilder()
    .setProductList(
        ImmutableList.of(
            Product.newBuilder()
                .setProductId("product_id_example")
                .setProductType(ProductType.SUBS)
                .build()))
    .build();
billingClient.queryProductDetailsAsync(
queryProductDetailsParams,
new ProductDetailsResponseListener() {
    public void onProductDetailsResponse(BillingResult billingResult,
            List productDetailsList) {
        // check billingResult
        // process returned productDetailsList
    }
}
)

4 trả về đối với các gói thuê bao ở phía máy chủ hoặc từ ở phía máy khách, nếu được đặt với khi giao dịch mua hàng được thực hiện.

Sau khi cấp quyền, ứng dụng phải xác nhận giao dịch mua hàng. Việc xác nhận này cho Google Play biết rằng bạn đã cấp quyền cho giao dịch mua hàng.

Quy trình cấp quyền và xác nhận giao dịch mua hàng phụ thuộc vào việc sản phẩm được mua là sản phẩm tiêu dùng, sản phẩm không phải hàng tiêu dùng hay gói thuê bao.

Sản phẩm tiêu dùng

Đối với sản phẩm tiêu dùng, nếu ứng dụng có phần phụ trợ bảo mật, bạn nên sử dụng

QueryProductDetailsParams queryProductDetailsParams =

QueryProductDetailsParams.newBuilder()
    .setProductList(
        ImmutableList.of(
            Product.newBuilder()
                .setProductId("product_id_example")
                .setProductType(ProductType.SUBS)
                .build()))
    .build();
billingClient.queryProductDetailsAsync(
queryProductDetailsParams,
new ProductDetailsResponseListener() {
    public void onProductDetailsResponse(BillingResult billingResult,
            List productDetailsList) {
        // check billingResult
        // process returned productDetailsList
    }
}
)

8 để tiêu thụ sản phẩm được mua theo cách đáng tin cậy. Đảm bảo sản phẩm được mua chưa được tiêu thụ bằng cách kiểm tra

QueryProductDetailsParams queryProductDetailsParams =

QueryProductDetailsParams.newBuilder()
    .setProductList(
        ImmutableList.of(
            Product.newBuilder()
                .setProductId("product_id_example")
                .setProductType(ProductType.SUBS)
                .build()))
    .build();
billingClient.queryProductDetailsAsync(
queryProductDetailsParams,
new ProductDetailsResponseListener() {
    public void onProductDetailsResponse(BillingResult billingResult,
            List productDetailsList) {
        // check billingResult
        // process returned productDetailsList
    }
}
)

9 trong kết quả của lệnh gọi

QueryProductDetailsParams queryProductDetailsParams =

QueryProductDetailsParams.newBuilder()
    .setProductList(
        ImmutableList.of(
            Product.newBuilder()
                .setProductId("product_id_example")
                .setProductType(ProductType.SUBS)
                .build()))
    .build();
billingClient.queryProductDetailsAsync(
queryProductDetailsParams,
new ProductDetailsResponseListener() {
    public void onProductDetailsResponse(BillingResult billingResult,
            List productDetailsList) {
        // check billingResult
        // process returned productDetailsList
    }
}
)

2. Nếu ứng dụng của bạn chỉ dành cho máy khách mà không có phần phụ trợ, hãy sử dụng trong Thư viện Google Play Billing. Cả hai phương thức đều đáp ứng yêu cầu xác nhận và cho biết rằng ứng dụng đã cấp quyền cho người dùng. Các phương thức này cũng cho phép ứng dụng tạo sản phẩm tính phí một lần tương ứng với mã thông báo giao dịch mua hàng đầu vào hiện có để mua lại. Với

dependencies {

val billing_version = "6.1.0"
implementation("com.android.billingclient:billing:$billing_version")
}

01, bạn cũng phải truyền một đối tượng sẽ triển khai giao diện

dependencies {

val billing_version = "6.1.0"
implementation("com.android.billingclient:billing:$billing_version")
}

03. Đối tượng này xử lý kết quả của hoạt động tiêu thụ. Bạn có thể ghi đè phương thức mà Thư viện Google Play Billing này sẽ gọi khi hoạt động hoàn tất.

Ví dụ sau minh hoạ việc tiêu thụ một sản phẩm bằng Thư viện Google Play Billing khi sử dụng mã mua hàng được liên kết:

Kotlin

dependencies {

val billing_version = "6.1.0"
implementation("com.android.billingclient:billing:$billing_version")
}

5

Java

dependencies {

val billing_version = "6.1.0"
implementation("com.android.billingclient:billing:$billing_version")
}

6

Sản phẩm không phải hàng tiêu dùng

Để xác nhận giao dịch mua sản phẩm không phải hàng tiêu dùng, nếu ứng dụng có phần phụ trợ bảo mật, bạn nên sử dụng

dependencies {

val billing_version = "6.1.0"
implementation("com.android.billingclient:billing:$billing_version")
}

05 để xác nhận giao dịch mua hàng một cách đáng tin cậy. Đảm bảo giao dịch mua hàng chưa được xác nhận trước đó bằng cách kiểm tra

dependencies {

val billing_version = "6.1.0"
implementation("com.android.billingclient:billing:$billing_version")
}

06 trong kết quả của lệnh gọi

QueryProductDetailsParams queryProductDetailsParams =

QueryProductDetailsParams.newBuilder()
    .setProductList(
        ImmutableList.of(
            Product.newBuilder()
                .setProductId("product_id_example")
                .setProductType(ProductType.SUBS)
                .build()))
    .build();
billingClient.queryProductDetailsAsync(
queryProductDetailsParams,
new ProductDetailsResponseListener() {
    public void onProductDetailsResponse(BillingResult billingResult,
            List productDetailsList) {
        // check billingResult
        // process returned productDetailsList
    }
}
)

2.

Nếu ứng dụng của bạn chỉ dành cho máy khách, hãy dùng từ Thư viện Google Play Billing trong ứng dụng của bạn. Trước khi xác nhận giao dịch mua hàng, ứng dụng của bạn phải kiểm tra xem giao dịch đã được xác nhận hay chưa bằng cách dùng phương thức trong Thư viện Google Play Billing.

Ví dụ sau cho biết cách xác nhận một giao dịch mua hàng bằng cách sử dụng Thư viện Google Play Billing:

Kotlin

dependencies {

val billing_version = "6.1.0"
implementation("com.android.billingclient:billing:$billing_version")
}

7

Java

dependencies {

val billing_version = "6.1.0"
implementation("com.android.billingclient:billing:$billing_version")
}

8

Gói thuê bao

Gói thuê bao được xử lý tương tự như sản phẩm không phải hàng tiêu dùng. Nếu có thể, hãy sử dụng

dependencies {

val billing_version = "6.1.0"
implementation("com.android.billingclient:billing:$billing_version")
}

10 từ API Nhà phát triển Google Play để xác nhận một cách đáng tin cậy giao dịch mua hàng từ phần phụ trợ bảo mật của bạn. Xác minh rằng giao dịch mua hàng chưa được xác nhận trước đó bằng cách kiểm tra trong tài nguyên giao dịch mua hàng từ

QueryProductDetailsParams queryProductDetailsParams =

QueryProductDetailsParams.newBuilder()
    .setProductList(
        ImmutableList.of(
            Product.newBuilder()
                .setProductId("product_id_example")
                .setProductType(ProductType.SUBS)
                .build()))
    .build();
billingClient.queryProductDetailsAsync(
queryProductDetailsParams,
new ProductDetailsResponseListener() {
    public void onProductDetailsResponse(BillingResult billingResult,
            List productDetailsList) {
        // check billingResult
        // process returned productDetailsList
    }
}
)

4. Nếu không, bạn có thể xác nhận gói thuê bao bằng cách sử dụng từ Thư viện Google Play Billing sau khi kiểm tra . Bạn cần xác nhận tất cả các giao dịch mua gói thuê bao ban đầu. Bạn không cần xác nhận việc gia hạn gói thuê bao. Để biết thêm thông tin về thời điểm cần xác nhận gói thuê bao, hãy xem chủ đề Bán gói thuê bao.

Tìm nạp các giao dịch mua

Việc theo dõi thông tin cập nhật về giao dịch mua bằng cách sử dụng

dependencies {

val billing_version = "6.1.0"
implementation("com.android.billingclient:billing-ktx:$billing_version")
}

1 là không đủ để đảm bảo rằng ứng dụng của bạn sẽ xử lý tất cả các giao dịch mua. Có thể ứng dụng không biết tất cả các giao dịch mua mà một người dùng đã thực hiện. Dưới đây là một số trường hợp ứng dụng có thể bị mất dấu hoặc không biết về giao dịch mua:

  • Các vấn đề về mạng xảy ra trong quá trình mua: Người dùng mua hàng thành công và nhận được xác nhận của Google, nhưng thiết bị của họ bị mất kết nối mạng trước khi nhận được thông báo về giao dịch mua thông qua dependencies {
    val billing_version = "6.1.0"  
    implementation("com.android.billingclient:billing-ktx:$billing_version")  
    
    } 1.
  • Nhiều thiết bị: Người dùng mua một mặt hàng trên một thiết bị và kỳ vọng thấy mặt hàng đó khi chuyển đổi thiết bị.
  • Xử lý giao dịch mua thực hiện bên ngoài ứng dụng: Người dùng có thể thực hiện một số giao dịch mua (chẳng hạn như sử dụng các mã khuyến mãi) bên ngoài ứng dụng của bạn.

Để xử lý những trường hợp này, hãy chắc chắn ứng dụng gọi trong phương thức

dependencies {

val billing_version = "6.1.0"
implementation("com.android.billingclient:billing:$billing_version")
}

18 nhằm đảm bảo rằng tất cả các giao dịch mua đều được xử lý thành công như mô tả trong phần .

Ví dụ sau đây cho thấy cách tìm nạp giao dịch mua gói thuê bao của người dùng. Lưu ý

QueryProductDetailsParams queryProductDetailsParams =

QueryProductDetailsParams.newBuilder()
    .setProductList(
        ImmutableList.of(
            Product.newBuilder()
                .setProductId("product_id_example")
                .setProductType(ProductType.SUBS)
                .build()))
    .build();
billingClient.queryProductDetailsAsync(
queryProductDetailsParams,
new ProductDetailsResponseListener() {
    public void onProductDetailsResponse(BillingResult billingResult,
            List productDetailsList) {
        // check billingResult
        // process returned productDetailsList
    }
}
)

0 chỉ trả về thuê bao đang hoạt động và không truy vấn được các giao dịch mua hàng một lần.

Kotlin

dependencies {

val billing_version = "6.1.0"
implementation("com.android.billingclient:billing:$billing_version")
}

9

Java

dependencies {

def billing_version = "6.1.0"
implementation "com.android.billingclient:billing-ktx:$billing_version"
}

0

Đang tìm nạp nhật ký mua

dependencies {

val billing_version = "6.1.0"
implementation("com.android.billingclient:billing:$billing_version")
}

20 trả về giao dịch mua gần đây nhất của người dùng đối với từng sản phẩm, ngay cả khi sản phẩm được mua đó đã hết hạn, bị huỷ hoặc đã được tiêu thụ.

Nếu đang sử dụng tiện ích Kotlin, bạn có thể dùng hàm mở rộng

dependencies {

val billing_version = "6.1.0"
implementation("com.android.billingclient:billing:$billing_version")
}

21.

Kotlin

dependencies {

def billing_version = "6.1.0"
implementation "com.android.billingclient:billing-ktx:$billing_version"
}

1

Java

dependencies {

def billing_version = "6.1.0"
implementation "com.android.billingclient:billing-ktx:$billing_version"
}

2

Xử lý giao dịch mua hàng được thực hiện bên ngoài ứng dụng

Một số giao dịch mua (chẳng hạn như giao dịch mua sử dụng các mã khuyến mãi) có thể diễn ra bên ngoài ứng dụng của bạn. Khi người dùng mua hàng bên ngoài ứng dụng, họ kỳ vọng ứng dụng sẽ đưa ra thông báo trong ứng dụng hoặc sử dụng một số cơ chế thông báo để người dùng biết rằng ứng dụng đã nhận và xử lý giao dịch mua một cách chính xác. Dưới đây là một số cơ chế được chấp nhận:

  • Hiện một cửa sổ bật lên trong ứng dụng.
  • Chuyển thông báo tới hộp thông báo trong ứng dụng và nêu rõ rằng có một tin nhắn mới trong hộp thông báo trong ứng dụng.
  • Sử dụng một nội dung thông báo trên hệ điều hành.

Xin lưu ý rằng ứng dụng có thể ở bất kỳ trạng thái nào khi phát hiện giao dịch mua. Thậm chí ứng dụng có thể không được cài đặt khi giao dịch mua hàng được thực hiện. Người dùng mong muốn nhận thông tin về giao dịch mua khi tiếp tục sử dụng ứng dụng, bất kể ứng dụng đó đang trong trạng thái sử dụng nào.

Bạn phải phát hiện các giao dịch mua hàng bất kể ứng dụng đang trong trạng thái nào tại thời điểm người dùng mua hàng. Tuy nhiên, đôi khi cũng có những ngoại lệ có thể chấp nhận về việc không thông báo ngay lập tức cho người dùng rằng họ đã nhận được mặt hàng. Ví dụ:

  • Khi họ đang tham gia vào phần hành động của một trò chơi, thông báo hiển thị có thể khiến người dùng mất tập trung. Trong trường hợp này, bạn phải thông báo cho người dùng sau khi phần hành động này kết thúc.
  • Khi đoạn phim cắt cảnh đang chạy, việc hiện thông báo có thể khiến người dùng bị phân tâm. Trong trường hợp này, bạn phải thông báo cho người dùng sau khi đoạn phim cắt cảnh chạy hết.
  • Trong quá trình hướng dẫn ban đầu và thiết lập người dùng của trò chơi. Bạn nên thông báo cho người dùng mới về phần thưởng ngay sau khi họ mở trò chơi hoặc trong quá trình thiết lập người dùng ban đầu. Tuy nhiên, bạn có thể đợi cho đến khi cảnh chính trong trò chơi xuất hiện để thông báo cho người dùng.

Hãy luôn nghĩ tới trải nghiệm của người dùng khi quyết định thời điểm và cách thông báo cho họ về giao dịch mua được thực hiện bên ngoài ứng dụng của bạn. Bất cứ khi nào người dùng không nhận được thông báo ngay lập tức, họ có thể cảm thấy hoang mang và ngừng sử dụng ứng dụng, liên hệ với bộ phận hỗ trợ người dùng hoặc than phiền về việc đó trên mạng xã hội. Lưu ý:

dependencies {

val billing_version = "6.1.0"
implementation("com.android.billingclient:billing-ktx:$billing_version")
}

1 đăng ký ngữ cảnh cho ứng dụng của bạn để xử lý thông tin cập nhật về giao dịch mua, bao gồm cả giao dịch mua thực hiện bên ngoài ứng dụng. Điều này có nghĩa là nếu quy trình đăng ký của bạn không tồn tại,

dependencies {

val billing_version = "6.1.0"
implementation("com.android.billingclient:billing-ktx:$billing_version")
}

1 sẽ không được thông báo. Đây là lý do ứng dụng của bạn nên gọi trong phương thức

dependencies {

val billing_version = "6.1.0"
implementation("com.android.billingclient:billing:$billing_version")
}

18 như đã đề cập trong phần .

Xử lý các giao dịch đang chờ

Google Play hỗ trợ các giao dịch đang chờ xử lý hoặc các giao dịch yêu cầu một hoặc nhiều bước bổ sung giữa thời điểm người dùng thực hiện giao dịch mua và thời điểm phương thức thanh toán cho giao dịch mua được xử lý. Ứng dụng không được cấp quyền cho các loại giao dịch mua này cho đến khi Google thông báo cho bạn rằng đã tính phí thành công phương thức thanh toán của người dùng.

Ví dụ: người dùng có thể tạo một giao dịch mua

val queryProductDetailsParams =

QueryProductDetailsParams.newBuilder()
    .setProductList(
        ImmutableList.of(
            Product.newBuilder()
                .setProductId("product_id_example")
                .setProductType(ProductType.SUBS)
                .build()))
    .build()
billingClient.queryProductDetailsAsync(queryProductDetailsParams) {
billingResult,
productDetailsList ->
  // check billingResult
  // process returned productDetailsList
} )

8 cho một mặt hàng trong ứng dụng bằng cách chọn phương thức thanh toán là tiền mặt. Sau đó, người dùng có thể chọn một cửa hàng thực tế để hoàn tất giao dịch và nhận một mã qua cả thông báo lẫn email. Khi đến cửa hàng thực tế, người dùng có thể sử dụng mã này và thanh toán cho thu ngân bằng tiền mặt. Sau đó, Google sẽ thông báo cho cả bạn và người dùng rằng đã nhận được tiền mặt. Khi đó, ứng dụng có thể cấp quyền cho người dùng này.

Ứng dụng phải hỗ trợ các giao dịch đang chờ xử lý bằng cách gọi hàm trong khi khởi động ứng dụng.

Khi ứng dụng nhận được một giao dịch mua mới, thông qua

dependencies {

val billing_version = "6.1.0"
implementation("com.android.billingclient:billing-ktx:$billing_version")
}

1 hoặc từ việc gọi hàm , hãy sử dụng phương thức để xác định trạng thái mua hàng là

val queryProductDetailsParams =

QueryProductDetailsParams.newBuilder()
    .setProductList(
        ImmutableList.of(
            Product.newBuilder()
                .setProductId("product_id_example")
                .setProductType(ProductType.SUBS)
                .build()))
    .build()
billingClient.queryProductDetailsAsync(queryProductDetailsParams) {
billingResult,
productDetailsList ->
  // check billingResult
  // process returned productDetailsList
} )

7 hay

val queryProductDetailsParams =

QueryProductDetailsParams.newBuilder()
    .setProductList(
        ImmutableList.of(
            Product.newBuilder()
                .setProductId("product_id_example")
                .setProductType(ProductType.SUBS)
                .build()))
    .build()
billingClient.queryProductDetailsAsync(queryProductDetailsParams) {
billingResult,
productDetailsList ->
  // check billingResult
  // process returned productDetailsList
} )

8.

Nếu ứng dụng đang chạy khi người dùng hoàn tất giao dịch mua,

dependencies {

val billing_version = "6.1.0"
implementation("com.android.billingclient:billing-ktx:$billing_version")
}

1 sẽ được gọi lại và

dependencies {

val billing_version = "6.1.0"
implementation("com.android.billingclient:billing:$billing_version")
}

34 hiện tại là

val queryProductDetailsParams =

QueryProductDetailsParams.newBuilder()
    .setProductList(
        ImmutableList.of(
            Product.newBuilder()
                .setProductId("product_id_example")
                .setProductType(ProductType.SUBS)
                .build()))
    .build()
billingClient.queryProductDetailsAsync(queryProductDetailsParams) {
billingResult,
productDetailsList ->
  // check billingResult
  // process returned productDetailsList
} )

7. Ở thời điểm này, ứng dụng có thể xử lý giao dịch mua hàng bằng cách sử dụng phương thức tiêu chuẩn để . Ứng dụng cũng nên gọi hàm

QueryProductDetailsParams queryProductDetailsParams =

QueryProductDetailsParams.newBuilder()
    .setProductList(
        ImmutableList.of(
            Product.newBuilder()
                .setProductId("product_id_example")
                .setProductType(ProductType.SUBS)
                .build()))
    .build();
billingClient.queryProductDetailsAsync(
queryProductDetailsParams,
new ProductDetailsResponseListener() {
    public void onProductDetailsResponse(BillingResult billingResult,
            List productDetailsList) {
        // check billingResult
        // process returned productDetailsList
    }
}
)

0 trong phương thức

dependencies {

val billing_version = "6.1.0"
implementation("com.android.billingclient:billing:$billing_version")
}

18 của ứng dụng để xử lý những giao dịch mua đã chuyển sang trạng thái

val queryProductDetailsParams =

QueryProductDetailsParams.newBuilder()
    .setProductList(
        ImmutableList.of(
            Product.newBuilder()
                .setProductId("product_id_example")
                .setProductType(ProductType.SUBS)
                .build()))
    .build()
billingClient.queryProductDetailsAsync(queryProductDetailsParams) {
billingResult,
productDetailsList ->
  // check billingResult
  // process returned productDetailsList
} )

7 trong khi ứng dụng không chạy.

Ứng dụng cũng có thể dùng cho các giao dịch mua đang chờ xử lý bằng cách theo dõi

dependencies {

val billing_version = "6.1.0"
implementation("com.android.billingclient:billing:$billing_version")
}

39. Khi giao dịch mua chuyển từ trạng thái

val queryProductDetailsParams =

QueryProductDetailsParams.newBuilder()
    .setProductList(
        ImmutableList.of(
            Product.newBuilder()
                .setProductId("product_id_example")
                .setProductType(ProductType.SUBS)
                .build()))
    .build()
billingClient.queryProductDetailsAsync(queryProductDetailsParams) {
billingResult,
productDetailsList ->
  // check billingResult
  // process returned productDetailsList
} )

8 sang

val queryProductDetailsParams =

QueryProductDetailsParams.newBuilder()
    .setProductList(
        ImmutableList.of(
            Product.newBuilder()
                .setProductId("product_id_example")
                .setProductType(ProductType.SUBS)
                .build()))
    .build()
billingClient.queryProductDetailsAsync(queryProductDetailsParams) {
billingResult,
productDetailsList ->
  // check billingResult
  // process returned productDetailsList
} )

7, ứng dụng sẽ nhận được thông báo

dependencies {

val billing_version = "6.1.0"
implementation("com.android.billingclient:billing:$billing_version")
}

42. Nếu giao dịch mua bị huỷ, ứng dụng sẽ nhận được thông báo

dependencies {

val billing_version = "6.1.0"
implementation("com.android.billingclient:billing:$billing_version")
}

43. Điều này có thể xảy ra nếu khách hàng không hoàn tất việc thanh toán trong khung thời gian yêu cầu. Khi nhận được những thông báo này, bạn có thể sử dụng API Nhà phát triển Google Play, trong đó có trạng thái

val queryProductDetailsParams =

QueryProductDetailsParams.newBuilder()
    .setProductList(
        ImmutableList.of(
            Product.newBuilder()
                .setProductId("product_id_example")
                .setProductType(ProductType.SUBS)
                .build()))
    .build()
billingClient.queryProductDetailsAsync(queryProductDetailsParams) {
billingResult,
productDetailsList ->
  // check billingResult
  // process returned productDetailsList
} )

8 cho

dependencies {

val billing_version = "6.1.0"
implementation("com.android.billingclient:billing:$billing_version")
}

45.

Bạn có thể tìm thấy các bước chi tiết về cách kiểm thử tình huống này trong phần .

Xử lý giao dịch mua số lượng nhiều

Được hỗ trợ trong phiên bản 4.0 trở lên của Thư viện Google Play Billing, Google Play cho phép khách hàng mua cùng một sản phẩm trong ứng dụng với số lượng nhiều trong một giao dịch bằng cách chỉ định số lượng trong giỏ hàng. Ứng dụng cần xử lý các giao dịch mua hàng số lượng nhiều và cấp quyền dựa trên số lượng mặt hàng đã chỉ định.

Để cho phép xử lý các giao dịch mua với số lượng nhiều, logic cấp phép của ứng dụng cần kiểm tra số lượng mặt hàng. Bạn có thể truy cập trường

dependencies {

val billing_version = "6.1.0"
implementation("com.android.billingclient:billing:$billing_version")
}

46 qua một trong các API sau:

  • trong Thư viện Google Play Billing.
  • dependencies {
    val billing_version = "6.1.0"  
    implementation("com.android.billingclient:billing:$billing_version")  
    
    } 48 trong API Nhà phát triển Google Play.

Sau khi thêm logic để xử lý giao dịch mua số lượng nhiều, bạn cần bật tính năng mua số lượng nhiều cho sản phẩm tương ứng trên trang quản lý sản phẩm trong ứng dụng trong Google Play Console.

Truy vấn cấu hình thanh toán của người dùng

cung cấp quốc gia mà người dùng sử dụng trên Google Play.

Bạn có thể truy vấn cấu hình thanh toán của người dùng sau khi . Đoạn mã sau đây mô tả cách thực hiện lệnh gọi đến

dependencies {

val billing_version = "6.1.0"
implementation("com.android.billingclient:billing:$billing_version")
}

49. Hãy xử lý phản hồi bằng cách triển khai

dependencies {

val billing_version = "6.1.0"
implementation("com.android.billingclient:billing:$billing_version")
}

52. Trình nghe này nhận nội dung cập nhật cho tất cả các truy vấn cấu hình được bắt đầu từ ứng dụng của bạn.

Nếu

dependencies {

val billing_version = "6.1.0"
implementation("com.android.billingclient:billing:$billing_version")
}

53 được trả về không có lỗi nào, bạn có thể kiểm tra trường

dependencies {

val billing_version = "6.1.0"
implementation("com.android.billingclient:billing:$billing_version")
}

54 trong đối tượng

dependencies {

val billing_version = "6.1.0"
implementation("com.android.billingclient:billing:$billing_version")
}

55 để lấy thông tin Quốc gia trên Play của người dùng.