در اتصال سایت به درگاه بانک ملت یا بهپرداخت ملت، مقدار ResCode یکی از مهمترین دادههایی است که وضعیت پرداخت را مشخص میکند. این کد میتواند نشان دهد تراکنش موفق بوده، کاربر منصرف شده، اطلاعات پذیرنده مشکل دارد، مبلغ نامعتبر است یا خطایی در سمت بانک و شبکه پرداخت رخ داده است.
ResCode در چه مرحلهای استفاده میشود؟
فرایند پرداخت آنلاین معمولاً از چند مرحله تشکیل میشود. ابتدا سایت درخواست پرداخت را به سرویس بانک ارسال میکند. اگر درخواست اولیه درست باشد، بانک یک شناسه پرداخت مثل RefId برمیگرداند و کاربر به صفحه پرداخت هدایت میشود. بعد از پرداخت، بانک کاربر را به آدرس برگشت سایت بازمیگرداند و پارامترهایی مثل ResCode، SaleOrderId و SaleReferenceId ارسال میشود.
درخواست پرداخت
سایت مبلغ، شماره سفارش، اطلاعات پذیرنده و آدرس برگشت را ارسال میکند. اگر پاسخ اولیه موفق باشد، کاربر به صفحه پرداخت منتقل میشود.
بازگشت از بانک
پس از پرداخت، انصراف یا خطا، بانک کاربر را به سایت برمیگرداند و وضعیت اولیه تراکنش را همراه با ResCode ارسال میکند.
تایید سمت سرور
قبل از فعال کردن سفارش یا شارژ حساب، سایت باید تراکنش را Verify کند و مبلغ، شماره سفارش و وضعیت پرداخت را با دادههای داخلی تطبیق دهد.
جدول کدهای پاسخ رایج درگاه بانک ملت
| کد | معنی وضعیت یا خطا | اقدام پیشنهادی |
|---|---|---|
0 | عملیات موفق | تراکنش را Verify کنید، مبلغ و شماره سفارش را تطبیق دهید و سپس وضعیت سفارش را پرداختشده کنید. |
11 | شماره کارت نامعتبر است | پیام مناسب نمایش دهید و امکان پرداخت مجدد با کارت دیگر را قرار دهید. |
12 | موجودی کافی نیست | پرداخت را ناموفق ثبت کنید و کاربر را به بررسی موجودی یا استفاده از کارت دیگر راهنمایی کنید. |
13 | رمز نادرست است | سفارش را پرداختنشده نگه دارید و لینک تلاش مجدد نمایش دهید. |
14 | تعداد دفعات ورود رمز بیش از حد مجاز است | از کاربر بخواهید وضعیت کارت را از بانک صادرکننده پیگیری کند. |
15 | کارت نامعتبر است | استفاده از کارت دیگر یا تماس با بانک را پیشنهاد دهید. |
16 | دفعات برداشت وجه بیش از حد مجاز است | پرداخت را متوقف کنید و امکان پرداخت در زمان دیگر یا با کارت دیگر بدهید. |
17 | کاربر از انجام تراکنش منصرف شده است | این وضعیت خطای فنی نیست. سفارش را در حالت پرداختنشده نگه دارید. |
18 | تاریخ انقضای کارت گذشته است | کاربر باید از کارت معتبر دیگری استفاده کند. |
19 | مبلغ برداشت بیش از حد مجاز است | سقف کارت، مبلغ سفارش و محدودیتهای بانکی را بررسی کنید. |
21 | پذیرنده نامعتبر است | اطلاعات ترمینال، نام کاربری، رمز پذیرنده و فعال بودن درگاه را بررسی کنید. |
23 | خطای امنیتی رخ داده است | IP سرور، SSL، اطلاعات ارسالی، تغییر نکردن پارامترها و تنظیمات پذیرنده را کنترل کنید. |
24 | اطلاعات کاربری پذیرنده نامعتبر است | terminalId، userName و userPassword را دوباره بررسی کنید. |
25 | مبلغ نامعتبر است | مبلغ باید عددی، مثبت و مطابق واحد مورد انتظار درگاه ارسال شود. |
31 | پاسخ نامعتبر است | لاگ پاسخ بانک، فرمت درخواست و وضعیت سرویس را بررسی کنید. |
32 | فرمت اطلاعات وارد شده صحیح نیست | طول و نوع دادههایی مثل شماره سفارش، تاریخ، مبلغ و آدرس برگشت را کنترل کنید. |
34 | خطای سیستمی | پرداخت را ناموفق ثبت کنید، لاگ بگیرید و در صورت تکرار با پشتیبانی درگاه پیگیری کنید. |
41 | شماره درخواست تکراری است | برای هر پرداخت یک شماره سفارش یکتا تولید کنید و از ارسال دوباره همان شناسه جلوگیری کنید. |
43 | قبلاً درخواست Verify داده شده است | سیستم شما باید idempotent باشد؛ یعنی تکرار درخواست باعث چندبار فعال شدن سفارش نشود. |
44 | درخواست Verify یافت نشد | شماره سفارش، مرجع فروش و اطلاعات برگشتی بانک را با لاگ داخلی تطبیق دهید. |
45 | تراکنش Settle شده است | اگر سفارش قبلاً پرداختشده ثبت شده، از انجام دوباره عملیات جلوگیری کنید. |
46 | تراکنش Settle نشده است | وضعیت را بررسی و در صورت نیاز متد Settle را طبق مستندات اجرا کنید. |
47 | تراکنش Settle یافت نشد | لاگ Verify و Settle را بررسی کنید و از ارسال صحیح شناسهها مطمئن شوید. |
48 | تراکنش Reverse شده است | سفارش نباید پرداختشده بماند. وضعیت مالی و لاگ برگشت وجه را بررسی کنید. |
49 | تراکنش Refund یافت نشد | در سناریوهای برگشت وجه، شناسهها و وضعیت تراکنش را دوباره بررسی کنید. |
51 | تراکنش تکراری است | از پردازش دوباره جلوگیری کنید و وضعیت قبلی سفارش را نمایش دهید. |
54 | تراکنش مرجع موجود نیست | SaleReferenceId، SaleOrderId و لاگ برگشت از بانک را بررسی کنید. |
55 | تراکنش نامعتبر است | پرداخت را ناموفق نگه دارید و جزئیات را در لاگ فنی ذخیره کنید. |
61 | خطا در واریز | سفارش را تا روشن شدن وضعیت نهایی در حالت بررسی نگه دارید و با پشتیبانی درگاه پیگیری کنید. |
چرا Verify و کنترل مبلغ ضروری است؟
یکی از اشتباهات رایج در توسعه درگاه پرداخت این است که سایت فقط بر اساس ResCode=0 سفارش را تکمیل میکند. این کار امن نیست. بعد از بازگشت از بانک باید تراکنش در سمت سرور Verify شود و اطلاعات برگشتی با اطلاعات سفارش داخلی تطبیق داده شود. مبلغ، شماره سفارش، شناسه مرجع و وضعیت قبلی سفارش باید بررسی شوند.
- برای هر سفارش یک شناسه پرداخت یکتا ایجاد کنید.
- اگر سفارش قبلاً پرداخت شده، عملیات را دوباره انجام ندهید.
- مبلغ برگشتی و مبلغ ذخیرهشده در دیتابیس را تطبیق دهید.
- نتیجه Verify و Settle را در جدول تراکنشها ذخیره کنید.
- در صورت خطای نامشخص، سفارش را در وضعیت «در حال بررسی» قرار دهید، نه پرداختشده.
نمونه ساده بررسی وضعیت در PHP
نمونه زیر فقط برای نمایش منطق کلی است. در پروژه واقعی باید ساختار کلاسبندی، لاگ امن، مدیریت خطا، جلوگیری از تکرار پردازش و ارتباط با دیتابیس بهصورت استاندارد پیادهسازی شود.
<?php
$resCode = $_POST["ResCode"] ?? null;
$saleOrderId = $_POST["SaleOrderId"] ?? null;
$saleReferenceId = $_POST["SaleReferenceId"] ?? null;
if ($resCode !== "0") {
// پرداخت ناموفق یا انصراف کاربر
markOrderAsUnpaid($saleOrderId, $resCode);
exit("پرداخت با موفقیت انجام نشد.");
}
// 1) سفارش را از دیتابیس بخوانید
$order = findOrderByPaymentId($saleOrderId);
// 2) از پردازش چندباره جلوگیری کنید
if ($order && $order["status"] === "paid") {
exit("این سفارش قبلاً پرداخت شده است.");
}
// 3) تراکنش را از سمت سرور Verify کنید
$verifyResult = verifyMellatTransaction($saleOrderId, $saleReferenceId);
if ($verifyResult === "0") {
markOrderAsPaid($saleOrderId, $saleReferenceId);
exit("پرداخت با موفقیت تایید شد.");
}
markOrderAsPendingReview($saleOrderId, $verifyResult);
exit("وضعیت پرداخت نیاز به بررسی دارد.");
چکلیست رفع خطاهای رایج
اگر درخواست پرداخت ایجاد نمیشود
- اطلاعات پذیرنده را بررسی کنید.
- IP ثبتشده در بانک را کنترل کنید.
- واحد مبلغ و مثبت بودن مبلغ را بررسی کنید.
- SSL و آدرس برگشت را تست کنید.
اگر پرداخت انجام شده اما سفارش فعال نمیشود
- لاگ callback را بررسی کنید.
- Verify و Settle را کنترل کنید.
- تطبیق مبلغ و شماره سفارش را چک کنید.
- از تکراری نبودن شناسه سفارش مطمئن شوید.
سوالات متداول درباره کدهای بانک ملت
آیا ResCode صفر یعنی سفارش را بلافاصله پرداختشده کنم؟
خیر. ResCode صفر نشانه اولیه موفقیت است، اما باید Verify سمت سرور، تطبیق مبلغ و کنترل وضعیت قبلی سفارش انجام شود.
خطای 17 مشکل فنی است؟
معمولاً خیر. کد 17 یعنی کاربر از پرداخت منصرف شده است. بهتر است لینک پرداخت مجدد نمایش داده شود.
برای جلوگیری از فعال شدن دوباره سفارش چه کار کنم؟
برای هر تراکنش شناسه یکتا ذخیره کنید و قبل از هر تغییر وضعیت بررسی کنید سفارش قبلاً paid نشده باشد.
نظرات و پاسخها
دیدگاهها، تجربهها و پرسشهای کاربران درباره این صفحه را اینجا ببینید و ثبت کنید.
ثبت نظر جدید