JavaScript SDK
Pelago 官方 JavaScript/TypeScript SDK。
安装
npm install @pelago/sdk
# 或
yarn add @pelago/sdk
快速开始
import { PelagoClient } from '@pelago/sdk';
const pelago = new PelagoClient({
apiKey: process.env.PELAGO_API_KEY,
apiSecret: process.env.PELAGO_API_SECRET,
environment: 'production' // 或 'sandbox'
});
// 创建支付
const payment = await pelago.payments.create({
amount: 99.99,
currency: 'USD',
cryptocurrency: 'USDC',
network: 'stellar',
merchantWallet: 'GXXXXX...'
});
console.log('支付链接:', payment.url);
配置
const pelago = new PelagoClient({
// 必填
apiKey: 'pk_live_xxxxx',
apiSecret: 'sk_live_xxxxx',
// 可选
environment: 'production', // 'production' | 'sandbox'
timeout: 30000, // 请求超时(毫秒)
maxRetries: 3, // 自动重试失败请求
logger: console, // 自定义日志记录器
});
支付
创建支付
const payment = await pelago.payments.create({
amount: 100.00,
currency: 'USD',
cryptocurrency: 'USDC',
network: 'stellar',
merchantWallet: 'GXXXXX...',
redirectUrl: 'https://mystore.com/success',
webhookUrl: 'https://mystore.com/api/webhook',
expiresIn: 1800, // 30 分钟
metadata: {
orderId: 'ORD-12345',
customerEmail: '[email protected]'
}
});
查询支付
const payment = await pelago.payments.retrieve('pay_abc123');
console.log('状态:', payment.status);
列出支付
const payments = await pelago.payments.list({
status: 'completed',
limit: 20,
created_gte: '2025-01-01T00:00:00Z'
});
for (const payment of payments.data) {
console.log(`${payment.id}: ${payment.amount}`);
}
取消支付
const payment = await pelago.payments.cancel('pay_abc123');
// 状态将变为 'cancelled'
退款
创建退款
const refund = await pelago.refunds.create({
paymentId: 'pay_abc123',
amount: 50.00, // 部分退款
reason: 'Customer request'
});
列出退款
const refunds = await pelago.refunds.list({
paymentId: 'pay_abc123'
});
结算
列出结算
const settlements = await pelago.settlements.list({
status: 'completed',
startDate: '2025-01-01',
endDate: '2025-01-31'
});
获取结算详情
const settlement = await pelago.settlements.retrieve('stl_abc123');
console.log('总额:', settlement.totalAmount);
console.log('支付笔数:', settlement.paymentCount);
Webhook
验证签名
import express from 'express';
const app = express();
app.post('/webhook', express.raw({ type: 'application/json' }), (req, res) => {
const signature = req.headers['x-pelago-signature'] as string;
const timestamp = req.headers['x-pelago-timestamp'] as string;
const isValid = pelago.webhooks.verify(
req.body,
signature,
timestamp,
process.env.WEBHOOK_SECRET
);
if (!isValid) {
return res.status(401).send('Invalid signature');
}
const event = JSON.parse(req.body.toString());
// 处理事件...
res.status(200).json({ received: true });
});
构造事件
const event = pelago.webhooks.constructEvent(
req.body,
req.headers['x-pelago-signature'],
req.headers['x-pelago-timestamp'],
process.env.WEBHOOK_SECRET
);
switch (event.type) {
case 'payment.completed':
console.log('支付完成:', event.data.paymentId);
break;
}
错误处理
import { PelagoError } from '@pelago/sdk';
try {
const payment = await pelago.payments.create(params);
} catch (error) {
if (error instanceof PelagoError) {
console.error('类型:', error.type);
console.error('代码:', error.code);
console.error('消息:', error.message);
console.error('请求 ID:', error.requestId);
}
}
TypeScript 类型
import type {
Payment,
PaymentCreateParams,
Refund,
Settlement,
WebhookEvent
} from '@pelago/sdk';
// 完整的类型支持
const params: PaymentCreateParams = {
amount: 100,
currency: 'USD',
cryptocurrency: 'USDC',
network: 'stellar',
merchantWallet: 'GXXXXX...'
};
const payment: Payment = await pelago.payments.create(params);
React 集成
import { useState } from 'react';
import { PelagoClient } from '@pelago/sdk';
// 在组件外初始化客户端
const pelago = new PelagoClient({
apiKey: process.env.NEXT_PUBLIC_PELAGO_API_KEY,
environment: 'production'
});
function CheckoutButton({ amount, orderId }) {
const [loading, setLoading] = useState(false);
const handleCheckout = async () => {
setLoading(true);
try {
const payment = await pelago.payments.create({
amount,
currency: 'USD',
cryptocurrency: 'USDC',
network: 'stellar',
merchantWallet: process.env.NEXT_PUBLIC_WALLET,
metadata: { orderId }
});
window.location.href = payment.url;
} catch (error) {
console.error('支付错误:', error);
} finally {
setLoading(false);
}
};
return (
<button onClick={handleCheckout} disabled={loading}>
{loading ? '加载中...' : `支付 $${amount}`}
</button>
);
}
Next.js API 路由
// pages/api/create-payment.ts
import type { NextApiRequest, NextApiResponse } from 'next';
import { PelagoClient } from '@pelago/sdk';
const pelago = new PelagoClient({
apiKey: process.env.PELAGO_API_KEY!,
apiSecret: process.env.PELAGO_API_SECRET!,
environment: 'production'
});
export default async function handler(
req: NextApiRequest,
res: NextApiResponse
) {
if (req.method !== 'POST') {
return res.status(405).json({ error: 'Method not allowed' });
}
const { amount, orderId } = req.body;
try {
const payment = await pelago.payments.create({
amount,
currency: 'USD',
cryptocurrency: 'USDC',
network: 'stellar',
merchantWallet: process.env.MERCHANT_WALLET!,
webhookUrl: `${process.env.BASE_URL}/api/webhook`,
metadata: { orderId }
});
res.status(200).json({ paymentUrl: payment.url });
} catch (error) {
res.status(500).json({ error: error.message });
}
}