Мерчанты
Используйте эндпоинты invoice, чтобы взимать плату с клиентов в любом поддерживаемом токене и получать другой в свой кошелёк. p3p обрабатывает кросс-чейн маршрутизацию.
Как это работает
p3p никогда не берёт ваши средства на хранение дольше нескольких секунд, необходимых для маршрутизации свопа. Возвраты, если применимо, идут автоматически отправителю депозита.
1. Стать мерчантом
Зарегистрируйтесь в Партнёрской панели, используя кошелёк, который вы контролируете. Используйте назначенный вам Partner ID как opts.partner_id (в /exchange/create) или как wallet_merchant (в /invoice/create), чтобы закреплять транзакции за вашим аккаунтом.
Нет формы регистрации, нет подтверждения email и нет API токена. Кошелёк — это учётные данные.
Относитесь к вашему мерчант-кошельку как к ключу API
Любой, кто контролирует кошелёк, контролирует мерчант-аккаунт. Используйте выделенный кошелёк для вашего бизнеса, отдельно от личных средств.
2. Создать инвойс
Есть два способа сделать это.
Программно (рекомендуется)
POST /invoice/create
const invoice = await fetch("https://api.p3p.xyz/invoice/create", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
chain_from: "eth", token_from: "usdt", amount_from: "50",
chain_to: "ton", token_to: "usdt",
wallet_merchant: "UQYourMerchantTonWallet"
}),
}).then(r => r.json())
console.log(invoice.deposit_address) // покажите вашему клиентуОтвет:
{
"id": "in_ab12cd...",
"invoice": true,
"chain_from": "eth", "token_from": "usdt", "amount_from": "50",
"chain_to": "ton", "token_to": "usdt",
"amount_to": "50.0",
"wallet_merchant": "UQYourMerchantTonWallet",
"deposit_address": "0xDepositAddressForCustomer",
"rate": "1.0",
"duration": 60
}Общедоступный URL (интеграция не нужна)
Для кнопки оформления заказа, QR-кода или ссылки для обмена вы можете построить инвойс из URL:
https://api.p3p.xyz/invoice/create/:merchantId/:pathFrom/:pathTo?Примеры:
# клиент платит 100 USDT на TON, вы получаете USDT на TON
https://api.p3p.xyz/invoice/create/0xYourMerchantWallet/100:usdt.ton/usdt.ton
# клиент платит 50 TON, вы получаете USDT на TON
https://api.p3p.xyz/invoice/create/acme/50:ton.ton/usdt.ton
# простая форма: платите и получайте тот же актив
https://api.p3p.xyz/invoice/create/acme/100:usdt.ton:merchantId может быть:
- ID партнёра, возвращённый при регистрации,
nameпартнёра, если вы его установили, или- адрес кошелька, уже зарегистрированный как мерчант.
3. Покажите адрес депозита
Отобразите invoice.deposit_address и invoice.amount_from в вашем интерфейсе, идеально в виде QR-кода:
import QRCode from "qrcode"
const dataUrl = await QRCode.toDataURL(
`${invoice.chain_from}:${invoice.deposit_address}?amount=${invoice.amount_from}`
)Клиент отправляет amount_from от token_from на этот адрес. Что-либо другое (неправильная сумма, неправильный токен, истекшее окно) автоматически возвращается.
4. Подтвердить оплату
Опросите /check/:id точно так же, как обычный обмен:
async function waitForInvoicePayment(id: string) {
while (true) {
const s = await fetch(`https://api.p3p.xyz/check/${id}`).then(r => r.json())
if (s.status === "complete") return s
if (s.status === "failed" || s.status === "refunded") throw new Error(s.status)
await new Promise(r => setTimeout(r, 4000))
}
}
await waitForInvoicePayment(invoice.id)
// средства теперь в wallet_merchant5. Проверка ваших заработков
Три партнёрских эндпоинта только для чтения и не требуют никакой аутентификации помимо знания partnerId. Заработки расчитываются в соответствии с вашими настройками выплат (либо мгновенно за каждый своп, либо через плановые выводы USDT) — настройте это в Партнёрской панели.
| Эндпоинт | Возвращает |
|---|---|
GET /partners/:partnerId/stats | Объём, количество транзакций, доля дохода |
GET /partners/:partnerId/exchanges | Все обмены, зачисленные этому партнёру |
GET /partners/:partnerId/invoices | Все инвойсы, созданные для этого партнёра |
curl https://api.p3p.xyz/partners/0xYourMerchantWallet/statsСоветы и подводные камни
- Один кошелёк на сеть: партнёр накапливает кошельки, по одному на сеть. Используйте правильный кошелёк для целевой сети в
wallet_merchant. - Та же сеть + тот же токен: пропускает движок свопа и действует как простой адрес для пересылки — полезно для простых ссылок "оплати мне X USDT на TON".
- Окно депозита: инвойсы используют стандартное окно ~6 минут. Если клиент тратит больше времени, вызовите
/check/:id?bump=true, чтобы обновить его. - Возвраты: доступны только когда депозит обнаружен, но своп не удаётся. Для инвойсов без
wallet_refundсредства пытаются вернуться на адрес отправителя, обнаруженный on-chain.
Справочник эндпоинтов
Все мерчант-эндпоинты открыты — заголовок api-key не требуется. Ваш кошелёк — это учётные данные.
1. Создать инвойс
POST /invoice/create
| Поле | Тип | Обязательно | Описание |
|---|---|---|---|
chain_from | string | да | Сеть, с которой платит клиент |
token_from | string | да | Токен, которым платит клиент |
amount_from | string | да | Сумма, которую платит клиент |
chain_to | string | да | Сеть, на которую вы получаете средства |
token_to | string | да | Токен, который вы получаете |
wallet_merchant | string | да | Ваш кошелёк в целевой сети |
Возвращает объект инвойса, включающий id, deposit_address, amount_from, amount_to, rate и duration.
2. Создать общедоступный URL инвойса
GET /invoice/create/:merchantId/:pathFrom/:pathTo?
Общедоступный URL инвойса — поместите его в QR-код или кнопку.
merchantId— id партнёра, имя партнёра или кошелёк, уже зарегистрированный как мерчантpathFrom—<amount>:<token>.<chain>(например,100:usdt.ton)pathTo— опционально,<token>.<chain>если вы хотите конвертировать; по умолчаниюpathFrom
Возвращает тот же объект, что и POST /invoice/create.
3. Получить статистику партнёра
GET /partners/:partnerId/stats
Совокупный объём, количество транзакций и пожизненная доля дохода для кошелька партнёра.
4. Получить обмены партнёра
GET /partners/:partnerId/exchanges
Постраничный список обменов, зачисленных партнёру.
5. Получить инвойсы партнёра
GET /partners/:partnerId/invoices
Постраничный список инвойсов, созданных для партнёра.
Ошибки
{ "error": "merchant_id_required", "message": "..." }| Код | Значение |
|---|---|
invalid_json | Тело запроса не является валидным JSON |
merchant_id_required | GET эндпоинт инвойса вызван без идентификатора мерчанта |
partner_not_found | Ни один партнёр не соответствует данному merchantId |
merchant_wallet_not_found | Партнёр существует, но не имеет кошелька в целевой сети |
amount_too_small | Сумма ниже минимума поставщика |
amount_too_big | Сумма выше максимума поставщика |