Sina-Soltani / Parbad

A free, open-source, integrated and extensible library which connects your web applications to online payment gateways. Gateways can be added or developed by you.
GNU Lesser General Public License v3.0
366 stars 81 forks source link

Invalid data is received from the gateway #124

Closed mohammadhosseinzavvar closed 3 years ago

mohammadhosseinzavvar commented 3 years ago

Bug description (wIthout specifiing the sensitive data) توضیح خطا (بدون ذکر کردن اطلاعات خصوصی درگاه بانکی) با سلام من از این کتابخانه جهت اتصال به درگاه پرداخت ایران کیش استفاده میکنم، و مراحل و مطابق مستندات انجام دادم بعد از اتصال به درگاه و ورود اطلاعات کارت بانکی در خود سامانه پیام پرداخت با موفق انجام شد نمایش داده میشه ولی بعد از بازگشت به سایت من جهت نمایش خروجی به کاربر، خطای زیر و میده Invalid data is received from the gateway البته در سمت سامانه رصد تراکنش های بانک، این تراکنش موفق و تایید شده بوده

Package name and version نام و نسخه پکیج

Web application type: نوع برنامه وب

Sina-Soltani commented 3 years ago

درود

برای پیدا کردن مشکل ابتدا باید دید در کدوم مرحله بانکی این خطا داده شده آیا سمت سامانه بانک، به جز تراکنش موفق، تایید تراکنش از سمت شما رو هم ثبت کرده؟ یا فقط تایید پرداخت کاربر رو ثبت کرده؟

mohammadhosseinzavvar commented 3 years ago

تایید تراکنش هم ثبت شده در سامانه ای که بانک برای گزارشگیری در اختیار ما قرار داده نوشته نتیجه تراکنش موفق تراکنش در سمت بانک موفق انجام میشه و مبلغ از حساب کسر و به حساب مقصد واریز میشه، احتمال زیاد در دیتای برگشتی از سمت بانک و کانورت به مدل شما تناقض وجود دارد

Sina-Soltani commented 3 years ago

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

mohammadhosseinzavvar commented 3 years ago

https://mms.kiccc.com/Public/Media/Files/Other/IPG/IPG_940721_Token.pdf https://mms.kiccc.com/Public/Media/Files/Other/IPG/DotnetSample.rar https://mms.kiccc.com/Public/Media/Files/Other/IPG/KicccDefineMerchant_V1_940518.pdf

mohammadhosseinzavvar commented 3 years ago

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

mohammadhosseinzavvar commented 3 years ago

کد هدایت به سمت درگاه پرداخت var result = await _OnlinePayment.RequestAsync(invoice => { var VerifyUrl = Url.Action("Verify", "Default", null, Request.Scheme); invoice .SetAmount(Course.Fee - Course.Discount) .SetCallbackUrl(VerifyUrl) .SetGateway("IranKish");

                invoice.UseAutoRandomTrackingNumber();
            });

            var TrackingNumber = result.TrackingNumber;
            var Payment = await _ApplicationDbContext.TblPayment
                                                   .Where(P => P.Tracking_Number == TrackingNumber)
                                                   .FirstOrDefaultAsync();
            if (Payment != null)
            {
                Payment.UserCourseID = UserInCourse.UserCourseID;
                _ApplicationDbContext.TblPayment.Update(Payment);
                await _ApplicationDbContext.SaveChangesAsync();
            }

            if (result.IsSucceed)
            {
                // کاربر را به درگاه بانکی هدایت می‌کند
                return result.GatewayTransporter.TransportToGateway();
            }
            else
            {
                Alert(Message: "اتصال به درگاه بانک انجام نشد!", NotificationType: EnumNotificationType.error);
                return RedirectToAction(nameof(CourseDetails));
            } 
mohammadhosseinzavvar commented 3 years ago

کد اکشن بازگشت از درگاه پرداخت var invoice = await _OnlinePayment.FetchAsync(); // Check if the invoice is new or it's already processed before. if (invoice.Status == PaymentFetchResultStatus.AlreadyProcessed) { Alert(Message: "تراکنش قبلا پردازش شده است", NotificationType: EnumNotificationType.error); return View(); }

        var verifyResult = await _OnlinePayment.VerifyAsync(invoice);
        if (verifyResult.IsSucceed)
        {
            Alert(Message: $"پرداخت با موفقیت انجام شد شماره تراکنش {verifyResult.TransactionCode}", NotificationType: EnumNotificationType.success);
        }
        else
        {
            Alert(Message: verifyResult.Message, NotificationType: EnumNotificationType.error);
        }
        return View();
Sina-Soltani commented 3 years ago

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

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

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

mohammadhosseinzavvar commented 3 years ago

تنظیمات فایل Startup.cs services.AddParbad() .ConfigureGateways(gateways => { gateways .AddIranKish() .WithAccounts(accounts => { accounts.AddInMemory(account => { account.Name = "***"; account.MerchantId = "***"; }); }); gateways .AddParbadVirtual() .WithOptions(options => options.GatewayPath = "/MyVirtualGateway"); }) .ConfigureHttpContext(builder => builder.UseDefaultAspNetCore()) .ConfigureStorage(builder => { builder.UseEfCore(options => { // Using SQL Server var assemblyName = typeof(Startup).Assembly.GetName().Name; options.ConfigureDbContext = db => db.UseSqlServer(Configuration.GetConnectionString("ConnServer"), sql => sql.MigrationsAssembly(assemblyName)); options.PaymentTableOptions.Name = "TblPayment"; options.DefaultSchema = "dbo"; options.TransactionTableOptions.Name = "TblTransaction"; options.TransactionTableOptions.Schema = "dbo"; }); });

Sina-Soltani commented 3 years ago

این احتمال هست که شاید در چک کردن یک پارامتر در هنگام تایید تراکنش، مشکلی وجود داشته باشه متاسفانه بدون انجام تست واقعی و به صورت حدس و گمان، نمیشه از عملکرد یک سرویس اطمینان حاصل کرد.

هر چند که میدونم امکان پذیر نیست که با آی پی دیگری درخواست ارسال بشه، اما امتحانش ضرری نداره در صورت تمایل، لطف کنید اطلاعات درگاه رو به آدرس زیر ارسال کنید تا ببینیم میشه تست کرد یا خیر. parbad@outlook.com

Sina-Soltani commented 3 years ago

فکر کنم فراموش کردید اطلاعات رو کامل ارسال کنید MerchantId ارسال نشده

Sina-Soltani commented 3 years ago

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

کد پذیرنده؟ شماره پذیرنده؟ کد پایانه؟

Sina-Soltani commented 3 years ago

خوشبختانه میشه درخواست ارسال کرد، بر خلاف سایر درگاه‌ها که فقط با آی پی مشخصی کار میکنن فقط مساله اینجاست که پرداخت باید به یک طریقی انجام بشه تا بشه تست کرد با مثال تستی خودشون امتحان کردم به من خطای زیر رو میده:

"مشتری گرامی دسترسی شما به این صفحه غیر مجاز می باشد"

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

mohammadhosseinzavvar commented 3 years ago

سلام بله آی پی مشکل نداره میشه تست کرد اکانت تست ندادن، فردا پیگیر میشم ببینم امکان دریافت اکانت تست هست

On Tue, 20 Oct 2020, 21:27 Sina Soltani, notifications@github.com wrote:

خوشبختانه میشه درخواست ارسال کرد، بر خلاف سایر درگاه‌ها که فقط با آی پی مشخصی کار میکنن فقط مساله اینجاست که پرداخت باید به یک طریقی انجام بشه تا بشه تست کرد آیا کارت عابر بانکه تست یا اکانت تست به شما دادن؟

— You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub https://github.com/Sina-Soltani/Parbad/issues/124#issuecomment-713036829, or unsubscribe https://github.com/notifications/unsubscribe-auth/AMFWYCUPHV52DKGXVB2GF6DSLXFSLANCNFSM4SXXV5TQ .

Sina-Soltani commented 3 years ago

لطفا نسخه جدید رو نصب و امتحان کنید ببینید کار میکنه یا خیر Install-Package Parbad -Version 3.5.3-beta1

همچنین در تنظیمات این درگاه، پراپرتی Sha1Key رو با توجه به کلیدی که بانک بهتون داده مقدار دهی کنید

mohammadhosseinzavvar commented 3 years ago

نسخه جدید و نصب کردم و کلید امنیتی هم تنظیم کردم ولی بازم بعد از پرداخت همین خطا و میده

mohammadhosseinzavvar commented 3 years ago

در جدول تراکنش ها که توسط پرباد در دیتابیس خودم ایجاد شده برای پرداخت من 2 رکورد تراکنش ثبت شده اولی با فیلد Is_Success = true AND Type = 0 رکورد دومی Is_Success = false AND Type = 1

Sina-Soltani commented 3 years ago

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

Install-Package Parbad -Version 3.5.3-beta2

mohammadhosseinzavvar commented 3 years ago

نسخه جدید و نصب کردم در دیتابیس جدول تراکنش این خطا ثبت میشه Invalid data is received from the gateway Result: در سمت بانک تراکنش تایید شده

mohammadhosseinzavvar commented 3 years ago

public async Task Verify() { var invoice = await _OnlinePayment.FetchAsync(); // بررسی اینکه تراکنش قبلا پردازش شده است یا خیر if (invoice.Status == PaymentFetchResultStatus.AlreadyProcessed) { Alert(Message: "تراکنش قبلا پردازش شده است", NotificationType: EnumNotificationType.error); return View(); }

        var verifyResult = await _OnlinePayment.VerifyAsync(invoice);
        if (verifyResult.IsSucceed)
        {
            Alert(Message: $"پرداخت با موفقیت انجام شد شماره تراکنش {verifyResult.TransactionCode}", NotificationType: EnumNotificationType.success);
        }
        else
        {
            Alert(Message: verifyResult.Message, NotificationType: EnumNotificationType.error);
        }
        return View();
    }

}

Sina-Soltani commented 3 years ago

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

Sina-Soltani commented 3 years ago

لطفا نسخه آخر رو تست کنید خطا باید رفع شده باشه Install-Package Parbad -Version 3.5.3-beta3

mohammadhosseinzavvar commented 3 years ago

بعد از پرداخت و انجام تراکنش این پیغام و میده در متد Verify No invoice found with the token 251374e5bfdb49679de288cd35af668d در سمت بانک تراکنش موفق ثبت شده ولی در دیتابیس من هیچ رکوردی ثبت نشده احتمالا نتونسته فاکتور و پیدا کنه

Sina-Soltani commented 3 years ago

این کاملا یک چیزه دیگه ای هست که فقط هم موقع استفاده از متد Fetch میتونه اتفاق بیوفته که معنیش همونطور که گفتین یعنی با چنین توکنی، هیچ رکورد پرداختی پیدا نکرده در داخل دیتابیس شما پیشنهاد میکنم یا یکباره دیگه یک سفارش جدید رو انجام بدید یا اینکه ببینید مشکل پایگاه داده چیه برای مثال زمانیکه به درگاه بانک هدایت شدید، قبل از پرداخت کردن، برید دیتابیس رو چک کنید آیا رکورد جدیدی ثبت شد یا نه و اگه ثبت شده چه توکنی داره

mohammadhosseinzavvar commented 3 years ago

الان یک درخواست انجام دادم و درست شده در جدول payment فیلد Is_Paid اگر true باشه یعنی کاربر این فاکتور و پرداخت موفق داشته ؟

mohammadhosseinzavvar commented 3 years ago

این پرداخت من موفق بوده جدول payment هم تراکنش و موفق زده ولی در جدول تراکنش ها فیلد پیام اینه داخلش An unknown error is happened. ولی داخل خود آپ پیغام پرداخت موفق داد خطایی پیش نیومد

Sina-Soltani commented 3 years ago

الان یک درخواست انجام دادم و درست شده در جدول payment فیلد Is_Paid اگر true باشه یعنی کاربر این فاکتور و پرداخت موفق داشته ؟

بله یعنی همه چیز با موفقیت انجام شده.

Sina-Soltani commented 3 years ago

این پرداخت من موفق بوده جدول payment هم تراکنش و موفق زده ولی در جدول تراکنش ها فیلد پیام اینه داخلش An unknown error is happened. ولی داخل خود آپ پیغام پرداخت موفق داد خطایی پیش نیومد

جدول تراکنش ها و رکورد مربوط به این پرداخت رو کنید ببینید چک کنید ببینید آیا فیلد IsSucceed صحیح هست یا غلط. این احتمال وجود داره که شاید عملیات کاملا با موفقیت انجام گرفته اما فقط متن پیامی که نوشته شده صحیح نیست. در این صورت این مشکل احتمالا بر میگرده به ترجمه کد بانک به متن خوانا که خب میشه رفعش کرد راحت لطفا تست کنید اطلاع بدید.

mohammadhosseinzavvar commented 3 years ago

در سمت بانک تراکنش موفق بوده در هر دو جدول پایمنت و تراکنش هم فیلد Is_Success = true هست چیزی که مشخصه ک عملیات با موفقیت بوده ولی فقط متن پیغام ذخیره میشه و تراکنش به هیچ وجه Faild نشده چه در سمت بانک چه در سمت آپ من

mohammadhosseinzavvar commented 3 years ago

این خطا فکر میکنم در دستور Switch شما برای چک کردن خطای بانک در قسمت دیفالت گذاشتین

Sina-Soltani commented 3 years ago

در سمت بانک تراکنش موفق بوده در هر دو جدول پایمنت و تراکنش هم فیلد Is_Success = true هست چیزی که مشخصه ک عملیات با موفقیت بوده ولی فقط متن پیغام ذخیره میشه و تراکنش به هیچ وجه Faild نشده چه در سمت بانک چه در سمت آپ من

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

mohammadhosseinzavvar commented 3 years ago

سپاس بابت همراهی و همکاری مشکل الحمدالله حل شد.