Webhook 中的会话已更改

Session Changed In Webhook

我正在使用 Stripe 和 .Net 构建一个网上商店,我遇到了一些问题,会话没有持久存在我的 webhook 中,因此 webhook 无法获取购物车或客户信息。

我添加到购物车的方法如下所示:

            var cartList = new List<CartProduct>();

            var stringObj = _session.GetString("cart");

            /* Logic for deserializing stringObj into List<CartProduct> */

            stringObj = JsonConvert.SerializeObject(cartList);

            _session.SetString("cart", stringObj);

如果我查看 _session,我可以看到它有一个 ID。但是,当我尝试从我的 webhook 获取购物车时,会话 ID 已更改,因此购物车为空。

我的 get cart 方法在 charge.succeeded 使用 webhook 触发并开始如下:

            var cart = _session.GetString("cart"); // Returns null because session has changed

            var cartList = JsonConvert.DeserializeObject<List<CartProduct>>(cart); // Exception thrown due to cart being null

我试过使 cookie 必不可少,并将 CheckConsentNeeded 设置为 false。这是 startup.cs 文件的 ConfigureServices 方法:

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddRazorPages();
            services.AddMvc(option => option.EnableEndpointRouting = false);
            services.AddSession(options => { 
                options.Cookie.Name = "cart";
                options.Cookie.MaxAge = TimeSpan.FromDays(365);
                options.Cookie.IsEssential = true; // make the session cookie Essential
            });
            services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(Configuration["DefaultConnection"], b => b.MigrationsAssembly("ShopTutorial.Database")));

            services.Configure<CookiePolicyOptions>(options =>
            {
                // This lambda determines whether user consent for non-essential cookies is needed for a given request.
                options.CheckConsentNeeded = context => false;
                options.MinimumSameSitePolicy = SameSiteMode.None;
            });
        }

app.UseSession();已添加到同class.

的Configure方法

我通过将购物车信息添加到持续 60 秒的 MemoryCache 来解决它 以 Stripe 支付意向描述(一个新的 GUID)作为键:

        var intent = new CreatePaymentIntent();

        ObjectCache cache = MemoryCache.Default;

        cache.AddOrGetExisting(intent.Description, Cart, new CacheItemPolicy {
            AbsoluteExpiration =
                DateTimeOffset.Now.AddSeconds(60.0)
        });

然后,在 webhook 中,我使用存储在从 Stripe 发回的意图对象描述中的特定键调用相同的缓存:

        var charge = stripeEvent.Data.Object as Stripe.Charge;

        ObjectCache cache = MemoryCache.Default;

        var cart = (Cart)cache.Get(charge.Description);

我正试图在 PHP 中解决这个问题,到目前为止我发现,您必须将 cart/order/customer 保存到数据库并将相关 ID 作为元数据放入支付意图.以便稍后在 webhook 中,可以从付款意图中提取它。

在 .NET 中是这样的:

var options = new PaymentIntentCreateOptions
{
    Amount = 1099,
    Currency = "cad",
    // Verify your integration in this guide by including this parameter
    Metadata = new Dictionary<string, string>
    {
      { "integration_check", "accept_a_payment" },
      { "cart_id", 10022 },
    },
};