مستندات API
راهنمای کامل استفاده از API برای ایجاد و مدیریت فاکتورهای پرداخت
دریافت API Key
برای استفاده از API، ابتدا باید یک کلید API (API Key) دریافت کنید:
- از منوی داشبورد بلو روی مدیریت API Key بروید
- یک API Key جدید بسازید یا از کلیدهای قبلی استفاده کنید
- کلید را در محیط امن نگه دارید و آن را در درخواستهای خود به سرور ارسال کنید
آدرس پایه (Base URL)
آدرس پایه برای درخواستهای API:
https://mail.blupal.net/api
تمام endpointها زیر این آدرس قرار دارند.
احراز هویت
در هر درخواست، API Key را در هدر X-API-Key ارسال کنید:
X-API-Key: YOUR_API_KEY
یا میتوانید از query parameter استفاده کنید:
?api_key=YOUR_API_KEY
هشدار: API Key را در کد سمت کلاینت (مثل جاوااسکریپت مرورگر) قرار ندهید. همیشه از سمت سرور خودتان درخواستها را ارسال کنید.
محیط آزمایشی (Sandbox)
تست بدون پول واقعی با کلید blu_test_... (Live: blu_live_...). کارت واقعی لازم نیست؛ فاکتور حدود ۳۰ دقیقه اعتبار دارد.
جریان: ساخت فاکتور → شبیهسازی / صفحه پرداخت → چک وضعیت یا دریافت webhook
۱) ایجاد فاکتور
POST| پارامتر | وضعیت | توضیح |
|---|---|---|
| X-API-Key | الزامی | کلید blu_test_... |
| amount | الزامی | ریال — حداقل 100000 |
| card_number | اختیاری | در Sandbox نادیده گرفته میشود |
curl -X POST "https://mail.blupal.net/api/v1/invoices/create" \
-H "Content-Type: application/json" \
-H "X-API-Key: blu_test_YOUR_KEY" \
-d '{"amount": 1000000}'{
"success": true,
"invoice_id": 123,
"amount": 1000000,
"final_amount": 1000123,
"status": "PENDING",
"payment_link": "https://mail.blupal.net/sandbox/payment/123",
"card_number": "6219861012345678",
"mode": "sandbox",
"expires_at": "2026-07-14T12:30:00+03:30"
}۲) شبیهسازی پرداخت
POSTفقط کلید Sandbox و فاکتور PENDING. Body: scenario (اختیاری، پیشفرض success)
| scenario | وضعیت | Webhook |
|---|---|---|
success |
PAID |
بله |
wrong_amount |
PENDING |
خیر |
expire |
EXPIRED |
خیر |
cancel |
CANCELED |
خیر |
curl -X POST "https://mail.blupal.net/api/v1/sandbox/invoices/123/simulate" \
-H "Content-Type: application/json" \
-H "X-API-Key: blu_test_YOUR_KEY" \
-d '{"scenario": "success"}'{
"success": true,
"status": "PAID",
"invoice_id": 123,
"transaction_id": 456
}خطاهای رایج: unauthorized، mode_mismatch، invalid_scenario، invalid_state، not_found
۳) وضعیت / صفحه / Webhook
- وضعیت:
GET https://mail.blupal.net/api/v1/invoices/{invoice_id}با کلید Sandbox - صفحه پرداخت:
https://mail.blupal.net/sandbox/payment/{invoice_id} - بعد از
successwebhook باmode: "sandbox"ارسال میشود
{
"success": true,
"event": "payment.completed",
"invoice_id": 123,
"status": "PAID",
"amount": 1000000,
"final_amount": 1000123,
"mode": "sandbox",
"payer_name": "علی رضایی",
"payer_card": "6037991234567890",
"payer_bank_name": "بانک ملی"
}Endpoint های API
ایجاد فاکتور
POSTاین endpoint برای ایجاد یک فاکتور پرداخت جدید استفاده میشود. پس از ایجاد فاکتور، یک لینک پرداخت و شماره کارت برای واریز مبلغ دریافت خواهید کرد.
پارامترهای درخواست:
| پارامتر | نوع | وضعیت | توضیحات |
|---|---|---|---|
| amount | integer | الزامی | مبلغ فاکتور به ریال (حداقل 100,000 ریال) |
| card_number | string | اختیاری | شماره کارت مشخص برای واریز. در صورت عدم ارسال یا عدم تطابق، ابتدا کارت پیشفرض کاربر (در صورت تنظیم و فعال بودن) استفاده میشود؛ در غیر این صورت یک کارت فعال بهصورت تصادفی انتخاب میشود |
مثال درخواست (cURL):
curl -X POST "https://mail.blupal.net/api/v1/invoices/create" \
-H "Content-Type: application/json" \
-H "X-API-Key: YOUR_API_KEY" \
-d '{
"amount": 1000000,
"card_number": "6219861012345678"
}'مثال پاسخ موفق:
{
"success": true,
"invoice_id": 123,
"amount": 1000000,
"final_amount": 1000123,
"status": "PENDING",
"payment_link": "https://mail.blupal.net/payment/123",
"card_number": "6219861012345678",
"mode": "live",
"expires_at": null
} نکته: فیلد final_amount = مبلغ اصلی + عدد تصادفی ۳ رقمی (۰–۹۹۹). با کلید Sandbox مقدار mode برابر sandbox است.
مثال پاسخ خطا:
{
"success": false,
"error": "amount_too_low",
"message": "مبلغ باید حداقل 100,000 ریال باشد"
}بررسی وضعیت فاکتور
GETاین endpoint برای بررسی وضعیت یک فاکتور استفاده میشود. میتوانید وضعیت پرداخت، مبلغ و تاریخ پرداخت را دریافت کنید.
پارامترهای URL:
| پارامتر | نوع | توضیحات |
|---|---|---|
| invoice_id | integer | شناسه فاکتور که از endpoint ایجاد فاکتور دریافت کردهاید (عدد) |
مثال درخواست (cURL):
curl -X GET "https://mail.blupal.net/api/v1/invoices/123" \ -H "X-API-Key: YOUR_API_KEY"
مثال پاسخ موفق:
{
"success": true,
"invoice_id": 123,
"status": "PAID",
"transaction_id": 456,
"amount": 1000000,
"final_amount": 1000123,
"mode": "live",
"expires_at": null,
"payer_name": "علی رضایی",
"payer_card": "6037991234567890",
"payer_bank_name": "بانک ملی"
} نکته: فیلدهای payer_* فقط پس از پرداخت موفق پر میشوند؛ در وضعیتهای دیگر null هستند. در فیلد payer_card برای همهٔ بانکها شماره کارت ارسال میشود، بهجز بلو بانک که فقط شماره شبا در دسترس است.
وضعیتهای ممکن:
PENDING- فاکتور در انتظار پرداخت استPAID- فاکتور پرداخت شده استEXPIRED- فاکتور منقضی شده استCANCELED- فاکتور لغو شده است
مثال پاسخ خطا:
{
"success": false,
"error": "not_found"
}Webhook (اطلاعرسانی خودکار)
Webhook به شما امکان دریافت اطلاعرسانی خودکار را میدهد. زمانی که یک فاکتور پرداخت میشود، سیستم به صورت خودکار یک درخواست POST به آدرس Webhook شما ارسال میکند.
تنظیم Webhook URL
برای استفاده از Webhook، باید آدرس Webhook خود را در تنظیمات API Key ثبت کنید:
- از بخش مدیریت API Key وارد شوید
- API Key خود را انتخاب یا ایجاد کنید
- فیلد
Webhook URLرا با آدرس سرور خود پر کنید - آدرس باید یک URL معتبر و قابل دسترسی از اینترنت باشد (HTTPS توصیه میشود)
نکته: Webhook URL باید یک endpoint معتبر باشد که درخواستهای POST را دریافت میکند و پاسخ HTTP 200 برمیگرداند.
زمان ارسال Webhook
Webhook در زمانهای زیر ارسال میشود:
- پس از پرداخت موفق: بلافاصله پس از شناسایی و تطبیق پرداخت با فاکتور، Webhook ارسال میشود
- فقط یک بار: برای هر فاکتور، Webhook فقط یک بار ارسال میشود (هنگام تغییر وضعیت به PAID)
فرمت درخواست Webhook
سیستم یک درخواست POST با محتوای JSON به آدرس Webhook شما ارسال میکند:
مثال Payload ارسالی:
{
"success": true,
"event": "payment.completed",
"invoice_id": 123,
"status": "PAID",
"amount": 1000000,
"final_amount": 1000123,
"mode": "live",
"payer_name": "علی رضایی",
"payer_card": "6037991234567890",
"payer_bank_name": "بانک ملی"
} نکته: در فیلد payer_card برای همهٔ بانکها شماره کارت ارسال میشود، بهجز بلو بانک که فقط شماره شبا در دسترس است (مثلاً IR120170000000123456789001).
توضیحات فیلدها:
| فیلد | نوع | توضیحات |
|---|---|---|
| success | boolean | همیشه true است (در صورت موفقیت) |
| event | string | نوع رویداد - همیشه "payment.completed" است |
| invoice_id | integer | شناسه یکتای فاکتور (عدد - همان شناسهای که از endpoint ایجاد فاکتور دریافت کردهاید) |
| status | string | وضعیت فاکتور - همیشه "PAID" است |
| amount | integer | مبلغ اصلی فاکتور به ریال |
| final_amount | integer | مبلغ نهایی که باید واریز شود (مبلغ اصلی + عدد تصادفی 3 رقمی) |
| mode | string | live یا sandbox — محیط فاکتور را مشخص میکند |
| payer_name | string|null | نام پرداختکننده (واریزکننده) طبق اطلاعات بانک |
| payer_card | string|null | شماره کارت پرداختکننده برای همهٔ بانکها؛ برای بلو بانک فقط شماره شبا (در صورت موجود بودن در داده بانک) |
| payer_bank_name | string|null | نام بانک مبدأ پرداختکننده |
مثال دریافت Webhook (PHP)
<?php
// دریافت دادههای Webhook
$payload = json_decode(file_get_contents('php://input'), true);
// بررسی صحت دادهها
if ($payload && isset($payload['event']) && $payload['event'] === 'payment.completed') {
$invoiceId = $payload['invoice_id'];
$amount = $payload['amount'];
$finalAmount = $payload['final_amount'];
// پردازش پرداخت موفق
// مثلاً: بهروزرسانی دیتابیس، ارسال ایمیل، و غیره
// پاسخ موفق به سرور
http_response_code(200);
echo json_encode(['received' => true]);
} else {
// پاسخ خطا
http_response_code(400);
echo json_encode(['error' => 'Invalid payload']);
}
?>مثال دریافت Webhook (Node.js)
const express = require('express');
const app = express();
app.use(express.json());
app.post('/webhook', (req, res) => {
const payload = req.body;
// بررسی صحت دادهها
if (payload && payload.event === 'payment.completed') {
const { invoice_id, amount, final_amount } = payload;
// پردازش پرداخت موفق
console.log(`Payment completed for invoice: ${invoice_id}`);
console.log(`Amount: ${amount}, Final: ${final_amount}`);
// پاسخ موفق
res.status(200).json({ received: true });
} else {
res.status(400).json({ error: 'Invalid payload' });
}
});
app.listen(3000);مثال دریافت Webhook (Python - Flask)
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route('/webhook', methods=['POST'])
def webhook():
payload = request.get_json()
# بررسی صحت دادهها
if payload and payload.get('event') == 'payment.completed':
invoice_id = payload.get('invoice_id')
amount = payload.get('amount')
final_amount = payload.get('final_amount')
# پردازش پرداخت موفق
print(f"Payment completed for invoice: {invoice_id}")
print(f"Amount: {amount}, Final: {final_amount}")
# پاسخ موفق
return jsonify({'received': True}), 200
else:
return jsonify({'error': 'Invalid payload'}), 400
if __name__ == '__main__':
app.run(port=3000)نکات مهم Webhook
مهم: سرور شما باید در کمتر از 10 ثانیه پاسخ دهد، در غیر این صورت درخواست timeout میشود.
- پاسخ سریع: سرور شما باید در کمتر از 10 ثانیه پاسخ HTTP 200 برگرداند
- Idempotency: ممکن است Webhook چندین بار ارسال شود، پس باید منطق idempotent داشته باشید
- HTTPS: برای امنیت بیشتر، از HTTPS استفاده کنید
- اعتبارسنجی: همیشه
invoice_idرا با دیتابیس خود بررسی کنید - لاگگیری: تمام Webhookهای دریافتی را لاگ کنید تا در صورت مشکل بتوانید بررسی کنید
- Retry: در صورت پاسخ ناموفق یا خطا، سیستم تا ۳ بار دیگر با فاصلهٔ ۱۰ ثانیه، ۳۰ ثانیه و ۶۰ ثانیه تلاش میکند؛ هر تلاش در لاگ Webhook Delivery ثبت میشود
پاسخ موفق
سرور شما باید پاسخ HTTP 200 با محتوای JSON برگرداند:
HTTP/1.1 200 OK
Content-Type: application/json
{
"received": true
}تست Webhook
برای تست Webhook خود میتوانید از ابزارهای زیر استفاده کنید:
- webhook.site: یک URL موقت برای تست دریافت میدهد
- ngrok: برای ایجاد تونل به سرور محلی خود
- Postman: برای شبیهسازی درخواست Webhook
نکات امنیتی
- API Key را محافظت کنید: هرگز API Key را در کد سمت کلاینت (مثل جاوااسکریپت مرورگر) قرار ندهید
- استفاده از HTTPS: همیشه از HTTPS برای ارسال درخواستها استفاده کنید
- درخواست از سرور: تمام درخواستهای API را از سمت سرور خودتان انجام دهید
- مدیریت کلید: در صورت لو رفتن کلید، بلافاصله آن را غیرفعال کرده و کلید جدید بسازید
- محدودیت Rate: از ارسال درخواستهای بیش از حد خودداری کنید
کدهای خطا
| کد خطا | توضیحات | کد HTTP |
|---|---|---|
| unauthorized | API Key نامعتبر یا وجود ندارد | 401 |
| amount_required | مبلغ ارسال نشده است | 400 |
| amount_too_low | مبلغ کمتر از حداقل مجاز (100,000 ریال) است | 400 |
| no_active_card | هیچ کارت فعالی برای این کاربر یافت نشد | 400 |
| invalid_invoice_id | شناسه فاکتور نامعتبر است | 400 |
| not_found | فاکتور یافت نشد | 404 |
| mode_mismatch | عدم تطابق حالت کلید و فاکتور (مثلاً کلید Live روی فاکتور Sandbox، یا simulate با کلید Live) | 403 |
| invalid_scenario | مقدار scenario در simulate نامعتبر است | 400 |
| invalid_state | فاکتور برای شبیهسازی آماده نیست (مثلاً دیگر PENDING نیست یا منقضی شده) | 400 |