PDA

View Full Version : سوال: اگر تراکنش بانکی وریفای شد و بلافاصله سرور خاموش شد یا از کار افتاد باید چیکار کرد؟



i-php-i
چهارشنبه 20 اسفند 1393, 20:06 عصر
گاهی پیش می یاد که کاربر از درگاه بانک به سایت بر می گرده و تراکنش هم وریفای می شه ولی بعد سایت از کار می یافته یا ارتباط با دیتابیس به مشکل بر می خورده و...

در این صورت پول کاربر کسر می شه و دیگه به حسابش برگشت نمی خوره اما خریدش هم ثبت نمی شه!

تا حالا این مشکل براتون پیش اومده و چه راه حلی بنظرتون می رسه؟

prans.info
چهارشنبه 20 اسفند 1393, 20:23 عصر
برای سیستم های حساس باید زیر ساخت درست و حسابی هم فراهم کنید که چنین مشکلاتی پیش نیاد .
قفل دیتابیس در انجین اینو دی بی میتونه در این مورد کاربردی باشه ...

us1234
چهارشنبه 20 اسفند 1393, 20:32 عصر
اگر وریفای شد و داخل اسکریپت ثبت نشد یا هر اتفاق دیگری که افتاد ، یوزر باید ایمیل بزند وشرایط را توضیح دهد و شما با چک کردن حساب بانکی تون بعد از درست شدن سرور ( یا اسکریپت ) تراکنش را دستی ثبت کنید.

وقتی سرور دان شده دیگه قفل دیتابیس و ... چه کاربردی دارد !

prans.info
چهارشنبه 20 اسفند 1393, 20:36 عصر
وقتی سرور دان شده دیگه قفل دیتابیس و ... چه کاربردی دارد !
باعث میشه دیگه از حساب کاربر کم نشه .

us1234
چهارشنبه 20 اسفند 1393, 21:54 عصر
باعث میشه دیگه از حساب کاربر کم نشه .

یعنی قفل دیتابیس روی یک سرور خاموش باعث میشه که پول از حساب مثلا بانک ملت کاربر کم نشود ؟

سناریو به این شکل است یوزر به درگاه رفته پرداخت انجام شده و به سایت برگشته تراکنش وریفای شده 1 قدم قبل از اینکه تراکنش ثبت بشه یا هر کار دیگه ای انجام بشه سرور خاموش شده !!!

rambod18
چهارشنبه 20 اسفند 1393, 22:00 عصر
برای down شدن سرور که فکر نکنم کار نرم افزاری بشه کرد. اما برای ارتباط با دیتابیس میشه
اگر دیتابیس خطا داد اطلاعات به صورت رکورد در یک فایل ذخیره کنید بعد که ارتباط برقرار شد وارد دیتابیس کنید

rambod18
چهارشنبه 20 اسفند 1393, 22:02 عصر
اگر هم سرور خیلی حساس هست میشه اطلاعات رو روی دوتا دیتابیس یکی لوکال و یکی راه دور ذخیره کرد

H:Shojaei
چهارشنبه 20 اسفند 1393, 22:38 عصر
وقتی سرور خاموش بشه خوب چه کاری میشه کرد شما 1000 نوع کد بزنید یا تمحیدات دیگه بذارید تو فایل ذخیره کنید دیتابیس رو قفل کنید هر کاری سرور خاموش کاری نمیتونه بکنه!
باید کاربر با پشتیبانی تماس بگیره کد رهگیری بده (که واسه همچین روزایی ساخته شده این کد رهگیری) بعد شما تشخیص بدید و دستی عمل مربوطه رو انجام بدید...
فقط مگر این که بانک ها خدمتی در این مورد ارائه داده باشن که اونام میگن به ما چه سرور شما رو!

i-php-i
پنج شنبه 21 اسفند 1393, 00:12 صبح
وقتی سیستم خاموش می شه که دیگه نه می شه با دیتابیس ارتباط برقرار کرد نه کار دیگه ای کرد!

پس ظاهرا راهی نیست و باید با این وضعیت کنار اومد.

نمی دونید سایتهای خارجی چطور نقل و انتقال پول رو انجام می دن؟

Unique
پنج شنبه 21 اسفند 1393, 01:29 صبح
راستش تا حالا کسی تایید نکرده چنین مشکلی را ، ببینید شما مثل اینکه حواستون نیست در مورد چی دارین صحبت میکینم. اگه شما از یک شرکت در پیت که UPS یا پشتیبان برای شرابط قطع برق و این چیزا توی Data Center ش نداره استفاده میکنید که تقصیر شماست. مگه ایرانه که لنگر کشتی به سیم ها گیر کنه یا پاشون بره روی سیم برق ؟!؟! تو را خدا از این حرفا نزنین. این احتمالی که میگین انقدر کمه که کاملا قابل چشم پوشیه.

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

اما باز هم میگم که سناریو شما خیلی خیلی بعیده. Database هم معمولا روی همون سرور هاست هست و این مشکلات برای پیش نمیاد اما خوب اگه settle در آخر باشه احتمالش دیگه واقعا نزدیک به صفره.

i-php-i
پنج شنبه 21 اسفند 1393, 23:12 عصر
راستش تا حالا کسی تایید نکرده چنین مشکلی را ، ببینید شما مثل اینکه حواستون نیست در مورد چی دارین صحبت میکینم.

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

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

اگر قرار بود چون یه سناریو بعیده کاری براش نکنن که نیازی نبود تراکنش ها رو به دیتابیس ها اضافه کنن!

اینم بعیده که در یک زمان (برحسب میلی ثانیه) دو نفر بخوان از حساب پول جابجا کنن ولی چرا برای این کار تراکنش رو پیشنهاد دادن؟

Unique
جمعه 22 اسفند 1393, 00:42 صبح
پارسپال و پی لاین و زرین پال و... ستل ندارن فقط دوتابع می دن یکی برای ثبت تراکنش یکی برای وریفای تراکنش
راستش مشکل از این ها هستش که اصولی کار نکردن ! چرا مستقیم از بانک درگاه نمیگیرید ؟


اگر قرار بود چون یه سناریو بعیده کاری براش نکنن که نیازی نبود تراکنش ها رو به دیتابیس ها اضافه کنن!
اینم بعیده که در یک زمان (برحسب میلی ثانیه) دو نفر بخوان از حساب پول جابجا کنن ولی چرا برای این کار تراکنش رو پیشنهاد دادن؟
موضوع برق رفتن و کار نکردن پشتیبان یه چیزی نزدیک به صفره اما موضوع تراکنش ها و اختلالاتی که در صورت عدم اسفاده از اون ها در زمان همزماین پیش میاد خیلی خیلی زیاده و توی برخی نرم افزار ها ۷۰ یا ۸۰ درصد مواقع اتفاق میفته.

MMSHFE
جمعه 22 اسفند 1393, 01:00 صبح
درگاههای واسط هم راههای جایگزین دارن. برای مثال کدی که اعلام میکنه قبلاً وریفای شده. کدی که میگه مبلغ نمیخونه. کدی که میگه اصلاً پرداخت نشده و...
حالا شما کافیه هر چند وقت یکبار با Cron Jobs چک کنید تراکنشهایی که اصلاً پرداخت نشده رو حذف کنید و اونهایی که پرداخت شده ولی وریفای نشده و مبلغ هم میخونه رو تأیید کنید.

i-php-i
جمعه 22 اسفند 1393, 02:47 صبح
حالا شما کافیه هر چند وقت یکبار با Cron Jobs چک کنید تراکنشهایی که اصلاً پرداخت نشده رو حذف کنید و اونهایی که پرداخت شده ولی وریفای نشده و مبلغ هم میخونه رو تأیید کنید.
معمولا وقتی پول از حساب مشتری کم می شه و خرید ثبت نمی شه خیلی سریع با مدیر سایت تماس می گیره و مدیر با من تماس می گیره و وقتی برای کران جابز باقی نمی مونه مگر اینکه هر دقیقه اجرا بشه.

در ثانی هیچکدوم از درگاههای واسطه چنین امکانی ندارن


راستش مشکل از این ها هستش که اصولی کار نکردن ! چرا مستقیم از بانک درگاه نمیگیرید ؟
فرض کنید مستقیم از بانک بگیرن، در این صورت بعد از ستل کردن کار ما با بانک تموم می شه و باید اطلاعات رو وارد دیتابیس کنیم.

حالا (به هردلیل) اگر بعد از ستل کردن برای سخت افزار یا نرم افزار مشکلی پیش بیاد باید چیکار کرد؟

البته در این موارد تنها راه اینه که مدیر چک کنه ببینه پول به حسابش واریز شده یا نه و اگر واریز ثبت شده بود وضعیت خرید رو دستی تغییر بده

MMSHFE
جمعه 22 اسفند 1393, 12:39 عصر
شما مطمئنید ندارن؟ من خودم با این سناریو کار میکنم و همیشه جواب گرفتم (با چند درگاه پرداخت مختلف هم کار کردم - اعم از واسط و مستقیم) :
یک جدول برای سفارشها و یک جدول هم برای ارتباط n به n بین محصولات و سفارشها:

orders
id
name
address
mobile
amount
ts
au
paid

orderproducts
order_id
product_id
quantity
حالا موقع ثبت سفارش اینطوری کار میکنم:
1- تا وقتی که محصولات توی سبد خرید هستن هیچی توی دیتابیس نمیاد و توی سشن id محصول و تعداد رو میگذارم
2- وقتی مشتری میخواد پرداخت کنه، یک رکورد توی جدول orders میگذارم و برای هر محصول هم یک رکورد توی orderproducts و تعداد رو هم ثبت میکنم و جمع مبلغ کل (تعداد هر محصول ضربدر قیمت واحد) رو توی فیلد amount جدول orders میگذارم تا اگه بعداً قیمت محصولات تغییر کرد، توی جدول سفارشها قیمت فاکتور رو داشته باشم. ضمناً فیلد au ابتدا null هست.
3- از درگاه کد au رو میگیرم و رکورد رو آپدیت میکنم و au رو میگذارم. نکته اینکه علت اینکه au رو همون اول نمیگذارم بخاطر مسائل آماریه که بعداً بدونم درگاه چه وقتایی جواب نداده و خریدهای ناموفق رو داشته باشم. البته این کار ضروری نیست و میتونین درصورت تمایل، همون اول au رو بگیرین و بعد تراکنش رو ثبت کنید. اما من بخاطر اینکه میخوام شماره سفارشم رو برای بانک بفرستم (orderId) اول رکورد سفارش رو ثبت میکنم با au خالی و بعد توی این مرحله au رو میگیرم و آپدیت میکنم.
3- فیلد ts رو با زمان جاری مقداردهی میکنم و کاربر رو میفرستم درگاه بانک و موقع برگشت با کمک au رکورد رو پیدا میکنم و با کمک amount و au وریفای میکنم و اگه اوکی بود، paid هم 1 میشه.

توی این روش، حتی اگه بر فرض مشکلی هم توی پرداخت پیش بیاد، کد au رو توی دیتابیس داریم و میشه درصورت نیاز بصورت دستی برگشت زد. البته بانکهایی مثل ملت، متدی برای تراکنش معکوس (برگشت زدن تراکنش) دارن و حتی اگه verify به درستی انجام نشه، خودشون بعد از مدت زمان مشخصی برگشت میزنن. درنهایت میتونین یک اسکریپت با Cron Jobs ست کنین که هر چند وقت یکبار میاد تراکنشهایی که paid اونها 0 هست رو وریفای میکنه و اگه پرداخت انجام شده بود، paid رو 1 میکنه و خرید رو تکمیل میکنه (اطلاع رسانی به مدیر و...) ولی اگه پرداخت نشده بود، با کمک ts چک میکنه زمانی که بانک برای تراکنش مجاز دونسته (معمولاً 10 دقیقه) گذشته یا نه و اگه گذشته بود، فرضاً paid رو 1- میکنه.

درنهایت همه فروشگاههای اینترنتی، حتی مهره درشتهایی مثل دیجی کالا و بامیلو و... مدیریت دستی برای فروش دارن چون مسئله پول مردمه و شوخی بردار نیست.

Unique
جمعه 22 اسفند 1393, 13:24 عصر
فرض کنید مستقیم از بانک بگیرن، در این صورت بعد از ستل کردن کار ما با بانک تموم می شه و باید اطلاعات رو وارد دیتابیس کنیم.
حالا (به هردلیل) اگر بعد از ستل کردن برای سخت افزار یا نرم افزار مشکلی پیش بیاد باید چیکار کرد؟

من توی پُست قبلی اشاره کردم که ستل را بعد از تراکنش های مربوط به پایگاه داده خودتون انجام بدین که اگه این وسط قطعی به وجود اومد یا مشکل دیگه ای حداقل درگیر پول دریافتی از مشتری نباشین و ادعایی نباشه. حالا بعد از رفع مشکل میشه با cronjob در پایان زمان کاری وضعیت این نوع پرداخت ها را مشخص کرد که حتی دستی هم نباشه.

i-php-i
جمعه 22 اسفند 1393, 17:51 عصر
من توی پُست قبلی اشاره کردم که ستل را بعد از تراکنش های مربوط به پایگاه داده خودتون انجام بدین که اگه این وسط قطعی به وجود اومد یا مشکل دیگه ای حداقل درگیر پول دریافتی از مشتری نباشین و ادعایی نباشه.
این روش که دیگه بدتره!
اگر اول تراکنش رو توی دیتابیس به عنوان ثبت شده تغییر وضعیت بدیم و بعد از وب سرویس بانک استفاده کنیم این دفعه ممکنه سرور بانک از دسترس خارج بشه ولی ما توی نرم افزار تراکنش رو به عنوان پرداخت شده ثبت کردیم و باز هم نیاز هست تا مدیر دستی کار رو انجام بده


شما مطمئنید ندارن؟ من خودم با این سناریو کار میکنم و همیشه جواب گرفتم (با چند درگاه پرداخت مختلف هم کار کردم - اعم از واسط و مستقیم) :
مشکل اینه که زمانی که پول از حساب خریدار کم می شه تا زمانی که مدیر سایت با من تماس می گیره 2-3 دقیقه بیشتر طول نمی کشه و کران جابز نمی تونه در این مورد کاری از پیش ببره

توی این موارد همون تغییر وضعیت دستی بهترین راه حله

us1234
جمعه 22 اسفند 1393, 21:05 عصر
این روش که دیگه بدتره!
اگر اول تراکنش رو توی دیتابیس به عنوان ثبت شده تغییر وضعیت بدیم و بعد از وب سرویس بانک استفاده کنیم این دفعه ممکنه سرور بانک از دسترس خارج بشه ولی ما توی نرم افزار تراکنش رو به عنوان پرداخت شده ثبت کردیم و باز هم نیاز هست تا مدیر دستی کار رو انجام بده


مشکل اینه که زمانی که پول از حساب خریدار کم می شه تا زمانی که مدیر سایت با من تماس می گیره 2-3 دقیقه بیشتر طول نمی کشه و کران جابز نمی تونه در این مورد کاری از پیش ببره

توی این موارد همون تغییر وضعیت دستی بهترین راه حله

ارتباطی با اصل قضیه ندارد ، ولی کرون جاب در کمترین حالت می تونه هر دقیقه اجرا بشه . در ضمن با یک while(1) داخل کد پی اچ پی و استفاده از sleep و کرون جابی که هر دقیقه اجرا میشود می تونی یک ریکویست را همیشه در حال اجرا نگه داری ولی سعی کن این کار را روی هاست های اشتراکی انجام ندید چون ممکنه مشکل ساز بشه .
من برای یک ربات خاص که با پی اچ پی نوشته بودم روی یک vps یک ریکوست را 48 ساعت اجرا نگه داشتم و بعد هم با ریست کردن آپاچی تونستم ببندمش :لبخندساده:

Unique
شنبه 23 اسفند 1393, 01:18 صبح
این روش که دیگه بدتره!
اگر اول تراکنش رو توی دیتابیس به عنوان ثبت شده تغییر وضعیت بدیم و بعد از وب سرویس بانک استفاده کنیم این دفعه ممکنه سرور بانک از دسترس خارج بشه ولی ما توی نرم افزار تراکنش رو به عنوان پرداخت شده ثبت کردیم و باز هم نیاز هست تا مدیر دستی کار رو انجام بده

شما هم خدا را میخواین هم خرما را.
شما نه به سایت خودتون اطمینان دارین و نه به سایت بانک. میشه وقتی که ستل جواب نداد و به مشکل خورد تراکنش را توی پایگاه داده خودمون کنسل کنیم البته اگه نگین حالا ممکنه برق بره !
من اتفاقا میخواستم شما همین موضوع را پیش بکشین تا متوجه بشین هیچوقت نمیتونید صد در صد مطمئن باشین. این Cron job و غیره هم به درد شما نمیخوره چون وقتی سرور شما از کار میفته و برقش میره خوب Cron Job شما هم اثر نمیکنه !‌ اگه هم Cron Job شما روی یک سرور دیگه باشه ! خوب ممکنه همون موقع که Cron Job باید عمل کنه برق اون سرور هم بره.

در چنین حالت هایی یک موضوعی هست که بعش میگن "تعامل". فقط به صورت دستی میشه وضعیت های این چنینی را مدیریت کرد.

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

aliphp1
شنبه 23 اسفند 1393, 01:35 صبح
بهترین راه همون کرانجاب هست و در کنار اون روش دستی رو داشته باشید
ولی من خودم شخصا با اینکه تعداد تراکنش بالایی دارم ولی تعداد این جور تراکنش ها خیلی خیلی کم هست به همین خاطر کرانجاب هم ندارم و دستی چک میکنم ولی میگم شاید ماهی یکی هم اتفاق نیفته
چون فاصله اینکه جواب وریفای از بانک بیاد و یک کوئری در دیتابیس ثبت بشه در حد هزارم ثانیه هست و در این بین خیلی به ندرت این اتفاق میفته (البته برای من افتاده ولی خیلی خیلی کم )

i-php-i
شنبه 23 اسفند 1393, 14:15 عصر
بهترین راه همون کرانجاب هست و در کنار اون روش دستی رو داشته باشید
ولی من خودم شخصا با اینکه تعداد تراکنش بالایی دارم ولی تعداد این جور تراکنش ها خیلی خیلی کم هست به همین خاطر کرانجاب هم ندارم و دستی چک میکنم ولی میگم شاید ماهی یکی هم اتفاق نیفته
چون فاصله اینکه جواب وریفای از بانک بیاد و یک کوئری در دیتابیس ثبت بشه در حد هزارم ثانیه هست و در این بین خیلی به ندرت این اتفاق میفته (البته برای من افتاده ولی خیلی خیلی کم )
امسال فقط 2 بار این اتفاق افتاده پس یعنی اتفاق میافته!

تعدادشون اونقدر زیاد نیست که بخوایم هر دقیقه از کرانجابز استفاده کنیم

شما نه به سایت خودتون اطمینان دارین و نه به سایت بانک. میشه وقتی که ستل جواب نداد و به مشکل خورد تراکنش را توی پایگاه داده خودمون کنسل کنیم البته اگه نگین حالا ممکنه برق بره !
برق هم ممکنه بره!

توی خیلی از سرورهای اشتراکی که ارتباط با دیتابیس یه دفعه کلا قطع می شه و سایت رو از کار می ندازه!

نمی دونم مشکل سرور کجاش براتون عجیبه

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

استفاده از کرانجابز برای مشکلی که ممکنه در طول یک سال به ندرت اتفاق بیافته درست نیست.

Unique
شنبه 23 اسفند 1393, 18:54 عصر
برق هم ممکنه بره!
تا جایی که من میدونم دیتا سنتر ها برق پشتیبان دارند و ۲ تا ۴ ساعت هم بدون برق شهری به خوبی کار میکنند.


توی خیلی از سرورهای اشتراکی که ارتباط با دیتابیس یه دفعه کلا قطع می شه و سایت رو از کار می ندازه!
اگه سایت پر بازدید باشه که کلا باید سرور اختصاصی گرفت. در مورد اشتراکی ها درصد اتفاق افتادن بیشتره ولی نه دیگه در این حد.


نمی دونم مشکل سرور کجاش براتون عجیبه
سعی میکنم پول بیشتر بدم و از جای معبتر بگیرم و تا حالا این مشکلات را نداشتم. روی سایتی در یک ساعت ممکنه ۷۰ یا ۸۰ تا خرید (البته توی چند روز از سال) هم داشته باشم اما تا حالا این مشکل که میگین نداشتم.


همین الان به دلیل اینکه یکی از سرورها مشکل داره نمی تونم به سی پنل لاگین کنم و پشتیبان می که خط اینترنت رو باید عوض کنی.
چه ربطی به خط اینترنت داره !؟ برخی مواقع ممکنه سرور IP ی را موقتا Block کنه (مثلا برخی مواقع ممکنه فکر کنه یک Ip میخواد DDOS بزنه) که اگه ip جدید بگیربن درست میشه. اما قطع بودن ربطی به خط اینترنت شما نداره. سرور های ایران اصلا قابل حرف زدن هم نیستند. از اروپا مخصوصا انگلستان و آلمان یا از آمریکا از دیتا سنتر های معتبر سرویس بگیرید.

i-php-i
شنبه 23 اسفند 1393, 20:52 عصر
در مورد اشتراکی ها درصد اتفاق افتادن بیشتره ولی نه دیگه در این حد.
در سال فقط دو بار این اتفاق افتاده!

چه ربطی به خط اینترنت داره !؟
ای پی بلاک نشده پشتیبان می گه محدودیت سرویس دهنده اینترنت هست و موقتا از یه سرویس دهنده دیگه استفاده کنید!

Unique
دوشنبه 25 اسفند 1393, 19:57 عصر
در سال فقط دو بار این اتفاق افتاده!
دو بار از چند تا تراکنش موفق ؟


ای پی بلاک نشده پشتیبان می گه محدودیت سرویس دهنده اینترنت هست و موقتا از یه سرویس دهنده دیگه استفاده کنید!
ISP ها محدودیت ندارند. همکارای هاستینگ من عادت دارند تا نمیدونن مشکل چیه موضوع را به مخابرات یا ISP ربط میدن. انقدر مرد نیستند بگن آقا عجیبه ، نمیدونم و باید بررسی کنم.