Thông tin về lớp học lập trình này
1. Tổng quan
Tối ưu hoá các nguồn doanh thu và tự tin ra mắt ứng dụng của bạn thông qua lớp học lập trình tích hợp Thư viện Play Billing do Google Play tổ chức. Lớp học lập trình có cấu trúc này sẽ hướng dẫn bạn 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 hỗ trợ mục tiêu kiếm tiền và mang lại 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 gói thuê bao và sản phẩm tính phí một lần cho ứng dụng và trò chơi của bạn. Bạn sẽ tìm hiểu cách giảm tỷ lệ người đăng ký rời bỏ; bảo vệ khỏi hành vi gian lận và sai trái; kiểm thử các trường hợp hiếm gặp; mô phỏng, tái hiện và giải quyết các vấn đề tiềm ẩn; cũng như thử nghiệm các ưu đãi và thay đổi về giá mà không ảnh hưởng đến người dùng.
Cuối cùng, bạn sẽ sẵn sàng triển khai các chiến lược thu hút người dùng cũ, nhanh chóng giải quyết các thách thức về việc tích hợp, cải thiện ROI, mang đến trải nghiệm cao cấp và tự tin ra mắt ứng dụng cũng như bản cập nhật.
Điều kiện tiên quyết
- Quen thuộc với quy trình tích hợp cơ bản của Thư viện Play Billing
- Quen thuộc với việc phát triển ứng dụng Android (Java)
Kiến thức bạn sẽ học được
- Cách quản lý đúng cách vòng đời giao dịch mua để giúp tối ưu hoá sự tăng trưởng bằng các kỹ thuật cải thiện lượt chuyển đổi giao dịch mua và tỷ lệ 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 người dùng cũ và các chiến lược quản lý vòng đời khác
- Cách thiết lập trình nhận 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à quyền chính xác nhằm giảm nguy cơ hoàn tiền ngoài ý muốn hoặc gian lận và hành vi sai trái
- 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ó
- Quyền truy cập vào tài khoản nhà phát triển Play cho ứng dụng của bạn trong Google Play Console
- Truy cập vào Dự án Google Cloud Platform đã bật API Nhà phát triển Google Play
- Máy chủ phụ trợ để xử lý tài khoản và quyền cho ứng dụng Android
- Người kiểm thử giấy phép đã đăng ký ứng dụng của bạn trong Play Console
- Play Billing Lab đã được cài đặt trên thiết bị kiểm thử
2. Chiến lược kiếm tiền từ gói thuê bao và giao dịch mua hàng 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 thành công phải xem xét toàn bộ trải nghiệm người dùng, cả đối với giao dịch mua hàng một lần và gói thuê bao. Trải nghiệm liền mạch có thể giúp tăng tỷ lệ sẵn sàng mua hàng và giảm tỷ lệ rời bỏ.
Quy trình mua phổ biến cho giao dịch mua hàng một lần hoặc gói thuê bao sẽ bao gồm nhiều giai đoạn:
- Người dùng duyệt xem các mặt hàng để mua.
- Bắt đầu quy trình mua để người dùng hoàn tất giao dịch mua và thanh toán.
- Thông báo cho máy chủ của bạn về giao dịch mua đã hoàn tất
- 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 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 hay để nhận ra các giai đoạn này trong vòng đời giao dịch mua. Bạn có thể sử dụng thông báo này một cách hiệu quả cả dưới dạng công cụ theo dõi hiệu suất theo thời gian thực và công cụ để triển khai 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ỡ khoả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 gửi email nhắc họ cập nhật thông tin thanh toán để tiếp tục gói thuê bao.
RTDN cũng là một cách hay để thêm các chế độ kiểm soát phía máy chủ khác 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 thông báo độc lập thông qua máy chủ, cho phép bạn nhận dạng 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 đá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 báo hiệu một trạng thái mua hàng riêng biệt. Điều quan trọng là bạn phải 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 một ví dụ về cách xử lý thông báo RTDN trong máy chủ phụ trợ bảo mật, 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. Tiếp theo, chúng tôi sẽ hướng dẫn bạn cách định cấu hình RTDN cho ứng dụng.
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 lập tức 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 hiểu rõ về GCP và Cloud Pub/Sub, hãy xem Hướng dẫn nhanh.
Tạo 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 dành cho chủ đề đó. Để tạo gói thuê bao Pub/Sub, hãy làm như sau:
- Đọ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.
- Để 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.
- Mở Google Cloud Console.
- 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 chủ đề của bạn rồi mở phần cài đặt quyền.
- Nhấp vào ADD PRINCIPAL (THÊM TÀI KHOẢN CHÍNH) để 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. - 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
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) để nâng cao đáng kể khả năng 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 tức thì 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 đề 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 tế của quyền của người dùng, vượt qua các giới hạn phía máy khách và cho phép bạn phản ứng tức thì 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:
- Mở Google Play Console.
- Chọn ứng dụng của bạn.
- Chuyển đến phần Kiếm tiền qua Play > Thiết lập tính năng kiếm tiền.
- Cuộn đến phần Thông báo theo thời gian thực dành cho nhà phát triển.
- Đánh dấu vào Bật thông báo theo thời gian thực.
- 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 đó.
- 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. Nếu 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 tới trang của 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ủ đề đó. - 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_PURCHASED
vàONE_TIME_PRODUCT_CANCELED
. Hãy xem bài viết 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.
- 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 cho nhà phát triển cho ứng dụng của mình. Thông báo này cung cấp cho bạn các công cụ để giải quyết các thách thức phổ biến, chẳng hạn như việc người dùng rời bỏ ứng dụng thông qua thông báo thu hút người dùng quay lại, hoặc hành vi gian lận và lạm dụng. 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 để sử dụng các tin nhắn được 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 cập nhật trạng thái của 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ọ phải nhận được nội dung được phân phối đến tài khoản của họ càng sớm càng tốt.
Để làm được điều này, 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. Khi phát hiện 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 kịp thời giao dịch mua đó 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 thêm các chế độ kiểm soát 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 thông báo độc lập cho máy chủ của bạn khi trạng thái mua hàng thay đổi, cho phép bạn nhận ra 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 khách, đả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 trình đăng ký để sử dụng các thông báo được gửi đến chủ đề Cloud Pub/Sub 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/sử dụng 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 Tài liệu 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 Trung tâm điều hành bảo mật, hãy thiết lập Thông tin xác thực mặc định của ứng dụng. Xem bài viết Thiết lập thông tin 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();
}
}
}
Bây giờ, bạn có một trình nhận thông báo sử dụng các tin nhắn được gửi đến chủ đề Cloud Pub/Sub trong máy chủ phụ trợ bảo mật. 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ợ của bạn.
5. Đính kèm giá trị nhận dạng người dùng trong quy trình mua hàng trong ứng dụng
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 bất kỳ giá trị nhận dạng người dùng nào mà bạn có cho người dùng thực hiện giao dịch mua bằng obfuscatedAccountId khi chạy luồng mua hàng trong ứng dụng. Giá trị nhận dạng mẫu có thể là phiên bản đã làm rối mã đăng nhập của người dùng trong hệ thống. 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, tính năng này có thể giúp bạn đảm bảo 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 khởi chạy quy trình mua hàng 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, giá trị nhận dạng người dùng được đặt trong quy trình mua sẽ được đưa vào giao dịch mua và có thể được 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 tôi sẽ trình bày 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 thông báo Pub/Sub. Bạn nên làm như sau trong máy chủ phụ trợ:
- 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. - Xác minh rằng giá trị
purchaseToken
của giao dịch mua 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. - Hãy sử dụng điểm cuối purchases.products:get trong API Nhà phát triển Google Play để xác minh với Google rằng giao dịch mua hàng là hợp lệ.
- Nếu giao dịch mua 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.
- 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 muaPENDING
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 API Nhà phát triển Google Play. Chúng ta sẽ sử dụng nó để 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 thêm logic để thực hiện lệnh gọi API và sửa đổi trình nhận được 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 để tiêu thụ sản phẩm tiêu dùng hoặc xác nhận 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 dùng hoặc xác nhận giao dịch mua sản phẩm không phải sản phẩm tiêu dùng 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 đáng tin cậy như minh hoạ trong lớp học lập trình này. Bây giờ, để đảm bảo mọi thứ đều hoạt động hoàn hảo, hãy 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 kiểm thử quá 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ử tính năng tích hợp với hệ thống thanh toán của Google Play. Ứng dụng này giúp nhà phát triển kiểm thử các tính năng của Play Billing một cách dễ dàng và thuận tiện, 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 kiểm thử nhiều tình huống, bao gồm:
- Thay đổi Quốc gia trên Play trong Play Billing Lab và áp dụng chế độ cài đặt cho kiểm thử. Điều này cho phép kiểm thử trải nghiệm người dùng tuỳ chỉnh ở nhiều quốc gia/khu vực, bất kể người kiểm thử đang kiểm thử ở đâu
- Thử nghiệm bản dùng thử hoặc ưu đãi cho người dùng mới nhiều lần bằng cùng một tài khoản
- Kiểm thử các thay đổi về giá gói thuê bao mà không ảnh hưởng đến những người đăng ký đang hoạt động khác
- Mô phỏng mã phản hồi của Thư viện Play Billing để kiểm thử trong nhiều trường hợp lỗi
- Tăng tốc độ gia hạn gói thuê bao để đẩy nhanh quá trình kiểm thử
- Kiểm thử bằng phương thức thanh toán thực để bỏ qua một số tín hiệu rủi ro nhất định trong quy trình mua
Chúng tôi liên tục bổ sung các tính năng kiểm thử mới vào ứ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 bài viết Kiểm thử quá trình tích hợp để biết thêm thông tin về việc 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ả luồng BillingResponseCode là một thách thức thường gặp khi tích hợp ứng dụng 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 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 giao dịch mua thành công. Bạn muốn kiểm thử trường hợp ứng dụng của bạn không thể sử dụng giao dịch mua do lỗi mạng và bộ thu RTDN trong máy chủ phụ trợ của bạn sẽ 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 trường hợp kiểm thử. Phần sau đây sẽ hướng dẫn bạn các bước kiểm thử bằng Trình mô phỏng phản hồi của 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 để lấy 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ử ghi đè thông tin thanh toán cho Thư viện Play Billing
Để bật tính năng giao tiếp giữa Trình mô phỏng phản hồi và ứng dụng, trước tiên, bạn phải bật tính năng kiểm thử ghi đè thanh toán cho Thư viện Play Billing từ trong ứng dụng. Để thực hiện 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. Bây giờ, ứ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 của mình sang môi trường phát hành chính thức sau khi kiểm thử, bạn nên sử dụng một tệp AndroidManifest.xml
riêng biệt 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
- Đă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 cho thấy Trang tổng quan của Play Billing Lab,bao gồm cả thẻ Trình mô phỏng phản hồi.
- 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.
- Khi được nhắc, hãy cho phép thông báo từ Play Billing Lab để xem trạng thái kết nối của ứng dụng.
- 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).
- Chọn một 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 hàng tiêu 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. Bây giờ, Trình mô phỏng phản hồi đã sẵn sàng gửi các mã phản hồi đã chọn đến ứng dụng của bạn.
Kiểm thử ứng dụng
Bây giờ, 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 trường hợp lỗi đã định cấu hình hay không. Mở ứng dụng 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 theo mã lỗi hay không và máy chủ phụ trợ của bạn có xử lý chính xác giao dịch mua hay không.
Sau khi kiểm thử xong, bạn chỉ cần tắt nút 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 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 đã có đủ kiến thức để tối ưu hoá chiến lược kiếm tiền từ ứng dụng nhằm 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 giao dịch mua và tỷ lệ người đăng ký rời bỏ ứng dụng.
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 giải quyết các sự kiện trong vòng đời giao dịch mua cho cả giao dịch mua hàng một lần và gó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 người dùng cũ, nhanh chóng giải quyết các thách thức về việc tích hợp, đồng thời nâng cao trải nghiệm người dùng và 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 đã có các kỹ năng để quản lý toàn bộ hành trình mua hàng và kiểm thử nghiêm ngặt việc triển khai thông qua Play Billing Lab, đảm bảo trải nghiệm liền mạch cho người dùng và tối đa hoá tiềm năng kiếm tiền trên Google Play.