سلام وقت شما بخیر.
من از local host استفاده می کنم.
بعد از پرداخت و انتقال به سمت سایت ارور CSRF TOKEN میگیرم.
لطفا راهنمایی بفرمایید چیکار کنم مشکل برطرف شه
و نمی خوام از @login_required استفاده کنم
سلام خدمت شما دوست عزیز
لطفا مقدار زیر رو پر کنین:
CSRF_TRUSTED_ORIGINS = []
این مقدار رو توی فایل settings.py قرار بدین و آدرس های دامنه رو داخلش به صورت لیست تعریف کنین
استاد به این صورت منظورت هست؟
و بعد از دیپلوی مشکلی برای پروژه پیش نمیاد؟
CSRF_TRUSTED_ORIGINS = ['localhost:8000']
یا منظورتون url برگشت به سایت بعد از پرداخت هستش؟
نه دوست من داخلش باید آدرس url مربوط به دامنه ی سایت رو بذارین
زمانی که آنلاین کردین
استاد عزیز مشکل همچنان پا برجاس.
و در بالا منظورم این دکوریتور بود @csrf_exempt
اشتباها نوشتم @login_required
در حال حاظر من روی لوکال هستم و روی لوکال احتیاج دارم این ارور برطرف شه؟
لطفا راهنمایی بفرمایید سپاس .
ببینین زمانی که از درگاه برمیگردین، این درخواست به صورت POST توسط ارائه دهنده ی درگاه ارسال میشه
به صورت پیشفرض ساختار csrf توی head درخواست در جنگو تنظیم میشه
2 روش برای حل این مورد وجود داره
یا باید نوع بازگشت از درگاه رو از روی POST به GET تغییر بدین که عملا گاها با خطا مواجه میشه و مشکلات امنیتی داره
یا اینکه از دکوریتور csrf_exempt استفاده کنین
استاد من از این دکوریتور csrf_exempt استفاده میکنم زمان برگشت به سایت کاربر لاگین نیست
و این ارور رو میده
چه درگاهی رو دارین پیاده سازی میکنین؟
استاد درگاه آقای پرداخت رو دارم استفاده میکنم
ببینین چون درخواست از نوع post هستش و این درخواست رو سایت آقای درگاه داره ارسال میکنه پس کوکی مربوط به کاربر شما باهاش ارسال نمیشه
برای این مورد معمولا درگاه های پرداخت یک اطلاعات اضافی رو توی درخواست اولیه از شما میگیرن ( منظورم درخواست اولی هستش که به درگاه ارسال میکنین و بعد کاربر رو به سایت درگاه redirect میکنین )
توی این اطلاعات، مقدار id مربوط به order ای که قصد دارین خریدش رو نهایی کنین ارسال کنین
بعد از بازگشت از درگاه ، این اطلاعات توسط درگاه برای شما ارسال میشه و میتونین بفهمین که کدوم order باید نهایی بشه
استاد زمان ارسال اطلاعات فقط transid ارسال میکنه به درگاه پرداخت.
api در گاه پرداخت:
https://aqayepardakht.ir/api/
ببینین توی داکیومنت گفته شما میتونین مقدار invoice_id رو ارسال کنین
منظور از invoice_id همون شماره ی order یا order id هستش
اگر دقت کنین توی مرحله ی سوم گفته اگر شما invoice_id رو پر کرده باشین براتون مجدد ارسال میشه
فقط توجه داشته باشین که اطلاعات توی resquest.data یا request.post هستش و هر دو رو چک کنین
استاد عزیز لاگین شدن و یوزر آی دی کاربر رو چیکارکنم؟
استاد مجبور شدم کد رو به اینصورت تغییر بدم.
user_id = request.POST.get('invoice_id')
user: User = User.objects.filter(id=user_id).first()
login(request, user)
current_order, created = Order.objects.get_or_create(is_paid=False, user_id=user_id)
total_amount = current_order.get_total_amount()
بجای (ای دی) خرید (ای دی ) کاربر رو انتقال دادم و بعد از پرداخت مجدد اتومات لاگینش کردم
بنظر شما روی امنیت و سرعت سایت ثاثیر داره؟
این کار اشتباه هستش دوست من
عرض کردم که برای حل مشکل باید خود order id رو ارسال کنین
این مورد از نظر امنیت مشکل داره و با یک ابزار مثل http profiler میشه مشکلات زیادی توی پروژه ی شما ایجاد کرد
توی صفحه ای که کاربر از درگاه برمیگرده، نتیجه ی پرداخت رو نمایش بدین.
یک دکمه برای بازگشت به صفحه ی اصلی هم قرار بدین که وقتی کاربر روش کلیک کرد، وارد صفحه ی اصلی بشه
از اونجایی که روی مرورگر شما کوکی قبلا ایجاد شده، با ریدایرکت شدن ، کاربر مجددا توی سیستم شناسایی میشه
از طرف دیگه شما دارین id کاربرتون رو که یکی از اجزای اصلی پروژه هستش به رفرنس خارجی ارجاع میدین
استاد عزیز قبل از هر چیز ممنون از شما که بی درنگ و در اسرع وقت پاسخگو بنده هستید.
اگر با پشتیبانی درگاه پرداخت مکاتبه کنم پشتیبانی فنی درگاه میتونه در متد پست خود از csrf_token استفاده کنه و مشکل من حل شه؟ یا اینکه یکسری اطلاعات رو بتونم به همراه callback url ارسال کنم مشکل برطرف شه؟
و آیا این مشکل از ضعف api درگاه پرداخت هستش؟
فکر میکنم این مشکل در زرین پال نباشه. درسته استاد عزیز؟
خواهش میکنم دوست من
انجام وظیفه میکنم
این مورد مشکل درگاه نیست دوست من. اتفاقا این مورد از امنیت بالایی برخوردار هستش. اگر درگاه پرداخت شما به csrf شما دسترسی داشته باشه مشکل امنیتی ایجاد میشه
اطلاعات اضافه رو توی url میشه ارسال کرد اما پیشنهاد نمیکنم چون کاربری که مقداری برنامه نویسی بلد باشه با تغییر این مقادیر میتونه توی سایت شما مشکل ایجاد کنه
بهترین حالت استفاده از همون invoice_id هستش که خدمتتون عرض کردم
اگر api مورد نظر اطلاعات اضافی به جز invoice_id دریافت میکنه میتونین ازش استفاده کنین
در غیر اینصورت مورد اضافه ای نمیشه ارسال کرد
میتونین به جای order_id یک جدول دیگه داشته باشین که تمامی اطلاعات مورد نظرتون اونجا باشن و id مربوط به اون جدول رو ارسال کنین که بعد از بازگشت به همه این موارد دسترسی داشته باشین
استاد عزیز ممنونم با راهنمایی های شما مشکل بنده حل شد.
از اینکه با صبوری و مهربانی سوالات بنده رو جواب دادید بسیار از شما سپاسگذارم (استاد خوش اخلاق)
خواهش میکنم دوست من
خیلی خوشحالم تونستم کمکتون کنم
براتون آرزوی موفقیت و سلامتی میکنم :)
فقط چند مورد اگه امکانش هست در آپدیت های بعدی قرار بدید.
1 - جستجو در سایت
2 - انبار داری بسیار کوچک (فقط جهت آشنایی)
3 - بعد از دولوپ کردن اپ اگه موردی رو در لوکال تغییر دادیم و بروز رسانی کردیم چطور بدون اینکه به دیتا های سایت آسیب برسه قالب رو بروزرسانی کنیم - واقعا شاید بارها و بارها نیاز به بروز رسانی و تغییر اپ شود. این مورد بسیار برام مهم هست.
سپاسگذارم از شما
چشم دوست من
سعی میکنم این موارد رو در آپدیت های بعدی دوره پوشش بدم
بی نهایت سپاسگذارم از شما.
خواهش میکنم دوست من
موفق باشین :)