لوگوی پی‌اکسا

با نسخهٔ ۲ همهٔ اطلاعات کارت (حتی نام صاحب کارت) در همان پاسخ ساخت پرداخت می‌آید و دیگر درخواست دوم لازم نیست. ربات‌هایی که با نسخهٔ ۱ ساخته شده‌اند بدون تغییر کار می‌کنند.

PAYEXA SOLUTIONS

راه‌حل اتصال پرداخت پی‌اکسا در ربات تلگرام

کاربر هیچ‌وقت از ربات خارج نمی‌شود و به صفحه دیگری هدایت نمی‌شود. شماره کارت، نام صاحب کارت، مبلغ دقیق و مهلت پرداخت را همان‌جا در چت نشان می‌دهید و بعد از واریز، با یک وریفای سفارش را نهایی می‌کنید.

بدون ریدایرکت نمایش کارت در همان چت اعلان امضاشده یا استعلام Create → Show → Verify

آموزش گام‌به‌گام این مسیر همراه با نمونهٔ کد: آموزش اتصال درگاه پرداخت به ربات تلگرام

Quick Start

یک پرداخت بسازید و کارت، مبلغ دقیق و مهلت را از همان پاسخ در پیام ربات نشان دهید.

Operational Rule

وضعیت فقط برای نمایش است؛ سفارش را فقط بعد از وریفای موفق سمت سرور تحویل دهید.

Production Safety

پرداخت‌های منقضی را دیگر استعلام نکنید تا سفارش‌های رهاشده بی‌پایان درخواست نفرستند.

API VERSION

v2 (پیش‌فرض)

راهنمای نسخهٔ ۱ هم از دکمهٔ «نسخهٔ ۱» بالای صفحه در دسترس است.

FINALIZATION

Verify

سفارش را فقط وقتی تحویل دهید که وریفای سمت سرور تأیید کند.

1) نمای کلی جریان در ربات تلگرام

کل کار همین ۵ قدم است؛ بقیهٔ صفحه هر قدم را با نمونه باز می‌کند.

01

ساخت پرداخت

وقتی کاربر مبلغ را انتخاب کرد، سرور ربات POST /v2/payments را می‌زند. پاسخ همه‌چیز را دارد: شماره کارت، نام صاحب کارت، مبلغ دقیق و مهلت.

02

نمایش در چت

همین اطلاعات را در پیام ربات نشان می‌دهید. کاربر کارت به کارت می‌کند و پی‌اکسا واریز را خودکار تشخیص می‌دهد.

03

فهمیدن پرداخت

اگر ربات وب‌سرور دارد، اعلان امضاشدهٔ پی‌اکسا به‌محض پرداخت می‌رسد. وگرنه (یا در کنارش) وضعیت را خودکار یا با دکمهٔ «پرداخت کردم» بپرسید.

04

وریفای

وقتی وضعیت paid شد، POST /v2/payments/{payment_id}/verify را بزنید.

05

تحویل، فقط یک بار

اگر وریفای first_verification: true برگرداند، سفارش را در ربات تحویل دهید؛ اگر false بود، قبلاً تحویل داده‌اید.

2) ساخت پرداخت (همه‌چیز در یک پاسخ)

POST

سرور ربات شما این درخواست را با کلید API می‌فرستد. پاسخ، کارت کامل (با نام صاحب کارت)، مبلغ دقیق و مهلت را دارد.

https://pay.pexn.ir/v2/payments
فیلد درخواست نوع الزام توضیح
amount integer بله مبلغ به ریال.
order_id string بله شمارهٔ سفارش خودتان، برای هر سفارش یکتا (مثلاً TG-88-1024). درخواست تکراری با همین شماره همان پرداخت را برمی‌گرداند.
return_url string بله* لینک ربات خودتان، مثل https://t.me/YourBot؛ اگر خریدار از صفحه یا ربات پرداخت پی‌اکسا پرداخت کند، با آن به ربات شما برمی‌گردد.
callback_url string اختیاری* اگر ربات وب‌سرور دارد: آدرس سرور ربات برای اعلان امضاشده (بخش ۴). * از این دو، حداقل یکی لازم است.

پاسخ موفق (HTTP 201):

{
  "ok": true,
  "data": {
    "payment_id": "A7F3C9E1B5D2468A0C1E3F5B7D9A2C4E6",
    "order_id": "TG-88-1024",
    "status": "pending",
    "amount": 2500000,
    "payable_amount": 2499440,
    "payable_amount_toman": 249944,
    "expires_at": "2026-10-01T10:00:00Z",
    "card": { "number": "6037991234560010", "holder_name": "علی رضایی", "bank": "ملی" },
    "payment_url": "https://pay.pexn.ir/payment/start?authority=A7F3C9E1B5D2468A0C1E3F5B7D9A2C4E6",
    "telegram_url": "https://t.me/payexa_bot?start=pay_A7F3C9E1B5D2468A0C1E3F5B7D9A2C4E6",
    ...
  }
}
  • فقط payment_id را کنار سفارش ذخیره کنید؛ بقیه را هر وقت لازم شد از استعلام (بخش ۵) هم می‌گیرید.
  • به کاربر payable_amount را نشان دهید، نه amount؛ همین رقم دقیق است که واریز با آن شناسایی می‌شود.
  • اگر ترجیح دادید کاربر در صفحه یا ربات آمادهٔ پی‌اکسا پرداخت کند، payment_url یا telegram_url همین پاسخ را دکمه کنید (راه‌حل بات آماده).

3) نمایش به کاربر در همان چت

یک پیام با همین چند فیلد کافی است؛ نمونهٔ متن پیام ربات:

💳 شماره کارت: 6037991234560010
👤 به نام: علی رضایی (بانک ملی)
💰 مبلغ دقیق واریزی: 2,499,440 ریال
⏳ مهلت پرداخت: تا 13:30

دقیقاً همین مبلغ را واریز کنید؛ بعد از واریز، چند ثانیه صبر کنید و «پرداخت کردم، بررسی کن» را بزنید.
p = response["data"]
text = (
    f"💳 شماره کارت: {p['card']['number']}\n"
    f"👤 به نام: {p['card']['holder_name']} (بانک {p['card']['bank']})\n"
    f"💰 مبلغ دقیق واریزی: {p['payable_amount']:,} ریال\n"
    f"⏳ مهلت پرداخت: تا {to_local_time(p['expires_at'])}"
)
buttons = [[{"text": "✅ پرداخت کردم، بررسی کن", "callback_data": f"check:{p['payment_id']}"}]]
  • expires_at به وقت UTC است؛ برای کاربر به ساعت ایران تبدیلش کنید یا شمارش معکوس نشان دهید.
  • برای پذیرندهٔ آزمایشی (testnet) ممکن است card برابر null باشد؛ در حالت عادی همیشه پر است.

4) اعلان امضاشده (اگر ربات وب‌سرور دارد)

POST

اگر callback_url فرستاده باشید، پی‌اکسا به‌محض تأیید واریز یک POST امضاشده به آن می‌فرستد؛ دیگر لازم نیست مدام استعلام کنید. امضا را با API Key بررسی کنید، payment_id را بخوانید و به بخش ۶ (وریفای) بروید.

POST /payexa/callback
X-Payexa-Event: payment.paid
X-Payexa-Signature: t=1790000000,v1=5f2b9c...e81a

{"event":"payment.paid","payment_id":"A7F3C9E1B5D2468A0C1E3F5B7D9A2C4E6","order_id":"TG-88-1024","status":"paid",...}
  • کد کامل مسیر برگشت در مستندات، کد کامل آماده و بررسی (اختیاری) امضا در بخش امضا آمده است.
  • تا وریفای نکنید، اعلان payment.paid چند بار تکرار می‌شود؛ اگر پرداخت نشد، یک اعلان payment.expired می‌رسد تا سفارش را آزاد کنید.

5) استعلام خودکار یا دکمهٔ «پرداخت کردم»

GET

برای ربات بدون وب‌سرور، یا در کنار اعلان، وضعیت را با این مسیر بپرسید. این مسیر کلید API نمی‌خواهد و فقط وضعیت همان یک پرداخت را می‌دهد.

https://pay.pexn.ir/v2/payments/{payment_id}/client
{
  "ok": true,
  "data": {
    "payment_id": "A7F3C9E1B5D2468A0C1E3F5B7D9A2C4E6",
    "status": "pending",
    "payable_amount": 2499440,
    "seconds_remaining": 1320,
    "paid_at": null,
    ...
  }
}
status کار ربات
pending «هنوز ثبت نشده؛ چند ثانیه دیگر دوباره بزن.» (استعلام خودکار: ۱۰ تا ۱۵ ثانیهٔ دیگر)
paid برو به بخش ۶ (وریفای).
expired «مهلت تمام شد»؛ استعلام را متوقف کنید. کاربر می‌تواند با همان order_id دوباره پرداخت بسازد.

نکتهٔ مهم عملیاتی

  • وقتی seconds_remaining به صفر رسید یا وضعیت expired شد، دیگر استعلام نزنید.
  • روی دکمهٔ دستی محدودیت بگذارید (مثلاً هر ۵ ثانیه یک بار)؛ حداکثر ۶۰ استعلام در دقیقه برای هر پرداخت پذیرفته می‌شود.
  • استعلام خودکار، دکمهٔ دستی و اعلان امضاشده با هم تناقضی ندارند؛ هر کدام زودتر paid را دید، وریفای را شروع کند.

6) وریفای و تحویل سفارش

POST

تنها جایی که پرداخت برای شما قطعی می‌شود. بدنه اختیاری است؛ اگر مبلغ سفارش را بفرستید، سرور هم آن را کنترل می‌کند.

https://pay.pexn.ir/v2/payments/{payment_id}/verify
curl -X POST "https://pay.pexn.ir/v2/payments/A7F3C9E1B5D2468A0C1E3F5B7D9A2C4E6/verify" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"amount": 2500000}'

پاسخ موفق:

{
  "ok": true,
  "data": {
    "payment_id": "A7F3C9E1B5D2468A0C1E3F5B7D9A2C4E6",
    "order_id": "TG-88-1024",
    "status": "paid",
    "first_verification": true,
    ...
  }
}
  • فقط وقتی first_verification برابر true است محصول یا سرویس را تحویل دهید یا کیف پول کاربر را شارژ کنید؛ حتی اگر دکمه، استعلام و اعلان هم‌زمان وریفای بزنند، فقط یکی true می‌گیرد.
  • وریفای تکراری بی‌خطر است و همیشه جواب درست می‌دهد؛ لازم نیست جلوی آن را بگیرید.
  • خطای PAYMENT_NOT_PAID یعنی هنوز پرداخت نشده و PAYMENT_EXPIRED یعنی مهلت تمام شده است.

7) نکات امنیتی و بهینه‌سازی

قبل از رفتن به تولید (production) این چند مورد را بررسی کنید.

کلید فقط سمت سرور

API Key را فقط در سرور ربات نگه دارید؛ هرگز در پیام‌ها یا کد کلاینت قرار ندهید.

ربات ثبت‌شده

ربات و دامنهٔ سرورش را در پنل، صفحهٔ «درخواست درگاه پرداخت»، ثبت کنید؛ return_url و callback_url باید روی همان‌ها باشند.

تحویل یک‌باره

تحویل را فقط به first_verification=true ببندید تا هر سفارش دقیقاً یک بار تحویل شود.

  • سقف درخواست برای هر کلید: ساخت پرداخت و وریفای هر کدام ۶۰ در دقیقه؛ استعلام بدون کلید ۶۰ در دقیقه برای هر پرداخت.
  • برای جزئیات کامل هدرها و کدهای خطا، مستندات کامل پذیرنده را ببینید.
PAYEXA ASSISTANT

من دستیار پی اکسا هستم، شما را در تمام مسیر راهنمایی می‌کنم و اگر به من نیازی ندارید با ۲ بار کلیک خاموش می‌شوم.