• 1403/10/01

مشکل CSRF TOKEN و انتقال بعد از درگاه پرداخت :

سلام وقت شما بخیر.

من از  local host استفاده می کنم.

بعد از پرداخت و انتقال به سمت سایت ارور CSRF TOKEN میگیرم.

لطفا راهنمایی بفرمایید چیکار کنم مشکل برطرف شه

و نمی خوام از @login_required  استفاده کنم

  • 1403/10/01
  • ساعت 13:04

سلام خدمت شما دوست عزیز

لطفا مقدار زیر رو پر کنین:

CSRF_TRUSTED_ORIGINS = []

این مقدار رو توی فایل settings.py قرار بدین و آدرس های دامنه رو داخلش به صورت لیست تعریف کنین


  • 1403/10/01
  • ساعت 13:33

استاد به این صورت منظورت هست؟

و بعد از  دیپلوی مشکلی برای پروژه پیش نمیاد؟

CSRF_TRUSTED_ORIGINS = ['localhost:8000']

یا منظورتون url برگشت به سایت بعد از پرداخت هستش؟


  • 1403/10/01
  • ساعت 13:49

نه دوست من داخلش باید آدرس url مربوط به دامنه ی سایت رو بذارین

زمانی که آنلاین کردین


  • 1403/10/01
  • ساعت 15:27

استاد عزیز مشکل همچنان پا برجاس.

و در بالا منظورم این دکوریتور بود @csrf_exempt

اشتباها نوشتم  @login_required  

در حال حاظر من روی لوکال هستم و روی لوکال احتیاج دارم این ارور برطرف شه؟

لطفا راهنمایی بفرمایید سپاس .


  • 1403/10/01
  • ساعت 15:48

ببینین زمانی که از درگاه برمیگردین، این درخواست به صورت POST توسط ارائه دهنده ی درگاه ارسال میشه

به صورت پیشفرض ساختار csrf توی head درخواست در جنگو تنظیم میشه

2 روش برای حل این مورد وجود داره

یا باید نوع بازگشت از درگاه رو از روی POST به GET تغییر بدین که عملا گاها با خطا مواجه میشه و مشکلات امنیتی داره

یا اینکه از دکوریتور csrf_exempt استفاده کنین


  • 1403/10/01
  • ساعت 15:55

استاد من از این دکوریتور csrf_exempt استفاده میکنم زمان برگشت به سایت کاربر لاگین نیست

و این ارور رو میده


  • 1403/10/01
  • ساعت 15:57

چه درگاهی رو دارین پیاده سازی میکنین؟


  • 1403/10/01
  • ساعت 15:59

استاد درگاه آقای پرداخت رو دارم استفاده میکنم


  • 1403/10/01
  • ساعت 16:01

  • 1403/10/01
  • ساعت 16:02

ببینین چون درخواست از نوع post هستش و این درخواست رو سایت آقای درگاه داره ارسال میکنه پس کوکی مربوط به کاربر شما باهاش ارسال نمیشه

برای این مورد معمولا درگاه های پرداخت یک اطلاعات اضافی رو توی درخواست اولیه از شما میگیرن ( منظورم درخواست اولی هستش که به درگاه ارسال میکنین و بعد کاربر رو به سایت درگاه redirect میکنین )

توی این اطلاعات، مقدار id مربوط به order ای که قصد دارین خریدش رو نهایی کنین ارسال کنین

بعد از بازگشت از درگاه ، این اطلاعات توسط درگاه برای شما ارسال میشه و میتونین بفهمین که کدوم order باید نهایی بشه


  • 1403/10/01
  • ساعت 16:16

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

api در گاه پرداخت:

https://aqayepardakht.ir/api/


  • 1403/10/01
  • ساعت 16:24

ببینین توی داکیومنت گفته شما میتونین مقدار invoice_id رو ارسال کنین

منظور از invoice_id همون شماره ی order یا order id هستش

اگر دقت کنین توی مرحله ی سوم گفته اگر شما invoice_id رو پر کرده باشین براتون مجدد ارسال میشه

فقط توجه داشته باشین که اطلاعات توی resquest.data یا request.post هستش و هر دو رو چک کنین


  • 1403/10/01
  • ساعت 16:47

استاد عزیز لاگین شدن و یوزر آی دی کاربر رو چیکارکنم؟


  • 1403/10/01
  • ساعت 16:56

  • 1403/10/01
  • ساعت 19:50

استاد مجبور شدم کد رو به اینصورت تغییر بدم.

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()

بجای    (ای دی) خرید    (ای دی ) کاربر    رو انتقال دادم و بعد از پرداخت مجدد اتومات لاگینش کردم


  • 1403/10/01
  • ساعت 19:51

بنظر شما روی امنیت و سرعت سایت ثاثیر داره؟


  • 1403/10/01
  • ساعت 22:12

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

عرض کردم که برای حل مشکل باید خود order id رو ارسال کنین

این مورد از نظر امنیت مشکل داره و با یک ابزار مثل http profiler میشه مشکلات زیادی توی پروژه ی شما ایجاد کرد

توی صفحه ای که کاربر از درگاه برمیگرده، نتیجه ی پرداخت رو نمایش بدین.

یک دکمه برای بازگشت به صفحه ی اصلی هم قرار بدین که وقتی کاربر روش کلیک کرد، وارد صفحه ی اصلی بشه

از اونجایی که روی مرورگر شما کوکی قبلا ایجاد شده، با ریدایرکت شدن ، کاربر مجددا توی سیستم شناسایی میشه


  • 1403/10/01
  • ساعت 22:13

از طرف دیگه شما دارین id کاربرتون رو که یکی از اجزای اصلی پروژه هستش به رفرنس خارجی ارجاع میدین


  • 1403/10/01
  • ساعت 22:23

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

اگر با پشتیبانی درگاه پرداخت مکاتبه کنم پشتیبانی فنی درگاه میتونه در متد پست خود از csrf_token استفاده کنه و مشکل من حل شه؟ یا اینکه یکسری اطلاعات رو بتونم به همراه callback  url  ارسال کنم مشکل برطرف شه؟

و آیا این مشکل از ضعف api  درگاه پرداخت هستش؟

فکر میکنم این مشکل در زرین پال نباشه. درسته استاد عزیز؟

 


  • 1403/10/01
  • ساعت 22:38

خواهش میکنم دوست من

انجام وظیفه میکنم

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

اطلاعات اضافه رو توی url میشه ارسال کرد اما پیشنهاد نمیکنم چون کاربری که مقداری برنامه نویسی بلد باشه با تغییر این مقادیر میتونه توی سایت شما مشکل ایجاد کنه

بهترین حالت استفاده از همون invoice_id هستش که خدمتتون عرض کردم

اگر api مورد نظر اطلاعات اضافی به جز invoice_id دریافت میکنه میتونین ازش استفاده کنین

در غیر اینصورت مورد اضافه ای نمیشه ارسال کرد

میتونین به جای order_id یک جدول دیگه داشته باشین که تمامی اطلاعات مورد نظرتون اونجا باشن و id مربوط به اون جدول رو ارسال کنین که بعد از بازگشت به همه این موارد دسترسی داشته باشین


  • 1403/10/03
  • ساعت 17:17

استاد عزیز ممنونم با راهنمایی های شما مشکل بنده حل شد.

از اینکه با صبوری و مهربانی سوالات بنده رو جواب دادید بسیار از شما سپاسگذارم (استاد خوش اخلاق)


  • 1403/10/03
  • ساعت 17:21

خواهش میکنم دوست من

خیلی خوشحالم تونستم کمکتون کنم

براتون آرزوی موفقیت و سلامتی میکنم :)


  • 1403/10/03
  • ساعت 17:23

فقط چند مورد اگه امکانش هست در آپدیت های بعدی قرار بدید.

1 - جستجو در سایت

2 - انبار داری بسیار کوچک (فقط جهت آشنایی)

3 - بعد از دولوپ کردن اپ اگه موردی رو در لوکال تغییر دادیم و بروز رسانی کردیم چطور بدون اینکه به دیتا های سایت آسیب برسه قالب رو بروزرسانی کنیم - واقعا شاید بارها و بارها نیاز به بروز رسانی و تغییر اپ شود. این مورد بسیار برام مهم هست.

 

سپاسگذارم از شما


  • 1403/10/03
  • ساعت 17:24

چشم دوست من

سعی میکنم این موارد رو در آپدیت های بعدی دوره پوشش بدم


  • 1403/10/03
  • ساعت 17:27

بی نهایت سپاسگذارم از شما.


  • 1403/10/03
  • ساعت 17:34

خواهش میکنم دوست من

موفق باشین :)


logo-enamadlogo-samandehi