feat(trade): 转账基础枚举/工具/权限码与多语种词条

- TradeTypeEnum/TradeFlowTypeEnum/NoticeEventEnum 新增 transfer 项
- TradeNoGenerateUtil 支持转账单号生成
- PermCodes 新增转账权限码
- i18n(10语): notice_event/trade_type/transfer_payee_type 新增, pay/error 补 transfer 错误码
This commit is contained in:
daxpay
2026-08-05 14:23:28 +08:00
parent df6f4eda9e
commit 5adae83938
45 changed files with 241 additions and 20 deletions

View File

@@ -7,5 +7,8 @@
"pay.timeout": "Pay Timeout Close",
"pay.cancel": "Pay Cancel",
"refund.fail": "Refund Fail",
"risk.hit": "Risk Hit"
"risk.hit": "Risk Hit",
"transfer.success": "Transfer Success",
"transfer.fail": "Transfer Fail",
"transfer.close": "Transfer Close"
}

View File

@@ -2,5 +2,6 @@
"pay": "Payment",
"refund": "Refund",
"cashouts": "Withdrawal",
"settle": "Settlement"
"settle": "Settlement",
"transfer": "Transfer"
}

View File

@@ -0,0 +1,6 @@
{
"openid": "WeChat OpenID",
"user_id": "Alipay User ID",
"open_id": "Alipay Open ID",
"login_name": "Alipay Login Name"
}

View File

@@ -116,6 +116,16 @@
"transferAlreadyProcessed": "Transfer order already processed, recording callback",
"abnormal": "Callback processing exception, please contact platform support"
},
"transfer": {
"processing": "Transfer processing, please do not repeat",
"onlyFailRetry": "Only failed transfers can be initiated again",
"noDuplicate": "The merchant transfer no already exists, please do not repeat",
"notFound": "Transfer order does not exist",
"syncProcessing": "Transfer sync processing, please do not repeat",
"closeNotProcessing": "Only transfers in progress can be manually closed",
"channelNotSupport": "The channel does not support closing transfers",
"illegalTransition": "Illegal state transition: {0} → {1}"
},
"assist": {
"mchPublicKeyEmpty": "Merchant public key is empty",
"privateKeyEmpty": "Merchant private key is empty",

View File

@@ -7,5 +7,8 @@
"pay.timeout": "Pembayaran Tutup Timeout",
"pay.cancel": "Pembayaran Dibatalkan",
"refund.fail": "Pengembalian Gagal",
"risk.hit": "Risiko Terdeteksi"
"risk.hit": "Risiko Terdeteksi",
"transfer.success": "Transfer Berhasil",
"transfer.fail": "Transfer Gagal",
"transfer.close": "Transfer Ditutup"
}

View File

@@ -2,5 +2,6 @@
"pay": "Pembayaran",
"refund": "Pengembalian dana",
"cashouts": "Penarikan",
"settle": "Hunian"
"settle": "Hunian",
"transfer": "Transfer"
}

View File

@@ -0,0 +1,6 @@
{
"openid": "OpenID WeChat",
"user_id": "ID Pengguna Alipay",
"open_id": "ID Terbuka Alipay",
"login_name": "Akun Login Alipay"
}

View File

@@ -107,6 +107,16 @@
"transferNotFound": "Perintah transfer tidak ditemukan, merekam panggilan balik",
"transferAlreadyProcessed": "Pesanan transfer sudah diproses, rekaman panggilan balik"
},
"transfer": {
"processing": "Transfer sedang diproses, jangan ulangi",
"onlyFailRetry": "Hanya transfer dengan status gagal yang dapat dimulai ulang",
"noDuplicate": "Nomor transfer merchant sudah ada, jangan ulangi",
"notFound": "Pesanan transfer tidak ada",
"syncProcessing": "Sinkronisasi transfer sedang diproses, jangan ulangi",
"closeNotProcessing": "Hanya transfer yang sedang berjalan yang dapat ditutup manual",
"channelNotSupport": "Saluran ini tidak mendukung penutupan transfer",
"illegalTransition": "Transisi status tidak valid: {0} → {1}"
},
"assist": {
"mchPublicKeyEmpty": "Kunci publik pedagang kosong",
"privateKeyEmpty": "Kunci pribadi pedagang kosong",

View File

@@ -7,5 +7,8 @@
"pay.timeout": "支払タイムアウト終了",
"pay.cancel": "支払取消",
"refund.fail": "返金失敗",
"risk.hit": "リスク検知"
"risk.hit": "リスク検知",
"transfer.success": "送金成功",
"transfer.fail": "送金失敗",
"transfer.close": "送金クローズ"
}

View File

@@ -2,5 +2,6 @@
"pay": "支払い",
"refund": "返金",
"cashouts": "出金",
"settle": "決済"
"settle": "決済",
"transfer": "送金"
}

View File

@@ -0,0 +1,6 @@
{
"openid": "WeChat openid",
"user_id": "Alipay ユーザーID",
"open_id": "Alipay オープンID",
"login_name": "Alipay ログインアカウント"
}

View File

@@ -116,6 +116,16 @@
"transferAlreadyProcessed": "転送オーダーはすでに処理されており、コールバックを記録しています",
"abnormal": "コールバック処理で例外が発生しました。プラットフォームサポートにお問い合わせください"
},
"transfer": {
"processing": "送金処理中です。重複操作しないでください",
"onlyFailRetry": "失敗状態のみ再送金できます",
"noDuplicate": "このマーチャント送金番号は既に存在します。重複送金しないでください",
"notFound": "送金注文が存在しません",
"syncProcessing": "送金同期処理中です。重複操作しないでください",
"closeNotProcessing": "送金中の注文のみ手動クローズできます",
"channelNotSupport": "このチャネルは送金クローズをサポートしていません",
"illegalTransition": "不正な状態遷移: {0} → {1}"
},
"assist": {
"mchPublicKeyEmpty": "販売者の公開キーが空です",
"privateKeyEmpty": "販売者の秘密キーが空です",

View File

@@ -7,5 +7,8 @@
"pay.timeout": "결제 시간 초과 종료",
"pay.cancel": "결제 취소",
"refund.fail": "환불 실패",
"risk.hit": "리스크 적중"
"risk.hit": "리스크 적중",
"transfer.success": "송금 성공",
"transfer.fail": "송금 실패",
"transfer.close": "송금 닫기"
}

View File

@@ -2,5 +2,6 @@
"pay": "지불",
"refund": "환불하다",
"cashouts": "철수",
"settle": "합의"
"settle": "합의",
"transfer": "송금"
}

View File

@@ -0,0 +1,6 @@
{
"openid": "위챗 openid",
"user_id": "알리페이 사용자 ID",
"open_id": "알리페이 오픈 ID",
"login_name": "알리페이 로그인 계정"
}

View File

@@ -116,6 +116,16 @@
"transferAlreadyProcessed": "이전 주문이 이미 처리되었으며 콜백을 녹음하고 있습니다.",
"abnormal": "콜백 처리 중 예외가 발생했습니다. 플랫폼 지원에 문의하세요"
},
"transfer": {
"processing": "송금 처리 중입니다. 반복 작업하지 마세요",
"onlyFailRetry": "실패 상태만 다시 송금할 수 있습니다",
"noDuplicate": "이 상점 송금 번호가 이미 존재합니다. 반복 송금하지 마세요",
"notFound": "송금 주문이 존재하지 않습니다",
"syncProcessing": "송금 동기화 처리 중입니다. 반복 작업하지 마세요",
"closeNotProcessing": "송금 중인 주문만 수동으로 닫을 수 있습니다",
"channelNotSupport": "이 채널은 송금 닫기를 지원하지 않습니다",
"illegalTransition": "잘못된 상태 전환: {0} → {1}"
},
"assist": {
"mchPublicKeyEmpty": "판매자 공개 키가 비어 있습니다.",
"privateKeyEmpty": "판매자 개인 키가 비어 있습니다.",

View File

@@ -7,5 +7,8 @@
"pay.timeout": "Tutup Pembayaran Tamat Masa",
"pay.cancel": "Pembayaran Dibatalkan",
"refund.fail": "Bayaran Balik Gagal",
"risk.hit": "Risiko Dikesan"
"risk.hit": "Risiko Dikesan",
"transfer.success": "Pindahan Berjaya",
"transfer.fail": "Pindahan Gagal",
"transfer.close": "Pindahan Ditutup"
}

View File

@@ -2,5 +2,6 @@
"pay": "Bayaran",
"refund": "Bayaran balik",
"cashouts": "Pengeluaran",
"settle": "Penyelesaian"
"settle": "Penyelesaian",
"transfer": "Pindahan"
}

View File

@@ -0,0 +1,6 @@
{
"openid": "OpenID WeChat",
"user_id": "ID Pengguna Alipay",
"open_id": "ID Terbuka Alipay",
"login_name": "Akaun Log Masuk Alipay"
}

View File

@@ -107,6 +107,16 @@
"transferNotFound": "Perintah pemindahan tidak ditemui, merakam panggilan balik",
"transferAlreadyProcessed": "Pindahkan pesanan sudah diproses, merekodkan panggilan balik"
},
"transfer": {
"processing": "Pindahan sedang diproses, jangan ulangi",
"onlyFailRetry": "Hanya pindahan yang gagal boleh dimulakan semula",
"noDuplicate": "Nombor pindahan peniaga sudah wujud, jangan ulangi",
"notFound": "Pesanan pindahan tidak wujud",
"syncProcessing": "Sinkronisasi pindahan sedang diproses, jangan ulangi",
"closeNotProcessing": "Hanya pindahan yang sedang berjalan boleh ditutup secara manual",
"channelNotSupport": "Saluran ini tidak menyokong penutupan pindahan",
"illegalTransition": "Peralihan status tidak sah: {0} → {1}"
},
"assist": {
"mchPublicKeyEmpty": "Kunci awam pedagang kosong",
"privateKeyEmpty": "Kunci persendirian pedagang kosong",

View File

@@ -7,5 +7,8 @@
"pay.timeout": "ปิดการชำระหมดเวลา",
"pay.cancel": "ยกเลิกการชำระ",
"refund.fail": "คืนเงินล้มเหลว",
"risk.hit": "ตรวจพบความเสี่ยง"
"risk.hit": "ตรวจพบความเสี่ยง",
"transfer.success": "การโอนเงินสำเร็จ",
"transfer.fail": "การโอนเงินล้มเหลว",
"transfer.close": "ปิดการโอนเงิน"
}

View File

@@ -2,5 +2,6 @@
"pay": "การชำระเงิน",
"refund": "คืนเงิน",
"cashouts": "การถอนเงิน",
"settle": "การตั้งถิ่นฐาน"
"settle": "การตั้งถิ่นฐาน",
"transfer": "การโอนเงิน"
}

View File

@@ -0,0 +1,6 @@
{
"openid": "OpenID WeChat",
"user_id": "รหัสผู้ใช้ Alipay",
"open_id": "Open ID Alipay",
"login_name": "บัญชีเข้าสู่ระบบ Alipay"
}

View File

@@ -107,6 +107,16 @@
"transferNotFound": "ไม่พบคำสั่งการโอน กำลังบันทึกการโทรกลับ",
"transferAlreadyProcessed": "คำสั่งการโอนเงินดำเนินการแล้ว กำลังบันทึกการโทรกลับ"
},
"transfer": {
"processing": "กำลังดำเนินการโอนเงิน กรุณาอย่าทำซ้ำ",
"onlyFailRetry": "เฉพาะการโอนเงินที่ล้มเหลวเท่านั้นที่สามารถเริ่มใหม่ได้",
"noDuplicate": "เลขการโอนเงินของร้านค้ามีอยู่แล้ว กรุณาอย่าทำซ้ำ",
"notFound": "ไม่พบคำสั่งโอนเงิน",
"syncProcessing": "กำลังซิงค์การโอนเงิน กรุณาอย่าทำซ้ำ",
"closeNotProcessing": "เฉพาะคำสั่งโอนเงินที่กำลังดำเนินการเท่านั้นที่สามารถปิดด้วยตนเองได้",
"channelNotSupport": "ช่องทางนี้ไม่รองรับการปิดการโอนเงิน",
"illegalTransition": "การเปลี่ยนสถานะไม่ถูกต้อง: {0} → {1}"
},
"assist": {
"mchPublicKeyEmpty": "รหัสสาธารณะของผู้ขายว่างเปล่า",
"privateKeyEmpty": "รหัสส่วนตัวของผู้ขายว่างเปล่า",

View File

@@ -7,5 +7,8 @@
"pay.timeout": "Đóng thanh toán hết hạn",
"pay.cancel": "Hủy thanh toán",
"refund.fail": "Hoàn tiền thất bại",
"risk.hit": "Rủi ro phát hiện"
"risk.hit": "Rủi ro phát hiện",
"transfer.success": "Chuyển khoản thành công",
"transfer.fail": "Chuyển khoản thất bại",
"transfer.close": "Chuyển khoản đóng"
}

View File

@@ -2,5 +2,6 @@
"pay": "Sự chi trả",
"refund": "Đền bù",
"cashouts": "Rút tiền",
"settle": "giải quyết"
"settle": "giải quyết",
"transfer": "Chuyển khoản"
}

View File

@@ -0,0 +1,6 @@
{
"openid": "OpenID WeChat",
"user_id": "ID người dùng Alipay",
"open_id": "ID mở Alipay",
"login_name": "Tài khoản đăng nhập Alipay"
}

View File

@@ -107,6 +107,16 @@
"transferNotFound": "Không tìm thấy lệnh chuyển, đang ghi lại cuộc gọi lại",
"transferAlreadyProcessed": "Lệnh chuyển đã được xử lý, đang ghi lại cuộc gọi lại"
},
"transfer": {
"processing": "Chuyển khoản đang xử lý, vui lòng không lặp lại",
"onlyFailRetry": "Chỉ chuyển khoản thất bại mới có thể khởi động lại",
"noDuplicate": "Số chuyển khoản thương gia đã tồn tại, vui lòng không lặp lại",
"notFound": "Đơn chuyển khoản không tồn tại",
"syncProcessing": "Đồng bộ chuyển khoản đang xử lý, vui lòng không lặp lại",
"closeNotProcessing": "Chỉ đơn chuyển khoản đang xử lý mới có thể đóng thủ công",
"channelNotSupport": "Kênh này không hỗ trợ đóng chuyển khoản",
"illegalTransition": "Chuyển trạng thái không hợp lệ: {0} → {1}"
},
"assist": {
"mchPublicKeyEmpty": "Khóa công khai của người bán trống",
"privateKeyEmpty": "Khóa riêng của người bán trống",

View File

@@ -7,5 +7,8 @@
"pay.timeout": "支付超时关闭",
"pay.cancel": "支付撤销",
"refund.fail": "退款失败",
"risk.hit": "风控命中"
"risk.hit": "风控命中",
"transfer.success": "转账成功",
"transfer.fail": "转账失败",
"transfer.close": "转账关闭"
}

View File

@@ -2,5 +2,6 @@
"pay": "支付",
"refund": "退款",
"cashouts": "提现",
"settle": "结算"
"settle": "结算",
"transfer": "转账"
}

View File

@@ -0,0 +1,6 @@
{
"openid": "微信openid",
"user_id": "支付宝用户ID",
"open_id": "支付宝开放ID",
"login_name": "支付宝登录账号"
}

View File

@@ -116,6 +116,16 @@
"transferAlreadyProcessed": "转账单状态已处理,记录回调记录",
"abnormal": "回调处理异常,请联系平台客服"
},
"transfer": {
"processing": "转账处理中,请勿重复操作",
"onlyFailRetry": "只有失败状态的才可以重新发起转账",
"noDuplicate": "该商户转账号已存在,请勿重复转账",
"notFound": "转账单不存在",
"syncProcessing": "转账同步处理中,请勿重复操作",
"closeNotProcessing": "仅转账中的订单可手动关闭",
"channelNotSupport": "该通道暂不支持关闭转账",
"illegalTransition": "非法状态转换: {0} → {1}"
},
"assist": {
"mchPublicKeyEmpty": "商户公钥为空",
"privateKeyEmpty": "商户私钥为空",

View File

@@ -7,5 +7,8 @@
"pay.timeout": "支付逾時關閉",
"pay.cancel": "支付撤銷",
"refund.fail": "退款失敗",
"risk.hit": "風控命中"
"risk.hit": "風控命中",
"transfer.success": "轉賬成功",
"transfer.fail": "轉賬失敗",
"transfer.close": "轉賬關閉"
}

View File

@@ -2,5 +2,6 @@
"pay": "支付",
"refund": "退款",
"cashouts": "提現",
"settle": "結算"
"settle": "結算",
"transfer": "轉賬"
}

View File

@@ -0,0 +1,6 @@
{
"openid": "微信openid",
"user_id": "支付寶用戶ID",
"open_id": "支付寶開放ID",
"login_name": "支付寶登錄賬號"
}

View File

@@ -116,6 +116,16 @@
"transferAlreadyProcessed": "轉賬單狀態已處理,記錄回調記錄",
"abnormal": "回調處理異常,請聯絡平台客服"
},
"transfer": {
"processing": "轉賬處理中,請勿重複操作",
"onlyFailRetry": "只有失敗狀態的才可以重新發起轉賬",
"noDuplicate": "該商戶轉賬號已存在,請勿重複轉賬",
"notFound": "轉賬單不存在",
"syncProcessing": "轉賬同步處理中,請勿重複操作",
"closeNotProcessing": "僅轉賬中的訂單可手動關閉",
"channelNotSupport": "該通道暫不支持關閉轉賬",
"illegalTransition": "非法狀態轉換: {0} → {1}"
},
"assist": {
"mchPublicKeyEmpty": "商户公鑰為空",
"privateKeyEmpty": "商户私鑰為空",

View File

@@ -7,5 +7,8 @@
"pay.timeout": "支付逾時關閉",
"pay.cancel": "支付撤銷",
"refund.fail": "退款失敗",
"risk.hit": "風控命中"
"risk.hit": "風控命中",
"transfer.success": "轉帳成功",
"transfer.fail": "轉帳失敗",
"transfer.close": "轉帳關閉"
}

View File

@@ -2,5 +2,6 @@
"pay": "支付",
"refund": "退款",
"cashouts": "提現",
"settle": "結算"
"settle": "結算",
"transfer": "轉帳"
}

View File

@@ -0,0 +1,6 @@
{
"openid": "微信openid",
"user_id": "支付寶用戶ID",
"open_id": "支付寶開放ID",
"login_name": "支付寶登錄賬號"
}

View File

@@ -116,6 +116,16 @@
"transferAlreadyProcessed": "轉賬單狀態已處理,記錄回撥記錄",
"abnormal": "回撥處理異常,請聯繫平台客服"
},
"transfer": {
"processing": "轉帳處理中,請勿重複操作",
"onlyFailRetry": "只有失敗狀態的才可以重新發起轉帳",
"noDuplicate": "該商户轉帳號已存在,請勿重複轉帳",
"notFound": "轉帳單不存在",
"syncProcessing": "轉帳同步處理中,請勿重複操作",
"closeNotProcessing": "僅轉帳中的訂單可手動關閉",
"channelNotSupport": "該通道暫不支持關閉轉帳",
"illegalTransition": "非法狀態轉換: {0} → {1}"
},
"assist": {
"mchPublicKeyEmpty": "商戶公鑰為空",
"privateKeyEmpty": "商戶私鑰為空",

View File

@@ -281,6 +281,12 @@ public interface PermCodes {
String MENU = "trade:refund";
}
/// 转账单(微信/支付宝/抖音) menuCode=trade:transfer
interface Transfer {
/// 菜单编码
String MENU = "trade:transfer";
}
/// 资金交易凭证 menuCode=trade:fund
interface Fund {
/// 菜单编码

View File

@@ -28,6 +28,12 @@ public enum NoticeEventEnum implements I18nSupport {
REFUND_FAIL("refund.fail"),
/// 退款关闭
REFUND_CLOSE("refund.close"),
/// 转账成功
TRANSFER_SUCCESS("transfer.success"),
/// 转账失败
TRANSFER_FAIL("transfer.fail"),
/// 转账关闭
TRANSFER_CLOSE("transfer.close"),
/// 风控命中(黑名单/海外 IP 等规则触发)
RISK_HIT("risk.hit"),
;

View File

@@ -15,6 +15,8 @@ public enum TradeFlowTypeEnum implements I18nSupport {
PAY("pay"),
/// 退款
REFUND("refund"),
/// 转账
TRANSFER("transfer"),
;
/// 编码

View File

@@ -20,6 +20,8 @@ public enum TradeTypeEnum implements I18nSupport {
CASHOUTS("cashouts"),
/// 结算
SETTLE("settle"),
/// 转账
TRANSFER("transfer"),
;
private final String code;

View File

@@ -29,6 +29,11 @@ public final class TradeNoGenerateUtil {
return prefix() + "REF" + IdUtil.getSnowflakeNextId();
}
/// 生成转账单号
public static String transfer() {
return prefix() + "TRF" + IdUtil.getSnowflakeNextId();
}
/// 拼接环境前缀, 不添加分隔符, 部分通道不允许特殊符号
private static String prefix() {
return env == null ? "" : env;