شما مطمئنید ندارن؟ من خودم با این سناریو کار میکنم و همیشه جواب گرفتم (با چند درگاه پرداخت مختلف هم کار کردم - اعم از واسط و مستقیم) :
یک جدول برای سفارشها و یک جدول هم برای ارتباط 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- میکنه.
درنهایت همه فروشگاههای اینترنتی، حتی مهره درشتهایی مثل دیجی کالا و بامیلو و... مدیریت دستی برای فروش دارن چون مسئله پول مردمه و شوخی بردار نیست.