OrionPay 支付、集成与个人钱包 REST 端点的公开参考。 基础 URL: https://payapi.orion.moe
面向 LLM 的索引位于 /llms.txt 完整的内联规范位于 /llms-full.txt. OpenAPI 3.1 规范位于 payapi.orion.moe/openapi.json. 产品与 API 的更新说明位于 /changelog.
一个提供 18 个工具的 Streamable HTTP MCP 服务器已上线: payapi.orion.moe/mcp
claude mcp add orionpay --transport http https://payapi.orion.moe/mcp --header "X-API-Key: $ORIONPAY_API_KEY"在以下位置生成 API 密钥: Dashboard > API & Webhooks > MCP / LLM.
所有公开端点都需要在请求头中发送 API Key: X-API-Key (或 Authorization: Bearer)。共有两种类型:
productId = null。控制用户自己的钱包(余额、提现、兑换),不创建销售收款。
端点: /api/v1/personal/*.
绑定到某个产品。通过 API 销售时必需:它创建收款并触发销售 webhook。
端点: /api/v1/pix/generate, /integration/*.
X-API-Key: opay_abc123def456...// 通过 API 生成 PIX
const response = await fetch('https://payapi.orion.moe/api/v1/pix/generate', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-API-Key': 'opay_sua_chave_aqui'
},
body: JSON.stringify({
amount: 199.90,
name: 'João da Silva',
email: '[email protected]'
})
})
const { data } = await response.json()
console.log(data.purchaseId) // 内部购买 ID
console.log(data.pixCode) // PIX 复制粘贴码
console.log(data.qrCode) // QR Code = pixCode
console.log(data.expiresAt) // ISO 8601通过 API 销售
结账收款(/api/v1/pix/generate)与销售 webhook(purchase.created, payment.success)需要一个 产品 API Key ——请在控制台创建产品并生成其密钥。个人 API Key 仅能访问你自己的钱包(/api/v1/personal/*),且不创建收款。向你自己账户的充值通过控制台完成,而非 API。
/api/v1/pix/generate产品 API Key生成绑定到某个产品的 PIX 二维码。使用产品价格或你传入的金额。自 2026/06/30 起必须提供付款人的 CPF/CNPJ(字段 cpf)——替代方案:euid(付款人在 DePix 的标识)。
请求体
{
"amount": 199.90,
"description": "Venda de produto",
"name": "João da Silva",
"email": "[email protected]",
"cpf": "52998224725",
"phone": "+5511999999999"
}响应(200)
{
"success": true,
"data": {
"purchaseId": 12345,
"productId": 8,
"productTitle": "Exemplo Produto",
"id": "550e8400-e29b-41d4-a716-446655440000",
"pixCode": "00020126580014br.gov.bcb.pix...",
"qrCode": "00020126580014br.gov.bcb.pix...",
"amount": 199.90,
"description": "Venda de produto: Exemplo Produto",
"expiresAt": "2026-04-24T14:30:00.000Z",
"status": "PENDING",
"coProducers": [
{ "userId": 5, "name": "Co-produtor Name", "percentage": 15.50 }
]
}
}/api/v1/pix/status/:id任意 API Key60 req/min接受 purchaseId(数字)、transactionId(数字)或 eulenDepositId(UUID)。
响应(200)
{
"success": true,
"type": "product_purchase",
"id": 12345,
"eulenDepositId": "550e8400-e29b-41d4-a716-446655440000",
"status": "PAID",
"paidAt": "2026-04-24T12:00:00.000Z",
"accessToken": "abcd1234efgh5678ijkl9012mnop3456",
"productId": 8,
"productTitle": "Exemplo Produto",
"amount": 199.90,
"buyerEmail": "[email protected]",
"buyerName": "João Silva",
"createdAt": "2026-04-24T10:00:00.000Z"
}/integration/verify-access产品 API Key60 req/minQuery:email 或 accessToken(至少提供一个)。
响应(200)
{
"hasAccess": true,
"purchaseId": 12345,
"accessToken": "abcd1234efgh5678ijkl9012mnop3456",
"buyerEmail": "[email protected]",
"buyerName": "João Silva",
"productTitle": "Exemplo Produto",
"purchaseDate": "2026-04-20T10:00:00.000Z",
"expiresAt": "2026-05-20T10:00:00.000Z"
}/integration/grant-access产品 API Key为指定邮箱创建一笔已支付的购买记录。适用于赠送与客服场景。
请求体
{
"buyerEmail": "[email protected]",
"buyerName": "Maria Santos",
"price": 199.90,
"expiresAt": "2026-05-24T00:00:00.000Z"
}响应(200)
{
"success": true,
"message": "Acesso concedido com sucesso",
"purchaseId": 12347,
"accessToken": "abcd1234efgh5678ijkl9012mnop3456",
"buyerEmail": "[email protected]",
"buyerName": "Maria Santos",
"expiresAt": "2026-05-24T00:00:00.000Z"
}/integration/buyers产品 API Key60 req/min可选 query:status(PENDING、PAID、EXPIRED)。
响应(200)
{
"total": 2,
"buyers": [
{
"purchaseId": 12345,
"buyerEmail": "[email protected]",
"buyerName": "João Silva",
"price": 199.90,
"paymentStatus": "PAID",
"accessToken": "abcd1234efgh5678ijkl9012mnop3456",
"purchaseDate": "2026-04-20T10:00:00.000Z",
"paidAt": "2026-04-20T10:05:00.000Z",
"expiresAt": "2026-05-20T10:00:00.000Z",
"paymentLink": "Link de Pagamento Exemplo"
}
]
}/integration/buyers/:purchaseId产品 API Key按 ID 返回一笔购买的完整数据。
响应(200)
{
"purchaseId": 12345,
"buyerEmail": "[email protected]",
"buyerName": "João Silva",
"price": 199.90,
"paymentStatus": "PAID",
"accessToken": "abcd1234efgh5678ijkl9012mnop3456",
"purchaseDate": "2026-04-20T10:00:00.000Z",
"paidAt": "2026-04-20T10:05:00.000Z",
"expiresAt": "2026-05-20T10:00:00.000Z",
"product": { "id": 8, "title": "Exemplo Produto", "productType": "COURSE" },
"paymentLink": { "id": 1, "title": "Link de Pagamento Exemplo" }
}/integration/content产品 API Key60 req/minQuery:accessToken(必填)。校验令牌并返回已开放的内容。
响应(200)
{
"productId": 8,
"buyerEmail": "[email protected]",
"buyerName": "João Silva",
"contents": [
{
"id": 1,
"type": "video",
"title": "Aula 1 - Introdução",
"url": "https://storage.example.com/video1.mp4",
"fileSize": 524288000,
"mimeType": "video/mp4",
"order": 1,
"metadata": "{\"duration\": 3600}"
}
]
}/integration/revoke-access/:purchaseId产品 API Key使指定购买的 accessToken 失效。
响应(200)
{
"success": true,
"message": "Acesso revogado com sucesso",
"purchaseId": 12345
}/api/v1/integration/deposit/pix产品 API Key10 req/min为产品创建 PIX 二维码。自 2026/06/30 起必须提供付款人的 CPF/CNPJ(字段 cpf,仅数字)——替代方案:euid(付款人在 DePix 的标识)。商户标识(merchantId)会自动解析自你的 API key,无需传入。
请求体
{
"cpf": "52998224725",
"amount": 199.90,
"buyerEmail": "[email protected]",
"buyerName": "João da Silva"
}响应(200)
{
"purchaseId": 12348,
"productId": 8,
"productTitle": "Exemplo Produto",
"id": "550e8400-e29b-41d4-a716-446655440000",
"pixCode": "00020126580014br.gov.bcb.pix...",
"qrCode": "00020126580014br.gov.bcb.pix...",
"amount": 199.90,
"expiresAt": "2026-04-24T14:30:00.000Z",
"status": "created"
}/api/v1/personal/balance个人 API Key60 req/h按币种返回余额,包含冻结与待处理部分。
响应(200)
{
"success": true,
"wallets": [
{
"currency": "BRL",
"balance": 5000.00,
"blockedBalance": 500.00,
"pendingBalance": 0.00,
"availableBalance": 4500.00
},
{
"currency": "L-BTC",
"balance": 0.02,
"blockedBalance": 0.00,
"pendingBalance": 0.00,
"availableBalance": 0.02
}
]
}/api/v1/personal/limits个人 API Key30 req/h返回每日/每月限额及当前已用量。
响应(200)
{
"success": true,
"limits": {
"dailyWithdrawBRL": 10000.00,
"monthlyWithdrawBRL": 100000.00,
"dailyWithdrawCrypto": 2.00,
"monthlyWithdrawCrypto": 10.00,
"dailyUsed": 2000.00,
"monthlyUsed": 15000.00
}
}/api/v1/personal/transactions个人 API Key60 req/hQuery:limit、offset、type(DEPOSIT、WITHDRAWAL、SWAP)。
响应(200)
{
"success": true,
"transactions": [
{
"id": 789,
"type": "DEPOSIT",
"status": "COMPLETED",
"amount": 500.00,
"description": "Depósito PIX",
"blockchainTxId": null,
"createdAt": "2026-04-24T10:00:00.000Z"
}
],
"pagination": { "total": 50, "limit": 10, "offset": 0, "hasMore": true }
}/api/v1/personal/withdraw/quote个人 API Key120 req/h以与真实扣款相同的算法模拟一笔提现。二者只能传其一:?amount=(要扣除的总额)或 ?netAmount=(目标账户应收到的净额)。grossAmount − totalFee = netAmount 恰好相等。
响应(200)
{
"success": true,
"quote": { "grossAmount": 78.31, "totalFee": 3.31, "netAmount": 75.00, "requestedNetAmount": 75.00 },
"limits": { "minAmount": 4.00, "maxAmount": 50000.00 },
"validation": { "withinLimits": true }
}/api/v1/personal/withdraw/pix个人 API Key10 req/h二者只能传其一:amount(1–100,000,要扣除的总额)或 netAmount(应到账的净额,扣款金额自动计算)。fee 为总手续费,且 amount − fee = netAmount。pixKeyType 会自动识别(EMAIL、CPF、CNPJ、PHONE、RANDOM)。
请求体
{
"netAmount": 75.00,
"pixKey": "12345678000123",
"pixKeyType": "CPF",
"description": "Saque via API",
"taxNumber": "52998224725"
}响应(200)
{
"success": true,
"message": "Saque PIX em processamento",
"queueId": 88,
"transactionId": 791,
"status": "PENDING",
"requiresApproval": false,
"amount": 78.31,
"fee": 3.31,
"total": 78.31,
"netAmount": 75.00,
"requestedNetAmount": 75.00,
"estimatedProcessingTime": "1-2 minutos"
}/api/v1/personal/withdraw/crypto个人 API Key10 req/h支持 L-BTC、BTC-PEGOUT、DePix、USDt、USDC。TON 必须提供 memo。
请求体
{
"amount": 0.01,
"toAddress": "bc1q6y3kz2c8s4n9p1m0l2k3j4h5g6f7e8d9c0b1a",
"assetTicker": "BTC-PEGOUT",
"network": "bitcoin"
}响应(200)
{
"success": true,
"transactionId": 792,
"status": "PENDING",
"amount": 0.01,
"assetTicker": "BTC-PEGOUT",
"toAddress": "bc1q6y3kz2c8s4n9p1m0l2k3j4h5g6f7e8d9c0b1a",
"blockchainTxId": null,
"createdAt": "2026-04-24T14:00:00.000Z"
}/api/v1/personal/withdraw/status/:id个人 API Key120 req/h返回当前状态、总手续费与净额。一旦服务商确认支付,netAmount 即为已确认的付款额(payoutConfirmed: true)。加密货币提现会填充 toAddress/asset 而非 pixKey。
响应(200)
{
"success": true,
"transaction": {
"id": 791,
"status": "COMPLETED",
"amount": 78.31,
"fee": 3.31,
"netAmount": 75.00,
"payoutConfirmed": true,
"requestedNetAmount": 75.00,
"pixKey": "12345678000123",
"description": "P-API: Saque PIX",
"blockchainTxId": null,
"errorCode": null,
"errorMessage": null,
"createdAt": "2026-04-24T14:00:00.000Z",
"updatedAt": "2026-04-24T14:05:00.000Z"
}
}/api/v1/personal/swap/quote个人 API Key120 req/h支持的币种:DePix、L-BTC、USDt、EURx。报价有效期 5 分钟。
请求体
{
"fromCurrency": "BRL",
"toCurrency": "BTC",
"amount": 1000.00
}响应(200)
{
"success": true,
"fromCurrency": "BRL",
"toCurrency": "BTC",
"fromAmount": 1000.00,
"toAmount": 0.0195,
"rate": 0.0000195,
"fee": 5.00,
"feeCurrency": "BRL",
"expiresAt": "2026-04-24T14:15:00.000Z"
}/api/v1/personal/swap/execute个人 API Key20 req/h按执行时的现行价格扣除 fromCurrency 并入账 toCurrency。
请求体
{
"fromCurrency": "BRL",
"toCurrency": "BTC",
"amount": 1000.00
}响应(200)
{
"success": true,
"transactionId": 793,
"fromCurrency": "BRL",
"toCurrency": "BTC",
"fromAmount": 1000.00,
"toAmount": 0.0195,
"status": "COMPLETED",
"executedAt": "2026-04-24T14:05:00.000Z"
}/payment-links/purchase/:purchaseId/status公开(无需鉴权)60 req/min唯一无需鉴权的端点。接受数字 ID(购买)或 UUID(eulenDepositId)。用于结账轮询。
响应(200)
{
"purchaseId": 12345,
"paymentStatus": "PAID",
"paidAt": "2026-04-24T12:00:00.000Z",
"accessToken": "abcd1234efgh5678ijkl9012mnop3456",
"productTitle": "Exemplo Produto",
"price": 199.90
}超过限制时后端返回 HTTP 429。限额按 API Key + 路由计算,并在所示时间窗内重置。
Transaction 资源(GET /transactions/:id)上 status 字段的可能值
PIX 已生成,等待支付。余额尚未移动。
Eulen 处理中。可能是 under_review(反欺诈)、delayed(Eulen 在批准前保留 DePix — 尚无资金影响),或在 approved 后处于 delay-depix HOLD(PIX 已确认,blockedBalance 已增加;通过 metadata.holdSource = "delay-depix" + metadata.approvedAt + availableAt 识别该子阶段)。该子阶段的 webhook:deposit.approved_delay。
DePix 已交付到储备。资金记入 balance(如果 isOnHold=true 则记入 pendingBalance)。发出的 webhook:deposit.success 或 deposit.on_hold。
PIX 失败(未支付、过期、被 Eulen 或银行拒绝)。未移动任何余额。
交易被管理员手动取消或因 TTL(PIX 在窗口内未支付)取消。
退款:在保留期间检测到 MED(PIX 退款)或管理员手动退款。根据 metadata.holdSource 从 blockedBalance 或 pendingBalance 扣除。
交易由团队人工审核中,等待批准或拒绝。
当重要事件发生时自动接收通知
每个 webhook 都在 X-Webhook-Signature 请求头中携带 HMAC-SHA256 签名,该签名基于原始请求体(raw body)与 webhook 密钥计算得出。处理前请务必校验。
X-Webhook-Signature: a1b2c3d4e5f6...payment.success支付已确认并入账。
{
"event": "payment.success",
"productId": 8,
"productTitle": "Exemplo Produto",
"webhookName": "notificar_sistema",
"timestamp": "2026-04-24T12:00:00.000Z",
"data": {
"purchaseId": 12345,
"transactionId": "txn_abc123",
"productId": 8,
"buyerEmail": "[email protected]",
"buyerName": "João Silva",
"accessToken": "abcd1234efgh5678ijkl9012mnop3456",
"price": 199.90,
"netAmount": 179.91,
"platformFee": 19.99,
"timestamp": "2026-04-24T12:00:00.000Z"
}
}purchase.created购买已创建,等待支付。
{
"event": "purchase.created",
"productId": 8,
"timestamp": "2026-04-24T10:00:00.000Z",
"data": {
"purchaseId": 12345,
"transactionId": "txn_abc123",
"amount": 199.90,
"status": "pending",
"createdAt": "2026-04-24T10:00:00.000Z",
"buyerEmail": "[email protected]",
"buyerName": "João Silva"
}
}access.granted支付确认后已向买家开放访问权限。
{
"event": "access.granted",
"productId": 8,
"timestamp": "2026-04-24T12:00:05.000Z",
"data": {
"purchaseId": 12345,
"buyerEmail": "[email protected]",
"accessToken": "abcd1234efgh5678ijkl9012mnop3456",
"expiresAt": "2026-05-24T12:00:05.000Z",
"grantedAt": "2026-04-24T12:00:05.000Z"
}
}payment.refunded_med在反欺诈保留期内因 MED(退单)而退款。
{
"event": "payment.refunded_med",
"productId": 8,
"timestamp": "2026-04-24T15:00:00.000Z",
"data": {
"transactionId": 789,
"amount": 199.90,
"reference": "550e8400-e29b-41d4-a716-446655440000",
"status": "refunded",
"type": "DEPOSIT",
"currency": "BRL",
"reason": "med_during_antifraud_hold",
"medDetectedAt": "2026-04-24T14:50:00.000Z",
"refundedAt": "2026-04-24T15:00:00.000Z"
}
}payment.refundedEulen 已将充值退回给付款人(PIX 已退回),冻结金额被冲销。对已入账资金的 MED 冲正会以 payment.refunded_med 事件送达。可选字段 refundReasonDetail 携带推断出的原因(med_chargeback、cpf_mismatch、cnpj_mismatch、spam_like、user_blocked、payer_refused、indeterminate_payer)。除 indeterminate_payer 外,负载都包含 payerEuid —— 付款账户稳定的假名标识,可在不暴露身份的前提下关联惯犯。mismatch 类原因还会附带 payerName 与 payerTaxNumber,其中 CPF 始终脱敏。
{
"event": "payment.refunded",
"productId": 8,
"timestamp": "2026-04-24T15:00:00.000Z",
"data": {
"transactionId": 789,
"amount": 199.90,
"reference": "550e8400-e29b-41d4-a716-446655440000",
"status": "refunded",
"type": "DEPOSIT",
"currency": "BRL",
"reason": "eulen_refund",
"refundReasonDetail": "cpf_mismatch",
"payerEuid": "EU015562310201680",
"payerName": "João da Silva",
"payerTaxNumber": "***.456.789-**",
"eulenStatus": "refunded",
"refundedAt": "2026-04-24T15:00:00.000Z",
"credited": false
}
}payment.refund_pending预先通知:Eulen 宣布将退回一笔已收到的 PIX(风控/合规)。这不是终态事件 —— payment.refunded 随后送达,平均约 2 小时,若服务商先行冻结金额则最长 3 天(在 expectedRefundAt 中告知)。请按不可逆处理。可选字段 rejectionReasons 携带服务商的原始代码(PAYER_MISMATCH、BLOCKED_USER);该词表由其定义且可能扩充 —— 未知代码请按通用风控拒绝处理。若买家已获得访问权限,OrionPay 会撤销并发送 accessRevoked: true;请同时在你这一侧撤回交付。
{
"event": "payment.refund_pending",
"productId": 8,
"timestamp": "2026-04-24T15:00:00.000Z",
"data": {
"transactionId": 789,
"amount": 199.90,
"reference": "550e8400-e29b-41d4-a716-446655440000",
"status": "refund_pending",
"type": "DEPOSIT",
"currency": "BRL",
"reason": "eulen_will_refund",
"rejectionReasons": ["PAYER_MISMATCH"],
"expectedRefundAt": "2026-04-27T15:00:00.000Z",
"payerEuid": "EU015562310201680",
"eulenStatus": "will_refund",
"credited": false,
"accessRevoked": true,
"purchaseId": 12345,
"productId": 8,
"productTitle": "Exemplo Produto",
"buyerEmail": "[email protected]",
"buyerName": "Cliente Exemplo"
}
}med.created在 Eulen 充值中检测到 MED(退单)。
{
"event": "med.created",
"timestamp": "2026-04-24T14:50:00.000Z",
"data": {
"qrId": "550e8400-e29b-41d4-a716-446655440000",
"bankTxId": "E00000000202604241450",
"amount": 199.90,
"currency": "BRL",
"medDetectedAt": "2026-04-24T14:50:00.000Z",
"depositStatus": "depix_sent",
"payerTaxNumber": "52998224725",
"transactionId": 789,
"purchaseId": 12345,
"productId": 8,
"productTitle": "Exemplo Produto"
}
}withdrawal.completed提现已广播至区块链或银行。
{
"event": "withdrawal.completed",
"timestamp": "2026-04-24T14:05:00.000Z",
"data": {
"withdrawalId": 792,
"amount": 0.01,
"fee": 0.00001,
"totalDeducted": 0.01001,
"asset": "L-BTC",
"toAddress": "lq1qqw...",
"txHash": "abc123...",
"network": "liquid",
"isSideShift": false,
"completedAt": "2026-04-24T14:05:00.000Z"
}
}withdrawal.settled提现已在目标网络上完全确认(含 BTC Peg-Out)。
{
"event": "withdrawal.settled",
"timestamp": "2026-04-24T14:30:00.000Z",
"data": {
"withdrawalId": 792,
"amount": 0.01,
"asset": "BTC-PEGOUT",
"toAddress": "bc1q...",
"liquidTxHash": "abc123...",
"settleTxHash": "def456...",
"settleNetwork": "bitcoin",
"completedAt": "2026-04-24T14:30:00.000Z"
}
}withdrawal.failed提现失败(余额不足、地址无效等)。金额已退回余额。
{
"event": "withdrawal.failed",
"timestamp": "2026-04-24T14:05:00.000Z",
"data": {
"withdrawalId": 792,
"amount": 0.01,
"asset": "L-BTC",
"toAddress": "lq1qqw...",
"network": "liquid",
"error": "Insufficient hotwallet balance",
"failedAt": "2026-04-24T14:05:00.000Z"
}
}swap.completed原子兑换执行成功。
{
"event": "swap.completed",
"timestamp": "2026-04-24T14:05:00.000Z",
"data": {
"txid": "abc123...",
"fromCurrency": "L-BTC",
"toCurrency": "DePix",
"fromAmount": 0.01,
"toAmountGross": 3500.00,
"toAmountNet": 3482.50,
"feePercent": 0.5,
"feeAmount": 17.50,
"completedAt": "2026-04-24T14:05:00.000Z"
}
}swap.failed兑换失败或已退款。
{
"event": "swap.failed",
"timestamp": "2026-04-24T14:05:00.000Z",
"data": {
"transactionId": 793,
"fromCurrency": "L-BTC",
"toCurrency": "DePix",
"fromAmount": 0.01,
"step": "REFUNDED",
"reason": "Manual refund by admin",
"refundedAt": "2026-04-24T14:05:00.000Z"
}
}webhook.test从控制台手动触发的事件,用于测试 URL。
{
"event": "webhook.test",
"timestamp": "2026-04-24T14:05:00.000Z",
"data": {
"message": "Webhook de teste",
"testId": "test_abc123"
}
}// 校验 webhook 签名(Node.js)
const crypto = require('crypto')
function validateWebhook(rawBody, signature, secret) {
const expected = crypto
.createHmac('sha256', secret)
.update(rawBody)
.digest('hex')
return crypto.timingSafeEqual(
Buffer.from(signature, 'hex'),
Buffer.from(expected, 'hex')
)
}
app.post('/webhooks/orionpay', express.raw({ type: 'application/json' }), (req, res) => {
const signature = req.headers['x-webhook-signature']
const rawBody = req.body.toString('utf8')
if (!validateWebhook(rawBody, signature, process.env.WEBHOOK_SECRET)) {
return res.status(401).json({ error: 'Invalid signature' })
}
const { event, data } = JSON.parse(rawBody)
switch (event) {
case 'payment.success':
grantAccess(data.buyerEmail, data.accessToken)
break
case 'payment.refunded_med':
case 'payment.refunded':
case 'payment.refund_pending':
revokeAccess(data.transactionId)
break
case 'withdrawal.settled':
markWithdrawalSettled(data.withdrawalId)
break
}
res.status(200).json({ received: true })
})