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
364 stars 81 forks source link

عدم وریفای پرداخت #334

Closed idotnetdev closed 1 year ago

idotnetdev commented 1 year ago

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

var token = await httpRequest.TryGetParamAsync("Token", cancellationToken).ConfigureAwaitFalse();

وارد متد TryGetParamAsync هم که میشم توی این خط گیر داره

var form = await httpRequest.ReadFormAsync(cancellationToken).ConfigureAwaitFalse();

اینم عرض کنم که پروژه من ASP.NET MVC با دات نت فریمورک 4.7.2 استفاده میکنم.

یه نکته ای رو هم بگم خودم، اینکه توی asp.net mvc کلاس HttpContextAccessor وجود نداره و توی دات نت استاندارد و dot net core وجود دارن. وقتی چک میکردم از بانک که برمیگرده تو خود HttpContext.Current.Request.Form اطلاعاتی که بانک ارسال میکنه توش وجود داره. راهی رو هم نتونستم پیدا کنم که بتونم به جای HttpContextAccessor از خود HttpContext.Current استفاده کنم.

Sina-Soltani commented 1 year ago

درود تنظیمات پَرباد رو اینجا قرار بدید تا بررسی کنیم.

idotnetdev commented 1 year ago

ممنون

` public class ParbadConfiguration { public static IParbadBuilder Configure() { return ParbadBuilder.CreateDefaultBuilder() .ConfigureGateways(gateways => { gateways.AddMellat() .WithAccounts(accounts => { accounts.Add(ServiceLifetime.Transient); });

                gateways.AddIranKish()
                    .WithAccounts(accounts =>
                    {
                        accounts.Add<IranKishAccountSource>(ServiceLifetime.Transient);
                    });
                gateways.AddAsanPardakht()
                    .WithAccounts(accounts =>
                    {
                        accounts.Add<AsanPardakhtAccount>(ServiceLifetime.Transient);
                    });
            })
            .ConfigureHttpContext(builder => builder.UseOwinFromCurrentHttpContext())
            .ConfigureStorage(builder => builder.UseMemoryCache());
    }
}`

image

این هم کانفیگ درگاه ایران کیش

public class IranKishAccountSource : IGatewayAccountSource<IranKishGatewayAccount> { public async Task AddAccountsAsync(IGatewayAccountCollection<IranKishGatewayAccount> accounts) { var gateway = EngineContext.Current.Resolve<IGatewaysService>(); var account = gateway.GetGateway(HighStore.Core.Domain.Payments.Gateway.IranKish); if (account != null) { accounts.Add(new IranKishGatewayAccount() { Name = "IranKish", AcceptorId = account.Username, PassPhrase = account.Password, TerminalId = account.Terminal, PublicKey = account.MerchenatCode }); } } }

image

واسه اینکه کدها رو به هم ریخته نشون میداد تصویرشون رو هم آپلود کردم چیز دیگه ای مورد نیاز هست؟

Sina-Soltani commented 1 year ago

تنظیمات ظاهرا درست هست. تنها مشکلی که میتونم در پروژه شما تصور کنم اینه که Owin در پروژه شما به درستی کار نمیکنه یا تنظیم نشده.

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

idotnetdev commented 1 year ago

آخه سایت های ما هم دارن از زرین پال و ملت هم استفاده میکنن ولی مشکلی ندارن. نمیدونم چرا توی ایران کیش و آسان پرداخت مشکل داره. راستی ورژن پکیج های Owin استفاده شده در پرباد 4.0.1 هست ولی ورژنی که من توی پروژه م استفاده کردم 4.2.0 هست. به نظرتون ممکن هست از این باشه؟ نمیشه هم بیارم ورژنش رو پایین چون ورژن 4.0.1 دو تا مورد امنیتی با ریسک بالا داره

idotnetdev commented 1 year ago

متوجه مشکل شدم!

من از متد _onlinePayment.Fetch() استفاده کرده بودم. این یه Extension Method هست که داره در نهایت این کد زیر رو اجرا میکنه

onlinePayment.FetchAsync().GetAwaiter().GetResult()

به این شکل استفاده کردن از GetAwaiter().GetResult() تقریبا در تمام موارد باعث به وجود اومدن Dead Lock میشه که اصلا توصیه نمیشه از این روش استفاده بشه. در نهایت با تغییرش به متد FetchAsync مشکلم رو پیدا کردم و حل شد.

ممنون

mahdisky commented 1 year ago

سلام من هم دقیقا همین مشکل رو دارم از وقتی که از پرباد استفاده کردم توی پروژه ، همیش موقع برگشت از بانک گیر میکنه و میمونه، من اتفاقا برای درگاه زرین پال این مشکل رو دارم . هم اینکه از await _onlinePayment.FetchAsync(); استفاده کردم. مشکل کجاست؟ چکار باید کرد؟ اینجوری مشجبور میشم پرباد رو حذف کنم ، قبلش این مشکل رو نداشتم

idotnetdev commented 1 year ago

سلام سعی کنید پکیج های Owin پروژه تون با پکیج های پرباد یکی باشه و اینکه Example ها رو اجرا کنید ببینید که اونجا هم مشکل دارید یا نه؟ و اینکه پروژه شما asp.net mvc هست یا asp.net core؟

mahdisky commented 1 year ago

من asp.net core هست

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

mahdisky commented 1 year ago

و اینکه بعضی مواقع این مشکل پیش میاد ولی کم نیست پکیج Owin ندارم توی پروژم

Sina-Soltani commented 1 year ago

و اینکه بعضی مواقع این مشکل پیش میاد ولی کم نیست پکیج Owin ندارم توی پروژم

درود نمونه پروژه asp.net core رو دانلود و اجرا کنید. یک درخواست پرداخت برای درگاه مجازی ایجاد کنید. اگر همه چیز کار میکنه،‌ بنابراین مشکل از تنظیمات پروژه شماست. اینکه این مشکل کجا میتونه باشه، نمیشه به همین راحتی گفت، چون پروژه توسط من قابل تست نیست.

mahdisky commented 1 year ago

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

Sina-Soltani commented 1 year ago

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

کدهای تنظیمات رو اینجا قرار بدید برای اطمینان تا بررسی کنم.

mahdisky commented 1 year ago

مشکل برطرف شد از کد خودم بود ممنون