پرش به محتوای اصلی
PAYNYXورود

توسعه‌دهندگان

API پِی‌نیکس بر پایه قرارداد OpenAPI 3.1 است. همه مبالغ عدد صحیح به ریال هستند و نام فیلدها با Rial تمام می‌شود.

قرارداد OpenAPI (JSON)

کلید API را هرگز در کد مرورگر، اپ موبایل، متغیرهای NEXT_PUBLIC_* یا مخزن کد قرار ندهید. همه فراخوانی‌های API با کلید باید از سرور شما انجام شود.

شروع سریع

  1. در داشبورد یک کلید API آزمایشی (pk_test) بسازید و آن را در متغیر محیطی سرور خود نگه دارید.
  2. از سمت سرور، فاکتور بسازید. هدر Idempotency-Key را برای هر سفارش یکتا بفرستید.
  3. خریدار را به checkoutUrl بفرستید یا کارت و مبلغ دقیق (payableAmountRial) را خودتان نمایش دهید.
  4. رویداد invoice.paid را از وب‌هوک دریافت و امضای PAYNYX-Signature را بررسی کنید.

مقادیر داخل <…> جای‌گذار هستند.

# Server-side only. <PAYNYX_API_BASE>, <MERCHANT_ID> and $PAYNYX_API_KEY are placeholders.
curl -X POST "<PAYNYX_API_BASE>/v1/merchants/<MERCHANT_ID>/invoices" \
  -H "Authorization: Bearer $PAYNYX_API_KEY" \
  -H "Idempotency-Key: <UNIQUE_ORDER_KEY>" \
  -H "Content-Type: application/json" \
  -d '{"baseAmountRial": 1500000, "orderRef": "<ORDER_ID>", "returnUrl": "https://<YOUR_SHOP>/thanks"}'

امضای وب‌هوک: HMAC-SHA256 روی «timestamp.rawBody» با رمز امضای endpoint، در هدر PAYNYX-Signature به شکل t=…,v1=….

// Node.js webhook verification sketch (server-side). <WEBHOOK_SECRET> is a placeholder.
import { createHmac, timingSafeEqual } from 'node:crypto';

function verify(rawBody: string, header: string, secret = process.env.PAYNYX_WEBHOOK_SECRET!) {
  const parts = Object.fromEntries(header.split(',').map((p) => p.split('=') as [string, string]));
  const age = Math.abs(Date.now() / 1000 - Number(parts.t));
  if (!parts.t || !parts.v1 || age > 300) return false;
  const expected = createHmac('sha256', secret).update(`${parts.t}.${rawBody}`).digest('hex');
  return timingSafeEqual(Buffer.from(expected), Buffer.from(parts.v1));
}