Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix unwanted UUID change #238

Open
wants to merge 2 commits into
base: master
Choose a base branch
from

Conversation

m-ostadi
Copy link

این مرج برای حل مشکلاتی هست که توی #124 توضیح داده شده. بعضی مواقع orderId ای که تو برخی درگاه ها نیاز هست ارسال بشه با استفاده از تابع crc32 تبدیل به یک هش عددی شده.
مشکلاتی که وجود داشت این بود که :
۱. وقتی یک دولوپر خودش مقدار uuid رو ست میکنه انتظار داره که اون مقدار رو از درگاه تحویل بگیره تا باهاش صحت اطلاعات پرداخت رو چک کنه، ولی با استفاده از crc32 اون مقدار یونیکی که ست کرده بود عوض شده و یک مقدار دیگه ای که احتمال تکرار هم داره بجاش ست میشه که نه امنه نه اصولی.
۲. توی بعضی جاها این مقدار با استفاده از crc32 و یا افزودن یه رقم رندوم مثل time() تغییر پیدا کرده و این تغییر هم داخل uuid ذخیره نشده که بشه خوند و تو دیتابیس ذخیرش کرد.

توی این مرج امکان تغییر مقدار uuid در حالاتی که یوزر خودش اون رو ست کرده باشه گرفته شده.
توی حالت هایی هم که یوزر ست نکرده و مقدارش تغییر پیدا کرده اون تغییر توی uuid آپدیت شده تا بشه توی دیتابیس ذخیرش کرد.

برای اینکه تابع جدیدی برای تغییر مقدار uuid اضافه نشه، ست کردن مقدار رندوم اولیه توی متود uuid() به متود getUuid منتقل شده.

@m-ostadi
Copy link
Author

m-ostadi commented Jun 3, 2024

@khanzadimahdi سلام وقت بخیر. این مرج رکويست رو بررسی میکنین لطفا.

@khanzadimahdi
Copy link
Member

@khanzadimahdi سلام وقت بخیر. این مرج رکويست رو بررسی میکنین لطفا.

سلام. مرسی که PR رو گذاشتین و کانفلیکت ها رو رفع کردین.
از اونجایی که توی invoice یکسری متد پابلیک جدید ایجاد شده یه مقدار بحث بر انگیز هست. این متدها بیشتر کاربرد خارجی دارن و با این متدها ما پیاده سازی بیزینس لاجیکمون رو داریم با API بانک کاپل میکنیم. لطفا کمی بیشتر فرصت بدید تا بیشتر فکر کنیم. در نهایت اگه راهکار بهتری پیدا نشد این تغییرات رو مرج میکنیم. ممنونم.

@m-ostadi
Copy link
Author

سلام وقت بخیر. با این مرج به راهکاری رسیدین؟
@khanzadimahdi

@khanzadimahdi
Copy link
Member

khanzadimahdi commented Aug 22, 2024

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

/invoice/1233/verify

مثلا اگه ادرس بالا رو برای callback در نظر بگیریم میتونیم از id مربوط به invoice اطلاعاتشو از دیتابیس بکشیم بیرون.
قبول دارم پکیج باید یه مقدار تغییر کنه تا جلوی این مشکلی که شما بهش اشاره کردین رو بگیره! نباید از invoice uuid برای وریفای کردن پرداخت بانکی استفاده کرد.
میتونیم اون invoice uuid رو کلا حذف کنیم و پکیج رو به صورت major اپدیت کنیم! خودمم دلیلی برای وجود invoice uuid نمیبینم! برای هرکدوم از درگاه هایی که به این مقدار نیاز دارن میتونیم توی کانفیگ یا توی پکیج یه تابع hook اضافه کنیم که بشه یه تابع رو بهش register کرد و چیزی که برمیگردونه رو به درگاه بفرسته.
این تابع رو میتونیم توی config.php خودمون هم بزاریم که یه پیاده سازی پیش فرض داشته باشه.

class Pasargad {
      private static $generatePaymentUuid

     public static function RegisterPaymentUuidGenerator(callable $func) {
          self::$generatePaymentUuid = $func
     }
}

حالا کاربر میتونه نحوه تولید شدن اون کدی که به درگاه میدیم رو کنترل کنه و ما هم از invoice میایم uuid رو حذف میکنیم تا جلوی این روش اشتباه پیاده سازی رو بگیره

نظرتون چیه؟

@m-ostadi
Copy link
Author

m-ostadi commented Aug 22, 2024

من قبلا این راه حل رو که توی callbackurl یه متغیر داینامیک یونیک ست کنم رو رفته بودم ولی تو بعضی درگاها بازم به تجربه دیدم که این کافی نیس و میان با مقدار متغیرای بازگشتی بازی میکنن و پرداخت دیگه ای رو بجای پرداخت اصلی وریفای میکنن که تو اون موارد با چک کردن مقدار این uuid (یا مبلغ پرداخت اگر برگردونده شه ) میشه جلوشونو گرفت به راحتی.
یه سری درگاها هم هستن که callbackurl داینامیک قبول نمیکنن کلا.

@m-ostadi
Copy link
Author

اگه میخوایم breaking change بدیم و تو درگاهایی که نیازش دارن مسولیت پر کردن مقدارشو به عهده کاربر بزاریم، میتونیم ساده تر جلوبریم و صرفا مقدارشو ازشون بگیریم و ولیدیشنش رو تو درایور انجام بدیم و اگه درست نبود یا خالی بود اکسپشن بدیم.
در مورد کانفیگ هم تا جایی که میدونم اگه فانکشن توش پاس بدن به ارور سریالایز میخورن توی کش کانفیگا.
@khanzadimahdi

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants