Play bởi bí quyết có tác dụng đi theo những bước vào bài bác viết lách Chuẩn bị
Chủ đề nà miêu tả bí quyết kết hợp Thư viện Google Play Billing trong phần mềm nhằm mở màn cung cấp loại sản phẩm .
Chủ đề nè gồm có những mã tỉ dụ dựa bên trên phần mềm kiểu bắt đầu bên trên GitHub. Bạn hoàn toàn có thể coi những khoáng sản khác biệt nhằm rõ được list khá đầy đủ phần mềm kiểu & khoáng sản nổi bật mà lại khách tham quan hoàn toàn có thể sài vào lúc kết hợp .
Vòng đời của một giao dịch mua hàng
Dưới trên đây được xem là quy trình tiến độ sắm nổi bật mang lại thanh toán giao dịch sắm dãy 1 dịp hay 1 gói thuê bao .
- Hiển thị cho người dùng những sản phẩm mà họ có thể mua.
- Khởi chạy quy trình mua để người dùng chấp nhận giao dịch mua hàng.
- Xác minh giao dịch mua hàng trên máy chủ.
- Cung cấp nội dung cho người dùng.
- 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 xử lý
giao dịch mua để người dùng không thể mua lại mặt hàng đó.Các gói thuê bao tiếp tục tự động hóa duy trì mang đến tới lúc bị diệt. Gói thuê bao hoàn toàn có thể trải đi qua những tinh thần 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 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 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 tạo kết nối với Google Play
Cách tiên phong nhằm phối kết hợp sở hữu mạng lưới hệ thống thanh toán giao dịch của Google Play được xem là gắn Thư viện Google Play Billing trong phần mềm của hành khách & khởi đầu liên kết .
Thêm phần phụ thuộc Thư viện Google Play Billing
Lưu ý:Nếu sẽ làm cho đi theo chỉ dẫn Giai đoạn chuẩn bị sẵn sàng thì khách du lịch sẽ đính thêm những phần phụ thuộc thiết yếu & hoàn toàn có thể đưa quý phái ứng dụng tiếp sau .
Thêm phần phụ thuộc Thư viện Google Play Billing vào tệp
build.gradle
của ứng dụng như dưới đây:Groovy
dependencies { def billing_version = "5.1.0" implementation "com.android.billingclient:billing:$billing_version" }Kotlin
dependencies { val billing_version = "5.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 tiện ích này vào dự án, hãy thêm phần phụ thuộc sau vào
tệpbuild.gradle
của ứng dụng như dưới đây:Groovy
dependencies { def billing_version = "5.1.0" implementation "com.android.billingclient:billing-ktx:$billing_version" }Kotlin
dependencies { val billing_version = "5.1.0" implementation("com.android.billingclient:billing-ktx:$billing_version") }Khởi chạy 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 chạy một bản sao củaBillingClient
.BillingClient
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.BillingClient
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 nghị bạn chỉ nên có một
kết nốiBillingClient
hiện hoạt tại một thời điểm để tránh tạo ra nhiều lệnh gọi lạiPurchasesUpdatedListener
cho một sự kiện duy nhất.Để tạo
BillingClient
, hãy sử dụng
newBuilder()
.
Bạn có thể chuyển bất kỳ ngữ cảnh nào đến hàmnewBuilder()
, đồng thờiBillingClient
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
setListener()
bằng cách truyền tham chiếu đến một
PurchasesUpdatedListener
.
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, Listpurchases) { // To be implemented in a later section. } }; private BillingClient billingClient = BillingClient.newBuilder(context) .setListener(purchasesUpdatedListener) .enablePendingPurchases() .build(); Lưu ý:
BillingResult
chứaBillingResult
còn chứaThư viện Google Play Billing sẽ trả về lỗi dưới dạng
BillingResult
chứaBillingResponseCode
, giúp phân loại các lỗi liên quan đến việc thanh toán mà ứng dụng của bạn có thể gặp phải. Ví dụ: nếu bạn nhận được mã lỗiSERVICE_DISCONNECTED
, ứng dụng phải khởi động lại kết nối với Google Play. Ngoài ra,còn chứa thông báo gỡ lỗi. Đây là một thông báo hữu ích trong quá trình phát triển để chẩn đoán lỗi.Kết nối với Google Play
Sau khi đã tạo một
BillingClient
, 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
startConnection()
.
Quá trình kết nối không đồng bộ, và bạn phải triển khai
BillingClientStateListener
để 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
onBillingServiceDisconnected()
và đảm bảo rằngBillingClient
gọi phương thức
startConnection()
để kết nối lại với Google Play trước khi tạo yêu cầu tiếp theo.lấy ví dụ như sau trên đây minh họa bí quyết khởi đầu 1 liên kết & đánh giá coi liên kết sẽ chuẩn bị sẵn sàng nhằm sài không :
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. } });Lưu ý:
BillingClient
khi
thực thi bất kỳ phương thức nào.Bạn nên triển khai logic kết nối lại của riêng mình và ghi đè phương thức
onBillingServiceDisconnected()
. Hãy đảm bảo bạn duy trì kết nốikhi thực thi bất kỳ phương thức nào.Hiển thị các sản phẩm có sẵn để mua
Sau lúc setup liên kết có Google Play, hành khách hoàn toàn có thể truy cập những loại sản phẩm cơ mà người trong gia đình hiện nay sở hữu & đến người ta sử dụng nhìn thấy những loại sản phẩm đấy .
Truy vấn thông báo chi tiết cụ thể về mẫu sản phẩm được xem là 1 bước không thể trước lúc chỉ ra loại sản phẩm mang đến người ta sài vì thế Việc truy cập nà tiếp tục đưa về thông báo loại sản phẩm sẽ bản địa hóa. Đối với gói thuê bao, cần bảo vệ loại sản phẩm chỉ ra tuân hành toàn bộ chủ trương 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
queryProductDetailsAsync()
.Để 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
ProductDetailsResponseListener
. Sau đó, bạn có thể ghi đè
onProductDetailsResponse()
để 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, ListproductDetailsList) { // 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
QueryProductDetailsParams
để chỉ định danh sách các chuỗi mã sản phẩm được tạo trong Google Play Console cùng vớiProductType
.ProductType
có thể làProductType.INAPP
đối với các sản phẩm tính phí một lần hoặcProductType.SUBS
đối với các gói thuê bao.Truy vấn bằng tiện ích Kotlin
Nếu đang sử dụng phần mở rộng Kotlin, 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
queryProductDetails()
.
queryProductDetails()
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ả:suspend fun processPurchases() { val productList = ArrayList
() productList.add("product_id_example") val params = QueryProductDetailsParams.newBuilder() params.setProductList(productList) .setType(ProductType.SUBS) // leverage queryProductDetails Kotlin extension function val productDetailsResult = withContext(Dispatchers.IO) { billingClient.queryProductDetails(params.build()) } // Process the result. } Trong một số ít trường hợp, một số thiết bị không hỗ trợ
ProductDetails
vàqueryProductDetailsAsync()
, 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 hướng dẫn di chuyển Thư viện Play Billing 5.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
List
các đối tượngProductDetails
. Sau đó, bạn có thể gọi nhiều phương thức cho mỗi đối tượngProductDetails
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ớpProductDetails
.Trước lúc xin chào phân phối 1 loại sản phẩm, có thể bình chọn nhằm bảo vệ rằng dân chúng sài không chiếm hữu mẫu sản phẩm đấy. Nếu người ta sử dụng với 1 loại sản phẩm chi tiêu và sử dụng nhưng vẫn vẫn vào tủ sách loại sản phẩm, thì chúng ta cần tiêu tốn trước lúc hoàn toàn có thể sắm lại loại sản phẩm đấy .
Trước lúc mang ra khuyễn mãi thêm 1 gói thuê bao, nên xác định rằng quần chúng sài không ĐK. không chỉ thế, phải quan tâm các vấn đề sau :
queryProductDetailsAsync()
trả về thông tin chi tiết của sản phẩm đăng ký và tối đa 50 ưu đãi cho mỗi gói thuê bao.queryProductDetailsAsync()
chỉ trả về những ưu đãi người dùng đủ điều kiện. Nếu người dùng cố gắng mua một ưu đãi mà họ không đủ điều kiện (ví dụ: nếu ứng dụng đang đưa ra danh sách ưu đãi đủ điều kiện nhưng đã hết hạn), thì Play sẽ thông báo cho người dùng việc họ không đủ điều kiện, và họ có thể chuyển sang mua gói cơ bản.Lưu ý:
Một số thiết bị Android có thể có phiên bản ứng dụng cũ của Cửa hàng Google Play và không hỗ trợ một số loại sản phẩm, chẳng hạn như các gói thuê bao. Trước khi ứng dụng bước vào quy trình thanh toán, bạn có thể gọi hàm
isFeatureSupported()
để xác định xem thiết bị có hỗ trợ các sản phẩm bạn muốn bán hay không. Để biết danh sách các loại sản phẩm có thể được hỗ trợ, hãy xemBillingClient.FeatureType
Bắt đầu quy trình mua
Để bắt đầu yêu cầu mua hàng từ ứng dụng của bạn, hãy gọi phương thức
launchBillingFlow()
từ luồng chính của ứng dụng. Phương thức này tham chiếu đến đối tượngBillingFlowParams
chứa đối tượngProductDetails
liên quan đã nhận được từ việc gọiqueryProductDetailsAsync()
.
Để tạo một đối tượngBillingFlowParams
, hãy dùng lớpBillingFlowParams.Builder
.Kotlin
// An activity reference from which the billing flow will be launched. val activity : Activity = ...; val productDetailsParamsList = listOf( BillingFlowParams.ProductDetailsParams.newBuilder() // retrieve a value for "productDetails" by calling queryProductDetailsAsync() .setProductDetails(productDetails) // to get an offer token, call ProductDetails.subscriptionOfferDetails() // for a list of offers that are available to the user .setOfferToken(selectedOfferToken) .build() ) val billingFlowParams = BillingFlowParams.newBuilder() .setProductDetailsParamsList(productDetailsParamsList) .build() // Launch the billing flow val billingResult = billingClient.launchBillingFlow(activity, billingFlowParams)Java
// An activity reference from which the billing flow will be launched. Activity activity = ...; ImmutableList productDetailsParamsList = ImmutableList.of( ProductDetailsParams.newBuilder() // retrieve a value for "productDetails" by calling queryProductDetailsAsync() .setProductDetails(productDetails) // to get an offer token, call ProductDetails.getSubscriptionOfferDetails() // for a list of offers that are available to the user .setOfferToken(selectedOfferToken) .build() ); BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder() .setProductDetailsParamsList(productDetailsParamsList) .build(); // Launch the billing flow BillingResult billingResult = billingClient.launchBillingFlow(activity, billingFlowParams);Phương thức
launchBillingFlow()
trả về một trong nhiều mã phản hồi
được liệt kê trong
BillingClient.BillingResponseCode
.
Hãy kiểm tra kết quả này để đảm bảo không có lỗi khi khởi chạy
quy trình mua.BillingResponseCode
OK
cho biết đã khởi chạy thành công.Khi bạn gọi hàm
launchBillingFlow()
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ình 1. Màn hình mua hàng trên Google Play hiển thị một
gói thuê bao mà bạn có thể mua.Google Play gọi hàm
onPurchasesUpdated()
để 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
PurchasesUpdatedListener
. Trình nghe này được chỉ định bằng phương thức
setListener()
khi bạn khởi chạy ứng dụng của mình.Bạn phải thực thi
onPurchasesUpdated()
để xử lý các mã phản hồi khả thi.
Ví dụ sau đây trình bày cách ghi đèonPurchasesUpdated()
:Kotlin
override fun onPurchasesUpdated(billingResult: BillingResult, purchases: List?) { if (billingResult.responseCode == BillingResponseCode.OK && purchases != null) { for (purchase in purchases) { handlePurchase(purchase) } } else if (billingResult.responseCode == BillingResponseCode.USER_CANCELED) { // Handle an error caused by a user cancelling the purchase flow. } else { // Handle any other error codes. } } Java
@Override void onPurchasesUpdated(BillingResult billingResult, Listpurchases) { if (billingResult.getResponseCode() == BillingResponseCode.OK && purchases != null) { for (Purchase purchase : purchases) { handlePurchase(purchase); } } else if (billingResult.getResponseCode() == BillingResponseCode.USER_CANCELED) { // Handle an error caused by a user cancelling the purchase flow. } else { // Handle any other error codes. } } đổi chác sắm thành công xuất sắc tiếp tục sản xuất ra 1 màn hình hiển thị tậu dãy thành công xuất sắc bên trên Google Play, tương tự như cũng như hình 2 .
Hình 2. Màn hình giao dịch mua thành công của
Google Play.Một lượt tậu dãy thành công xuất sắc cũng thành lập ra 1 mã tậu dãy. Mã nào là được xem là trị giá nhận dạng độc tôn, đại diện thay mặt mang đến nhân loại sử dụng & mã loại sản phẩm của mẫu sản phẩm vào phần mềm nhưng bọn họ sẽ sắm. Ứng dụng hoàn toàn có thể tàng trữ toàn cục mã thông tin thanh toán giao dịch tậu, nhưng mà du khách buộc phải truyền mã thông tin nè đến sever hỗ trợ bảo mật thông tin của hành khách. Tại sever ấy, du khách hoàn toàn có thể xác định & đảm bảo thanh toán giao dịch tậu ngoài hành động gian lậu. Quy trình nè đc miêu tả kỹ rộng vào phần mềm tiếp sau .
Người sài cũng tiếp tục nhấn đc biên nhận thanh toán giao dịch đựng Mã đối chọi dãy hay 1 mã nhận dạng độc tôn của thanh toán giao dịch đi qua tin nhắn. Người sử dụng tiếp tục dấn đc 1 gmail kèm Mã đối chọi dãy độc tôn đến mọi dịp tậu loại sản phẩm tính phao phí 1 dịp, cũng cũng như thanh toán giao dịch sắm gói thuê bao dịp đầu & các đợt duy trì tự động hóa chu kỳ tiếp theo sau. Bạn hoàn toàn có thể sài Mã 1-1 dãy nhằm quản trị tiền trong game hoàn trả vào 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
setIsOfferPersonalized()
để cho người dùng biết 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ì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.quý khách nên tìm hiểu thêm đi qua Art. 6 ( một ) ( ea ) CRD của Chỉ thị về quyền của quả đât chi tiêu và sử dụng ( 2011 / 83 / EU ) nhằm xác lập coi báo giá du khách cung ứng đến trái đất sử dụng sở hữu đc cá thể hóa giỏi ko .
setIsOfferPersonalized()
nhận giá trị nhập boolean. Khitrue
, giao diện người dùng Play có bao gồm thông tin công bố. Khifalse
, giao diện người dùng bỏ qua thông tin công bố. Giá trị mặc định làfalse
.Hãy truy vấn trong Cơ sở hỗ trợ địa cầu chi tiêu và sử dụng nhằm xác định gắn thêm thông báo .
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ẽ được thông báo về giao dịch mua thông qua
PurchasesUpdatedListener
.
nhưng có những trường hợp ứng dụng nhận biết được việc gọi hàm
BillingClient.queryPurchasesAsync()
như mô tả trong phần Tìm nạp giao dịch mua.Ứng dụng bắt buộc giải quyết và xử lý thanh toán giao dịch sắm đi theo bí quyết sau :
- Xác minh giao dịch mua hàng.
- 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à đã tiêu thụ để 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 xem
trạng thái mua hàng
có phải làPURCHASED
hay không.
Nếu giao dịch mua làPENDING
, thì bạn nên xử lý giao dịch mua như được mô tả trong phần Xử lý các giao dịch đang chờ. Đối với các giao dịch mua nhận được qua
onPurchasesUpdated()
hoặcqueryPurchasesAsync()
,
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
Xác minh giao dịch mua trước khi cấp quyền.Sau lúc xác định thanh toán giao dịch tậu, phần mềm tiếp tục chuẩn bị sẵn sàng cung cấp quyền mang lại con người sài. Sau lúc cung cấp quyền, phần mềm buộc phải chứng thực thanh toán giao dịch tậu. Hoạt động xác thực nà đến Google Play xác định rằng hành khách sẽ cấp cho quyền mang đến thanh toán giao dịch tậu .
Lưu ý:Nếu hành khách ko xác thực thanh toán giao dịch sắm vào vòng tam đến ngày, trái đất sử dụng tiếp tục tự động hóa đc trả tiền xu & Google Play tiếp tục tịch thu thanh toán giao dịch tậu đấy .
Quy trình cấp cho quyền & chứng thực thanh toán giao dịch sắm phụ thuộc vào trong Việc thanh toán giao dịch sắm nằm trong thứ hạng thanh toán giao dịch loại sản phẩm ko cần sản phẩm tiêu dùng, mẫu sản phẩm chi tiêu và sử dụng xuất xắc gói thuê bao .Đối với giao dịch mua sản phẩm tiêu dùng, phương thức
consumeAsync()
sẽ đá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. Phương thức này cũng cho phép ứng dụng đổi trạng thái của sản phẩm tính phí một lần thành có thể mua lại.Để xác định sản phẩm tính phí một lần đã được tiêu thụ, hãy gọi hàm
consumeAsync()
và bao gồm mã thông báo giao dịch mua mà Google Play cung cấp để
mua lại. Bạn cũng phải truyền một đối tượng sẽ triển khai giao diện
ConsumeResponseListener
. Đố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
onConsumeResponse()
mà Thư viện Google Play Billing này sẽ dùng khi hoạt động hoàn tất.lấy ví dụ như sau minh họa vấn đề tiêu hao 1 mẫu sản phẩm bởi mã sắm dãy đc link :
Kotlin
suspend fun handlePurchase(purchase: Purchase) { // Purchase retrieved from BillingClient#queryPurchasesAsync or your PurchasesUpdatedListener. val purchase : Purchase = ...; // Verify the purchase. // Ensure entitlement was not already granted for this purchaseToken. // Grant entitlement to the user. val consumeParams = ConsumeParams.newBuilder() .setPurchaseToken(purchase.getPurchaseToken()) .build() val consumeResult = withContext(Dispatchers.IO) { client.consumePurchase(consumeParams) } }Java
void handlePurchase(Purchase purchase) { // Purchase retrieved from BillingClient#queryPurchasesAsync or your PurchasesUpdatedListener. Purchase purchase = ...; // Verify the purchase. // Ensure entitlement was not already granted for this purchaseToken. // Grant entitlement to the user. ConsumeParams consumeParams = ConsumeParams.newBuilder() .setPurchaseToken(purchase.getPurchaseToken()) .build(); ConsumeResponseListener listener = new ConsumeResponseListener() { @Override public void onConsumeResponse(BillingResult billingResult, String purchaseToken) { if (billingResult.getResponseCode() == BillingResponseCode.OK) { // Handle the success of the consume operation. } } }; billingClient.consumeAsync(consumeParams, listener); }Lưu ý:Thông thường, nhu yếu tiêu hao hoàn toàn có thể ko thành công xuất sắc, vì vậy khách tham quan bắt buộc đánh giá sever trợ giúp bảo mật thông tin nhằm bảo vệ rằng mỗi mã thông tin thanh toán giao dịch tậu hầu hết không đc sài & chống phần mềm cung cấp quyền phổ biến dịp mang lại cộng 1 thanh toán giao dịch sắm. Hoặc phần mềm hoàn toàn có thể ngóng mang lại tới lúc hành khách thừa nhận đc bình luận tiêu hao thành công xuất sắc tự Google Play trước lúc cung cấp quyền. Nếu khách du lịch tậu duy trì lại thanh toán giao dịch sắm dãy của địa cầu sài mang lại tới lúc Google Play chuyển bình luận tiêu tốn thành công xuất sắc, các bạn buộc phải rất là cẩn trọng nhằm ko mất vết thanh toán giao dịch sắm sau lúc thừa nhận đc nhu yếu tiêu tốn .
Để xác nhận giao dịch mua sản phẩm không phải hàng tiêu dùng, hãy sử dụng
BillingClient.acknowledgePurchase()
trong Thư viện Google Play Billing hoặc
Product.Purchases.Acknowledge
trong API Nhà phát triển Google Play. 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 sử dụng phương thức
isAcknowledged()
trong Thư viện Google Play Billing hoặc trường
acknowledgementState
trong API Nhà phát triển Google.ví dụ như sau mang đến xác định bí quyết xác thực thanh toán giao dịch sắm bởi phương pháp dùng Thư viện Google Play Billing :
Kotlin
val client: BillingClient = ... val acknowledgePurchaseResponseListener: AcknowledgePurchaseResponseListener = ... suspend fun handlePurchase() { if (purchase.purchaseState === PurchaseState.PURCHASED) { if (!purchase.isAcknowledged) { val acknowledgePurchaseParams = AcknowledgePurchaseParams.newBuilder() .setPurchaseToken(purchase.purchaseToken) val ackPurchaseResult = withContext(Dispatchers.IO) { client.acknowledgePurchase(acknowledgePurchaseParams.build()) } } } }Java
BillingClient client = ... AcknowledgePurchaseResponseListener acknowledgePurchaseResponseListener = ... void handlePurchase(Purchase purchase) { if (purchase.getPurchaseState() == PurchaseState.PURCHASED) { if (!purchase.isAcknowledged()) { AcknowledgePurchaseParams acknowledgePurchaseParams = AcknowledgePurchaseParams.newBuilder() .setPurchaseToken(purchase.getPurchaseToken()) .build(); client.acknowledgePurchase(acknowledgePurchaseParams, acknowledgePurchaseResponseListener); } } }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. Bạn có thể xác nhận việc Xác nhận gói thuê bao bằng cách sử dụng hàm
BillingClient.acknowledgePurchase()
từ Thư viện Google Play Billing hoặcPurchases.Subscriptions.Acknowledge
từ API Nhà phát triển Google Play. Bạn cần xác nhận tất cả giao dịch mua gói thuê bao ban đầu. 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 việc đăng ký, hãy xem
chủ đề Bán gói thuê bao.Tìm nạp các giao dịch mua
Theo dõi thông tin cập nhật về giao dịch mua bằng cách sử dụng
PurchasesUpdatedListener
là không đủ để đảm bảo rằng ứng dụng sẽ xử lý tất cả giao dịch mua. Có thể
ứng dụng không biết tất cả giao dịch mua mà 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 trong khi mua hàng: 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 quaPurchasesUpdatedListener
.- 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 (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 đảm bảo ứng dụng gọi hàm
BillingClient.queryPurchasesAsync()
trong phương thứconResume()
để đảm bảo rằng tất cả giao dịch mua đều được xử lý thành công như mô tả trong phần xử lý giao dịch mua.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 ýqueryPurchasesAsync()
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
val params = QueryPurchasesParams.newBuilder() .setProductType(ProductType.SUBS) // uses queryPurchasesAsync Kotlin extension function val purchasesResult = billingClient.queryPurchasesAsync(params.build()) // check purchasesResult.billingResult // process returned purchasesResult.purchasesList, e.g. display the plans user ownsJava
billingClient.queryPurchasesAsync( QueryPurchasesParams.newBuilder() .setProductType(ProductType.SUBS) .build(), new PurchasesResponseListener() { public void onQueryPurchasesResponse(BillingResult billingResult, List purchases) { // check billingResult // process returned purchase list, e.g. display the plans user owns } } );Tìm nạp nhật ký mua
queryPurchaseHistoryAsync()
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 giao dịch mua đó đã hết hạn, bị huỷ hoặc đã hoàn tất.Nếu đang sử dụng tiện ích Kotlin, bạn có thể dùng hàm mở rộng
queryPurchaseHistory()
.Kotlin
val params = QueryPurchaseHistoryParams.newBuilder() .setProductType(ProductType.SUBS) // uses queryPurchaseHistory Kotlin extension function val purchaseHistoryResult = billingClient.queryPurchaseHistory(params.build()) // check purchaseHistoryResult.billingResult // process returned purchaseHistoryResult.purchaseHistoryRecordList, e.g. display purchaseJava
billingClient.queryPurchaseHistoryAsync( QueryPurchaseHistoryParams.newBuilder() .setProductType(ProductType.SUBS) .build(), new PurchaseHistoryResponseListener() { public void onPurchaseHistoryResponse( BillingResult billingResult, List purchasesHistoryList) { // check billingResult // process returned purchase history list, e.g. display purchase history } } );Xử lý giao dịch mua hàng được thực hiện bên ngoài ứng dụng
Một số thanh toán giao dịch sắm cũng như sài những mã khuyến mại hoàn toàn có thể diễn ra phía ngoại trừ phần mềm của du khách. khi địa cầu sử dụng tậu dãy phía ngoại trừ phần mềm, chúng ta mong muốn phần mềm mang ra thông tin vào phần mềm hay sài 1 số ít chính sách thông tin nhằm toàn cầu sài rõ được rằng phần mềm sẽ dấn & giải quyết và xử lý thanh toán giao dịch sắm 1 cách đúng chuẩn. Một số chính sách đc gật đầu được xem là :
- Hiển thị 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 chú ý quan tâm rằng phần mềm hoàn toàn có thể sống bất kể tinh thần làm sao lúc bắt gặp thanh toán giao dịch sắm. Thậm chí phần mềm hoàn toàn có thể ko đc setup lúc thanh toán giao dịch tậu dãy đc thực thi. Người sử dụng mong ước thừa nhận thông báo về thanh toán giao dịch sắm lúc liên tục dùng phần mềm, bất cứ phần mềm đấy đang được vào tinh thần sài như thế nào .
Quý khách hàng cần bắt gặp những thanh toán giao dịch tậu dãy bất kỳ phần mềm đang được vào tâm trạng như thế nào trên thời gian người ta sài sắm dãy. Tuy nhiên, đôi lúc cũng sở hữu các ngoại lệ hoàn toàn có thể gật đầu về bài toán ko thông tin lập tức mang lại loài người sài rằng bọn họ sẽ thừa nhận đc mẫu sản phẩm. ví dụ như :
- 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ị 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. 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, từ đó 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 ý:PurchasesUpdatedListener
đă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 của bạn. Tức là nếu quy trình đăng ký của bạn không tồn tại,PurchasesUpdatedListener
sẽ không được thông báo. Đây là lý do ứng dụng của bạn nên gọiBillingClient.queryPurchasesAsync()
trong phương thứconResume()
như đã đề cập trong Tìm nạp giao dịch.Xử lý các giao dịch đang chờ
Lưu ý:
Bạn phải xử lý các Giao dịch đang chờ xử lý trong Thư viện Google Play Billing phiên bản
2.0 trở lên. Bạn nên xử lý các giao dịch đang chờ xử lý một cách rõ ràng.Lưu ý:Quý khách hàng không hề sài phương pháp giao dịch thanh toán bổ trợ đến những thanh toán giao dịch sắm gói thuê bao .
Google Play tương hỗ thanh toán giao dịch đang được ngóng giải quyết và xử lý hay thanh toán giao dịch nhu yếu 1 hay đa dạng bước bổ trợ thân thời gian quần chúng sử dụng thực thi thanh toán giao dịch tậu & lúc phương pháp giao dịch thanh toán đến thanh toán giao dịch tậu đc giải quyết và xử lý. Ứng dụng ko đc cấp cho quyền mang đến những thanh toán giao dịch sắm nà đến tới lúc Google thông tin đến các bạn rằng sẽ tính hoang toàng thành công xuất sắc phương pháp giao dịch thanh toán của quần chúng sử dụng .Ví dụ: người dùng có thể tạo một giao dịch mua mặt hàng
PENDING
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ã thông qua cả
thông báo và 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. Sau đó, ứng dụng có thể cấp quyền cho người dùng.Ứng dụng phải hỗ trợ các giao dịch đang chờ xử lý bằng cách gọi hàm
enablePendingPurchases()
trong khi khởi chạy ứng dụng.Khi ứng dụng nhận được một giao dịch mua mới, thông qua
PurchasesUpdatedListener
hoặc từ việc gọi hàmqueryPurchasesAsync()
, hãy sử dụng phương thứcgetPurchaseState()
để xác định trạng thái mua hàng làPURCHASED
hayPENDING
.Lưu ý:
Bạn chỉ nên cấp quyền khi trạng thái là
PURCHASED
. Hãy sử dụng hàm
getPurchaseState()
thay vì hàmgetOriginaljson()
và đảm bảo
xử lý giao dịchPENDING
một cách phù hợp.Nếu ứng dụng đang chạy khi người dùng hoàn tất giao dịch mua,
PurchasesUpdatedListener
sẽ được gọi lại vàPurchaseState
hiện làPURCHASED
. Tại 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 để
xử lý giao dịch mua hàng một lần. Ứng dụng cũng nên gọi hàm
queryPurchasesAsync()
trong phương thứconResume()
của ứng dụng để
xử lý những giao dịch mua đã chuyển sang trạng tháiPURCHASED
trong khi
ứng dụng không chạy.Lưu ý:
Bạn chỉ nên xác nhận giao dịch mua hàng khi trạng thái là
PURCHASED
, tức là không xác nhận giao dịch mua hàng ở trạng tháiPENDING
. Thời hạn xác nhận
ba ngày chỉ bắt đầu khi trạng thái mua hàng chuyển đổi từ
“PENDING” (ĐANG CHỜ XỬ LÝ) thành “PURCHASED” (ĐÃ MUA).Ứng dụng cũng có thể sử dụng
Thông báo theo thời gian thực dành cho nhà phát triển
cho các giao dịch mua đang chờ xử lý bằng cách lắng nghe
OneTimeProductNotifications
. Khi giao dịch mua chuyển từ trạng tháiPENDING
sangPURCHASED
, ứng dụng sẽ nhận được
thông báoONE_TIME_PRODUCT_PURCHASED
. Nếu giao dịch mua bị huỷ,
ứng dụng sẽ nhận được thông báoONE_TIME_PRODUCT_CANCELED
. Đ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, bao gồm trạng tháiPENDING
cho
Purchases.products
.Lưu ý:Quý khách hàng hoàn toàn có thể bình chọn những thanh toán giao dịch đang được ngóng giải quyết và xử lý bởi bí quyết dùng trình kiểm hãy thử bản thảo. Ngoài nhị card tín dụng thanh toán kiểm hãy thử, trình kiểm hãy thử đc cấp cho phép sở hữu quyền truy vấn trong nhị dụng cụ kiểm hãy thử đến những phương pháp thanh toán giao dịch bị kéo dài vì lượng giao dịch thanh toán tự động hóa hoàn thành xong hay diệt sau vài ba phút. Trong quy trình kiểm hãy thử phần mềm, du khách bắt buộc xác định rằng phần mềm ko cung cấp quyền hay xác thực thanh toán giao dịch sắm gần sau lúc sắm bởi 1 vào nhì lý lẽ nè. Khi sắm dãy bởi phương pháp kiểm hãy thử tự động hóa kết thúc, các bạn cần xác định rằng phần mềm cấp cho quyền & xác thực thanh toán giao dịch tậu dãy sau lúc xong .
quý khách hàng hoàn toàn có thể mua nhìn thấy những bước chi tiết cụ thể về phương pháp kiểm hãy thử trường hợp nè vào phần mềm Kiểm hãy thử thanh toán giao dịch sắm dãy đang được hóng giải quyết và xử lý .Xử lý giao dịch mua số lượng nhiều
Được tương hỗ vào bản 4.0 trở lên trên của Thư viện Google Play Billing, Google Play được cho phép người mua sắm rộng rãi dịp cộng 1 mẫu sản phẩm vào phần mềm vào 1 thanh toán giao dịch bởi bí quyết bổ nhiệm con số vào giỏ dãy. Ứng dụng buộc phải giải quyết và xử lý những thanh toán giao dịch tậu dãy con số đa dạng & cung cấp quyền dựa bên trên con số loại sản phẩm sẽ bổ nhiệm .
Lưu ý:Số lượng đa dạng dành riêng đến những mẫu sản phẩm chi tiêu và sử dụng vào phần mềm, có nghĩa là những loại sản phẩm hoàn toàn có thể sắm, chi tiêu và sử dụng & sắm lại. Không nhảy chức năng nà mang đến các loại sản phẩm chỉ sắm 1 dị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ườngquantity
qua một trong
các API sau:
getQuantity()
trong Thư viện Google Play Billing.Purchases.products.quantity
từ API Nhà phát triển Google Play.Sau lúc gắn súc tích nhằm giải quyết và xử lý thanh toán giao dịch sắm con số đa dạng, khách tham quan buộc phải nhảy công dụng con số phệ mang đến mẫu sản phẩm tương xứng bên trên trang quản trị mẫu sản phẩm vào phần mềm vào Google Play Console .
Lưu ý:Hãy bảo vệ rằng phần mềm của khách du lịch được cho phép thực thi thanh toán giao dịch tậu sở hữu con số đa dạng trước lúc nhảy chức năng nà vào bảng tinh chỉnh và điều khiển. cũng có thể hành khách bắt buộc nên update lên bản phần mềm tương hỗ tác dụng nè trước lúc hoàn toàn có thể nhảy tác dụng bên trên loại sản phẩm .
Source: https://gauday.com