Skip to content

商家

使用发票端点向您的客户收取任何受支持代币的费用,并在您自己的钱包中接收不同的代币。p3p 处理跨链路由。

它如何运作

1
注册为合作伙伴从仪表板获取您的合作伙伴 ID
2
创建发票POST /invoice/create
3
客户支付到 `deposit_address`
4
您接收资金直接结算到您的钱包

p3p 永远不会托管您的资金超过路由交易所需的几秒钟。如果适用,退款会自动发送给存款发送者。

1. 成为商家

使用您控制的钱包在合作伙伴仪表板注册。将您分配的合作伙伴 ID 用作 opts.partner_id(在 /exchange/create 中)或 wallet_merchant(在 /invoice/create 中)以将交易归属于您的账户。

无需注册表,无需电子邮件确认,无需 API 令牌。钱包即凭证。

像对待 API 密钥一样对待您的商家钱包

任何控制钱包的人都控制商家账户。为您的业务使用专用钱包,与个人资金分开。

2. 创建发票

有两种方法可以做到这一点。

编程方式(推荐)

POST /invoice/create

ts
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) // 向您的客户展示

响应:

json
{
  "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?

示例:

# 客户在 TON 上支付 100 USDT,您在 TON 上接收 USDT
https://api.p3p.xyz/invoice/create/0xYourMerchantWallet/100:usdt.ton/usdt.ton

# 客户支付 50 TON,您在 TON 上接收 USDT
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. 显示存款地址

在您的 UI 中渲染 invoice.deposit_addressinvoice.amount_from,最好作为 QR 码:

ts
import QRCode from "qrcode"

const dataUrl = await QRCode.toDataURL(
  `${invoice.chain_from}:${invoice.deposit_address}?amount=${invoice.amount_from}`
)

客户将 amount_fromtoken_from 发送到该地址。其他任何情况(金额错误、代币错误、窗口过期)都会自动退款。

4. 确认付款

像普通交易所一样轮询 /check/:id

ts
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_merchant 中

5. 检查您的收益

三个合作伙伴端点是只读的,除了知道 partnerId 外不需要任何身份验证。收益根据您配置的支付设置进行结算(每次交易立即或通过 USDT 定时提款)— 在合作伙伴仪表板中配置此项。

端点返回
GET /partners/:partnerId/stats交易量、交易计数、收入分成
GET /partners/:partnerId/exchanges归功于此合作伙伴的所有交易所
GET /partners/:partnerId/invoices为此合作伙伴创建的所有发票
bash
curl https://api.p3p.xyz/partners/0xYourMerchantWallet/stats

提示和陷阱

  • 每条链一个钱包:合作伙伴累积钱包,每条链一个。在 wallet_merchant 中使用目标链的正确钱包。
  • 相同的链 + 相同的代币:跳过交易引擎并充当简单的转发地址 — 对于简单的"在 TON 上付我 X USDT"链接很有用。
  • 存款窗口:发票共享标准的约 6 分钟窗口。如果客户花费更长时间,请调用 /check/:id?bump=true 来刷新它。
  • 退款:仅在检测到存款但交易失败时可用。对于没有 wallet_refund 的发票,资金会尝试退回到链上检测到的发送者地址。

端点参考

所有商家端点都是开放的 — 不需要 api-key 标头。您的钱包是凭证。

1. 创建发票

POST /invoice/create

字段类型必需描述
chain_fromstring客户付款的链
token_fromstring客户付款的代币
amount_fromstring客户付款的金额
chain_tostring您接收资金的链
token_tostring您接收的代币
wallet_merchantstring您在目标链上的钱包

返回包含 iddeposit_addressamount_fromamount_torateduration 的发票对象。

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

为合作伙伴创建的发票分页列表。

错误

json
{ "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金额高于供应商最大值