PIX 转账
概述
POST /api/dict/pix 端点向指定密钥发起 PIX 转账。密钥可以是 CPF、CNPJ、电子邮件、电话或 EVP(随机密钥)。
同步响应仅确认转账已被接受处理。最终结果(LIQUIDATED 或 ERROR)通过 TRANSFER Webhook 送达。
端点
POST https://api.fypay.me/api/dict/pix请求头
stringobrigatorio通过 POST https://api.fypay.me/api/auth/token 获取的 Bearer 令牌。此路由不使用客户端证书。
stringobrigatorio由您的系统生成的转账唯一标识符。最多 50 个字符,且在账户内唯一(UUID 是不错的选择)。它会成为交易的外部标识符,并在响应的 endToEndId 字段和 TRANSFER Webhook 的 idempotencyKey 字段中返回。
示例:550e8400-e29b-41d4-a716-446655440000
请求体
stringobrigatorio目标 PIX 密钥。类型根据格式识别:
- 电子邮件:包含
@ - EVP:UUID(随机密钥)
- 电话:带国家代码,格式为
+55DDDNUMERO(例如+5511999999999) - CPF:11 位数字
- CNPJ:14 位数字
string收款人的 CPF 或 CNPJ。会转发给结算提供商,部分提供商要求提供该证件号。省略时,API 使用密钥本身中的数字。
string随 PIX 转账附带的信息。会在 TRANSFER Webhook 的 data.remittanceInformation 中返回。
objectobrigatorio付款数据。
stringHIGH 或 NORM。为兼容而接受并校验,但不影响处理。
string为兼容而接受,没有效果。
number介于 1 和 10800 之间。为兼容而接受并校验,但不影响处理。
array字符串列表。为兼容而接受,没有效果:API 不会按 ISPB 屏蔽机构。
请求
curl -X POST https://api.fypay.me/api/dict/pix \
-H "Authorization: Bearer <token>" \
-H "x-idempotency-key: 550e8400-e29b-41d4-a716-446655440000" \
-H "Content-Type: application/json" \
-d '{
"pixKey": "destino@email.com",
"creditorDocument": "12345678909",
"description": "Pagamento referente a NF 12345",
"payment": {
"currency": "BRL",
"amount": 100.50
}
}'const idempotencyKey = crypto.randomUUID();
const response = await fetch('https://api.fypay.me/api/dict/pix', {
method: 'POST',
headers: {
'Authorization': `Bearer ${token}`,
'x-idempotency-key': idempotencyKey,
'Content-Type': 'application/json',
},
body: JSON.stringify({
pixKey: 'destino@email.com',
creditorDocument: '12345678909',
description: 'Pagamento referente a NF 12345',
payment: {
currency: 'BRL',
amount: 100.50,
},
}),
});
const transfer = await response.json();import requests
import uuid
idempotency_key = str(uuid.uuid4())
response = requests.post(
'https://api.fypay.me/api/dict/pix',
headers={
'Authorization': f'Bearer {token}',
'x-idempotency-key': idempotency_key,
'Content-Type': 'application/json',
},
json={
'pixKey': 'destino@email.com',
'creditorDocument': '12345678909',
'description': 'Pagamento referente a NF 12345',
'payment': {
'currency': 'BRL',
'amount': 100.50,
},
}
)
transfer = response.json()响应
{
"endToEndId": "550e8400-e29b-41d4-a716-446655440000",
"eventDate": "2024-01-15T10:30:00.000Z",
"id": 12345,
"payment": {
"amount": 100.5
},
"type": "PENDING"
}{
"statusCode": 400,
"code": "PIX_INSUFFICIENT_BALANCE",
"userMessage": "Saldo insuficiente para realizar esta operação.",
"details": {
"availableReais": "50.00",
"requiredReais": "100.50"
},
"errorId": "c0a8012e-7b1f-4c55-9d1e-2f9a8c3b4d5e"
}{
"statusCode": 422,
"code": "PIX_KEY_NOT_FOUND",
"details": {
"cached": true,
"retryAfterSeconds": 300
},
"errorId": "c0a8012e-7b1f-4c55-9d1e-2f9a8c3b4d5e"
}响应字段
endToEndIdstring这不是 PIX 的 End to End ID。 此字段返回的是 x-idempotency-key 请求头的值。真正的 End to End ID 会在 TRANSFER Webhook 的 data.endToEndId 中返回。
eventDatestring转账创建的日期和时间(ISO 8601)。
idnumberFyPay 中的交易 ID。与 TRANSFER Webhook 中的 data.id 值相同。
paymentobjecttypestring响应时的交易状态:
PENDING:转账处理中(正常情况)CONFIRMED:转账已确认ERROR:转账失败
幂等性
x-idempotency-key 是必填项,且必须在账户内唯一。它可防止重复发送:如果您重复使用已用过的密钥,不会创建新的转账,API 返回 400,错误码为 PIX_DUPLICATE_EXTERNAL_ID。details.existingTransactionId 字段包含原始转账的 ID。
const key = '550e8400-e29b-41d4-a716-446655440000';
const res1 = await createTransfer(key, { amount: 100 });
const res2 = await createTransfer(key, { amount: 100 });第一次调用创建转账(201,type: "PENDING")。第二次被以 400 PIX_DUPLICATE_EXTERNAL_ID 拒绝,不会扣款。要跟踪第一次的结果,请等待 TRANSFER Webhook,或使用数字 id 或该密钥本身查询 GET https://api.fypay.me/api/pix/transaction/{id}。
出现 5xx 错误或超时后,不要更换密钥重试:付款可能已经发出。请等待 TRANSFER Webhook,并通过 data.idempotencyKey 进行关联。参见 TRANSFER。
转账 Webhook
转账处理完成后,在 cash_out 事件下以 PIX BACEN 格式登记的 URL 会收到 TRANSFER 类型的 Webhook(节选):
{
"data": {
"id": 12345,
"txId": "550e8400-e29b-41d4-a716-446655440000",
"pixKey": "destino@email.com",
"status": "LIQUIDATED",
"payment": {
"amount": "100.5",
"currency": "BRL"
},
"endToEndId": "E12345678202401151030abcdefghijk",
"creditDebitType": "DEBIT",
"idempotencyKey": "550e8400-e29b-41d4-a716-446655440000",
"creditorAccount": {
"ispb": "12345678",
"name": "João Silva",
"bankName": "Banco Exemplo S.A.",
"issuer": "000",
"number": "123456",
"document": "12345678909",
"accountType": null
},
"remittanceInformation": "Pagamento referente a NF 12345"
},
"type": "TRANSFER"
}TRANSFER Webhook
查看 TRANSFER Webhook 的完整文档
常见错误
| HTTP 状态码 | code | 原因 | 处理方式 |
|---|---|---|---|
| 400 | PUB_REQUEST_BODY_INVALID | 请求体无效(amount 缺失或小于 0.01、priority 不是 HIGH/NORM 等) | 查看 details.violations |
| 400 | PIX_DUPLICATE_EXTERNAL_ID | 该账户已使用过此 x-idempotency-key | 未创建任何转账;查看 details.existingTransactionId |
| 400 | PIX_INSUFFICIENT_BALANCE | 余额不足 | 查询余额后使用新的密钥重试 |
| 401 | 令牌缺失、无效或已过期 | 生成新令牌 | |
| 422 | PIX_KEY_NOT_FOUND | 密钥在 DICT 中不存在 | 与收款人确认密钥。若 details.cached: true,请等待 details.retryAfterSeconds。参见密钥不存在 |
| 429 | TOO_MANY_PIX_KEYS_NOT_FOUND | 按密钥提款时不存在的密钥过多 | 等待 Retry-After 请求头指定的时间。参见提供商正在封锁查询 |