PHẦN 1: CẤU HÌNH VÀ THÊM QUYỀN TÀI KHOẢN
Bước 1: ENABLE GOOGLE PLAY ANDROID DEVELOPER API
1.Truy cập Google Cloud Console
🔗 https://console.cloud.google.com
- Đăng nhập bằng tài khoản Google
- Chọn Project Firebase của bạn từ dropdown góc trên bên trái
2. Mở API Library
🔗 https://console.cloud.google.com/apis/library
Hoặc: Menu bên trái → APIs & Services → Library
3. Tìm và Enable API
- Gõ vào ô tìm kiếm:
Google Play Android Developer API - Click vào kết quả đầu tiên
- Click nút ENABLE (màu xanh)
- Đợi 5-10 giây → Thấy "API enabled" ✅

BƯỚC 2: TẠO VÀ LẤY THÔNG TIN SERVICE ACCOUNT
1. Truy cập Service Accounts
🔗 https://console.cloud.google.com/iam-admin/serviceaccounts
Hoặc: Menu → IAM & Admin → Service Accounts
2. Tìm hoặc Tạo Service Account
Option A: Sử dụng Service Account có sẵn
- Tìm Service Account có tên chứa
firebasehoặcfirebase-adminsdk - Email dạng:
firebase-adminsdk-xxxxx@your-project.iam.gserviceaccount.com - Copy email này (cần dùng ở bước tiếp theo)
Option B: Tạo Service Account mới (nếu chưa có)
- Click + CREATE SERVICE ACCOUNT
- Service account name:
play-api-checker - Service account ID: Tự động tạo (có thể tùy chỉnh)
- Click CREATE AND CONTINUE
- Role: Bỏ qua (không cần chọn) → Click CONTINUE
- Click DONE
- Copy email Service Account vừa tạo

3. Tạo Private Key (JSON)
Quan trọng: File này dùng để xác thực API từ code
- Tại danh sách Service Accounts, click vào email Service Account
- Chọn tab KEYS (ở menu trên)
- Click ADD KEY → Create new key
- Chọn JSON → Click CREATE
- File JSON tự động tải về máy
- Đổi tên file thành
service-account.json
⚠️ Bảo mật:
- Không đẩy file này lên Git
- Không chia sẻ với người khác
- Lưu ở nơi an toàn
Cấu trúc file JSON:
{
"type": "service_account",
"project_id": "your-project-id",
"private_key_id": "abc123...",
"private_key": "-----BEGIN PRIVATE KEY-----\n...",
"client_email": "play-api-checker@your-project.iam.gserviceaccount.com",
"client_id": "123456789",
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://oauth2.googleapis.com/token"
}
BƯỚC 3: CẤP QUYỀN CHO SERVICE ACCOUNT TRÊN GOOGLE PLAY CONSOLE
1. Truy cập Google Play Console
🔗 https://play.google.com/console
- Đăng nhập bằng tài khoản có quyền quản lý app
- Chọn ứng dụng của bạn
2. Vào Users and Permissions
🔗 https://play.google.com/console/users-and-permissions
Hoặc: Menu bên trái → Users and permissions
Mời Service Account
- Click Invite new users (góc trên phải)
- Email address: Paste email Service Account (từ Bước 5)
- Expiry date: Chọn None (không hết hạn)

3. Cấp quyền cho App cụ thể
- Phần App permissions: Click Add app
- Chọn ứng dụng của bạn từ danh sách
- Click Apply

4. Cấp quyền Account (QUAN TRỌNG ⚠️)
Scroll xuống phần Account permissions và mở rộng các mục sau:
A. Financial data (Click để mở rộng):
- ✅ Tích:
View financial data, orders, and cancellation survey responses
B. Order management (Click để mở rộng):
- ✅ Tích:
Manage orders and subscriptions

📝 Lưu ý:
- Quyền
View financial datacho phép đọc thông tin giao dịch - Quyền
Manage orderscho phép đọc danh sách giao dịch bị hủy (voided purchases)
Hoàn tất
- Click Invite user (nút màu xanh)
- Thấy thông báo "User invited successfully" ✅

BƯỚC 4: XÁC MINH CẤU HÌNH
1. Kiểm tra quyền đã cấp
🔗 https://play.google.com/console/users-and-permissions
- Tìm email Service Account trong danh sách users
- Click vào email để xem chi tiết
- Kiểm tra:
- ✅ App access: Có tên ứng dụng
- ✅ Financial data: View financial data, orders...
- ✅ Order management: Manage orders and subscriptions
Đợi đồng bộ quyền
⏱️ Thời gian đồng bộ: 30 phút đến 24 giờ
Google cần thời gian để đồng bộ quyền giữa Play Console và API backend. Trong thời gian này:
- API có thể trả về lỗi 403 Forbidden
- Đây là hiện tượng bình thường
- Hãy đợi và thử lại sau
✅ HOÀN TẤT PHẦN 1
Checklist cấu hình:
- ✅ Google Play Android Developer API: Đã Enable
- ✅ Service Account: Đã tạo/chọn
- ✅ Service Account JSON Key: Đã tải về
- ✅ Email Service Account: Đã copy
- ✅ Quyền trên Play Console: Đã cấp (Financial data + Order management)
- ✅ App: Đã thêm vào App permissions
Thông tin cần lưu lại:
Service Account Email: [email@project.iam.gserviceaccount.com]
Package Name: [vn.vgp.kiem.khach.phong.lang]
File JSON: [service-account.json]
➡️ Tiếp theo: Chuyển sang PHẦN 2 để test API
PHẦN 2: TEST TRỰC TIẾP TRÊN GOOGLE API EXPLORER
2.1. GIỚI THIỆU API EXPLORER
Google API Explorer là công cụ web cho phép test API trực tiếp mà không cần viết code.
Ưu điểm:
- ✅ Không cần cài đặt gì
- ✅ Test nhanh các parameters
- ✅ Xem request/response trực quan
- ✅ Không cần Service Account JSON (dùng OAuth)
Link API Explorer:
🔗 https://developers.google.com/android-publisher/api-ref/rest/v3/purchases.voidedpurchases/list
2.2. CÁC BƯỚC TEST API
Bước 1: Truy cập API Explorer
Mở link sau trong trình duyệt:
https://developers.google.com/android-publisher/api-ref/rest/v3/purchases.voidedpurchases/list
Hoặc tìm kiếm Google: android publisher api voidedpurchases list
Bước 2: Kéo xuống phần "Try this API"
Tìm panel bên phải có tiêu đề "Try this API" hoặc "Try this method"

2.3. CẤU HÌNH PARAMETERS
A. REQUIRED PARAMETERS (Bắt buộc)
| Parameter | Giá trị | Mô tả |
|---|---|---|
| packageName | vn.vgp.kiem.khach.phong.lang | Package name của app trên Google Play |
Cách lấy packageName:
- Mở Google Play Console → Chọn app
- Xem ở URL:
https://play.google.com/console/app/[PACKAGE_NAME]/... - Hoặc: Dashboard → App details → Package name
B. OPTIONAL PARAMETERS (Tùy chọn)
1. startTime (Thời gian bắt đầu)
- Format: Milliseconds (số nguyên 13 chữ số)
- Mô tả: Chỉ lấy giao dịch hủy SAU thời điểm này
- Giới hạn: Không được quá 60 ngày so với hiện tại
Ví dụ:
1701187200000 → 29/11/2023 00:00:00 GMT
1704067200000 → 01/01/2024 00:00:00 GMT
Cách tính:
- Online: https://www.epochconverter.com/
- JavaScript:
new Date('2024-01-01').getTime() - 30 ngày trước:
Date.now() - (30 * 24 * 60 * 60 * 1000)
2. endTime (Thời gian kết thúc)
- Format: Milliseconds (số nguyên 13 chữ số)
- Mô tả: Chỉ lấy giao dịch hủy TRƯỚC thời điểm này
- Mặc định: Nếu không điền = thời gian hiện tại
3. maxResults (Số lượng kết quả)
- Format: Số nguyên
- Giá trị: 1 - 1000
- Mặc định: 100
- Mô tả: Số lượng giao dịch tối đa trả về trong 1 request
4. includeQuantityBasedPartialRefund (Bao gồm refund một phần)
- Format: Boolean
- Giá trị:
truehoặcfalse - Mặc định:
false - Mô tả: Có bao gồm giao dịch hoàn tiền một phần theo số lượng không
Khuyến nghị: Luôn dùng true để lấy đầy đủ dữ liệu
5. type (Loại sản phẩm)
- Format: Integer
- Giá trị:
0= In-app products (mua trong app 1 lần)1= Subscriptions (đăng ký định kỳ)
- Mặc định: Lấy cả 2 loại
6. startIndex (Vị trí bắt đầu - Phân trang)
- Format: Integer
- Giá trị: >= 0
- Mặc định: 0
- Mô tả: Bỏ qua N kết quả đầu tiên (dùng cho phân trang)
7. token (Token phân trang)
- Format: String
- Mô tả: Dùng để lấy trang tiếp theo (từ response trước)
- Cách dùng: Copy
nextPageTokentừ response trước, paste vào đây
2.4. CONFIGURATION MẪU
Cấu hình cơ bản (Recommended):
packageName: vn.vgp.kiem.khach.phong.lang
startTime: 1701187200000 (30 ngày trước)
endTime: [để trống hoặc thời gian hiện tại]
maxResults: 100
includeQuantityBasedPartialRefund: true