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 },
},
};
我正在使用 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 },
},
};