【发布时间】:2020-07-19 16:23:04
【问题描述】:
我正在使用 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();已添加到同一个类的 Configure 方法中。
【问题讨论】:
-
要记住的一点是,Stripe Checkout 是重定向到 Stripe 的网站,然后再重定向回您的网站。这些搜索结果中列出的一些答案可能对如何在重定向后重新建立会话有所帮助:stackoverflow.com/search?q=.net+session+after+redirect
-
/你是怎么运行这个的?在 Visual Studio 中,或者您是否托管在某个地方
-
谢谢!是的,我为此使用 VS 2019。从我收集的内容来看,分布式缓存可能可用于将会话存储在数据库中。然后可以将分布式缓存注入 webhook 并从数据库中提取会话。这可能是一个可行的选择吗?
标签: c# asp.net-core stripe-payments webhooks