Custom Events
SimpPay fire nhiều custom events trong payment lifecycle. Developers có thể listen các events này để tích hợp với plugins khác.
Payment Events
PaymentBankPromptEvent
Fire khi hiển thị QR code/payment link cho người chơi.
Package: me.typical.simppay.event.payment
Cancellable: No
Fields:
Player player // Người chơiString orderId // Mã đơn hàngint amount // Số tiền (VNĐ)String qrCodeUrl // URL QR codeString paymentUrl // URL payment linkString bankName // Tên ngân hàngVí dụ:
@EventHandlerpublic void onBankPrompt(PaymentBankPromptEvent event) { Player player = event.getPlayer(); int amount = event.getAmount();
// Custom logic player.sendMessage("Đang tạo QR code " + amount + "đ...");}PaymentQueueSuccessEvent
Fire khi payment được queue thành công (bắt đầu polling).
Package: me.typical.simppay.event.payment
Cancellable: No
Fields:
Player player // Người chơiString orderId // Mã đơn hàngint amount // Số tiền (VNĐ)PaymentType type // CARD hoặc BANKINGVí dụ:
@EventHandlerpublic void onPaymentQueued(PaymentQueueSuccessEvent event) { String orderId = event.getOrderId();
// Start custom tracking trackPayment(orderId);}PaymentSuccessEvent
Fire khi thanh toán thành công.
Package: me.typical.simppay.event.payment
Cancellable: No
Fields:
Player player // Người chơiString orderId // Mã đơn hàngint amount // Số tiền (VNĐ)int coinsAwarded // Số coins được cộngPaymentType type // CARD hoặc BANKINGVí dụ:
@EventHandlerpublic void onPaymentSuccess(PaymentSuccessEvent event) { Player player = event.getPlayer(); int amount = event.getAmount(); int coins = event.getCoinsAwarded();
// Custom rewards player.sendMessage("§aCảm ơn bạn đã nạp " + amount + "đ!"); player.sendMessage("§aBạn nhận được " + coins + " coins!");
// Give bonus items player.getInventory().addItem(new ItemStack(Material.DIAMOND, 5));}PaymentFailedEvent
Fire khi thanh toán thất bại.
Package: me.typical.simppay.event.payment
Cancellable: No
Fields:
Player player // Người chơiString orderId // Mã đơn hàngint amount // Số tiền (VNĐ)String reason // Lý do thất bạiPaymentType type // CARD hoặc BANKINGVí dụ:
@EventHandlerpublic void onPaymentFailed(PaymentFailedEvent event) { Player player = event.getPlayer(); String reason = event.getReason();
// Log failure logger.warning("Payment failed for " + player.getName() + ": " + reason);
// Send support message player.sendMessage("§cThanh toán thất bại. Liên hệ admin nếu cần hỗ trợ.");}Milestone Events
PlayerMilestoneEvent
Fire khi người chơi hoàn thành milestone.
Package: me.typical.simppay.event.milestone
Cancellable: No
Fields:
Player player // Người chơiString milestoneName // Tên milestoneint milestoneAmount // Số tiền milestonePeriodType period // Kỳ (ALL, DAILY, WEEKLY, MONTHLY, YEARLY)List<String> commands // Commands sẽ thực thiVí dụ:
@EventHandlerpublic void onPlayerMilestone(PlayerMilestoneEvent event) { Player player = event.getPlayer(); String name = event.getMilestoneName();
// Custom celebration player.playSound(player.getLocation(), Sound.UI_TOAST_CHALLENGE_COMPLETE, 1.0f, 1.0f);
// Broadcast Bukkit.broadcastMessage("§6" + player.getName() + " đã đạt " + name + "!");}ServerMilestoneEvent
Fire khi server đạt milestone.
Package: me.typical.simppay.event.milestone
Cancellable: No
Fields:
String milestoneName // Tên milestoneint milestoneAmount // Số tiền milestonePeriodType period // KỳList<String> commands // Commands sẽ thực thiVí dụ:
@EventHandlerpublic void onServerMilestone(ServerMilestoneEvent event) { String name = event.getMilestoneName();
// Fireworks for all online players for (Player player : Bukkit.getOnlinePlayers()) { spawnFirework(player.getLocation()); }}MilestoneCompleteEvent
Generic milestone completion event (parent của PlayerMilestoneEvent và ServerMilestoneEvent).
Package: me.typical.simppay.event.milestone
Cancellable: No
Webhook Events
SepayWebhookReceivedEvent
Fire khi nhận webhook từ Sepay (async).
Package: me.typical.simppay.event.webhook
Cancellable: No
Async: Yes
Fields:
String transactionId // ID giao dịchString accountNumber // Số tài khoảnint amount // Số tiềnString transactionContent // Nội dung chuyển khoảnString bankCode // Mã ngân hànglong timestamp // TimestampVí dụ:
@EventHandlerpublic void onSepayWebhook(SepayWebhookReceivedEvent event) { String content = event.getTransactionContent(); int amount = event.getAmount();
// Custom webhook processing logger.info("Received Sepay webhook: " + content + " - " + amount + "đ");}Event Priority
Listeners được thực thi theo thứ tự priority:
- LOWEST - Custom pre-processing
- LOW - Custom logic
- NORMAL - Default SimpPay listeners
- HIGH - Custom post-processing
- HIGHEST - Final custom logic
- MONITOR - Logging only (không modify event)
Ví dụ:
@EventHandler(priority = EventPriority.HIGH)public void onPaymentSuccess(PaymentSuccessEvent event) { // Runs after SimpPay's default processing}Ví dụ tích hợp
Discord webhook
@EventHandlerpublic void onPaymentSuccess(PaymentSuccessEvent event) { Player player = event.getPlayer(); int amount = event.getAmount();
// Send to Discord DiscordWebhook webhook = new DiscordWebhook(WEBHOOK_URL); webhook.setContent(player.getName() + " đã nạp " + amount + "đ!"); webhook.execute();}Custom statistics
@EventHandlerpublic void onPaymentSuccess(PaymentSuccessEvent event) { Player player = event.getPlayer(); int amount = event.getAmount();
// Update custom stats PlayerStats stats = getStats(player); stats.addPayment(amount); stats.incrementPaymentCount(); stats.save();}Bonus rewards
@EventHandlerpublic void onPlayerMilestone(PlayerMilestoneEvent event) { Player player = event.getPlayer(); int amount = event.getMilestoneAmount();
// Give bonus based on amount if (amount >= 1000000) { player.getInventory().addItem(new ItemStack(Material.NETHERITE_INGOT, 5)); player.sendMessage("§6Bonus: 5 Netherite Ingot!"); }}Best practices
-
Async events: Không block main thread trong async event handlers
-
Error handling: Catch exceptions để không break event chain
-
Priority: Dùng priority phù hợp để control execution order
-
Performance: Tránh heavy operations trong event handlers
-
Cancellable: Kiểm tra
event.isCancelled()trước khi xử lý