
YuPay is a modern, feature-rich payment and donation plugin designed for Minecraft servers (compatible with 1.8.x-1.26.x). It seamlessly integrates WeChat Pay and Alipay
Minecraft server sponsorship has never been been this elegant.
Direct integration with WeChat Pay & Alipay, redeem code system, refund review, multi-language, full lifecycle event listening — everything you need, YuPay delivers it all at once. Free, no middlemen, no tricks. 100% of the revenue goes straight to your account. The only fees are those charged by Alipay and WeChat.
YuPay is a free, modern payment plugin tailored for Minecraft servers. It breaks down the hassle of "sponsorship management" into four steps: Initiate → Pay → Receive → Record. Every step is automated, every step traceable.
Server operators use it to collect sponsorships, players use it to scan and pay. Both sides enjoy a worry-free experience. Supports direct API integration with WeChat Pay and Alipay — no third-party relay, your funds stay secure in your own hands.
⚠️ This plugin is designed for scenarios where "players voluntarily sponsor server operations". Please ensure usage complies with local laws and payment platform regulations.
| Category | What You Get |
|---|---|
| 💳 Payment | WeChat + Alipay dual channels, Native QR scan payment, automatic fallback |
| 💰 Economy | Vault + PlayerPoints dual support, one-click switch |
| 🎁 Rewards | Base rewards, single milestone, total achievements, limited-time sprints — four trigger layers |
| 🔑 Redeem Code | Create/redeem/query/modify, supports paid codes, complete logs |
| 💵 Refund | Players can request refunds, admin approve/deny, forced refund, partial refund |
| 📊 Data | Leaderboards, order history, page browsing, one-click copy order ID |
| 🌐 Multi-language | Default Chinese + English, server owners can customize any language, different players see different languages |
| 🔌 PAPI | 40+ placeholders, use in scoreboards/titles/item lore |
| 🛡️ Security | Signature verification, IP whitelist, 24h event monitoring, anti-duplicate delivery |
| ⚡ Performance | Fully async, HikariCP connection pool, 600% startup speed boost |
| 🧩 Extensibility | Full lifecycle event API for deep integration by developers |
| 📚 Wiki / DOC | WIKI |
/donate 50 wechatFully automated. You just configure the rewards, YuPay handles the rest.
YuPay's reward system is like a Lego box — four trigger modes you can combine freely.
| Layer | Trigger | Example |
|---|---|---|
| Base Reward | Every successful payment | give {player} diamond 1 |
| Single Milestone | Single payment reaches threshold | 50 yuan → 5 gold blocks |
| Total Achievement | Lifetime total reaches new height | 500 yuan → SVIP permission group |
| Limited Sprint | Cumulative within specified time period | 200 yuan in 24h → enchanted golden apple |
Each layer's commands are fully customizable, support variables like {player}, {amount}, {points}, and can integrate with permission/economy plugins like LuckPerms, CMI, etc.
💡 Adding
-n(e.g./donate 10 -n) makes it a no-reward sponsorship — pure server support, no rewards triggered.
YuPay's redeem code module goes far beyond typical "gift codes":
Create a paid activation code with a single command:
/yp code create --code VIP2026 --amount 50 --economy vault --eco-amount 5000 --commands "lp user {player} parent set vip" --max-uses 100 --expire 30d
Refunds are no longer a nightmare. YuPay's refund process is complete and reassuring:
A lifesaver for international server operators.
language.mappings/yp lang <language>, stored in database, persists across sessionsYuPay provides 40+ built-in PlaceholderAPI placeholders, covering personal, server, leaderboard, and redeem code dimensions. All monetary values keep two decimal places. Full list below:
| Placeholder | Description | Example Return |
|---|---|---|
%yupay_is_banned% |
Whether the player is banned from sponsoring | true / false |
%yupay_total% |
Player's lifetime total sponsorship (yuan) | 158.00 |
%yupay_total_orders% |
Player's total orders (including failed) | 7 |
%yupay_success_orders% |
Player's successful orders | 5 |
%yupay_rank% |
Player's sponsorship rank (off-rank shows text from language file) | 3 or Not ranked |
%yupay_has_paid_in_<time>% |
Whether the player has sponsored within the last <time> milliseconds |
true / false |
%yupay_recent_amount_gt_<time>_<amount>% |
Whether sponsorship amount in last <time> ms exceeds <amount> yuan |
true / false |
%yupay_orders_in_<time>% |
Number of orders in last <time> ms (including failed) |
2 |
%yupay_success_orders_in_<time>% |
Successful orders in last <time> ms |
2 |
%yupay_amount_in_<time>% |
Total sponsorship amount in last <time> ms (yuan) |
75.50 |
%yupay_is_limited% |
Whether today's sponsorship has reached daily limit | true / false |
%yupay_daily_remaining% |
Remaining sponsorship amount for today (yuan) | 450.00 |
%yupay_lang% |
Player's current language identifier | zh_cn |
%yupay_pay_methods_count% |
Number of currently available payment channels | 2 |
%yupay_pay_methods_list% |
List of available payment channel names (comma-separated) | wechat, alipay |
💡 Dynamic parameters:
<time>is in milliseconds (e.g.86400000= 24h),<amount>is monetary threshold (yuan). All monetary placeholders retain two decimals.
| Placeholder | Description | Example Return |
|---|---|---|
%yupay_server_total% |
Server's lifetime total sponsorship (yuan) | 12850.75 |
%yupay_server_total_orders% |
Server's total orders (including failed) | 312 |
%yupay_server_success_orders% |
Server's successful orders | 289 |
%yupay_server_orders_in_<time>% |
Server orders in last <time> ms |
45 |
%yupay_server_success_orders_in_<time>% |
Server successful orders in last <time> ms |
42 |
%yupay_server_amount_in_<time>% |
Server total sponsorship in last <time> ms (yuan) |
3200.00 |
Two formats supported (first recommended):
| Placeholder | Description | Example Return |
|---|---|---|
%yupay_top_<rank>_name% |
Player name at rank N | Steve |
%yupay_top_<rank>_amount% |
Total sponsorship at rank N (yuan) | 2000.00 |
%yupay_top<rank>_name% |
(legacy format) Same as above | Alex |
%yupay_top<rank>_amount% |
(legacy format) Same as above | 1500.00 |
<rank>ranges1~10. If rank doesn't exist, name returns fallback text from language file (default "None"), amount returns0.00.
Includes global statistics (no player needed) and specific code attributes (where redeemed and can_redeem require player context).
| Placeholder | Description | Example Return |
|---|---|---|
%yupay_code_total% |
Total number of codes | 25 |
%yupay_code_active% |
Number of active codes (status ACTIVE) | 18 |
<code> with actual code string (auto-uppercase)| Placeholder | Description | Example (code = VIP2026) |
|---|---|---|
%yupay_code_<code>_status% |
Current status of the code | ACTIVE |
%yupay_code_<code>_amount% |
Required payment amount (yuan) | 50.00 |
%yupay_code_<code>_economy_type% |
Economy reward type | vault |
%yupay_code_<code>_economy_amount% |
Economy reward amount | 5000.00 |
%yupay_code_<code>_used% |
Number of times redeemed | 23 |
%yupay_code_<code>_max_uses% |
Max redeem count (-1 = unlimited) | 100 |
%yupay_code_<code>_expire% |
Expiry timestamp (ms), -1 = never | 1798675199999 |
%yupay_code_<code>_expire_formatted% |
Formatted expiry time | 2026-12-31 23:59 |
%yupay_code_<code>_remark% |
Code remark | "VIP activation code" |
%yupay_code_<code>_locked% |
Whether locked by a payment (someone is paying) | true / false |
%yupay_code_<code>_redeemed% |
Whether current player has redeemed this code | true / false |
%yupay_code_<code>_can_redeem% |
Whether current player can redeem now (comprehensive check) | true / false |
💡
_can_redeemchecks: code status normal, not expired, uses left, not locked by others, and current player hasn't redeemed it.
yuan, with two decimal places, e.g. 99.50. Integer amounts also show .00.<time> always uses milliseconds — 24h = 86400000, 7d = 604800000.If you can write plugins, these events will make your secondary development experience fly:
| Event | Trigger | Modifiable Parameters |
|---|---|---|
PrePaymentEvent |
Before payment | amount, payment method, order ID, cancel flag |
PaymentOrderCreatedEvent |
Order created successfully | read-only (has QR URL) |
PaymentCompletedEvent |
Payment success + rewards granted | read-only (full data) |
PaymentFailedEvent |
Payment failed / canceled | read-only |
RefundCompletedEvent |
Refund completed | read-only |
RedeemCodeRedeemedEvent |
Code redeemed | read-only |
RedeemCodeLifetimeEvent |
Code status changed | read-only (old → new state) |
PlayerPointsChangedEvent |
Economy changed | read-only |
All events support sync. You can intercept before order creation, trigger联动 other systems after payment, sync data on refund — every detail of the sponsorship lifecycle is observable.
/yp audit one-click audit, 24h monitoring of which plugins are listening to YuPay's fund eventsThe rewritten dependency loading system means YuPay no longer requires cumbersome JVM startup parameters. All dependencies are automatically managed, verification speed increased by 600%, out-of-the-box. Drop it into the plugins folder, start the server, it's ready.
/yp history is one of your most-used commands. Order history supports page browsing, click an order ID to copy it with one click — reconciliation efficiency doubled.
/yp top lets you know at any time who is contributing to the server — leaderboard data syncs with placeholders in real time.
/yp total for personal stats, /yp total all for server-wide stats — all available at your fingertips.
YuPay.jar into the plugins/ folderconfig.yml and messages.yml to generateconfig.yml, fill in your WeChat/Alipay parameters8080) is open in your server firewall and security group/donate 0.01 to test a small payment💬 Plugin QQ Discussion Group: 1080918424
For issues, feature requests, or just to chat — welcome. Every improvement of YuPay comes from feedback from server owners.
💛 Support the Author on AiFaDian: https://afdian.com/a/vicuna
If YuPay has helped your server, consider buying the author a milk tea ~ Your support is the biggest motivation for the plugin's continued evolution.
Stop struggling with sponsorship management. Leave the professional stuff to YuPay, and focus on running your server well.
| Item | Requirement |
|---|---|
| Server | Spigot / Paper / compatible forks / compatible hybrid servers, 1.8 – 1.26+ |
| Java | JDK 8 or higher |
| Optional dependencies | Vault (economy), PlayerPoints (points), PlaceholderAPI (placeholders), ProtocolLib (map lock) |
🎉 Good news: You no longer need to manually add JVM startup parameters for Java 9+. YuPay's latest version has built-in smart dependency management — out-of-the-box.
YuPay.jar, place it in the server's plugins/ directoryconfig.yml, messages.yml, and SQLite database filesplugins/YuPay/config.yml, fill in payment channel configuration parametershttp(s)://your-domain-or-ip:port/pay/wechat/notifyhttp(s)://your-domain-or-ip:port/pay/alipay/notify8080) is open in firewall and security group/yupay reload or type reload in console to apply configuration/donate 0.01 to test a small payment| Path | Description | Example |
|---|---|---|
pay.default-method |
Default payment method | wechat / alipay |
pay.min-amount |
Minimum amount per order (yuan) | 0.01 |
pay.max-amount |
Maximum amount per order (-1 = unlimited) | 500 |
pay.max-daily-amount |
Daily cumulative limit (-1 = unlimited) | 1000 |
pay.order-subject |
Order subject template | Sponsorship-{player}-{amount}yuan |
| Path | Description |
|---|---|
wechat.enabled |
Enable (true/false) |
wechat.mchid |
Merchant ID |
wechat.appid |
Official account / Mini Program AppID |
wechat.serial-no |
API certificate serial number |
wechat.private-key-path |
Merchant private key (relative to pems/ directory) |
wechat.public-key-path |
Platform public key (relative to pems/ directory) |
wechat.public-key-id |
Platform public key ID |
wechat.api-v3-key |
API v3 key (32 characters) |
wechat.notify-url |
Complete callback notification URL |
| Path | Description |
|---|---|
alipay.enabled |
Enable |
alipay.mode |
public_key or cert |
alipay.app-id |
App ID |
alipay.merchant-private-key |
Merchant private key (PKCS8, without headers/footers) |
alipay.alipay-public-key |
Alipay public key (required for public_key mode) |
alipay.app-cert-path |
App public key certificate (cert mode) |
alipay.alipay-cert-path |
Alipay public key certificate (cert mode) |
alipay.alipay-root-cert-path |
Alipay root certificate (cert mode) |
alipay.notify-url |
Async notification URL |
alipay.return-url |
Sync return URL |
| Path | Description |
|---|---|
economy.enabled |
Enable economy rewards |
economy.type |
vault or playerpoints |
economy.rate |
1 yuan = how many in-game currency/points |
| Path | Description |
|---|---|
qrcode.default-output-mode |
link / text / map |
qrcode.text-qr-size |
Text mode QR side length (characters, default 12) |
qrcode.text-black-char |
Black pixel character (default ██) |
qrcode.api-url |
Image generation API for link mode |
| Path | Description |
|---|---|
callback.port |
Listening port |
callback.host |
Bind address (0.0.0.0 = all interfaces) |
callback.io-threads |
IO thread count |
callback.worker-threads |
Worker thread count |
callback.allowed-ips |
IP whitelist (CIDR format, empty = allow all) |
callback.access-log |
Enable access logging |
| Path | Description |
|---|---|
database.type |
sqlite (standalone) or mysql (multi-server sync) |
database.mysql.* |
MySQL connection parameters |
database.connection-pool.* |
HikariCP connection pool parameters |
database.table-names.prefix |
Table prefix to avoid conflicts |
database.table-names.* |
Individual business table names (can be customized) |
Executed on every successful payment — suitable for "base reward every sponsorship".
commands:
on-success:
- "give {player} diamond 1"
- "effect give {player} minecraft:speed 30 1"
Available variables: {player} (player name), {amount} (amount), {points} (economy points earned)
Triggered when a single payment reaches a set amount. Sort amounts from low to high, multiple tiers allowed.
commands:
on-single-achieved:
- amount: 50
commands:
- "say {player} reached 50 yuan in a single sponsorship!"
- "give {player} minecraft:gold_block 5"
- amount: 100
commands:
- "give {player} minecraft:diamond_block 3"
- "lp user {player} parent set vip"
Triggered when lifetime total reaches a new height. Each tier triggers only once — anti-duplicate mechanism built-in.
commands:
on-total-achieved:
- total: 100
commands:
- "lp user {player} parent set vip"
- total: 1000
commands:
- "lp user {player} parent set ultimate"
- "give {player} minecraft:beacon 1"
Triggered when cumulative amount within a specified time period (milliseconds) reaches the target. Great for holiday events, weekend leaderboard pushes, etc.
commands:
on-recent-achieved:
- time: 86400000 # 24 hours
total: 200
commands:
- "give {player} minecraft:enchanted_golden_apple 5"
- time: 604800000 # 7 days
total: 500
commands:
- "give {player} minecraft:elytra 1"
Executed after a successful refund — can be used to notify admins, log events.
commands:
on-refund:
- "say {player}'s order {order} has been refunded {amount} yuan"
| Command | Function | Default Aliases |
|---|---|---|
/donate <amount> [payment] [output] [-n] |
Initiate sponsorship | /pay, /zanzhu |
/ytop |
Sponsorship leaderboard Top10 | /paytop, /yt |
/ytotal [player|all] |
Query total sponsorship | /paytotal, /ytt |
/yp history [page] |
My sponsorship history | /yupay history |
/yp lang [language] |
Switch personal language preference | |
/yp code redeem <code> |
Redeem a code | |
/yp cancel |
Cancel current map payment |
💡 The
-nflag means "no-reward sponsorship" — pure server support, no reward commands or economy items triggered.
| Command | Function |
|---|---|
/yp reload |
Hot reload configuration |
/yp set <option> <value> |
Change configuration online |
/yp config |
View current core config |
/yp ban <player|all> [reason] |
Ban from sponsoring (all = global ban) |
/yp unban <player|all> |
Unban |
/yp convert <player> <from> <to> <amount> |
Convert currency (vault/points) |
/yp audit |
Audit all plugins listening to YuPay events |
/yp history <player> [page] |
View any player's order history |
/yp code create ... |
Create a redeem code |
/yp code list [page] |
List codes |
/yp code info <code> |
View code details |
/yp code modify <code> <field> <newvalue> |
Modify code parameters |
/yp code delete <code> |
Disable code (soft delete) |
/yp code logs [code] [page] |
View redemption logs |
/yp refund <order-id> [amount] |
Direct refund |
/yp refund list [page] |
Refund logs |
/yp refund request <order-id> [amount] |
Submit refund review request |
/yp refund pending [page] |
View pending refund requests |
/yp refund approve <request-id> |
Approve request |
/yp refund reject <request-id> |
Reject request |
| Permission Node | Operations |
|---|---|
yupay.command.pay |
Initiate sponsorship |
yupay.command.top |
View leaderboard |
yupay.command.total |
Query total sponsorship |
yupay.command.history |
View order history |
yupay.reload |
Reload config |
yupay.ban |
Manage blacklist |
yupay.convert |
Currency conversion |
yupay.audit |
Event listener audit |
yupay.admin |
Includes all above admin permissions |
Code creation uses named parameters in --param value format, freely combinable:
# Free welfare code (unlimited uses, never expires)
/yp code create --code FREEGIFT --max-uses -1 --economy vault --eco-amount 100 --remark "New player gift"
# Paid activation code (pay 50 yuan to redeem, 100 uses, expires after 30 days)
/yp code create --code PREMIUM --amount 50 --economy vault --eco-amount 5000 --max-uses 100 --expire 30d --commands "lp user {player} parent set vip"
# Command-only code (no economy, no payment)
/yp code create --code WELCOME --commands "give {player} diamond 5; say {player} Welcome back!"
Parameter quick reference:
| Parameter | Description | Example |
|---|---|---|
--code |
Code string (auto-uppercase) | VIP2026 |
--amount |
Required payment amount (0 = free) | 50 |
--economy |
Economy type (vault / playerpoints / none) | vault |
--eco-amount |
Economy reward amount | 5000 |
--max-uses |
Max redeem count (-1 = unlimited) | 100 |
--expire |
Expiry time (30d / 24h / 2026-12-31 / never) |
30d |
--commands |
Commands to execute on redemption (semicolon-separated) | "cmd1; cmd2" |
--remark |
Remark description | "VIP activation code" |
| Status | Meaning |
|---|---|
ACTIVE |
Usable |
DEPLETED |
Uses exhausted (automatic) |
EXPIRED |
Expired (automatic) |
DISABLED |
Manually disabled by admin |
Using code VIP2026 as example:
| Placeholder | Example Return |
|---|---|
%yupay_code_total% |
Total number of codes |
%yupay_code_active% |
Number of active codes |
%yupay_code_VIP2026_status% |
ACTIVE |
%yupay_code_VIP2026_amount% |
50.00 |
%yupay_code_VIP2026_used% |
23 |
%yupay_code_VIP2026_max_uses% |
100 |
%yupay_code_VIP2026_expire_formatted% |
2026-12-31 23:59 |
%yupay_code_VIP2026_can_redeem% |
true / false |
%yupay_code_VIP2026_locked% |
true / false |
%yupay_code_VIP2026_redeemed% |
Whether current player has redeemed |
| Method | Command Example | Use Case |
|---|---|---|
| Direct refund | /yp refund ORDER001 50 |
Confirmed refund needed, quick processing |
| Forced refund | /yp refund ORDER001 50 -f |
Skip amount check, refund directly |
| Partial refund | /yp refund ORDER001 30 |
Refund part of the amount |
| Approval workflow | /yp refund request ORDER001 → wait for approve |
Scenarios requiring approval |
| Code refund | /yp refund -r <redemption-log-id> |
Refund code payment + restore usage count |
/yp refund request <order-id> [amount]/yp refund pending/yp refund approve <request-id> / rejectFULL_REFUND / PARTIAL_REFUND)ACTIVEcommands.on-refundRefundCompletedEvent for other plugins to reactAdd under language.mappings node in config.yml:
language:
mappings:
zh_cn:
file: "messages.yml"
aliases: [zh, cn, chinese]
client-locales: ["zh_cn", "zh_*"]
en:
file: "messages_en.yml"
aliases: [english, eng]
client-locales: ["en_*"]
ja:
file: "messages_ja.yml"
aliases: [japanese, jp]
client-locales: ["ja_*"]
Then create plugins/YuPay/messages_ja.yml, translating based on messages.yml. Plugin will automatically fill in missing keys.
/yp lang en (supports aliases, e.g. english)| Server Scale | Recommended Type | Reason |
|---|---|---|
| Single small server | SQLite | Zero configuration, out-of-the-box |
| Multi-server network | MySQL | Unified data, cross-server sync |
| Large network | MySQL + connection pool | High concurrency support, connection reuse |
status in database — should be SUCCESSeconomy.enabled and commands.enabled are both trueqrcode.default-output-mode is set to maplinkplugins/YuPay/pems/ directorywechat.public-key-path is correct.bak suffix) and merges new keys| Table Name | Stored Content |
|---|---|
yu_payments |
All payment orders, including refund status |
yu_total_levels |
Cumulative reward tier records |
yu_banned_players |
Sponsorship blacklist |
yu_player_lang |
Player language preferences |
yu_redeem_codes |
Redeem code master table |
yu_redeem_logs |
Redemption records |
yu_refund_logs |
Refund operation logs |
yu_refund_requests |
Refund review requests |
/yp reload (ensure in-memory config is flushed)plugins/YuPay.jarplugins/YuPay folder (including database)💬 Plugin Discussion Group: 1080918424
Don't struggle alone — bring your logs and config screenshots to the group, the author and helpful server owners are there.
💛 Support the Author on AiFaDian: https://ifdian.net/item/012b6c1c4a0911f18d1b52540025c377
If YuPay has helped your server, consider buying the author a milk tea ~ Your support is the biggest motivation for the plugin's continued evolution.
```