تالار گفتمان مانشت
رفع مشکل پرداخت بانک ملت (خطای ۴۲) - نسخه‌ی قابل چاپ

رفع مشکل پرداخت بانک ملت (خطای ۴۲) - admin - 29 شهریور ۱۳۹۱ ۰۱:۱۸ ق.ظ

مشکل ماجول هدیه سایت برطرف شد. بد ندونستم دلایل این مشکل و راه‌حل رو توضیح بدم (بلکه به درد یه بنده خدایی خورد):

۱. آغاز مشکل: مشکل از اونجا شروع شد که ما سرور رو تغییر دادیم. با تغییر آی‌پی باید یه درخواست به بانک پذیرنده داد تا آی‌پی جدید تنظیم بشه. ما هم همین کار رو انجام دادیم. اما....
با همون اسکریپتی که قبلاً داشتیم نمی‌تونستیم پرداخت داشته باشیم. دلیل چی بود؟؟ آیا مشکل از بانک بود؟ آیا مشکل از اسکریپت ما بود؟
۲. شناسایی مشکل: شناسایی محل مشکل خودش از سخت‌ترین کارها توی این شرایط هست. من با بانک تماس گرفتم و مقادیر رو باهاشون چک کردم (واقعاً این بانک ملتی‌ها خیلی کارشون درسته و به مشتری‌ها احترام می‌گذارند) متوجه شدم که یکی از متغییرها به اسم saleReferenceId مقادیر عجیبی رو به خودش می‌گیره و چیزی که بانک برای من می‌فرسته با چیزی که من برای بانک می‌فرستم زمین تا آسمان متفاوت هست.
دلیل ساده این امر تنها یک چیز می‌تونه باشه، overflow! یعنی مقادیر saleReferenceId این‌قدر بزرگ هستند که توی int جا نمی‌شن. اما چرا توی سرور قبلی مشکل نداشتیم؟ سرور قبلی ما دارای معماری ۶۴ بیتی بود و به همین خاطر طول int در اون ۲ به توان ۶۴ بود. در حالی که این‌بار ما سرور رو ۳۲ بیتی کردیم!! و عجیب‌تر اینکه این saleReferenceId هم حدود چند ماهه که از میزان ماکزیمم int32 بالاتر رفته!!!
۳. راه‌حل: بعد از شناسایی مشکل پیشنهاد راه‌حل ساده به نظر می‌رسه. اما در این مورد خاص واقعاً راه‌حل ساده نیست. من متوجه شدم که درخواست SOAP ما به وب‌سرویس بانک ملت به صورت خودکار به int تبدیل می‌شه!! بنابراین ما از هر روشی استفاده می‌کردیم در نهایت overflow اتفاق می‌افتاد. راه حل واقعی این مشکل عوض کردن سرور به یک سرور ۶۴ بیتی بود اما ما چه طور این اتفاق رو دور زدیم؟
استفاده از تابع بسیار خطرناک eval از اونجا که استفاده ما از این تابع یک باگ امنیتی رو به مانشت اضافه کرده و به راحتی می‌شه با داشتن تعریف eval به مانشت نفوذ کرد من نمی‌تونم کد ۳۲ بیتی رو اینجا بیارم. لذا تنها توضیحاتی می‌دم که برای دوستان مفید باشه.
من متوجه شدم که تنها راه حل دور زدن تبدیل به int توی این وب‌سرویس استفاده از CONSTANTها هست. از طرفی اسم ثابت که میاد دل آدم می‌لرزه. مگه می‌شه که من Idای که هر سری تغییر می‌کنه رو توی یک ثابت بریزم؟؟ تنها راه انجام این کار استفاده از eval هست که بسیار بسیار خطرناک هست و باید با احتیاط سراغش رفت.

در نهایت از دوستانی که مایل به کمک به مانشت هستند درخواست می‌کنم که دریغ نکنند. متاسفانه هزینه‌های دلاری بالا رفته Big Grin