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

C#同会话下商品加购后结算失败问题求助

问题分析与解决方案

嘿,这个问题我之前也踩过坑!核心原因是你现在的两个HttpWebRequest属于完全独立的会话——网站是通过Cookie来识别用户、关联购物车的,你加购商品时服务器返回的会话Cookie,没有带到后续的结算请求里,所以服务器会把你当成新用户,自然购物车是空的,直接返回首页了。

要解决这个问题,你需要用CookieContainer在两个请求之间共享会话Cookie,具体调整如下:

  • 先创建一个全局的CookieContainer实例,用来存储会话相关的所有Cookie
  • 给加购请求和结算请求都设置CookieContainer属性为这个实例,让两个请求归属同一会话
  • 另外注意你的post数据里有✓这种特殊字符,用Encoding.ASCII编码会导致乱码,建议换成Encoding.UTF8
  • 还有个小细节:你之前拼接post参数时没加&分隔符,服务器解析参数会出错,这个也要修正

下面是修改后的完整代码:

// 创建CookieContainer,用于在请求间共享会话Cookie
var cookieContainer = new CookieContainer();

// 加购商品请求
var request = (HttpWebRequest)WebRequest.Create(url_add_to_cart);
request.CookieContainer = cookieContainer; // 关联Cookie容器

var postData = "utf8=✓";
postData += "&style=" + data_style_id; // 用&分隔参数,避免解析错误
postData += "&size=" + size;
postData += "&commit=add to basket";

var data = Encoding.UTF8.GetBytes(postData); // 改用UTF8编码特殊字符
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = data.Length;

using (var stream = request.GetRequestStream())
{
    stream.Write(data, 0, data.Length);
}

var response = (HttpWebResponse)request.GetResponse();
var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();

// 结算请求
var url_checkout = link_general + "/checkout.json";
var request2 = (HttpWebRequest)WebRequest.Create(url_checkout);
request2.CookieContainer = cookieContainer; // 关联同一个Cookie容器,保持会话

var postData2 = "utf8=✓";
postData2 += "&order[billing_name]=toto"; // 同样用&分隔参数
postData2 += "&order[email]=toto@gmail.com";

var data2 = Encoding.UTF8.GetBytes(postData2);
request2.Method = "POST";
request2.ContentType = "application/x-www-form-urlencoded";
request2.ContentLength = data2.Length;

using (var stream2 = request2.GetRequestStream())
{
    stream2.Write(data2, 0, data2.Length);
}

var response2 = (HttpWebResponse)request2.GetResponse();
var responseString2 = new StreamReader(response2.GetResponseStream()).ReadToEnd();
Console.WriteLine(responseString2);

这样调整后,加购和结算请求就会共享同一个会话,服务器就能识别到你的购物车内容了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:57:07