توسعهدهندگان
API پِینیکس بر پایه قرارداد OpenAPI 3.1 است. همه مبالغ عدد صحیح به ریال هستند و نام فیلدها با Rial تمام میشود.
کلید API را هرگز در کد مرورگر، اپ موبایل، متغیرهای NEXT_PUBLIC_* یا مخزن کد قرار ندهید. همه فراخوانیهای API با کلید باید از سرور شما انجام شود.
شروع سریع
- در داشبورد یک کلید API آزمایشی (pk_test) بسازید و آن را در متغیر محیطی سرور خود نگه دارید.
- از سمت سرور، فاکتور بسازید. هدر Idempotency-Key را برای هر سفارش یکتا بفرستید.
- خریدار را به checkoutUrl بفرستید یا کارت و مبلغ دقیق (payableAmountRial) را خودتان نمایش دهید.
- رویداد 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));
}