[Màn hình Điện – nhập MKH]
↓ nhập MKH → bấm Tiếp tục
[Thông tin KH + hóa đơn]
↓ (nếu có popup "Kích hoạt tự động" → bấm "Không, tiếp tục thanh toán")
↓ bấm Tiếp tục
[Xác nhận tổng tiền]
↓ bấm Xác nhận
[Smart OTP PIN – nhập 6 số]
↓ (nếu có màn hình OTP nâng cao → bấm "Xác nhận giao dịch")
[Thành công ✓]
↓ bấm Giao dịch mới → lặp MKH tiếp theo
VPBankController/
├── app/src/main/
│ ├── AndroidManifest.xml
│ ├── java/com/example/vpbankcontroller/
│ │ ├── AppConfig.kt ← text constants, timing
│ │ ├── BillPaymentAccessibilityService.kt ← state machine 9 bước
│ │ └── MainActivity.kt ← UI: MKH list + PIN + start/stop
│ └── res/
│ ├── layout/activity_main.xml
│ ├── values/strings.xml
│ └── xml/accessibility_service_config.xml
- Android Studio → Open → chọn thư mục
VPBankController/ - Để Gradle sync xong.
- Kết nối điện thoại (bật USB Debugging) hoặc dùng emulator.
Mở VPBank NEO, rồi chạy:
adb shell dumpsys window | findstr mCurrentFocusKết quả: mCurrentFocus=Window{... com.vpbank.digitalmb/...}
Package = com.vpbank.digitalmb (điền vào ô đầu trong app).
Ctrl+F9 → Make Project
Shift+F10 → Run 'app'
Cài đặt → Trợ năng → Dịch vụ đã tải xuống → VPBank Auto Bill Payment → BẬT
- Mở VPBank Controller.
- Điền Package name VPBank NEO.
- Điền PIN Smart OTP (6 chữ số) — chỉ lưu trong RAM, không ghi file.
- Dán danh sách MKH (mỗi dòng 1 mã, ví dụ
PB05090014481). - Bấm Mở VPBank → điều hướng đến màn hình Thanh toán hóa đơn → Điện.
- Bấm Bắt đầu → service tự động xử lý từng MKH.
| Hằng số | Mặc định | Khi nào cần tăng |
|---|---|---|
DELAY_AFTER_TEXT_MS |
700 ms | Điện thoại chậm load bàn phím |
DELAY_AFTER_CLICK_MS |
3000 ms | Mạng yếu / màn hình load lâu |
POLL_INTERVAL_MS |
800 ms | Giữ nguyên |
MAX_RETRY |
15 | Tăng nếu hay bị skip nhầm |
- PIN Smart OTP được xóa khỏi memory khi bấm Dừng hoặc đóng app.
- Service dùng text-based search (tìm theo nội dung nút) thay vì resource ID vì VPBank NEO obfuscate IDs.
- Nếu VPBank cập nhật và đổi text nút → sửa các hằng
TEXT_*trongAppConfig.kt. - Nếu popup "Kích hoạt thanh toán tự động" xuất hiện, service tự bấm "Không, tiếp tục thanh toán".
- Nếu có màn hình OTP nâng cao, service tự bấm "Xác nhận giao dịch" (OTP tự điền).