با نسخهٔ ۲ همهٔ اطلاعات کارت (حتی نام صاحب کارت) در همان پاسخ ساخت پرداخت میآید و دیگر درخواست دوم لازم نیست.
رباتهایی که با نسخهٔ ۱ ساخته شدهاند بدون تغییر کار میکنند.
PAYEXA SOLUTIONS
راهحل اتصال پرداخت پیاکسا در ربات تلگرام
کاربر هیچوقت از ربات خارج نمیشود و به صفحه دیگری هدایت نمیشود. شماره کارت، نام صاحب کارت، مبلغ دقیق و
مهلت پرداخت را همانجا در چت نشان میدهید و بعد از واریز، با یک وریفای سفارش را نهایی میکنید.
بدون ریدایرکتنمایش کارت در همان چتاعلان امضاشده یا استعلامCreate → Show → Verify
فقط 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",...}
فقط وقتی first_verification برابر true است محصول یا سرویس را تحویل دهید یا کیف پول کاربر را شارژ کنید؛ حتی اگر دکمه، استعلام و اعلان همزمان وریفای بزنند، فقط یکی true میگیرد.
وریفای تکراری بیخطر است و همیشه جواب درست میدهد؛ لازم نیست جلوی آن را بگیرید.
خطای PAYMENT_NOT_PAID یعنی هنوز پرداخت نشده و PAYMENT_EXPIRED یعنی مهلت تمام شده است.
7) نکات امنیتی و بهینهسازی
قبل از رفتن به تولید (production) این چند مورد را بررسی کنید.
کلید فقط سمت سرور
API Key را فقط در سرور ربات نگه دارید؛ هرگز در پیامها یا کد کلاینت قرار ندهید.
ربات ثبتشده
ربات و دامنهٔ سرورش را در پنل، صفحهٔ «درخواست درگاه پرداخت»، ثبت کنید؛ return_url و callback_url باید روی همانها باشند.
تحویل یکباره
تحویل را فقط به first_verification=true ببندید تا هر سفارش دقیقاً یک بار تحویل شود.
سقف درخواست برای هر کلید: ساخت پرداخت و وریفای هر کدام ۶۰ در دقیقه؛ استعلام بدون کلید ۶۰ در دقیقه برای هر پرداخت.
راهنمای نسخهٔ ۱ (قدیمی). رباتهایی که با این روش وصل شدهاند بدون هیچ تغییری کار میکنند و پشتیبانی میشوند.
برای اتصال تازه، نسخهٔ ۲ را استفاده کنید: سادهتر است (فقط یک شناسه، وریفای بدون توکن مبلغ و اعلان امضاشده).
1) نمای کلی جریان در ربات تلگرام
کل ماجرا همین ۶ قدم است؛ بقیه صفحه همینها را با نمونه کد باز میکند.
01
ساخت درخواست پرداخت
وقتی کاربر مبلغ را انتخاب کرد، payment/request را بزنید.
02
دریافت اطلاعات کامل کارت
بلافاصله با همان authority، payment/info را بزنید تا نام صاحب کارت را هم داشته باشید.
03
نمایش در چت
شماره کارت، نام صاحب کارت، مبلغ یکتا و مهلت پرداخت را در همان پیام ربات نشان دهید.
04
صبر تا مهلت، با دو ابزار استعلام
در بازه مهلت، یا خودتان دورهای استعلام میگیرید (خودکار) یا منتظر کلیک کاربر روی «پرداخت کردم» میمانید (دستی).
05
تشخیص واریز
هر وقت payment/status برابر SUCCESS شد، یعنی پول نشسته.
06
Verify و نهاییسازی سفارش
با payment/verify نهایی کنید و فقط بعد از آن سفارش/محصول را در ربات تحویل بدهید.
2) ساخت درخواست پرداخت و دریافت اطلاعات کارت
POST
اول درخواست پرداخت را میسازید. پاسخ این مرحله شماره کارت (ماسکشده)، مبلغ یکتا و مهلت را دارد اما
نام صاحب کارت را ندارد — برای آن باید بلافاصله یک درخواست دوم به payment/info بزنید.
https://pay.pexn.ir/v1/payment/request
فیلد درخواست
نوع
الزام
توضیح
amount
number
بله
مبلغ اصلی به ریال.
callback_url
string
بله
آدرس سرور ربات شما برای اطلاع اولیه؛ برای نهاییسازی همچنان به verify نیاز دارید.
مقدار order_id را برای مرحله استعلام (status) نگه دارید و amount_unique را برای مرحله verify.
amount_unique با amount فرق دارد؛ همین رقم دقیق را باید به کاربر نشان دهید تا واریزش قابل تشخیص باشد.
3) نمایش به کاربر در همان چت
یک پیام ساده با همین ۴ فیلد کافی است؛ نمونه متن پیام ربات:
💳 شماره کارت: 603799******0010
👤 به نام: علی رضایی
💰 مبلغ دقیق واریزی: 250,170 تومان
⏳ مهلت پرداخت: تا 15:15
بعد از واریز، چند ثانیه صبر کنید و روی دکمه «پرداخت کردم، بررسی کن» بزنید.
همیشه amount_unique را نشان دهید، نه مبلغ اصلی درخواستی؛ این رقم یکتا همان چیزی است که سیستم برای تطبیق واریز استفاده میکند.
expire_at را بهصورت شمارش معکوس یا ساعت پایان نشان دهید تا کاربر بداند چقدر وقت دارد.
4) استعلام خودکار
GET
اگر میخواهید ربات خودش زیر پوست دورهای چک کند، همین endpoint را هر ۱۰ تا ۱۵ ثانیه یکبار صدا بزنید — نیازی به کلید API ندارد.
قبل از هر بار صدا زدن status، اول expire_at را که خودتان ذخیره کردهاید با ساعت فعلی مقایسه کنید. اگر گذشته، دیگر درخواست نزنید و سفارش را خودتان expired علامت بزنید — وگرنه سفارشهای رهاشده تا ابد به سرور PAYEXA درخواست میفرستند.
وقتی status برابر SUCCESS شد، فوراً به مرحله ۶ (verify) بروید. تا زمانی که verify نکردهاید سفارش را نهایی نکنید.
اگر status برابر EXPIRED شد، به کاربر اطلاع دهید و امکان ساخت درخواست جدید (مرحله ۲) را بدهید.
5) استعلام دستی — دکمه «پرداخت کردم، بررسی کن»
GET
این روش وقتی مفید است که نمیخواهید ربات مدام در پسزمینه poll کند و ترجیح میدهید خود کاربر با یک دکمه استعلام را شروع کند.
۱
به کاربر بگویید صبر کند
در همان پیام مرحله ۳ تصریح کنید: «بعد از واریز چند ثانیه صبر کنید، بعد دکمه را بزنید» — ثبت واریز روی سرور بانک/PAYEXA لحظهای نیست.
۲
با کلیک دکمه، یک بار status را صدا بزنید
همان https://pay.pexn.ir/v1/payment/status?order_id={order_id} مرحله قبل، ولی فقط یکبار و درست وقتی کاربر دکمه را زد.
۳
بر اساس نتیجه پاسخ بدهید
PENDING → «هنوز ثبت نشده، چند ثانیه دیگر دوباره بزن».
SUCCESS → برو به مرحله ۶ (verify).
EXPIRED → «مهلت تمام شد، دوباره سفارش بده».
روی این دکمه یک محدودیت ساده بگذارید (مثلاً هر چند ثانیه یکبار قابل کلیک باشد) تا کاربر با کلیک پشتسرهم سرور را درگیر نکند.
استعلام خودکار و دکمه دستی با هم تناقضی ندارند؛ میتوانید هر دو را همزمان فعال نگه دارید — هرکدام زودتر SUCCESS را دید، جریان verify را شروع میکند.
6) نهاییسازی سفارش با Verify
POST
همین که status برابر SUCCESS شد (چه از مسیر خودکار، چه از دکمه دستی)، این endpoint را بزنید. این تنها جایی است که سفارش رسماً برای شما هم verify میشود.
https://pay.pexn.ir/v1/payment/verify
فیلد
نوع
توضیح
order_id
string
همان order_id دریافتی در مرحله ۲.
token
string
دقیقاً همان مقدار amount_unique مرحله ۲ (بهصورت رشته). چیز دیگری اینجا لازم نیست تولید کنید.