-
Notifications
You must be signed in to change notification settings - Fork 128
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
base: master
Are you sure you want to change the base?
Conversation
…itialized by user.
a61c56d
to
ace9874
Compare
@khanzadimahdi سلام وقت بخیر. این مرج رکويست رو بررسی میکنین لطفا. |
سلام. مرسی که PR رو گذاشتین و کانفلیکت ها رو رفع کردین. |
سلام وقت بخیر. با این مرج به راهکاری رسیدین؟ |
سلام وقت بخیر. من راجبش فکر کردم. اینکه با یه flag بیایم باگ رو حل کنیم کار درستی نیست!
مثلا اگه ادرس بالا رو برای callback در نظر بگیریم میتونیم از id مربوط به invoice اطلاعاتشو از دیتابیس بکشیم بیرون. class Pasargad {
private static $generatePaymentUuid
public static function RegisterPaymentUuidGenerator(callable $func) {
self::$generatePaymentUuid = $func
}
} حالا کاربر میتونه نحوه تولید شدن اون کدی که به درگاه میدیم رو کنترل کنه و ما هم از invoice میایم uuid رو حذف میکنیم تا جلوی این روش اشتباه پیاده سازی رو بگیره نظرتون چیه؟ |
من قبلا این راه حل رو که توی callbackurl یه متغیر داینامیک یونیک ست کنم رو رفته بودم ولی تو بعضی درگاها بازم به تجربه دیدم که این کافی نیس و میان با مقدار متغیرای بازگشتی بازی میکنن و پرداخت دیگه ای رو بجای پرداخت اصلی وریفای میکنن که تو اون موارد با چک کردن مقدار این uuid (یا مبلغ پرداخت اگر برگردونده شه ) میشه جلوشونو گرفت به راحتی. |
اگه میخوایم breaking change بدیم و تو درگاهایی که نیازش دارن مسولیت پر کردن مقدارشو به عهده کاربر بزاریم، میتونیم ساده تر جلوبریم و صرفا مقدارشو ازشون بگیریم و ولیدیشنش رو تو درایور انجام بدیم و اگه درست نبود یا خالی بود اکسپشن بدیم. |
این مرج برای حل مشکلاتی هست که توی #124 توضیح داده شده. بعضی مواقع orderId ای که تو برخی درگاه ها نیاز هست ارسال بشه با استفاده از تابع crc32 تبدیل به یک هش عددی شده.
مشکلاتی که وجود داشت این بود که :
۱. وقتی یک دولوپر خودش مقدار uuid رو ست میکنه انتظار داره که اون مقدار رو از درگاه تحویل بگیره تا باهاش صحت اطلاعات پرداخت رو چک کنه، ولی با استفاده از crc32 اون مقدار یونیکی که ست کرده بود عوض شده و یک مقدار دیگه ای که احتمال تکرار هم داره بجاش ست میشه که نه امنه نه اصولی.
۲. توی بعضی جاها این مقدار با استفاده از crc32 و یا افزودن یه رقم رندوم مثل time() تغییر پیدا کرده و این تغییر هم داخل uuid ذخیره نشده که بشه خوند و تو دیتابیس ذخیرش کرد.
توی این مرج امکان تغییر مقدار uuid در حالاتی که یوزر خودش اون رو ست کرده باشه گرفته شده.
توی حالت هایی هم که یوزر ست نکرده و مقدارش تغییر پیدا کرده اون تغییر توی uuid آپدیت شده تا بشه توی دیتابیس ذخیرش کرد.
برای اینکه تابع جدیدی برای تغییر مقدار uuid اضافه نشه، ست کردن مقدار رندوم اولیه توی متود uuid() به متود getUuid منتقل شده.