Điều này có thể dưới hình thức bán các mặt hàng dành riêng cho ứng dụng hoặc các gói đăng ký cho phép người dùng truy cập các tính năng xịn xò trong một thời gian giới hạn,
Để có thể thực hiện được tính năng này, mình xin giới thiệu với các bạn Google Play Billing – một dịch vụ cho phép bạn thanh toán những sản phẩm trong app của mình.
Thành phần chính của google play billing:
-
Google Play Console: là nơi bạn có thể thiết lập các loại sảm phẩm mà sẽ bán trên ứng dụng của mình cũng như các gói đăng ký sử dụng.
-
Google Play Billing Library: là thư viện sẽ cần tích hợp vào ứng dụng android của mình
-
Google Play Developer API: tập hợp các api mà bạn sử dụng để giao tiếp với google play. có thể truy vấn và quản lý các mặt hàng sẽ bán. Ngoài ra, sử dụng api còn có thể xác minh được người dùng có thực sự đã mua sản phẩm hay không hay đang gian lận hoặc kiểm tra có còn hoạt động hay không.
Nào, chúng ta bắt đầu bước vào việc set up môi trường cho In App Purchase.
- Đầu tiên chúng ta set up Google Play Billing Library cho ứng dụng của bạn.
Thêm dependency vào trong /build.gradle
implementation ‘com.android.billingclient:billing:3.0.0’
Để có thể tạo được các mặt hàng có thể mua trên google console, chúng ta cần phải upload 1 apk có chứa thư viện Google Billing lên console. Vì vậy sau khi thêm thư viện Google Billing, bạn hãy build 1 bản apk và upload lên play console.
-
Sau khi đã upload apk lên play console, bạn đã có thể tạo các sản phẩm cũng như các gói sẽ được bán trong GooglePlay Console. Khi tạo mới 1 sản phẩm, bạn được yêu cầu nhập product id cho mặt hàng đó. product id này sẽ không được trùng lặp và không thể thay đổi sau khi tạo.
-
Sau khi đã set up xong các sản phẩm, gói sẽ được bán, bạn có thể truy vấn các sản phẩm hay gói xem đã thành công hay chưa như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
<span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">Demo</span> <span class="token keyword">extends</span> <span class="token class-name">AppCompatActivity</span> <span class="token punctuation">{</span> <span class="token keyword">private</span> <span class="token class-name">BillingClient</span> billingClient<span class="token punctuation">;</span> <span class="token annotation punctuation">@Override</span> <span class="token keyword">protected</span> <span class="token keyword">void</span> <span class="token function">onCreate</span><span class="token punctuation">(</span><span class="token annotation punctuation">@Nullable</span> <span class="token class-name">Bundle</span> savedInstanceState<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">super</span><span class="token punctuation">.</span><span class="token function">onCreate</span><span class="token punctuation">(</span>savedInstanceState<span class="token punctuation">)</span><span class="token punctuation">;</span> billingClient <span class="token operator">=</span> <span class="token class-name">BillingClient</span><span class="token punctuation">.</span><span class="token function">newBuilder</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">)</span> <span class="token punctuation">.</span><span class="token function">enablePendingPurchases</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">.</span><span class="token function">setListener</span><span class="token punctuation">(</span><span class="token punctuation">(</span>billingResult<span class="token punctuation">,</span> list<span class="token punctuation">)</span> <span class="token operator">-></span> <span class="token punctuation">{</span> <span class="token comment">//TODO: Hàm này sẽ trả về kết quả khi người dùng thực hiện mua hàng. </span> <span class="token comment">// Mình sẽ nói chi tiết ở phần 2 của bài viết</span> <span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token punctuation">.</span><span class="token function">build</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//TODO: Connect ứng dụng của bạn với Google Billing</span> billingClient<span class="token punctuation">.</span><span class="token function">startConnection</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">BillingClientStateListener</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token annotation punctuation">@Override</span> <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">onBillingSetupFinished</span><span class="token punctuation">(</span><span class="token annotation punctuation">@NonNull</span> <span class="token class-name">BillingResult</span> billingResult<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">//TODO: Sau khi connect thành công, thử lấy thông tin các sản phẩm</span> <span class="token function">queryProducts</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token annotation punctuation">@Override</span> <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">onBillingServiceDisconnected</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">//TODO: Connect Google Play not success</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">private</span> <span class="token keyword">void</span> <span class="token function">queryProducts</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// TODO: tạo list các product id (chính là product id bạn đã nhập ở bước trước) để lấy thông tin</span> <span class="token class-name">List</span><span class="token generics"><span class="token punctuation"><</span><span class="token class-name">String</span><span class="token punctuation">></span></span> productIds <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ArrayList</span><span class="token generics"><span class="token punctuation"><</span><span class="token punctuation">></span></span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> productIds<span class="token punctuation">.</span><span class="token function">add</span><span class="token punctuation">(</span><span class="token string">"hello_babe"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token class-name">SkuDetailsParams</span> skuDetailsParams <span class="token operator">=</span> <span class="token class-name">SkuDetailsParams</span><span class="token punctuation">.</span><span class="token function">newBuilder</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">.</span><span class="token function">setSkusList</span><span class="token punctuation">(</span>productIds<span class="token punctuation">)</span> <span class="token punctuation">.</span><span class="token function">setType</span><span class="token punctuation">(</span><span class="token class-name">BillingClient</span><span class="token punctuation">.</span><span class="token class-name">SkuType</span><span class="token punctuation">.</span>INAPP<span class="token punctuation">)</span> <span class="token comment">//TODO: Sử dụng INAPP với one-time product và SUBS với các gói subscriptions. </span> <span class="token punctuation">.</span><span class="token function">build</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// TODO: Thực hiện query</span> billingClient<span class="token punctuation">.</span><span class="token function">querySkuDetailsAsync</span><span class="token punctuation">(</span>skuDetailsParams<span class="token punctuation">,</span> <span class="token punctuation">(</span>billingResult<span class="token punctuation">,</span> list<span class="token punctuation">)</span> <span class="token operator">-></span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>list <span class="token operator">!=</span> <span class="token keyword">null</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token class-name">SkuDetails</span> skuDetails<span class="token operator">:</span> list<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token class-name">Log</span><span class="token punctuation">.</span><span class="token function">d</span><span class="token punctuation">(</span><span class="token string">"Hello babe: "</span><span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token class-name">Gson</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">toJson</span><span class="token punctuation">(</span>skuDetails<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
Sau khi thành công, bạn sẽ lấy được thông tin của các sản phẩm sẽ bán. Chi tiết về các thông tin bạn có thể xem tại SkuDetails
Để hiểu rõ về INAPP và SUBS cũng như sự khác nhau giữa chúng, bạn hãy xem tại Google Billing Overview
Trên đây mình đã giới thiệu cho các bạn cách set up môi trường, tạo các sản phẩm và việc query các sản phẩm đang bán. Bài viết lần tới mình sẽ hướng dẫn các bạn thanh toán khi người dùng mua sản phẩm.
Cảm ơn bạn đã đọc bài viết!