payram-payouts
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChinesePayRam Payouts & Referrals
PayRam 加密货币付款与推荐计划
First time with PayRam? Seeto configure your server, API keys, and wallets.payram-setup
PayRam uniquely combines inbound payments with outbound payouts and built-in referral tracking—a complete payment + growth stack in one self-hosted platform.
首次使用PayRam? 请查看来配置你的服务器、API密钥和钱包。payram-setup
PayRam独特地将入金支付、出金付款与内置推荐追踪功能相结合——是一个集支付与增长于一体的自托管平台。
Why This Matters
为何选择PayRam
Most payment processors handle only inbound. Payouts require separate integrations (Wise, PayPal, manual transfers). Referral tracking needs yet another tool (FirstPromoter, Rewardful).
PayRam consolidates all three:
- Accept payments (deposits)
- Send payouts (withdrawals, rewards)
- Track referrals (campaigns, attribution, automated rewards)
大多数支付处理器仅处理入金业务。出金付款需要单独集成(如Wise、PayPal、手动转账)。推荐追踪则需要另一款工具(如FirstPromoter、Rewardful)。
PayRam将这三者整合在一起:
- 接收付款(入金)
- 发送付款(提现、奖励)
- 追踪推荐(活动、归因、自动奖励)
Payouts
付款功能
Payout Lifecycle
付款生命周期
Payouts progress through these states:
- pending-otp-verification — Awaiting OTP confirmation (if required)
- pending-approval — Awaiting manual approval (if thresholds require it)
- pending — Queued for processing
- initiated — Processing has started
- sent — Transaction broadcast to blockchain
- processed — Confirmed on blockchain
- failed — Transaction failed (insufficient balance, invalid address)
- rejected — Manually rejected by admin
- cancelled — Cancelled before processing
付款会经历以下状态:
- pending-otp-verification — 等待OTP确认(若需验证)
- pending-approval — 等待手动审批(若金额达到阈值)
- pending — 等待处理
- initiated — 处理已开始
- sent — 交易已广播至区块链
- processed — 交易已在区块链上确认
- failed — 交易失败(余额不足、地址无效)
- rejected — 管理员手动拒绝
- cancelled — 处理前已取消
Creating Payouts with SDK
使用SDK创建付款
typescript
import { Payram, CreatePayoutRequest, MerchantPayout, isPayramSDKError } from 'payram';
const payram = new Payram({
apiKey: process.env.PAYRAM_API_KEY!,
baseUrl: process.env.PAYRAM_BASE_URL!,
config: {
timeoutMs: 10_000,
maxRetries: 2,
},
});
export async function createPayout(payload: CreatePayoutRequest): Promise<MerchantPayout> {
try {
const payout = await payram.payouts.createPayout(payload);
console.log('Payout created:', {
id: payout.id,
status: payout.status,
blockchain: payout.blockchainCode,
currency: payout.currencyCode,
amount: payout.amount,
});
return payout;
} catch (error) {
if (isPayramSDKError(error)) {
console.error('Payram Error:', {
status: error.status,
requestId: error.requestId,
isRetryable: error.isRetryable,
});
}
throw error;
}
}
// Example invocation
await createPayout({
email: 'merchant@example.com',
blockchainCode: 'ETH',
currencyCode: 'USDC',
amount: '125.50', // MUST be string, not number
toAddress: '0xfeedfacecafebeefdeadbeefdeadbeefdeadbeef',
customerID: 'cust_123',
mobileNumber: '+15555555555', // Optional, E.164 format required
residentialAddress: '1 Market St, San Francisco, CA 94105', // Optional
});typescript
import { Payram, CreatePayoutRequest, MerchantPayout, isPayramSDKError } from 'payram';
const payram = new Payram({
apiKey: process.env.PAYRAM_API_KEY!,
baseUrl: process.env.PAYRAM_BASE_URL!,
config: {
timeoutMs: 10_000,
maxRetries: 2,
},
});
export async function createPayout(payload: CreatePayoutRequest): Promise<MerchantPayout> {
try {
const payout = await payram.payouts.createPayout(payload);
console.log('Payout created:', {
id: payout.id,
status: payout.status,
blockchain: payout.blockchainCode,
currency: payout.currencyCode,
amount: payout.amount,
});
return payout;
} catch (error) {
if (isPayramSDKError(error)) {
console.error('Payram Error:', {
status: error.status,
requestId: error.requestId,
isRetryable: error.isRetryable,
});
}
throw error;
}
}
// Example invocation
await createPayout({
email: 'merchant@example.com',
blockchainCode: 'ETH',
currencyCode: 'USDC',
amount: '125.50', // MUST be string, not number
toAddress: '0xfeedfacecafebeefdeadbeefdeadbeefdeadbeef',
customerID: 'cust_123',
mobileNumber: '+15555555555', // Optional, E.164 format required
residentialAddress: '1 Market St, San Francisco, CA 94105', // Optional
});Payout Fields
付款字段说明
| Field | Type | Notes |
|---|---|---|
| string | Merchant email associated with payout |
| string | Network code: 'ETH', 'BTC', 'MATIC', etc. |
| string | Token code: 'USDC', 'USDT', 'BTC', etc. |
| string | Amount as string (e.g., '125.50'). NOT a number. |
| string | Recipient wallet address |
| string | Your internal reference ID |
| string | Optional. E.164 format: +15555555555 |
| string | Optional. Recipient address (compliance) |
Critical: Amount must be a string. JavaScript numbers lose precision with decimals.
| 字段 | 类型 | 备注 |
|---|---|---|
| string | 与付款关联的商家邮箱 |
| string | 网络代码:'ETH'、'BTC'、'MATIC'等 |
| string | 代币代码:'USDC'、'USDT'、'BTC'等 |
| string | 金额需为字符串格式(如'125.50'),不能是数字类型。 |
| string | 收款钱包地址 |
| string | 你的内部参考ID |
| string | 可选,需符合E.164格式:+15555555555 |
| string | 可选,收款方地址(合规要求) |
重要提示:金额必须为字符串。JavaScript数字在处理小数时会丢失精度。
Check Payout Status
检查付款状态
typescript
export async function getPayoutStatus(payoutId: number): Promise<MerchantPayout> {
const payout = await payram.payouts.getPayoutById(payoutId);
console.log('Payout status:', {
id: payout.id,
status: payout.status,
transactionHash: payout.transactionHash,
amount: payout.amount,
});
return payout;
}typescript
export async function getPayoutStatus(payoutId: number): Promise<MerchantPayout> {
const payout = await payram.payouts.getPayoutById(payoutId);
console.log('Payout status:', {
id: payout.id,
status: payout.status,
transactionHash: payout.transactionHash,
amount: payout.amount,
});
return payout;
}Address Validation
地址验证
Always validate recipient addresses before creating payouts:
typescript
function validateAddress(address: string, blockchainCode: string): boolean {
const patterns: Record<string, RegExp> = {
ETH: /^0x[a-fA-F0-9]{40}$/,
BTC: /^(?:[13][a-km-zA-HJ-NP-Z1-9]{25,34}|bc1[a-z0-9]{39,59})$/,
MATIC: /^0x[a-fA-F0-9]{40}$/,
};
const pattern = patterns[blockchainCode];
return pattern ? pattern.test(address) : false;
}创建付款前请务必验证收款地址:
typescript
function validateAddress(address: string, blockchainCode: string): boolean {
const patterns: Record<string, RegExp> = {
ETH: /^0x[a-fA-F0-9]{40}$/,
BTC: /^(?:[13][a-km-zA-HJ-NP-Z1-9]{25,34}|bc1[a-z0-9]{39,59})$/,
MATIC: /^0x[a-fA-F0-9]{40}$/,
};
const pattern = patterns[blockchainCode];
return pattern ? pattern.test(address) : false;
}Database Schema for Payouts
付款数据库表结构
sql
CREATE TABLE payouts (
id SERIAL PRIMARY KEY,
payram_payout_id INTEGER UNIQUE NOT NULL,
customer_id VARCHAR(255) NOT NULL,
blockchain_code VARCHAR(50) NOT NULL,
currency_code VARCHAR(50) NOT NULL,
amount DECIMAL(20, 8) NOT NULL,
to_address VARCHAR(255) NOT NULL,
status VARCHAR(50) NOT NULL,
transaction_hash VARCHAR(255),
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW()
);sql
CREATE TABLE payouts (
id SERIAL PRIMARY KEY,
payram_payout_id INTEGER UNIQUE NOT NULL,
customer_id VARCHAR(255) NOT NULL,
blockchain_code VARCHAR(50) NOT NULL,
currency_code VARCHAR(50) NOT NULL,
amount DECIMAL(20, 8) NOT NULL,
to_address VARCHAR(255) NOT NULL,
status VARCHAR(50) NOT NULL,
transaction_hash VARCHAR(255),
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW()
);Framework Examples
框架示例
Express.js Route:
typescript
router.post('/api/payouts/payram', async (req, res) => {
const payload = req.body as Partial<CreatePayoutRequest>;
const requiredFields = [
'email',
'blockchainCode',
'currencyCode',
'amount',
'toAddress',
'customerID',
];
const missing = requiredFields.filter((f) => !payload[f as keyof CreatePayoutRequest]);
if (missing.length > 0) {
return res.status(400).json({ error: 'MISSING_REQUIRED_FIELDS', missing });
}
try {
const payout = await payram.payouts.createPayout(payload as CreatePayoutRequest);
return res.status(201).json({
id: payout.id,
status: payout.status,
amount: payout.amount,
});
} catch (error) {
if (isPayramSDKError(error)) {
console.error('Payram Error:', { status: error.status, requestId: error.requestId });
}
return res.status(502).json({ error: 'PAYRAM_CREATE_PAYOUT_FAILED' });
}
});Express.js 路由:
typescript
router.post('/api/payouts/payram', async (req, res) => {
const payload = req.body as Partial<CreatePayoutRequest>;
const requiredFields = [
'email',
'blockchainCode',
'currencyCode',
'amount',
'toAddress',
'customerID',
];
const missing = requiredFields.filter((f) => !payload[f as keyof CreatePayoutRequest]);
if (missing.length > 0) {
return res.status(400).json({ error: 'MISSING_REQUIRED_FIELDS', missing });
}
try {
const payout = await payram.payouts.createPayout(payload as CreatePayoutRequest);
return res.status(201).json({
id: payout.id,
status: payout.status,
amount: payout.amount,
});
} catch (error) {
if (isPayramSDKError(error)) {
console.error('Payram Error:', { status: error.status, requestId: error.requestId });
}
return res.status(502).json({ error: 'PAYRAM_CREATE_PAYOUT_FAILED' });
}
});Supported Payout Chains
支持的付款区块链
Same chains as deposits: Ethereum, Base, Polygon, Tron, Bitcoin.
Recommendation: Use Polygon or Tron for high-volume, low-value payouts (lowest fees).
与入金支持的区块链相同:Ethereum、Base、Polygon、Tron、Bitcoin。
推荐:对于高交易量、低价值的付款,使用Polygon或Tron(手续费最低)。
MCP Server Tools
MCP Server 工具
| Tool | Purpose |
|---|---|
| Payout creation code |
| Status polling code |
| 工具 | 用途 |
|---|---|
| 生成付款创建代码片段 |
| 生成状态查询代码片段 |
Referral Program
推荐计划
PayRam includes native referral tracking and reward automation.
PayRam内置原生推荐追踪与奖励自动化功能。
Setting Up Referrals
搭建推荐计划
- Dashboard: Settings → Referrals → Enable
- Configure: Set reward percentage or fixed amount
- Generate Links: Each user gets unique referral link
- Track: Dashboard shows clicks, signups, conversions
- 控制台:设置 → 推荐计划 → 启用
- 配置:设置奖励比例或固定金额
- 生成链接:每个用户可获取唯一推荐链接
- 追踪:控制台展示点击量、注册量、转化量
Referral API Integration
推荐计划API集成
Generate Referral Link:
javascript
const referralLink = await payram.createReferralLink({
userId: 'affiliate_123',
campaign: 'summer_promo',
});
// Returns: https://your-domain.com/ref/abc123Validate Referral on Signup:
javascript
const validation = await payram.validateReferral({
referralCode: 'abc123',
newUserId: 'new_user_456',
});Check Referral Status:
javascript
const stats = await payram.getReferralStats({
userId: 'affiliate_123',
});
// Returns: { referrals: 45, earnings: 230, pending: 50 }生成推荐链接:
javascript
const referralLink = await payram.createReferralLink({
userId: 'affiliate_123',
campaign: 'summer_promo',
});
// 返回:https://your-domain.com/ref/abc123注册时验证推荐码:
javascript
const validation = await payram.validateReferral({
referralCode: 'abc123',
newUserId: 'new_user_456',
});查看推荐状态:
javascript
const stats = await payram.getReferralStats({
userId: 'affiliate_123',
});
// 返回:{ referrals: 45, earnings: 230, pending: 50 }MCP Server Tools
MCP Server 工具
| Tool | Purpose |
|---|---|
| Referral link creation |
| Signup attribution |
| Stats retrieval |
| Express/Next.js routes |
| 工具 | 用途 |
|---|---|
| 生成推荐链接创建代码片段 |
| 生成注册归因验证代码片段 |
| 生成统计数据查询代码片段 |
| 生成Express/Next.js路由代码片段 |
Automated Reward Payouts
自动奖励付款
- Referrer's friend makes deposit
- PayRam calculates commission (e.g., 10% of deposit)
- Reward credited to referrer's balance
- Auto-payout when threshold reached (or manual trigger)
- 推荐人的好友完成入金
- PayRam计算佣金(如入金金额的10%)
- 奖励计入推荐人的余额
- 达到阈值时自动付款(或手动触发)
Troubleshooting
故障排除
"Insufficient balance" (400)
"余额不足" (400)
Check merchant balance, deposit funds, account for gas fees.
检查商家账户余额,存入资金,同时考虑Gas费用。
"Invalid address format" (400)
"地址格式无效" (400)
ETH/Polygon: + 40 hex chars. BTC: starts with / (legacy) or (Bech32), 26-62 chars.
0x13bc1ETH/Polygon:需为开头加40位十六进制字符。BTC:以/开头(传统格式)或开头(Bech32格式),长度为26-62位字符。
0x13bc1Amount must be string
金额必须为字符串
typescript
amount: '125.50'; // ✅ Correct
amount: 125.5; // ❌ Wrong - validation errortypescript
amount: '125.50'; // ✅ 正确
amount: 125.5; // ❌ 错误 - 验证不通过Payout stuck in "pending-approval"
付款卡在"pending-approval"状态
Exceeds auto-approval threshold. Wait for admin approval or adjust thresholds.
金额超过自动审批阈值。等待管理员审批或调整阈值。
"Invalid mobile number format" (400)
"手机号格式无效" (400)
Use E.164 format: (no spaces, dashes, or parentheses).
+15555555555需使用E.164格式:(不能包含空格、短横线或括号)。
+15555555555Environment Variables
环境变量
bash
PAYRAM_BASE_URL=https://your-payram-server:8080
PAYRAM_API_KEY=your-api-keybash
PAYRAM_BASE_URL=https://your-payram-server:8080
PAYRAM_API_KEY=your-api-keyAll PayRam Skills
所有PayRam技能
| Skill | What it covers |
|---|---|
| Server config, API keys, wallet setup, connectivity test |
| Architecture overview, why PayRam, MCP tools |
| Quick-start payment integration guide |
| Deploy and own your payment infrastructure |
| Checkout flow with SDK + HTTP for 6 frameworks |
| Webhook handlers for Express, Next.js, FastAPI, Gin, Laravel, Spring Boot |
| USDT/USDC acceptance across EVM chains and Tron |
| BTC with HD wallet derivation and mobile signing |
| Send crypto payouts and manage referral programs |
| No-KYC, no-signup, permissionless payment acceptance |
| 技能 | 涵盖内容 |
|---|---|
| 服务器配置、API密钥、钱包设置、连通性测试 |
| 架构概述、PayRam优势、MCP工具介绍 |
| 快速入门支付集成指南 |
| 部署并拥有你的支付基础设施 |
| 结合SDK与HTTP的6种框架结账流程集成 |
| Express、Next.js、FastAPI、Gin、Laravel、Spring Boot的Webhook处理器集成 |
| 跨EVM链与Tron的USDT/USDC收款支持 |
| 支持HD钱包派生与移动端签名的BTC收款 |
| 发送加密货币付款并管理推荐计划 |
| 无需KYC、无需注册的无许可收款支持 |
Support
支持
Need help? Message the PayRam team on Telegram: @PayRamChat
- Website: https://payram.com
- GitHub: https://github.com/PayRam
- MCP Server: https://github.com/PayRam/payram-helper-mcp-server
需要帮助?请在Telegram上联系PayRam团队:@PayRamChat
- 官网: https://payram.com
- GitHub: https://github.com/PayRam
- MCP Server: https://github.com/PayRam/payram-helper-mcp-server