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

خطای No invoice found with the token بعد از انتقال به هاست جدید #316

Closed javadmjt closed 2 years ago

javadmjt commented 2 years ago

سلام و احترام

بعد از انتقال به هاست جدید یک در میون با خطای No invoice found with the token مواجه میشم. در هاست قبلی هیچ خطایی نداشتم

تو یکی دو تا issue دیگه دیدم که توضیح دادین مربوط به کد نویسی برنامه هست. میخواستم ببینم احتمال داره بخاطر محدودیت خاصی روی هاست و سرور باشه که این خطا داده میشه؟ اگر بخاطر محدودیت هست چه محدودیتی میتونه باعث این خطا بشه؟

javadmjt commented 2 years ago

با تغییر تنظیم ConfigureStorage به UseDistributedCache درست شد.

.ConfigureStorage(builder => builder.UseMemoryCache());

قسمت بالا تبدیل قسمت پایین شود

.ConfigureStorage(builder => builder.UseDistributedCache());

Sina-Soltani commented 2 years ago

درود

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

موفق باشید.

mohsen-najafzadeh commented 1 year ago

سلام و ادب برای استفاده از UseDistributedCache در ASP.NET webfrom چطور باید IDistributedCache رو فراخوانی کنیم / نمونه کدی دارید؟

Sina-Soltani commented 1 year ago

درود

سلام و ادب برای استفاده از UseDistributedCache در ASP.NET webfrom چطور باید IDistributedCache رو فراخوانی کنیم / نمونه کدی دارید؟

متوجه منظور شما از فراخوانی نمیشم.

mohsen-najafzadeh commented 1 year ago

برای بکارگیری UseDistributedCache در ASP.NET webfrom (.NET 4.5) نمونه کدی دارید؟ (آیا ملاحظه خاصی داره) با این خطا مواجه می شم

Unable to resolve service for type 'Microsoft.Extensions.Caching.Distributed.IDistributedCache' while attempting to activate 'Parbad.Storage.Cache.DistributedCache.DistributedCacheStorage'.

Sina-Soltani commented 1 year ago

این مقاله انواع Distributed Cache رو برای شما توضیح داده که میتونید استفاده کنید https://learn.microsoft.com/en-us/aspnet/core/performance/caching/distributed?view=aspnetcore-7.0

mohsen-najafzadeh commented 1 year ago

ضمن تشکر در کانفیگ قطعه کد زیر رو اضافه کردم .ConfigureStorage(builder => builder.UseDistributedCache()) و در کلاس Startup تابع ConfigureServices قطعه کد زیر services.AddDistributedSqlServerCache(options => { options.ConnectionString = Config.ConnectionString; options.SchemaName = "dbo"; options.TableName = "CacheStore"; });

ولی همچنان خطای زیر رو دارم

Unable to resolve service for type 'Microsoft.Extensions.Caching.Distributed.IDistributedCache' while attempting to activate 'Parbad.Storage.Cache.DistributedCache.DistributedCacheStorage'.

Sina-Soltani commented 1 year ago

در صورت تمایل، کدهای کلاس Startup رو به طور کامل اینجا بزارید تا بررسی کنم

mohsen-najafzadeh commented 1 year ago

Startup:

[assembly: OwinStartup("Brand", typeof(WebApp.Startup))] namespace WebApp { public class Startup {

    public void ConfigureServices(IServiceCollection services)
    {
        var parbadBuilder = ParbadConfig.Configure();

        services.AddDistributedSqlServerCache(options =>
        {
            options.ConnectionString = Config.ConnectionString;
            options.SchemaName = "dbo";
            options.TableName = "CacheStore";
        });
    }

    public void Configuration(IAppBuilder app)
    {           
    }
}

}

ParbadConfig:

public static class ParbadConfig { public static ParbadData Configure() { var parbadData = new ParbadData() {
Saderat_TerminalId = General.GetTokenFromJson(json, "Accounts.Saderat_TerminalId").To(), };

        ParbadBuilder.CreateDefaultBuilder()
            .ConfigureGateways(gateways =>
            {
                 gateways
                         .AddSepehr()
                         .WithAccounts(accounts =>
                         {
                             accounts.AddInMemory(account =>
                             {
                                 account.TerminalId = parbadData.Saderat_TerminalId.To<long>();
                             });
                         });                       
            })

            .ConfigureHttpContext(builder => builder.UseOwinFromCurrentHttpContext())
            .ConfigureStorage(builder => builder.UseDistributedCache())
            .Build();

        return parbadData;
    }
}
Sina-Soltani commented 1 year ago

ظاهرا ServiceCollection که شما دارید استفاده می‌کنید رو به پَرباد معرفی نکردید و به همین خاطر پَرباد اطلاعی از سرویسی که درخواست میکنه نداره. متد ParbadBuilder.CreateDefaultBuilder یک ورودی از شما میگیره که میتونید سرویس ها رو بهش بدید. سرویس ها رو از داخل متد ConfigureServices پاس بدید به داخل کلاسی که پَرباد رو تنظیم کردید

mohsen-najafzadeh commented 1 year ago

ضمن تشکر از پاسخگویی / چون سایت چند مستاجره است هر زیردامنه دارای یک شماره حساب است / با این روال راهکاری هست تا فراخوانی CreateDefaultBuilder بعد از فراخوانی کلید هر دامنه انجام شود؟

Sina-Soltani commented 1 year ago

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

https://github.com/Sina-Soltani/Parbad/wiki/Configuration#adding-multiple-accounts-for-a-gateway

mohsen-najafzadeh commented 1 year ago

مشابه زيرساخت یک وبلاگ كه دارای چندين وبلاگ است، زيرساخت ما هم چندين دامنه (وبلاگ) داره كه ادمین هر دامنه شماره حساب اختصاصی خودش رو معرفي مي كنه

Sina-Soltani commented 1 year ago

شما در چه مرحله ای امکان تشخیص وبلاگ رو دارید؟

mohsen-najafzadeh commented 1 year ago

با روتينگ مشخص مي شود www.test.ir/blog1 www.test.ir/blog2

Sina-Soltani commented 1 year ago

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

https://github.com/Sina-Soltani/Parbad/wiki/Configuration#adding-the-accounts-dynamically-using-a-custom-source

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

mohsen-najafzadeh commented 1 year ago

ممنونم / الان دو سوال همچنان موجود هست

1- آیا در هر فراخوانی پرداخت، من می تونم تابع ParbadBuilder.CreateDefaultBuilder رو مجددا صدا بزنم؟ بجز مسئله performance آیا نکته دیگه ای داره؟ 2- در زمان استفاده از UseMemoryCache مشکلی نیست (بجز این مورد مهم که بعضی از پرداخت ها ناموفق اعلام می شود) اما زمانی که از UseDistributedCache استفاده می کنم در زمان پرداخت با خطای زیر مواجه می شم، راهکار چیست؟

Unable to resolve service for type 'Microsoft.Extensions.Caching.Distributed.IDistributedCache' while attempting to activate 'Parbad.Storage.Cache.DistributedCache.DistributedCacheStorage'.

Sina-Soltani commented 1 year ago

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