Vật phẩm chưa được đăng ký với google in-app billing

Trong bài viết về ASO [App Store Optimization], mình có nói đến việc sử dụng tính năng In-app purchase để tối ưu ASO. Tuy nhiên, mình lại chưa có bài viết hướng dẫn cách tạo In app purchase [mua hàng trong ứng dụng] cho Android app.

Để bù đắp cho thiếu sót đó, bài này mình sẽ hướng dẫn chi tiết cách tạo tính năng mua hàng trong ứng dụng [In App Purchase – hay viết tắt là IAP] để bạn vừa có thể kiếm tiền từ ứng dụng Android, vừa có thể tối ưu ASO.

# IAP là gì? Purchase là gì?

In App Purchase hay còn biết tới với tên là mua hàng trong ứng dụng. Đây là tính năng được tích hợp bên trong ứng dụng di động [iOS hay Android] hoặc PC [Windows/Ubuntu] để người dùng có thể mua những vật phẩm hoặc mở những tính năng nâng cao trong ứng dụng/game.

Thêm tính năng In-app purchase là một cách tuyệt vời để giúp bạn kiếm tiền từ ứng dụng.

Lưu ý: Dù muốn hay không, Google tính phí 30% cho mỗi giao dịch thành công mà ứng dụng của bạn sẽ thực hiện.

Dựa trên API có sẵn, chúng ta có thể phân loại các sản phẩm IAP thành hai loại:

  • Sản phẩm có phí tạm thời: Là những sản phẩm chỉ có giá trị tạm thời và một khi được mua, có thể được mua lại. Ví dụ nhân vật trong trò chơi có thể kiếm được điểm để chơi tiếp hoặc kiếm thêm tiền vàng trong kho của họ.
  • Sản phẩm có phí vĩnh viễn: Nó có thể được mua một lần trong ứng dụng của bạn và mang lại lợi ích vĩnh viễn. Sau khi mua, các sản phẩm này sẽ được liên kết vĩnh viễn với tài khoản Google của người dùng. Ví dụ: nâng cấp ứng dụng lên phiên bản pro hoặc xóa quảng cáo.

Với hướng dẫn này, mình sẽ chia sẻ mọi thứ cần thiết về In-app purchase [mua hàng trong ứng dụng]. Mình sẽ cố gắng càng chi tiết càng tốt, và sẽ chia nhỏ hướng dẫn này thành nhiều bước để dễ nắm bắt và làm theo hơn.

Chúng ta bắt đầu nhé!

#Tạo In App Purchase trong ứng dụng Android

Sau khi thực hiện IAP trong nhiều dự án, mình đã đúc kết kinh nghiệm và gói gọn vào một Helper cho tiện sử dụng sau này.

Những tính năng chính của helper này bao gồm:

  1. Thêm thư viện thanh toán [Google Play Billing] vào ứng dụng.
  2. Cấu hình sản phẩm/vật phẩm.
  3. Triển khai các lớp mua hàng cho ứng dụng của bạn.
  4. Lấy lịch sử mua hàng.
  5. Nhận thông tin chi tiết về sản phẩm.
  6. Thanh toán trong ứng dụng Google Play.

Các bạn download dự án mẫu [có kèm cả Helper mà mình nói ở trên] tại đây nhé:

Bài viết này, mình sẽ chia sẻ các bạn cách sử dụng Helper của mình để tạo In-app purchase. Thành quả sau bao năm chinh chiến!

♥ Đọc thêm: Tăng thứ hạng từ khóa trên App Store/Google Play] bằng ASO

1.Thêm thư viện Google Play Billing vào dự án

Thêm vào file build.gradle

implementation 'com.android.billingclient:billing:3.0.0'

Và thêm quyền truy cập internet permission trong file AndroidManifest.xml

Quyền thanh toán được nhúng trong thư viện. Vì vậy không cần thiết phải thêm quyền com.android.veinating.BILLING bên trong AndoridManifest nữa.

Cuối cùng là sync project.

2. Cấu hình tính năng mua hàng trong ứng dụng [In App Purchase]

Để có IAP trong ứng dụng của bạn, trước tiên bạn phải định cấu hình các sản phẩm trong ứng dụng của mình bằng Google Play Console. Vì mình sử dụng thư viện nên việc cấu hình cũng nhanh chóng và dễ dàng hơn.

Các bạn vào 2 link này để đọc tài liệu về cấu hình.

3.Triển khai các lớp mua hàng

Để triển khai, bạn hãy kế thừa  PurchasingHelper của mình vào ứng dụng của bạn, bạn cần khai báo và xác định đối tượng bằng callback interface [PurchasingHelperListener], sẽ cung cấp cho bạn các hàm trả về khi người dùng thao tác.

Bạn có thể sử dụng đoạn code sau:

PurchaseHelper purchaseHelper; purchaseHelper = new PurchaseHelper[this, getPurchaseHelperListener[]]; public PurchaseHelper.PurchaseHelperListener getPurchaseHelperListener[] { return new PurchaseHelper.PurchaseHelperListener[] { @Override public void onServiceConnected[int resultCode] { Log.d[TAG, "onServiceConnected: " + resultCode]; } @Override public void onSkuQueryResponse[List skuDetails] { } @Override public void onPurchasehistoryResponse[List purchasedItems] { purchaseHistory = purchasedItems; } @Override public void onPurchasesUpdated[int responseCode, @Nullable List purchases] { Log.d[TAG, "onPurchasesUpdated: " + responseCode]; } }; }

4.Lấy lịch sử mua hàng

Trước khi bắt đầu luồng thanh toán, chúng ta phải kiểm tra trạng thái của sản phẩm, để kiểm tra lịch sử mua hàng.

Bạn có thể thực hiện yêu cầu để có được tất cả các mặt hàng đã mua. Bạn sử dụng hàm sau:

purchaseHelper.getPurchasedItems[TYPE];

Hàm này sẽ trả lại phản hồi của yêu cầu vào callback trên PurchasehistoryResponse [Danh sách đã mua].

Từ đó, chúng ta có thể nhận được tất cả các giao dịch mua trong SkuType cụ thể được kết nối với ứng dụng cụ thể và tài khoản Google đang hoạt động trong thiết bị Google play.

♥ Có thể có ích với bạn: Khóa học lập trình Android miễn phí

5. Nhận thông tin chi tiết về sản phẩm

Để hiển thị chi tiết về các sản phẩm, chúng ta phải lấy thông tin chi tiết từ play console bằng ID sản phẩm.

Để làm điều này, chúng ta phải lấy danh sách Id sản phẩm và SkuType. Bạn sử dụng hàm sau:

purchaseHelper.getSkuDetails[skuList,BillingClient.SkuType.INAPP];

Nó sẽ trả về các kết quả qua hàm callback onSkuQueryResponse[List skuDetails];

6. Thanh toán trong ứng dụng Google Play

Để bắt đầu Mua hàng trong ứng dụng, bạn phải có SkuType và ID sản phẩm.

purchaseHelper.launchBillingFLow[BillingClient.SkuType.INAPP, getProduct_id[]];

Nó sẽ trả lại phản hồi của yêu cầu này vào hàm callback PurchaseUpdated [int answerCode, @Nullable List purchases]. Vậy là hoàn tất quá trình tạo In App Purchase!

Tạm kết

Như vậy, mình đã chia sẻ cách tạo In App Purchase vào ứng dụng Android.

Mình hi vọng, với những chia sẻ của mình sẽ giúp các bạn nhanh chóng hoàn thành tính năng này. Nhờ đó kiếm được nhiều tiền nhờ ứng dụng Android.

Đừng quên like và để lại bình luận ủng hộ mình nhé!

Cảnh báo: Sản phẩm thưởng không còn được hỗ trợ. Để biết thêm thông tin, hãy xem phần Tạo sản phẩm thưởng.

Một phương thức để mở khoá sản phẩm và lợi ích trong ứng dụng cho người dùng là tạo sản phẩm thưởng hoặc vật phẩm mà người dùng nhận được sau khi xem một video quảng cáo. Bằng cách cung cấp sản phẩm thưởng, bạn cho phép người dùng nhận phần thưởng và lợi ích trong ứng dụng mà không cần thực hiện giao dịch mua trực tiếp.

Tài liệu này giải thích cách triển khai chức năng dành riêng cho sản phẩm thưởng. Mục sơ đồ quy trình làm việc của trang này minh hoạ quy trình đó.

Xác định sản phẩm thưởng của ứng dụng

Sản phẩm thưởng có một SkuType của INAPP. Để đảm bảo người dùng có thể xem nhiều quảng cáo và nhận nhiều phần thưởng, sản phẩm cần được tiêu thụ.

Trước khi có thể cung cấp sản phẩm thưởng cho người dùng, bạn phải lấy SkuDetails cho sản phẩm đó. Để thực hiện điều này, hãy gọi hàm querySkuDetailsAsync[] với loại sản phẩm là SkuType.INAPP.

Khai báo quảng cáo phù hợp với lứa tuổi

Để tạo điều kiện tuân thủ với các nghĩa vụ pháp lý liên quan đến trẻ em và người dùng chưa đủ tuổi hợp pháp, bao gồm cả Đạo luật bảo vệ quyền riêng tư của trẻ em trên mạng [COPPA] và Quy định chung về bảo vệ dữ liệu [GDPR], ứng dụng phải khai báo quảng cáo nào nên được phân loại là hướng tới trẻ em tại Hoa Kỳ và quảng cáo nào hướng đến người dùng dưới độ tuổi hợp pháp để tự quản lý tài khoản hiện hành tại quốc gia của họ. Trung tâm trợ giúp AdMob giải thích khi nào bạn nên gắn thẻ cho các yêu cầu quảng cáo là được dành cho trẻ em và khi nào nên gắn thẻ xử lý nội dung dưới độ tuổi hợp pháp để tự quản lý tài khoản, cũng như tác động của việc làm này.

Khi bạn tạo ứng dụng thanh toán cho ứng dụng, hãy cân nhắc xem các yêu cầu quảng cáo có tặng thưởng nên được phân loại là hướng tới trẻ em hay không, hoặc có nên dành cho người dùng chưa đủ độ tuổi hợp pháp để tự quản lý tài khoản. Nếu cần thiết lập các hạn chế đối với những quảng cáo này, hãy gọi phương thức setChildDirected[] và setUnderAgeOfConsent[], truyền các giá trị thích hợp vào mỗi phương thức.

Đoạn mã sau đây cho biết cách khai báo rằng quảng cáo dạng video phù hợp với trẻ em hoặc người dùng chưa đủ độ tuổi hợp pháp để tự quản lý tài khoản:

val billingClient = BillingClient.newBuilder[context] .setListener[this] .setChildDirected[ChildDirected.CHILD_DIRECTED] .setUnderAgeOfConsent[UnderAgeOfConsent.UNDER_AGE_OF_CONSENT] .build[]
BillingClient billingClient = BillingClient.newBuilder[context] .setListener[this] .setChildDirected[ChildDirected.CHILD_DIRECTED] .setUnderAgeOfConsent[UnderAgeOfConsent.UNDER_AGE_OF_CONSENT] .build[];

Lưu ý: Sau khi tạo ứng dụng thanh toán, bạn không thể thay đổi giá trị của childDirected và underAgeOfConsent. Nếu bạn cần sử dụng giá trị khác, chẳng hạn như khi người dùng chuyển tài khoản trò chơi, hãy ngắt kết nối ứng dụng thanh toán hiện tại, tạo phiên bản mới của ứng dụng và kết nối phiên bản mới đó với thư viện Google Play Billing.

Tải quảng cáo dạng video

Bạn cần tải video trước khi hiển thị cho người dùng tuỳ chọn xem quảng cáo video để nhận sản phẩm thưởng. Để thực hiện việc này, hãy tạo một đối tượng RewardLoadParams, liên kết đối tượng này với đối tượng SkuDetails đại diện cho sản phẩm thưởng. Sau đó, hãy gọi phương thức loadRewardedSku[] của ứng dụng thanh toán, truyền trong đối tượng RewardLoadParams và đối tượngRewardResponseListener.

Lưu ý: Quảng cáo dạng video liên kết với sản phẩm thưởng không phải lúc nào cũng có sẵn để tải. Ngoài ra, tuỳ thuộc vào băng thông của người dùng, video có sẵn có thể tốn một khoảng thời gian để tải.

Trình nghe RewardResponseListener sẽ được thông báo khi video tải xong. Trình nghe cũng được thông báo nếu video không có sẵn hoặc nếu xảy ra lỗi khác, chẳng hạn như máy chủ hết thời gian chờ.

Để duy trì hiệu suất của thiết bị khi tải video liên kết với sản phẩm thưởng của ứng dụng, hãy lưu ý các phương pháp hay nhất sau:

  • Tải cùng lúc tối đa ba SKU của sản phẩm thưởng.
  • Cố gắng tải video bất cứ khi nào người dùng truy cập vào ứng dụng. Bước này giúp bạn kiểm tra xem video có vẫn được tải và sẵn có hay không.
  • Khi quyết định thời điểm tải video, hãy cân bằng giữa mức sử dụng băng thông và khả năng phản hồi của ứng dụng, chọn ra sự kết hợp phù hợp nhất với trường hợp sử dụng của bạn:

    • Thời điểm sớm nhất để tải video là sau khi bạn gọi getSkuDetails[] cho sản phẩm thưởng có liên quan. Ứng dụng vẫn có tính phản hồi cao nhưng bạn có thể lãng phí dữ liệu mạng khi tải một video mà người dùng không bao giờ xem.
    • Thời điểm muộn nhất để tải video là khi người dùng chuyển đến trang hiển thị video. Ứng dụng hiếm khi lãng phí băng thông trong trường hợp này, tuy nhiên người dùng có thể phải đợi một vài giây trước khi có thể nhấp vào nút xem video.

Đoạn mã sau đây minh hoạ quy trình tải quảng cáo dạng video phát trước khi người dùng nhận được sản phẩm thưởng:

if [skuDetails.isRewarded[]] { val params = RewardLoadParams.Builder[] .setSkuDetails[skuDetails] .build[] mBillingClient.loadRewardedSku[params.build[], object : RewardResponseListener { override fun onRewardResponse[@BillingResponse responseCode : Int] { if [responseCode == BillingResponse.OK] { // Enable the reward product, or make // any necessary updates to the UI. } } }] }
if [skuDetails.isRewarded[]] { RewardLoadParams.Builder params = RewardLoadParams.newBuilder[]; params.setSkuDetails[skuDetails]; mBillingClient.loadRewardedSku[params.build[], new RewardResponseListener[] { @Override public void onRewardResponse[int responseCode] { if [responseCode == BillingResponse.OK] { // Enable the reward product, or make // any necessary updates to the UI. } } }]; }

Cung cấp giao dịch mua hàng tặng thưởng cho người dùng

Nếu Thư viện Google Play Billing tải thành công video liên kết với một sản phẩm thưởng, tức là RewardResponseListener đã nhận được responseCode của BillingResponse.OK – bạn có thể bắt đầu quy trình thanh toán.

Cảnh báo: Không bắt đầu quy trình thanh toán nếu responseCode không phải BillingResponse.OK, tình trạng này sẽ xảy ra nếu không có quảng cáo dạng video. Bằng cách đó, bạn không hiển thị thêm hộp thoại báo lỗi để duy trì trải nghiệm tốt cho người dùng.

Bạn bắt đầu phát quảng cáo cho sản phẩm thưởng bằng cách gọi hàm launchBillingFlow[], giống như đối với tất cả loại sản phẩm trong ứng dụng khác. Mặc dù người dùng không mua hàng trực tiếp để nhận sản phẩm thưởng, bạn vẫn cần phải bật quy trình thanh toán để người dùng có thể nhận và sử dụng sản phẩm.

Tiêu thụ sản phẩm

Để thông báo cho ứng dụng thanh toán rằng người dùng đã nhận và tiêu thụ sản phẩm thưởng, hãy xử lý giao dịch mua trong phương thức onPurchasesUpdated[] của trình nghe ứng dụng thanh toán. Xin lưu ý rằng các giao dịch mua hàng có tặng thưởng cần được tiêu thụ.

Kiểm thử sản phẩm thưởng

Để kiểm thử cách ứng dụng tải quảng cáo dạng video và cung cấp cho người dùng sản phẩm thưởng, hãy nhờ đến người kiểm thử được cấp phép là những người nhận được quảng cáo thử nghiệm theo mặc định thay vì các quảng cáo thực. Để tìm hiểu cách thiết lập tài khoản cho những người kiểm thử này, hãy xem phần Kiểm thử ứng dụng Google Play Billing qua người dùng.

Một phương thức kiểm thử khác là dùng mã sản phẩm android.test.reward. Sản phẩm cụ thể này là tên đặt trước trong Google Play Billing, vì vậy, bạn không cần thêm sản phẩm đó vào danh sách sản phẩm trong ứng dụng trên Play Console.

Cảnh báo: Không sử dụng sản phẩm thực tế khi kiểm thử sản phẩm thưởng của ứng dụng, nếu không tài khoản có thể bị gắn cờ là tài khoản vi phạm hoặc gian lận.

Tuy nhiên, khi kiểm thử xong, đừng quên thay thế android.test.reward bằng mã sản phẩm của sản phẩm thưởng thực tế trước khi triển khai ứng dụng chính thức cho người dùng cuối.

Sơ đồ quy trình công việc của sản phẩm thưởng

Sơ đồ trình tự sau đây cho thấy cách người dùng, ứng dụng và Thư viện Google Play Billing hoạt động cùng nhau để hiển thị quảng cáo dạng video và cấp quyền truy cập vào sản phẩm thưởng cho người dùng:

Hình 1. Các bước để hoàn tất giao dịch mua sản phẩm thưởng bằng cách sử dụng Google Play Billing

Video liên quan

Chủ Đề