You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

升级Authorize.NET至Accept Hosted:Webhook响应后保留ASP.NET会话数据

解决Accept Hosted重定向后ASP.NET会话数据丢失的问题

这个问题我之前帮不少开发者处理过,核心原因在于Accept Hosted是Authorize.NET托管的第三方页面,和你的ASP.NET应用属于不同域,浏览器的同源策略会阻止会话Cookie跨域传递,导致重定向回你的应用时无法读取原会话中的支付详情。下面是几个针对性的解决方案:

方案1:用临时存储替代会话(最可靠)

既然会话跨域无法保留,不如把应用专属的支付详情存到数据库/分布式缓存(比如Redis、SQL Server),生成一个唯一的标识符(如GUID),把这个ID作为参数附加到Return URL中。重定向回来后,通过这个ID从存储中取出数据,用完再删除避免冗余。

示例代码(ASP.NET Core):

// 生成唯一ID并存储支付详情
var tempId = Guid.NewGuid().ToString();
var paymentDetails = GetYourAppPaymentDetails(); // 你的应用专属数据
await _cache.SetStringAsync(tempId, JsonSerializer.Serialize(paymentDetails), 
    new DistributedCacheEntryOptions { AbsoluteExpirationRelativeToNow = TimeSpan.FromHours(1) });

// 构造带tempId的Return URL
var returnUrl = $"{Request.Scheme}://{Request.Host}/Payment/Success?tempId={tempId}";

// 把returnUrl传给Accept Hosted的配置

重定向回来后读取数据:

public async Task<IActionResult> Success(string tempId)
{
    var cachedData = await _cache.GetStringAsync(tempId);
    if (!string.IsNullOrEmpty(cachedData))
    {
        var paymentDetails = JsonSerializer.Deserialize<YourPaymentDetailsModel>(cachedData);
        // 使用数据处理业务逻辑
        await _cache.RemoveAsync(tempId); // 用完删除
    }
    return RedirectToAction("Index", "Home");
}

方案2:配置会话Cookie的SameSite属性

如果坚持要用会话,需要调整ASP.NET会话Cookie的SameSite设置,允许跨域传递。注意这个方案要求你的应用必须使用HTTPS(因为SameSite=None仅支持HTTPS)。

ASP.NET Core配置示例(Program.cs):

builder.Services.Configure<CookiePolicyOptions>(options =>
{
    options.MinimumSameSitePolicy = SameSiteMode.None;
    options.Secure = CookieSecurePolicy.Always; // 强制HTTPS
});

builder.Services.AddSession(options =>
{
    options.Cookie.SameSite = SameSiteMode.None;
    options.Cookie.SecurePolicy = CookieSecurePolicy.Always;
    options.Cookie.IsEssential = true;
});

方案3:切换会话状态模式

如果你的应用用的是默认的InProc会话模式,服务器重启、应用池回收都会导致会话丢失。建议切换到StateServer或SQLServer模式,或者用分布式缓存来存储会话数据,确保会话不依赖单个服务器进程。

额外注意事项

  • 不要把敏感数据放在URL参数里,临时存储的方式更安全;
  • Return URL和Webhook URL要各司其职:Webhook用来接收Authorize.NET的支付结果(transID等),Return URL用来恢复用户的应用会话数据;
  • 临时存储的数据一定要设置合理的过期时间,避免占用过多存储资源。

内容的提问来源于stack exchange,提问作者software_writer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:02:44