Tối đa hoá khả năng tích hợp Play Billing

1. Tổng quan

Tối ưu hoá các nguồn doanh thu và tự tin phát hành ứng dụng của bạn bằng lớp học lập trình tích hợp Thư viện Play Billing này của Google Play. Lớp học lập trình có cấu trúc này hướng dẫn bạn cách thiết lập, kiểm thử và triển khai quy trình xử lý giao dịch mua đáng tin cậy, giúp bạn đạt được mục tiêu kiếm tiền và mang đến trải nghiệm liền mạch hơn cho người dùng.

Chúng tôi sẽ giúp bạn thiết lập Thông báo theo thời gian thực dành cho nhà phát triển (RTDN) và Play Billing Lab cho các sản phẩm thuê bao và sản phẩm tính phí một lần của ứng dụng và trò chơi. Bạn sẽ tìm hiểu cách giảm tỷ lệ rời bỏ của người đăng ký; ngăn chặn hành vi gian lận và lạm dụng; kiểm thử các trường hợp đặc biệt; mô phỏng, tái tạo và giải quyết các vấn đề tiềm ẩn; đồng thời thử nghiệm các ưu đãi và thay đổi về giá mà không ảnh hưởng đến người dùng.

Đến cuối khoá học, bạn sẽ sẵn sàng triển khai các chiến lược thu hút lại người dùng, nhanh chóng giải quyết các thách thức về việc tích hợp, cải thiện lợi tức đầu tư, mang đến trải nghiệm cao cấp và tự tin ra mắt ứng dụng cũng như các bản cập nhật.

Điều kiện tiên quyết

Kiến thức bạn sẽ học được

  • Cách quản lý đúng vòng đời mua hàng để giúp tối ưu hoá mức tăng trưởng bằng các kỹ thuật cải thiện lượt chuyển đổi dạng giao dịch mua và khả năng giữ chân khách hàng
  • Cách thiết lập Thông báo theo thời gian thực dành cho nhà phát triển (RTDN) bằng Google Cloud Pub/Sub. Sau đó, bạn có thể tận dụng thông báo này để triển khai chiến dịch thu hút lại người dùng và các chiến lược quản lý vòng đời khác
  • Cách thiết lập một receiver trên máy chủ phụ trợ để xử lý an toàn các thông báo bằng tính năng theo dõi và xác định quyền chính xác nhằm giảm các trường hợp hoàn tiền ngoài ý muốn hoặc nguy cơ gian lận và sử dụng sai mục đích
  • Cách kiểm thử quá trình tích hợp và mô phỏng lỗi bằng Play Billing Lab để cải thiện trải nghiệm người dùng trong khi giảm chi phí phát triển

Bạn cần có

2. Chiến lược kiếm tiền từ gói thuê bao và giao dịch mua một lần

Khi bán các sản phẩm kỹ thuật số thông qua ứng dụng, một chiến lược kiếm tiền hiệu quả phải xem xét toàn bộ trải nghiệm người dùng, cả đối với giao dịch mua một lần và gói thuê bao. Trải nghiệm liền mạch có thể tăng mức độ sẵn sàng mua và giảm tỷ lệ rời bỏ.

Một quy trình mua phổ biến cho giao dịch mua một lần hoặc gói thuê bao sẽ bao gồm nhiều giai đoạn:

  1. Người dùng duyệt xem các mặt hàng để mua.
  2. Bắt đầu quy trình mua để người dùng hoàn tất giao dịch mua và thanh toán.
  3. Thông báo cho máy chủ của bạn về giao dịch mua đã hoàn tất
  4. Xác minh giao dịch mua hàng trên máy chủ.
  5. Cung cấp nội dung cho người dùng.
  6. 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 tiêu thụ giao dịch mua vào thời điểm thích hợp để người dùng có thể mua lại mặt hàng đó.

Tính năng tích hợp trong ứng dụng cho phép bạn khởi chạy quy trình mua và quản lý trải nghiệm người dùng này, tuy nhiên, bạn cần phải duy trì trạng thái cập nhật cho phần phụ trợ của mình đối với các quyền mà người dùng đang mua. Đây là điều quan trọng để theo dõi các giao dịch mua và quản lý các khía cạnh khác của trải nghiệm người dùng, chẳng hạn như quyền trên nhiều nền tảng.

Thông báo theo thời gian thực dành cho nhà phát triển (RTDN) là một cách hiệu quả để nhận biết các giai đoạn khác nhau này trong vòng đời giao dịch mua và có thể được sử dụng hiệu quả cả với tư cách là công cụ theo dõi hiệu suất theo thời gian thực và công cụ hỗ trợ các chiến lược thu hút lại người đăng ký.

Ví dụ: Giả sử người dùng của bạn vừa mua một mặt hàng mới hoặc vừa bỏ lỡ thời hạn thanh toán nên gói thuê bao đã chuyển sang thời gian ân hạn. Với RTDN phù hợp, bạn có thể nhận ra gần như theo thời gian thực rằng trạng thái của người dùng đã thay đổi và hành động cho phù hợp bằng cách thu hút người dùng tương tác nhiều hơn với mặt hàng họ vừa mua hoặc bằng cách gửi cho họ email nhắc nhở để cập nhật thông tin thanh toán nhằm tiếp tục gói thuê bao.

RTDN cũng là một cách hiệu quả để thêm các chế độ kiểm soát phía máy chủ bổ sung nhằm giúp bạn quản lý các giao dịch mua ngay cả khi ứng dụng của người dùng gặp vấn đề. Giả sử 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 thiết bị và ứng dụng của bạn nhận được thông báo về giao dịch mua thông qua trình nghe giao dịch mua. Với RTDN, bạn sẽ nhận được một thông báo độc lập thông qua máy chủ của mình, cho phép bạn nhận ra giao dịch mua và cấp quyền cho người dùng độc lập với vấn đề của ứng dụng, đảm bảo quy trình mua hàng đáng tin cậy.

Bạn có thể tìm hiểu thêm về tất cả các loại RTDN hiện được hỗ trợ tại đây. Mỗi loại RTDN cho biết một trạng thái mua riêng biệt. Bạn cần triển khai các cơ chế xử lý tương ứng để đảm bảo xử lý đúng cách khi cần trong các trường hợp sử dụng của bạn. Lớp học lập trình này sẽ hướng dẫn bạn thực hiện một ví dụ xử lý thông báo RTDN trong máy chủ phụ trợ bảo mật của bạn, bao gồm cả việc nhận thông báo, xác thực giao dịch mua và cấp quyền cho đúng người dùng khi người dùng hoàn tất thành công giao dịch mua trong ứng dụng của bạn. Sau đó, chúng tôi sẽ hướng dẫn bạn cách định cấu hình RTDN cho ứng dụng của mình.

3. Định cấu hình thông báo theo thời gian thực dành cho nhà phát triển (RTDN)

Thông báo theo thời gian thực dành cho nhà phát triển (RTDN) tận dụng Google Cloud Pub/Sub để cho phép bạn phản ứng ngay với những thay đổi về trạng thái giao dịch mua. Cloud Pub/Sub là một dịch vụ nhắn tin theo thời gian thực được quản lý toàn diện mà bạn có thể dùng để gửi và nhận tin nhắn giữa các ứng dụng độc lập. Google Play sử dụng Cloud Pub/Sub để đăng thông báo đẩy về các chủ đề mà bạn đăng ký.

Để bật RTDN, trước tiên bạn phải thiết lập Cloud Pub/Sub bằng cách sử dụng dự án Google Cloud Platform (GCP) của riêng mình, sau đó bật thông báo cho ứng dụng. Nếu bạn chưa biết rõ về GCP và Cloud Pub/Sub, hãy xem Hướng dẫn nhanh.

Tạo một chủ đề

Để bắt đầu nhận thông báo, bạn phải tạo một chủ đề và Google Play sẽ đăng thông báo về chủ đề này. Để tạo một chủ đề, hãy làm theo hướng dẫn trong phần Tạo chủ đề.

Tạo gói thuê bao Pub/Sub

Để nhận các tin nhắn được đăng lên một chủ đề, bạn phải tạo một gói thuê bao Pub/Sub cho chủ đề đó. Để tạo gói thuê bao Pub/Sub, hãy làm như sau:

  1. Đọc Hướng dẫn dành cho người đăng ký Cloud Pub/Sub để làm quen với cách định cấu hình gói thuê bao dưới dạng gói thuê bao đẩy hoặc gói thuê bao kéo. Trong lớp học lập trình này, chúng ta sẽ làm việc với một gói thuê bao kéo yêu cầu máy chủ phụ trợ bảo mật của bạn bắt đầu gửi các yêu cầu đến máy chủ Cloud Pub/Sub để truy xuất tin nhắn.
  1. Để tạo gói thuê bao, hãy làm theo hướng dẫn trong phần Thêm gói thuê bao.

Cấp quyền phát hành trên chủ đề của bạn

Cloud Pub/Sub yêu cầu bạn cấp các đặc quyền cho Google Play để phát hành thông báo về chủ đề của bạn.

  1. Mở Google Cloud Console.
  2. Chọn dự án của bạn, sau đó tìm "Pub/Sub" trong thanh tìm kiếm rồi chuyển đến trang cấu hình Pub/Sub. Tìm kiếm và truy cập vào trang cấu hình Pub/Sub
  3. Tìm chủ đề của bạn rồi mở phần cài đặt quyền truy cập. Mở chế độ cài đặt quyền
  4. Nhấp vào THÊM CHỦ THỂ để thêm tài khoản dịch vụ google-play-developer-notifications@system.gserviceaccount.com và cấp cho tài khoản này vai trò Nhà xuất bản Pub/Sub. Thêm tài khoản dịch vụ google-play-developer-notifications@system.gserviceaccount.com và cấp cho tài khoản này vai trò Nhà xuất bản Pub/Sub
  5. Nhấp vào Lưu để hoàn tất quá trình thiết lập chủ đề. Nhấp vào Lưu để hoàn tất quá trình thiết lập chủ đề.

Bật RTDN cho ứng dụng của bạn

Tìm hiểu cách thiết lập Thông báo theo thời gian thực dành cho nhà phát triển (RTDN) để cải thiện đáng kể quy trình tích hợp Play Billing. Bạn có thể cải thiện độ tin cậy của giao dịch mua bằng thông báo được cá nhân hoá, đồng thời ngăn chặn hành vi gian lận và sai trái để cải thiện lợi tức đầu tư (ROI) tổng thể.

RTDN cung cấp thông tin cập nhật ngay lập tức từ máy chủ đến máy chủ trực tiếp từ Google Play cho các sự kiện chính, chẳng hạn như gia hạn gói thuê bao, giao dịch mua mới và vấn đề về thanh toán. Các API này giúp hệ thống phụ trợ của bạn tự động đồng bộ hoá với trạng thái thực của quyền của người dùng, vượt qua các hạn chế phía máy khách và cho phép bạn phản ứng ngay lập tức và phù hợp.

Cách bật Thông báo theo thời gian thực dành cho nhà phát triển cho ứng dụng của bạn:

  1. Mở Google Play Console.
  2. Chọn ứng dụng của bạn.
  3. Chuyển đến mục Kiếm tiền qua Play > Thiết lập tính năng kiếm tiền.
  4. Di chuyển đến phần Thông báo theo thời gian thực dành cho nhà phát triển.
  5. Đánh dấu vào Bật thông báo theo thời gian thực.
  6. Trong trường Tên chủ đề, hãy nhập tên chủ đề đầy đủ trên Cloud Pub/Sub mà bạn đã định cấu hình trước đó. Tên chủ đề phải có định dạng projects/{project_id}/topics/{topic_name}, trong đó project_id là giá trị nhận dạng duy nhất cho dự án của bạn và topic_name là tên của chủ đề được tạo trước đó.
  7. Nhấp vào Gửi tin nhắn thử nghiệm để gửi tin nhắn thử nghiệm. Việc phát hành thử nghiệm sẽ giúp bạn đảm bảo mọi thứ được thiết lập và định cấu hình đúng cách. Khi quá trình phát hành thử nghiệm thành công, bạn sẽ nhận được một tin nhắn thông báo. Nếu đã đính kèm gói thuê bao theo chủ đề này thì bạn sẽ nhận được tin nhắn thử nghiệm. Đối với gói thuê bao kéo, hãy chuyển đến gói thuê bao trong Cloud Console, nhấp vào Xem tin nhắn rồi tiến hành kéo tin nhắn. Bạn nên xác nhận mọi tin nhắn bạn đã kéo để tránh việc gửi nhiều lần qua Cloud Pub/Sub. Đối với gói thuê bao đẩy, hãy kiểm tra xem tin nhắn thử nghiệm có được gửi đến điểm đẩy cuối hay không. Mã phản hồi thành công sẽ đóng vai trò là tin nhắn xác nhận. Nếu quá trình phát hành không thành công thì bạn sẽ thấy thông báo lỗi xuất hiện. Hãy đảm bảo tên chủ đề là chính xác và tài khoản dịch vụ google-play-developer-notifications@system.gserviceaccount.com có quyền truy cập Nhà xuất bản Pub/Sub vào chủ đề đó.
  8. Chọn loại thông báo bạn muốn nhận.
  • Nhận thông báo về gói thuê bao và tất cả giao dịch mua vô hiệu – nhận thông báo theo thời gian thực dành cho nhà phát triển liên quan đến gói thuê bao và giao dịch mua vô hiệu. Bạn sẽ không nhận được thông báo về giao dịch mua sản phẩm tính phí một lần.
  • Nhận tất cả thông báo về gói thuê bao và sản phẩm tính phí một lần – nhận thông báo về tất cả sự kiện liên quan đến gói thuê bao và giao dịch mua vô hiệu. Bạn cũng sẽ nhận được các sự kiện mua sản phẩm tính phí một lần, chẳng hạn như ONE_TIME_PRODUCT_PURCHASEDONE_TIME_PRODUCT_CANCELED. Hãy xem phần Vòng đời giao dịch mua hàng một lần để tìm hiểu thêm về những sự kiện mua hàng này.

a266e5dec5c93cd8.png

  1. Nhấp vào Lưu thay đổi.

Giờ đây, bạn đã hoàn tất thông báo theo thời gian thực dành cho nhà phát triển đối với ứng dụng của mình, cung cấp cho bạn các công cụ để giải quyết những thách thức thường gặp, chẳng hạn như tình trạng người dùng rời bỏ thông qua thông báo thu hút lại hoặc hành vi gian lận và sử dụng sai mục đích. Trong phần tiếp theo, chúng ta sẽ tạo một người đăng ký trong máy chủ phụ trợ bảo mật của bạn để sử dụng những thông báo gửi đến chủ đề Cloud Pub/Sub của bạn.

4. Nhận thông báo

Điều quan trọng là bạn phải luôn cập nhật trạng thái của các giao dịch mua trên máy chủ phụ trợ để mang lại trải nghiệm tốt nhất cho người dùng trong ứng dụng. Ví dụ: khi người dùng hoàn tất thành công một giao dịch mua bằng phương thức thanh toán trong ứng dụng, họ sẽ nhận được nội dung được gửi đến tài khoản của mình trong thời gian sớm nhất có thể.

Điều này đòi hỏi bạn phải phát hiện và xử lý kịp thời việc hoàn tất giao dịch mua. Thư viện Play Billing cung cấp nhiều cách để phát hiện giao dịch mua trong ứng dụng của bạn. Sau khi phát hiện thấy một giao dịch mua đã hoàn tất, ứng dụng của bạn phải thông báo cho máy chủ phụ trợ để xác minh giao dịch mua, cấp nội dung cho đúng người dùng rồi thông báo cho Google rằng giao dịch mua đã được xử lý. Tuy nhiên, có thể ứng dụng của bạn không phát hiện thấy giao dịch mua kịp thời vì nhiều lý do. Ví dụ: người dùng có thể 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 thiết bị và ứng dụng của bạn nhận được thông báo thông qua giao diện Thư viện Play Billing. RTDN cung cấp các chế độ kiểm soát bổ sung ở phía máy chủ để giúp bạn quản lý giao dịch mua ngay cả khi ứng dụng của người dùng gặp vấn đề. RTDN đảm bảo các thông báo độc lập cho máy chủ của bạn khi có thay đổi về trạng thái mua hàng, cho phép bạn nhận biết các thay đổi về trạng thái mua hàng gần như ngay lập tức thông qua một đường dẫn thứ hai độc lập với các vấn đề tiềm ẩn của ứng dụng, đảm bảo quy trình mua hàng đáng tin cậy hơn.

Trong phần này, bạn sẽ tạo một người đăng ký để sử dụng các thông báo được gửi đến chủ đề Cloud Pub/Sub của bạn bằng cách sử dụng Thư viện ứng dụng Cloud Pub/Sub. Các thư viện này hiện có sẵn bằng nhiều ngôn ngữ. Trong các phần sau, chúng ta sẽ thêm vào người đăng ký để xác minh giao dịch mua, cấp quyền cho đúng người dùng và xác nhận/tiêu thụ giao dịch mua trên máy chủ. Trong lớp học lập trình này, chúng ta sẽ sử dụng Java.

Mỗi lượt phát hành được tạo cho một chủ đề Cloud Pub/Sub, trong đó chứa một trường dữ liệu được mã hoá base64.

{
 "message": {
   "attributes": {
     "key": "value"
   },
   "data": "eyAidmVyc2lvbiI6IHN0cmluZywgInBhY2thZ2VOYW1lIjogc3RyaW5nLCAiZXZlbnRUaW1lTWlsbGlzIjogbG9uZywgIm9uZVRpbWVQcm9kdWN0Tm90aWZpY2F0aW9uIjogT25lVGltZVByb2R1Y3ROb3RpZmljYXRpb24sICJzdWJzY3JpcHRpb25Ob3RpZmljYXRpb24iOiBTdWJzY3JpcHRpb25Ob3RpZmljYXRpb24sICJ0ZXN0Tm90aWZpY2F0aW9uIjogVGVzdE5vdGlmaWNhdGlvbiB9",
   "messageId": "136969346945"
 },
 "subscription": "projects/myproject/subscriptions/mysubscription"
}

Sau khi bạn giải mã trường dữ liệu được mã hoá base64, DeveloperNotification sẽ chứa các trường sau:

{
 "version": string,
 "packageName": string,
 "eventTimeMillis": long,
 "oneTimeProductNotification": OneTimeProductNotification,
 "subscriptionNotification": SubscriptionNotification,
 "voidedPurchaseNotification": VoidedPurchaseNotification,
 "testNotification": TestNotification
}

Vui lòng tham khảo Thông tin tham khảo về thông báo theo thời gian thực dành cho nhà phát triển để biết thêm thông tin.

Sau đây là mã mẫu của NotificationReceiver để máy chủ phụ trợ bảo mật của bạn xử lý các thông báo Pub/Sub. Để xác thực với Security Command Center, hãy thiết lập Thông tin xác thực mặc định của ứng dụng, xem phần Thiết lập phương thức xác thực cho môi trường phát triển cục bộ.

import com.google.cloud.pubsub.v1.AckReplyConsumer;
import com.google.cloud.pubsub.v1.MessageReceiver;
import com.google.cloud.pubsub.v1.Subscriber;
import com.google.pubsub.v1.ProjectSubscriptionName;
import com.google.pubsub.v1.PubsubMessage;
import java.util.Base64;
import org.json.JSONObject;

/** Real-time developer notifications receiver. */
public class NotificationReceiver {

 private NotificationReceiver() {}

 /*
  * Receive notification messages from the subscription.
  *
  * @param projectId The project ID of your Google Cloud Project.
  * @param subscriptionId The subscription ID of the subscriber to the pub/sub topic.
  */
 public static void receiveNotificationMessages(String projectId, String subscriptionId) {
   ProjectSubscriptionName subscriptionName =
       ProjectSubscriptionName.of(projectId, subscriptionId);

   try {
     Subscriber subscriber =
         Subscriber.newBuilder(subscriptionName, new NotificationMessageReceiver()).build();
     // Start the subscriber.
     subscriber.startAsync().awaitRunning();

     subscriber.awaitTerminated();
   } catch (IllegalStateException e) {
     System.out.println("Subscriber stopped: " + e);
   }
 }

 static class NotificationMessageReceiver implements MessageReceiver {

   @Override
   public void receiveMessage(PubsubMessage message, AckReplyConsumer consumer) {
     // Decode the data into a String from the message data field.
     String jsonString = new String(Base64.getDecoder().decode(message.getData().toStringUtf8()));
     // Parse the String into a JSON object.
     JSONObject messageJson = new JSONObject(jsonString);

     // Fetch the value for certain fields.
     String version = messageJson.getString("version");
     String packageName = messageJson.getString("packageName");
     System.out.println("version: " + version);
     System.out.println("packageName: " + packageName);

     // Validate the purchase and grant the entitlement as needed.
     // More details in the following sections.
     // ......

     // Acknowledge the message to avoid repeated delivery.
     consumer.ack();
   }
 }
}

Giờ đây, bạn đã có một trình nhận thông báo sử dụng những tin nhắn được gửi đến chủ đề Cloud Pub/Sub trong máy chủ phụ trợ bảo mật của mình. Trong các phần sau, chúng ta sẽ đề cập đến các phương pháp hay nhất để xử lý thông báo RTDN trong máy chủ phụ trợ.

5. Đính kèm mã nhận dạng người dùng trong quy trình mua hàng trong ứng dụng của bạn

Khi nhận được thông báo RTDN về nội dung cập nhật trạng thái giao dịch mua, máy chủ của bạn cần biết người dùng nào đã thực hiện giao dịch mua để xử lý giao dịch đó, chẳng hạn như phân phối nội dung cho đúng người dùng. Bạn có thể thực hiện việc này bằng cách đính kèm mọi giá trị nhận dạng người dùng mà bạn có cho người dùng thực hiện giao dịch mua bằng obfuscatedAccountId khi khởi chạy quy trình mua trong ứng dụng. Giá trị nhận dạng ví dụ có thể là phiên bản bị làm rối của thông tin đăng nhập của người dùng trong hệ thống của bạn. Việc đặt tham số này có thể giúp Google phát hiện hành vi gian lận. Ngoài ra, phương pháp này có thể giúp bạn đảm bảo rằng giao dịch mua được phân bổ cho đúng người dùng như đã thảo luận trong phần cấp quyền cho người dùng.

Sau đây là mã mẫu để đính kèm giá trị nhận dạng người dùng khi chạy quy trình mua trong ứng dụng bằng cách đặt obfuscatedAccountId.

// An activity reference from which the billing flow will be launched.
Activity activity = ...;
// A user identifier, e.g. an obfuscated user id in your system.
String obfuscatedAccountId = ...;

ImmutableList<ProductDetailsParams> productDetailsParamsList =
    ImmutableList.of(
        ProductDetailsParams.newBuilder()
            // retrieve a value for "productDetails" by calling queryProductDetailsAsync()
            .setProductDetails(productDetails)
            // set the offer token to specify the offer to purchase when applicable, e.g., subscription products
            // .setOfferToken(offerToken)
            .build()
    );

BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder()
    .setProductDetailsParamsList(productDetailsParamsList)
    .setObfuscatedAccountId(obfuscatedAccountId)
    .build();

// Launch the billing flow
BillingResult billingResult = billingClient.launchBillingFlow(activity, billingFlowParams);

Như bạn sẽ thấy trong phần tiếp theo, mã nhận dạng người dùng được đặt trong quy trình mua hàng sẽ có trong giao dịch mua và có thể dùng để cấp quyền cho đúng người dùng.

6. Xác minh giao dịch mua trước khi cấp quyền

Trong phần này, chúng ta sẽ tìm hiểu các phương pháp hay nhất để xác minh giao dịch mua trước khi cấp quyền trong máy chủ phụ trợ bảo mật của bạn.

Sau khi người dùng mua sản phẩm tính phí một lần, người đăng ký Pub/Sub trong máy chủ phụ trợ bảo mật của bạn sẽ nhận được một thông báo Pub/Sub. Bạn nên làm những việc sau trong máy chủ phụ trợ:

  1. Phân tích cú pháp purchaseToken từ thông báo Pub/Sub. Bạn nên giữ một bản ghi về tất cả các giá trị purchaseToken cho mọi giao dịch mua hàng.
  2. Xác minh rằng giá trị purchaseToken của giao dịch mua hàng hiện tại không khớp với bất kỳ giá trị purchaseToken nào trước đó. purchaseToken là giá trị duy nhất trên tổng thể, vì vậy, bạn có thể sử dụng giá trị này làm khoá chính trong cơ sở dữ liệu một cách an toàn.
  3. Sử dụng điểm cuối purchases.products:get trong Google Play Developer API để xác minh bằng Google rằng giao dịch mua hàng là hợp lệ.
  1. Nếu giao dịch mua hàng là hợp lệ và chưa được sử dụng trước đây thì bạn có thể cấp quyền một cách an toàn cho mặt hàng trong ứng dụng hoặc gói thuê bao.
  2. Bạn chỉ nên cấp quyền khi trạng thái giao dịch mua là PURCHASED và đảm bảo xử lý giao dịch mua PENDING một cách phù hợp. Bạn có thể xem thêm thông tin trong phần Xử lý giao dịch đang chờ xử lý.

Ví dụ về mã sau đây tạo một ứng dụng API cho Google Play Developer API. Chúng ta sẽ dùng khoá này để thực hiện các lệnh gọi API sau này.

import com.google.api.client.auth.oauth2.Credential;
import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.gson.GsonFactory;
import com.google.api.services.androidpublisher.AndroidPublisher;
import com.google.api.services.androidpublisher.AndroidPublisherScopes;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.util.Collections;

/** Helper class to initialize the publisher APIs client library. */
public class AndroidPublisherHelper {
 /* Your application name */
 private static final String APPLICATION_NAME = "YourApplicationName";

 /* Load credentials from a JSON key file. Replace with the actual path to your downloaded service
  * account key file.
  */
 private static final String RESOURCES_CLIENT_SECRETS_JSON =
     "/path/to/your/service_account_key.json";

 /** Global instance of the JSON factory. */
 private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance();

 /* The API client */
 private static final AndroidPublisher ANDROID_PUBLISHER = init();

 /**
  * Performs all necessary setup steps for running requests against the API.
  *
  * @return the {@link AndroidPublisher} service
  */
 private static AndroidPublisher init(){
   try {
     // Authorization.
     Credential credential =
         GoogleCredential.fromStream(
                 AndroidPublisherHelper.class.getResourceAsStream(RESOURCES_CLIENT_SECRETS_JSON))
             .createScoped(Collections.singleton(AndroidPublisherScopes.ANDROIDPUBLISHER));

     HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();

     // Set up and return API client.
     return new AndroidPublisher.Builder(httpTransport, JSON_FACTORY, credential)
         .setApplicationName(ApplicationConfig.APPLICATION_NAME)
         .build();
   } catch (GeneralSecurityException | IOException ex) {
     throw new RuntimeException("fail to initialize the publisher APIs client library", ex);
   }
 }
}

Sau đó, chúng ta sẽ thêm logic để thực hiện lệnh gọi API và sửa đổi receiver đã tạo trước đó để xác thực giao dịch mua và cấp quyền cho đúng người dùng.

Trong AndroidPublisherHelper, hãy thêm phương thức sau để tìm nạp ProductPurchase từ điểm cuối Purchases.products:get trong API Nhà phát triển Google Play.

 /* Fetch the ProductPurchase for the one-time product purchase from
  * Purchases.products.get endpoint in the Google Play Developer API
  */
 public static ProductPurchase executeProductPurchasesGet(
     String packageName, String sku, String purchaseToken) {
   try {
     ProductPurchase productPurchase =
         ANDROID_PUBLISHER.purchases().products().get(packageName, sku, purchaseToken).execute();
     return productPurchase;
   } catch (IOException ex) {
     log.error("Exception was thrown while getting a product purchase", ex);
     // It is recommended to apply some retry mechanism, such as exponential backoff, to fetch the purchase in case of transient failures.
     return null;
   }
 }

Trong NotificationMessageReceiver, hãy xác thực giao dịch mua và cấp quyền cho đúng người dùng trong hệ thống của bạn dựa trên dữ liệu có trong thông báo. Bạn nên tiếp tục theo dõi purchaseToken trong máy chủ để tránh xử lý trùng lặp.

 @Override
 public void receiveMessage(PubsubMessage message, AckReplyConsumer consumer) {
   // Decode the data into a String from the message data field.
   String jsonString = new String(Base64.getDecoder().decode(message.getData().toStringUtf8()));
   // Parse the String into a JSON object.
   JSONObject messageJson = new JSONObject(jsonString);

   // Fetch the value for certain fields.
   String version = messageJson.getString("version");
   String packageName = messageJson.getString("packageName");

   // Process notification data based on your business requirements.
   // Process oneTimeProductNotification in the message.
   JSONObject oneTimeProductNotificationJson =
       messageJson.getJSONObject("oneTimeProductNotification");
   if (oneTimeProductNotificationJson != null) {
     String purchaseToken = oneTimeProductNotificationJson.getString("purchaseToken");
     String sku = oneTimeProductNotificationJson.getString("sku");
     int notificationType = oneTimeProductNotificationJson.getInt("notificationType");

     if (notificationType == 1) {
       // ONE_TIME_PRODUCT_PURCHASED - A one-time product was successfully purchased by a user.
       // Verify that the purchaseToken value does not match any previous purchaseToken values in
       // your backend system to avoid duplicate processing.
       ......
       // Fetch the ProductPurchase from Purchases.products.get endpoint
       ProductPurchase productPurchase =
         AndroidPublisherHelper.executeProductPurchasesGet(packageName, sku, purchaseToken);
       if (productPurchase != null && productPurchase.getPurchaseState() == 0) {
         // The purchase is valid and in PURCHASED state.

         // The account Id set in the App when launching the billing flow.
         String obfuscatedExternalAccountId = productPurchase.getObfuscatedExternalAccountId();
         // Grant the entitlement to the correct account for obfuscatedExternalAccountId in your
         // system.
       ......
       }
     }
     // Process subscriptionNotification in the message.
     JSONObject subscriptionNotificationJson = messageJson.getJSONObject("subscriptionNotification");
     if (subscriptionNotificationJson != null) {
       ......
     }
     // Process other notification data in the message as needed.
     ......
   }

   // Acknowledge the message to avoid repeated delivery.
   consumer.ack();
 }

7. Thông báo cho Google rằng giao dịch mua đã được xử lý

Sau khi cấp quyền, bạn nên thông báo cho Google rằng giao dịch mua đã được xử lý bằng cách gọi các điểm cuối purchases.products:consume hoặc purchases.products:acknowledge trong API Nhà phát triển Play từ máy chủ phụ trợ bảo mật của bạn để sử dụng một sản phẩm tiêu dùng hoặc xác nhận một sản phẩm không phải hàng tiêu dùng.

Trong AndroidPublisherHelper, hãy thêm các phương thức sau để gọi purchases.products:consume hoặc purchases.products:acknowledge trong API Nhà phát triển Google Play.

 /* Consume the one-time product purchase by calling
  * Purchases.products.consume endpoint in the Google Play Developer API
  */
 public static void executeProductPurchasesConsume(
     String packageName, String sku, String purchaseToken) {
   try {
     ANDROID_PUBLISHER
       .purchases().products().consume(packageName, sku, purchaseToken).execute();
   } catch (IOException ex) {
     log.error("Exception was thrown while consuming a product purchase", ex);
     // It is recommended to apply some retry mechanism, such as exponential backoff, to ensure the purchase is correctly consumed in case of transient failures.
   }
 }

 /* Acknowledge the one-time product purchase by calling
  * Purchases.products.acknowledge endpoint in the Google Play Developer API
  */
 public static void executeProductPurchasesAcknowledge(
     String packageName, String sku, String purchaseToken) {
   try {
     ANDROID_PUBLISHER
       .purchases().products().acknowledge(packageName, sku, purchaseToken, new ProductPurchasesAcknowledgeRequest()).execute();
   } catch (IOException ex) {
     log.error("Exception was thrown while acknowledging a product purchase", ex);
     // It is recommended to apply some retry mechanism, such as exponential backoff, to ensure the purchase is correctly acknowledged in case of transient failures.
   }
 }

Trong NotificationMessageReceiver, hãy tiêu thụ giao dịch mua sản phẩm tiêu hao hoặc xác nhận giao dịch mua sản phẩm không tiêu hao sau khi cấp quyền trong máy chủ phụ trợ.

 @Override
 public void receiveMessage(PubsubMessage message, AckReplyConsumer consumer) {
   ......
       String obfuscatedExternalAccountId = productPurchase.getObfuscatedExternalAccountId();
       // Grant the entitlement to the correct account for obfuscatedExternalAccountId in your
       // system.
       ......
       // If the product is a consumable product, consume the purchase.
       AndroidPublisherHelper.executeProductPurchasesConsume(packageName, sku, purchaseToken);
       // Or if the product is a non-consumable product, acknowledge the purchase.
       // AndroidPublisherHelper.executeProductPurchasesAcknowledge(packageName, sku, purchaseToken);
  ......

 }

Bạn cần xác nhận vì ứng dụng này sẽ thông báo cho Google Play rằng người dùng đã được cấp quyền cho giao dịch mua hàng. Bạn nên xác nhận giao dịch mua hàng ngay sau khi cấp quyền.

Tuyệt vời! Bạn đã tích hợp thành công với Thông báo theo thời gian thực dành cho nhà phát triển, cho phép xử lý giao dịch mua một cách đáng tin cậy như minh hoạ trong lớp học lập trình này. Giờ đây, để đảm bảo mọi thứ hoạt động hoàn hảo, hãy cùng khám phá Play Billing Lab, một công cụ thân thiện với người dùng được thiết kế để giúp bạn kiểm thử quy trình tích hợp Play Billing.

8. Kiểm thử bằng Play Billing Lab

Để tự tin ra mắt, bạn nên kiểm thử quá trình tích hợp trong toàn bộ quá trình phát triển. Play Billing Lab là một ứng dụng Android miễn phí giúp nhà phát triển kiểm thử khả năng tích hợp với hệ thống thanh toán của Google Play, mang đến cho nhà phát triển một cách thức dễ dàng và thuận tiện để kiểm thử các tính năng của Play Billing, tích hợp nhanh hơn và tự tin hơn khi phát hành.

Play Billing Lab cung cấp nhiều tính năng kiểm thử để giúp bạn kiểm thử nhiều trường hợp, bao gồm:

Chúng tôi liên tục bổ sung các chức năng kiểm thử mới cho ứng dụng Play Billing Lab. Bạn có thể tải xuống và cài đặt Play Billing Lab từ Cửa hàng Play hoặc xem phần Kiểm thử quy trình tích hợp để biết thêm thông tin về cách kiểm thử bằng Play Billing Lab.

Sử dụng Play Billing Lab để kiểm thử BillingResponseCode

Việc kiểm thử tất cả các luồng BillingResponseCode là một thách thức thường gặp khi tích hợp ứng dụng của bạn với Thư viện Play Billing, vì bạn không có nhiều quyền kiểm soát đối với hoạt động giao tiếp giữa Cửa hàng Play và phần phụ trợ của Play. Tính năng Trình mô phỏng phản hồi trong ứng dụng Play Billing Lab cho phép bạn định cấu hình các phản hồi mã lỗi cho Thư viện Play Billing để kiểm thử nhiều tình huống lỗi phức tạp.

Ví dụ: bạn đã triển khai logic trong ứng dụng để sử dụng giao dịch mua sau khi ứng dụng phát hiện thấy giao dịch mua thành công. Bạn muốn kiểm thử trường hợp ứng dụng không tiêu thụ được giao dịch mua do lỗi mạng và bộ nhận RTDN trong máy chủ phụ trợ của bạn nhận được thông báo và xử lý giao dịch mua một cách chính xác. Bạn có thể tận dụng Trình mô phỏng phản hồi để mô phỏng tình huống kiểm thử. Sau đây là hướng dẫn các bước kiểm thử bằng Trình mô phỏng phản hồi Play Billing Lab.

Kiểm thử bằng Trình mô phỏng phản hồi

Khi kiểm thử bằng Trình mô phỏng phản hồi, ứng dụng của bạn sẽ giao tiếp với Play Billing Lab để nhận mã phản hồi mà bạn đã định cấu hình trong Trình mô phỏng phản hồi của Play Billing Lab.

Bật tính năng kiểm thử chế độ ghi đè thông tin thanh toán cho Thư viện Play Billing

Để cho phép Response Simulator giao tiếp với ứng dụng của bạn, trước tiên, bạn phải bật tính năng kiểm thử ghi đè thông tin thanh toán cho Thư viện Play Billing trong ứng dụng. Để làm việc này, hãy thêm các thẻ siêu dữ liệu sau vào tệp AndroidManifest.xml của ứng dụng.

<manifest ... >
  <application ... >
    ...
     <meta-data
      android:name="com.google.android.play.largest_release_audience.NONPRODUCTION"
      android:value="" />
    <meta-data
      android:name="com.google.android.play.billingclient.enableBillingOverridesTesting"
      android:value="true" />
  </application>
</manifest>

Tạo ứng dụng bằng tệp AndroidManifest.xml đã cập nhật. Giờ đây, ứng dụng của bạn đã sẵn sàng cho Trình mô phỏng phản hồi của Play Billing Lab.

Khi triển khai ứng dụng vào môi trường phát hành sau khi kiểm thử, bạn nên sử dụng một tệp AndroidManifest.xml riêng không chứa các thẻ siêu dữ liệu này hoặc đảm bảo rằng bạn đã xoá các thẻ này khỏi tệp AndroidManifest.xml.

Mô phỏng lỗi trong Thư viện Play Billing

Để kiểm thử bằng các lỗi mô phỏng của Thư viện Play Billing, trước tiên, hãy định cấu hình mã phản hồi trong ứng dụng Play Billing Lab, sau đó thực hiện kiểm thử trong ứng dụng của bạn.

Định cấu hình mã phản hồi

  1. Đăng nhập vào ứng dụng Play Billing Lab bằng tài khoản người kiểm thử được cấp phép cho ứng dụng của bạn. Hình ảnh sau đây minh hoạ Trang tổng quan của Play Billing Lab,bao gồm cả thẻ Trình mô phỏng phản hồi.

Trang tổng quan Play Billing Lab có Trình mô phỏng phản hồi

  1. Nhấp vào Quản lý trên thẻ Trình mô phỏng phản hồi để chuyển đến màn hình Trình mô phỏng phản hồi.
  2. Khi được nhắc, hãy cho phép Play Billing Lab gửi thông báo để xem trạng thái kết nối của ứng dụng.
  3. Bật nút chuyển Mô phỏng phản hồi của Thư viện Play Billing (nếu bạn chưa bật).

c841baa4c96bf306.png

  1. Chọn mã phản hồi cho các API Thư viện Play Billing mà bạn muốn kiểm thử. Để mô phỏng lỗi cho giao dịch mua đang sử dụng, hãy chọn một mã lỗi cho api consumeAsync. Lựa chọn của bạn sẽ tự động được lưu. Giờ đây, Trình mô phỏng phản hồi đã sẵn sàng gửi mã phản hồi đã chọn đến ứng dụng của bạn.

Kiểm thử ứng dụng

Giờ đây, bạn có thể kiểm thử ứng dụng để xác minh xem mọi thứ có hoạt động như mong đợi trong tình huống lỗi đã định cấu hình hay không. Mở ứng dụng của bạn và kích hoạt phương thức API Thư viện Play Billing. Nếu ứng dụng của bạn thực hiện lệnh gọi consumeAsync để sử dụng giao dịch mua, thì ứng dụng sẽ nhận được mã lỗi như bạn vừa định cấu hình. Bạn có thể xác minh xem ứng dụng của mình có hoạt động chính xác không dựa trên mã lỗi và máy chủ phụ trợ của bạn có đang xử lý giao dịch mua một cách chính xác hay không.

Sau khi hoàn tất kiểm thử, bạn chỉ cần tắt công tắc Mô phỏng phản hồi của Thư viện Play Billing để ngừng mô phỏng phản hồi.

Tìm hiểu thêm về cách kiểm thử bằng Play Billing Lab hoặc truy cập vào Trung tâm trợ giúp để biết thêm thông tin về cách kiểm thử tính năng thanh toán trong ứng dụng bằng Nhân viên kiểm thử được cấp phép.

9. Xin chúc mừng!

Bạn đã hoàn thành lớp học lập trình này và giờ đây, bạn đã có thể tối ưu hoá chiến lược kiếm tiền từ ứng dụng một cách hiệu quả để cải thiện trải nghiệm người dùng, từ đó nâng cao mức độ hài lòng của người dùng, số lượt chuyển đổi dạng giao dịch mua và tỷ lệ người đăng ký rời bỏ.

Bằng cách tận dụng Thông báo theo thời gian thực dành cho nhà phát triển và ứng dụng đồng hành Play Billing Lab, bạn có thể chủ động xử lý các sự kiện trong vòng đời giao dịch mua cho cả giao dịch mua một lầngói thuê bao.

Với những công cụ này, bạn có thể triển khai hiệu quả các chiến lược thu hút lại người dùng, nhanh chóng giải quyết các thách thức về việc tích hợp và cuối cùng là nâng cao trải nghiệm người dùng cũng như các nguồn doanh thu để tự tin ra mắt ứng dụng hoặc trò chơi của mình.

Sau khi hoàn thành lớp học lập trình này, bạn sẽ có các kỹ năng để quản lý toàn bộ hành trình mua sắm và kiểm thử nghiêm ngặt việc triển khai bằng Play Billing Lab, đảm bảo trải nghiệm người dùng liền mạch và tối đa hoá tiềm năng kiếm tiền trên Google Play.