using BBWYB.Common.Models; using BBWYB.Server.Model._1688; using HtmlAgilityPack; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using SDKAdapter.PurchasePlatform.Models; using System.Text; using System.Text.RegularExpressions; using static BBWYB.Server.Model.Enums; namespace BBWYB.Server.Business._1688Helper { /// /// 手动支付采购单业务 /// public class Collect1688Helper { private string _1688Cookie { get; set; } public Action AddLog { get; set; } public Collect1688Helper(string _1688Cookie) { this._1688Cookie = _1688Cookie; } private string UrlEncode(string str, string encodingStr) { Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); return System.Web.HttpUtility.UrlEncode(str, Encoding.GetEncoding(encodingStr)); } ///// ///// ///// ///// //public ProductModel GetProductMsg(string offerId)//获取限制条件 //{ // string url = $"https://detail.1688.com/offer/{offerId}.html"; // using HttpClient http = new HttpClient(); // //添加cookie // http.DefaultRequestHeaders.Add("Cookie", _1688Cookie); // http.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0"); // var res = http.GetAsync(url).Result; // if (res.IsSuccessStatusCode) // { // Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); // var html = res?.Content?.ReadAsStringAsync().Result; // string ipvId = GetRegexValue(html, "\"ipvId\":\"([^\"]+)\""); //可以不带ipvId // //"sellerUserId":3199397430, // //string sellerUserId = GetRegexValue(html, "\"sellerUserId\":([^,]+),"); // //"mixNumber": 2, // int mixNumber = int.Parse(GetRegexValue(html, "\"mixNumber\":([^,]+),")); // return new ProductModel() { MixNumber = mixNumber, IpvId = ipvId }; // } // AddLog("获取商品信息失败"); // return null; //} public OrderParameter GetProductParameter(List orderProducts, OrderModel orderModel, string ipvId) { var flow = orderModel.ToString(); //下单类型 string url = $"https://order.1688.com/order/smart_make_order.htm?p=detail&_input_charset=utf-8&fromkv={UrlEncode($"offerdetail:pc;ipvId:{ipvId}", "utf-8")}"; List orderProductIds = new List(); foreach (var orderProduct in orderProducts) { orderProductIds.Add(@$"{{""specId"":""{orderProduct.SpecId}"",""offerId"":{orderProduct.ProductId},""quantity"":{orderProduct.Quantity},""flow"":""{flow}"",""ext"":{{""sceneCode"":""""}},""selectedTradeServices"":[]}}"); } var id = UrlEncode($"[{string.Join(",", orderProductIds)}]", "gb2312"); string postData = $"id={id}&flow=xxx"; var response = PostHtml(url, postData, _1688Cookie); if (response == null || !response.IsSuccessStatusCode) { AddLog("获取订单参数失败"); return null; } // string lvid = response.Headers.Get("Eagleeye-Traceid"); string lvid = ""; if (response.Headers.Contains("Eagleeye-Traceid")) { //获取响应头 Resin-Trace的值 var trace = response.Headers.GetValues("Eagleeye-Traceid"); if (trace.Any()) { lvid = trace.FirstOrDefault(); } } string html = response.Content.ReadAsStringAsync().Result; var orderUrl = GetRegexValue(html, "action=\"([^\"]+)\"").Replace("&", "&"); //data-default-checked-address-id="6012255930" var address = GetRegexValue(html, "data-default-checked-address-id=\"([^\"]+)\""); //name="_fm.smarta._0.t" value="350502005" var townCode = GetRegexValue(html, "name=\"_fm.smarta._0.t\" value=\"([^\"]+)\""); var res = new OrderParameter() { Lvid = lvid, OrderUrl = orderUrl, Address = address, TownCode = townCode, IpvId = ipvId }; HtmlAgilityPack.HtmlDocument htmlDoc = new HtmlAgilityPack.HtmlDocument(); htmlDoc.LoadHtml(html); HtmlNode csrfInput = htmlDoc.DocumentNode.SelectSingleNode("//input[@name='_csrf_token']"); if (csrfInput != null) { // 获取 value 属性的值 string csrfTokenValue = csrfInput.GetAttributeValue("value", ""); res.Csrf_token = csrfTokenValue; } // 使用XPath选择器获取
元素 HtmlNode orderDiv = htmlDoc.DocumentNode.SelectSingleNode("//div[@id='order']"); if (orderDiv != null) { List OrderGroupParameterList = new List(); // 获取
内的所有子元素 HtmlNodeCollection childNodes = orderDiv.ChildNodes; foreach (HtmlNode node in childNodes) { // 处理每个子元素 string innerText = node.InnerText; // 获取元素的文本内容 string outerHtml = node.OuterHtml; // 获取元素的HTML代码 // 其他操作... if (node.Name == "div") { var zone_orders = node.Descendants("div") .Where(div => div.Attributes.Contains("class") && div.GetAttributeValue("class", "").Equals("zone-order", StringComparison.OrdinalIgnoreCase)); foreach (HtmlNode zone_order in zone_orders) { // 获取 data-source 属性的值 string dataSourceValue = zone_order.GetAttributeValue("data-source", ""); var groupHeaderJson = JsonConvert.DeserializeObject(dataSourceValue); //sellerMemberId string sellerMemberId = groupHeaderJson.sellerMemberId.ToString(); //sellerUserId string sellerUserId = groupHeaderJson.sellerUserId.ToString(); ////buyerMemberId //string buyerMemberId = groupHeaderJson.buyerMemberId.ToString(); //orderOutId string orderOutId = groupHeaderJson.orderOutId.ToString(); //group string group = groupHeaderJson.group.ToString(); //belong string belong = groupHeaderJson.belong.ToString(); //flow 下单类型 flow = groupHeaderJson?.flow?.ToString(); //bizType string bizType = groupHeaderJson?.bizType?.ToString(); var groupDiv = zone_order.Descendants("li") .Where(li => li.Attributes.Contains("class") && li.GetAttributeValue("class", "").Equals("step-item step-item-first", StringComparison.OrdinalIgnoreCase)); //.SelectSingleNode("//li[@class='step-item step-item-first']"); if (groupDiv == null) { continue; } string stepName = ""; foreach (var item in groupDiv) { var groupDivDataSource = item.GetAttributeValue("data-source", ""); if (groupDivDataSource != null) { var json = JsonConvert.DeserializeObject(groupDivDataSource); group = json.group.ToString(); stepName = json.stepName.ToString(); } } OrderGroupParameter orderGroupParameter = new OrderGroupParameter() { Group = group, StepName = stepName, OrderOutId = orderOutId, MemberId = sellerMemberId, SellerUserId = sellerUserId, Belong = belong, }; var groupOrders = zone_order.Descendants("tr") .Where(tr => tr.Attributes.Contains("data-group-name")); List productAmountList = new List(); List OrderProductParameterList = new List(); foreach (var groupOrder in groupOrders) { if (groupOrder.Name == "tr") { var data_source = groupOrder.GetAttributeValue("data-source", ""); string groutOuterHtml = groupOrder.OuterHtml; if (data_source != null) { var sumCarriage = GetRegexValue(groutOuterHtml, "\"fee\":([^,]+),"); if (sumCarriage == null) { sumCarriage = "0"; } //"freightId":"18605534" var freightId = GetRegexValue(groutOuterHtml, "\"freightId\":\"([^\"]+)\""); //'freightId':'16850501' if (freightId == null) { freightId = GetRegexValue(groutOuterHtml, "'freightId':'([^\']+)'"); } //'outId':'general_705889664759_df9e522ec29afb80a682fcaac1dce50c', var outId = GetRegexValue(data_source, "'outId':'([^']+)'"); //"discountFee":"0" var discountFee = decimal.Parse(GetRegexValue(data_source, "\"discountFee\":\"([^\"]+)\"") ?? "0"); var cargoKey = GetRegexValue(data_source, "'cargoKey':'([^']+)'"); //'unitPrice':'6.33' var unitPrice = decimal.Parse(GetRegexValue(data_source, "'unitPrice':'([^']+)'")); var payFee = (int)(unitPrice * 100); //'quantity':1.0 int quantity = (int)(decimal.Parse(GetRegexValue(data_source, "'quantity':([^,]+),"))); //'ext':'{\"detailOrderBizAttributes\":{\"b_cargo_from\":\"offerdetail:pc;ipvId:2150462317125683404374580e106c\"}}', var ext = GetRegexValue(data_source, "'ext':'([^']+)'")?.Replace("\\"","\""); ////'mixAmount':'100' var mixAmount = decimal.Parse(GetRegexValue(data_source, "'mixAmount':'([^']+)'")); //'offerId':'563883060952', var offerId = GetRegexValue(data_source, "'offerId':'([^']+)'"); //'skuId':'ea66ab9ceff1fbcc8d0b97d4926e476f', var spectId = GetRegexValue(data_source, "'skuId':'([^']+)'"); //'tbSkuId':'5408119750040', var skuId = GetRegexValue(data_source, "'tbSkuId':'([^']+)'"); //'offerPriceRangeJson':[{"ba":1,"ea":0,"p":2.5}] var offerPriceRangeJson = GetRegexValue(data_source, "'offerPriceRangeJson'\\s*:\\s*\\[(.*?)\\]")?.Replace(""", "\""); var productAmount = quantity * unitPrice - discountFee; productAmountList.Add(productAmount); OrderProductParameterList.Add(new OrderProductParameter() { ProductAmount = productAmount, CargoKey = cargoKey, ProductId = offerId, SkuId = skuId, SpectId = spectId, UnitPrice = unitPrice, Quantity = quantity, DiscountFee = discountFee, SumCarriage = decimal.Parse(sumCarriage), FreightId = freightId, OutId = outId, OfferPriceRangeJson = offerPriceRangeJson, Ext = ext, MixAmount = mixAmount }); } } } var totalProductAmount = OrderProductParameterList.Sum(p => p.ProductAmount); var actualPay = OrderProductParameterList.Sum(p => p.ProductAmount + p.SumCarriage); orderGroupParameter.SumCarriage = OrderProductParameterList.Sum(p => p.SumCarriage); orderGroupParameter.ActualPay = actualPay; orderGroupParameter.ActualPayFee = (int)(actualPay * 100); orderGroupParameter.TotalProductAmount = totalProductAmount; orderGroupParameter.PayFee = (int)(totalProductAmount * 100); orderGroupParameter.OrderProductParameterList = OrderProductParameterList; OrderGroupParameterList.Add(orderGroupParameter); } } } res.OrderGroupParameterList = OrderGroupParameterList; } return res; } /// /// 输入临时收货地址(姓名 手机号 收货地址)或者直接输入地址 (主要获取邮编编码) //feiyu 19959858952 福建省泉州市鲤城区金龙街道古龙路媒人桥2号三文公寓一楼齐越中转仓 /// public AddressModel InputAddress(string adress, string _csrf_token) { //callback=jQuery17207000444400310621_1711938052406&address=feiyu+19959858952+%E7%A6%8F%E5%BB%BA%E7%9C%81%E6%B3%89%E5%B7%9E%E5%B8%82%E9%B2%A4%E5%9F%8E%E5%8C%BA%E9%87%91%E9%BE%99%E8%A1%97%E9%81%93%E5%8F%A4%E9%BE%99%E8%B7%AF%E5%AA%92%E4%BA%BA%E6%A1%A52%E5%8F%B7%E4%B8%89%E6%96%87%E5%85%AC%E5%AF%93%E4%B8%80%E6%A5%BC%E9%BD%90%E8%B6%8A%E4%B8%AD%E8%BD%AC%E4%BB%93&_csrf_token=42b5ba743ad1a219f275a0f2b8f13303&_input_charset=utf-8 string url = $"https://wuliu.1688.com/address/ajax/address_parse.jsx?callback=jQuery17207000444400310621_1711938052406&address={UrlEncode(adress, "utf-8")}&_csrf_token={_csrf_token}&_input_charset=utf-8"; /* jQuery17207000444400310621_1711938052406({ "data": { "addressDetail": "金龙街道古龙路媒人桥2号三文公寓一楼齐越中转仓", "city": "泉州市", "cityCode": 350500, "district": "鲤城区", "districtCode": 350502, "divisionZip": "362000", "mobileNO": "19959858952", "personalName": "feiyu", "province": "福建省", "provinceCode": 350000 }, "success": true }) */ using HttpClient http = new HttpClient(); http.BaseAddress = new Uri(url); http.DefaultRequestHeaders.Add("Cookie", _1688Cookie); http.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0"); var res = http.GetAsync(url).Result; if (res.IsSuccessStatusCode) { Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); var html = res?.Content?.ReadAsStringAsync().Result; if (html.Contains("会话已过期,请刷新页面")) { AddLog?.Invoke("登陆已过期,请刷新页面"); return null; } var addressCode = GetRegexValue(html, "\"districtCode\":(\\d+)"); var divisionZip = GetRegexValue(html, "\"divisionZip\":\"([^\"]+)\""); var mobileNO = GetRegexValue(html, "\"mobileNO\":\"([^\"]+)\""); var personalName = GetRegexValue(html, "\"personalName\":\"([^\"]+)\""); var addressDetail = GetRegexValue(html, "\"addressDetail\":\"([^\"]+)\""); return new AddressModel() { AddressDetail = addressDetail, DivisionZip = divisionZip, MobileNO = mobileNO, PersonalName = personalName, AddressCode = addressCode }; } return null; } //刷新物流列表 public OrderParameter ReflashAdress(OrderParameter oldData, AddressModel addressModel, OrderModel orderModel) { string url = "https://order.1688.com/order/smart_ajax.jsx?_input_charset=utf-8"; List generalOrders_orderGroupKeyList = new List(); foreach (var orderGroup in oldData.OrderGroupParameterList) { List orderList = new List(); foreach (var orderProduct in orderGroup.OrderProductParameterList) { string freightId = orderProduct.FreightId; string order = $@"{{""offerId"":""{orderProduct.ProductId}"",""skuId"":""{orderProduct.SpectId}"",""tbSkuId"":""{orderProduct.SkuId}"",""hasSkuUmp"":""false"",""outId"":""{orderProduct.OutId}"",""quantity"":{orderProduct.Quantity},""isfreefreight"":0,""marketingScene"":"""",""offerPriceRangeJson"":[{orderProduct.OfferPriceRangeJson}],""unitPrice"":""{orderProduct.UnitPrice}"",""bundle"":"""",""couple"":"""",""freightId"":""{freightId}"",""rebate"":0,""buyerBearServiceFee"":false,""gift"":""0""}}"; orderList.Add(order); } string orderGroupData = $@"""{orderGroup.Group}"":{{""order"":[{string.Join(",", orderList)}] ,""orderOutId"":""{orderGroup.OrderOutId}"",""orderBundle"":"""",""orderCouple"":"""",""type"":""address"",""memberId"":""{orderGroup.MemberId}"",""sellerUserId"":""{orderGroup.SellerUserId}"",""operate"":"""",""countyCode"":""{addressModel.AddressCode}"",""addressCode"":""{addressModel.AddressCode}"",""address"":""-1"",""townCode"":"""",""umpSysAvailble"":""1"",""bizType"":""{orderModel}"",""bizScene"":""{orderModel}"",""transportType"":""multiStep"",""groupId"":""{orderGroup.Group}"",""tplCode"":""assureTrade"",""countryISOCode"":"""",""channelId"":"""",""mobile"":""{addressModel.MobileNO}"",""orderAmount"":""{orderGroup.ActualPayFee}"",""carriage"":""{orderGroup.SumCarriage}"",""belong"":""{orderGroup.Belong}""}}"; generalOrders_orderGroupKeyList.Add(orderGroupData); } string generalOrders_orderGroupKey = string.Join(",", generalOrders_orderGroupKeyList); string data = $"{{\"ordersUmp.0\":{{\"orderBlockAjaxParam\":{{\"{orderModel}Orders..orderGroupKey\":{{{generalOrders_orderGroupKey}}}}},\"changeType\":\"address\",\"selectedCrossPromotionId\":\"\",\"selectedCrossPromotionIdMap\":\"{{}}\",\"bizScene\":\"{orderModel}\"}}}}"; string postData = $"tasks=ordersUmp.0&data={UrlEncode(data, "UTF-8")}&_csrf_token={oldData.Csrf_token}&lvId={oldData.Lvid}"; var response = PostHtml(url, postData, _1688Cookie); if (response == null || !response.IsSuccessStatusCode) { AddLog("获取订单参数失败"); return null; } // string lvid = response.Headers.Get("Eagleeye-Traceid"); if (response.Headers.Contains("Eagleeye-Traceid")) { //获取响应头 Resin-Trace的值 var trace = response.Headers.GetValues("Eagleeye-Traceid"); if (trace.Any()) { oldData.Lvid = trace.FirstOrDefault(); } } var html = response.Content.ReadAsStringAsync().Result; var json = JsonConvert.DeserializeObject(html); dynamic jsonObj = JsonConvert.DeserializeObject(html); if (jsonObj["success"].ToString() == "true") { var datawuliu = jsonObj["data"]["ordersUmp.0"]["data"]["orderPromotion"].ToString(); //获取键值对的方式 bool isReflash = false; JObject jbO = JObject.Parse(datawuliu); foreach (var property in jbO.Properties()) { var key = property.Name; var groupData = oldData.OrderGroupParameterList.SingleOrDefault(o => o.Group == key); var value = property.Value; //获取value下的 freight var freight = (JObject)value["freight"]; //获取freight的键值对的key值 foreach (var item in freight.Properties()) { var freightKey = item.Name; var freightValue = item.Value; //获取freight的键值对的value值 //totalFreightFee的值 var wuliufee = freightValue["totalFreightFee"].ToString(); groupData.OrderProductParameterList.OrderByDescending(s => s.SumCarriage).FirstOrDefault(g => g.FreightId == freightKey).SumCarriage = decimal.Parse(wuliufee) / 100m; isReflash = true; } var order = (JObject)value["order"]; foreach (var item in order.Properties()) { var outId = item.Name; var orderProduct = groupData.OrderProductParameterList.FirstOrDefault(g => g.OutId == outId); if (orderProduct != null) { orderProduct.ProductAmount = item.Value["amount"].ToObject(); //selectedUmpBundle 的couple var skuSelectedUmpBundle = item.Value["selectedUmpBundle"]; if (skuSelectedUmpBundle != null) { var couple = skuSelectedUmpBundle["couple"].ToString(); var sceneUnitPrice = skuSelectedUmpBundle["sceneUnitPrice"].ToObject(); var discountFee = skuSelectedUmpBundle["price"].ToObject();//折扣价格 var skuChooseFreeFreight = skuSelectedUmpBundle["isFreeFreight"].ToObject() ? 1 : 0; orderProduct.Couple = couple; orderProduct.ChooseFreeFreight = skuChooseFreeFreight; orderProduct.ProductAmount = orderProduct.UnitPrice * orderProduct.Quantity - discountFee; } } } //selectedShopUmpBundle var selectedShopUmpBundle = value["selectedShopUmpBundle"]; bool isFreeFreight = false; decimal shopDiscountFee = 0; string shopCouple = ""; if (selectedShopUmpBundle != null) { shopCouple = selectedShopUmpBundle["couple"].ToString();//店铺优惠券 isFreeFreight = selectedShopUmpBundle["isFreeFreight"].ToObject();//是否包邮 shopDiscountFee = selectedShopUmpBundle["price"].ToObject();//店铺优惠金额 } groupData.ChooseFreeFreight = isFreeFreight ? 1 : 0; groupData.PromotionId = shopCouple; if (isFreeFreight) groupData.SumCarriage = 0; else groupData.SumCarriage = groupData.OrderProductParameterList.Select(s => s.SumCarriage).Sum(); groupData.TotalProductAmount = groupData.OrderProductParameterList.Select(s => s.ProductAmount).Sum(); groupData.ActualPay = groupData.TotalProductAmount + groupData.SumCarriage - shopDiscountFee; groupData.ActualPayFee = (int)(groupData.ActualPay * 100); } if (isReflash) { AddLog?.Invoke("刷新地址成功"); } else { AddLog?.Invoke("刷新地址失败"); } } else { AddLog?.Invoke("刷新地址失败"); } return oldData; } public string GetCookieStr(string cookies, string cookieName) { //通过;分割 var cookieDatas = cookies.Split(';', StringSplitOptions.RemoveEmptyEntries); foreach (var cookie in cookieDatas) { var cookieParams = cookie.Split('='); if (cookieParams.Count() >= 2) { var key = cookieParams[0]?.Trim(); var value = cookieParams[1]?.Trim(); if (key == cookieName) { return value; } } } return ""; } private string GetRegexValue(string html, string patternStr) { //使用正则匹配出值 var regex = Regex.Match(html, patternStr); if (regex.Success) { return regex.Groups[1].Value; } return null; } //获取_csrf_token参数 public string GetCsrfToken(string cookies) { var csrf_token = GetCookieStr(cookies, "_csrf_token"); if (csrf_token == null) { return null; } return Md5Helper.Md5_32(csrf_token); } //加入购物车 public void AddCart(string offerId, string specId, int quantity, string IpvId) { try { //时间戳 var timestamp = DateTimeOffset.UtcNow.ToUnixTimeSeconds(); string url = "https://cart.1688.com/ajax/safe/add_to_cart_list_new.jsx"; string ext = $"{{\"sceneCode\":\"offerdetail:pc;ipvId:{IpvId}\"}}"; string specData = $"[{{\"amount\":{quantity},\"specId\":\"{specId}\",\"selectedTradeServices\":[]}}]"; string postData = $"type=offer&cargoIdentity={offerId}&returnType=url&needTotalPrice=false&promotionSwitch=false&_csrf_token={GetCsrfToken(_1688Cookie)}&t={timestamp}&purchaseType=&ext={UrlEncode(ext, "utf-8")}&specData={UrlEncode(specData, "utf-8")}"; var res = PostHtml(url, postData, _1688Cookie); if (res.IsSuccessStatusCode) { var html = res.Content.ReadAsStringAsync().Result; var json = JsonConvert.DeserializeObject(html); if (json.success) { AddLog?.Invoke("成功加入购物车"); } else { AddLog?.Invoke("加入购物车失败"); } } } catch (Exception ex) { AddLog?.Invoke($"加入购物车失败:{ex.Message}"); } } public ApiResponse CommitOrder(PrewOrderResponse prewOrderResponse, string remarkMesg) { var productParameter = prewOrderResponse.orderParameter; var orderModel = prewOrderResponse.OrderModel; var adressModel = prewOrderResponse.AddressModel; var flow = orderModel.ToString(); //下单类型 var ipvId = productParameter.IpvId; var addressDetail = adressModel.AddressDetail; var townCode = productParameter.TownCode; var csrf_token = productParameter.Csrf_token; var orderUrl = productParameter.OrderUrl; var addressCode = adressModel.AddressCode; var lvid = productParameter.Lvid; var personalName = adressModel.PersonalName; var mobileNO = adressModel.MobileNO; var _csrf_token = productParameter.Csrf_token; var divisionZip = adressModel.DivisionZip; // 213e38fa17117750507943145ee537 string fromkv = $"offerdetail:pc;ipvId:{productParameter.IpvId}";//24885ba917116953616677208e //string remarkMesg = "拖鞋";//备注消息 string cna = GetCookieStr(_1688Cookie, "cna"); List _fm_sm_0_iList = new List(); List _fm_sma_cargoKeyList = new List(); List _fm_smartin_group_meList = new List(); List smarts_mList = new List(); List _fm_smart_group_meList = new List(); List _fm_sma_group_g_fList = new List(); foreach (var OrderGroupParameter in productParameter.OrderGroupParameterList) { //'mixAmount':'100' var group = OrderGroupParameter.Group; var discountFee = OrderGroupParameter.DiscountFee; var sumCarriage = OrderGroupParameter.SumCarriage.ToString("0.00"); var stepName = OrderGroupParameter.StepName; var totalProductAmount = OrderGroupParameter.TotalProductAmount.ToString("0.00"); var actualPay = OrderGroupParameter.ActualPay.ToString("0.00"); var actualPayFee = OrderGroupParameter.ActualPayFee; var payFee = OrderGroupParameter.PayFee; var shopCouple = OrderGroupParameter.PromotionId; var chooseFreeFreight = OrderGroupParameter.ChooseFreeFreight; foreach (var orderProductParameter in OrderGroupParameter.OrderProductParameterList) { var cargoKey = orderProductParameter.CargoKey; var unitPrice = orderProductParameter.UnitPrice.ToString("0.00"); var productAmount = orderProductParameter.ProductAmount.ToString("0.00"); var quantity = orderProductParameter.Quantity; var offerId = orderProductParameter.ProductId; var specId = orderProductParameter.SpectId; var tbSkuId = orderProductParameter.SkuId; var skuChooseFreeFreight = orderProductParameter.ChooseFreeFreight; var _fm_sm_0_i_ = @$"{{""cartId"":"""",""offerId"":""{offerId}"",""specId"":""{specId}"",""tbSkuId"":""{tbSkuId}"",""hasSkuUmp"":""false"",""quantity"":{quantity},""tradeMode"":""multiStep"",""tradeWay"":""100"",""templateCode"":""assureTrade"",""flow"":""{flow}"",""subflow"":"""",""ext"":""{{\""sceneCode\"":\""\""}}""}}"; _fm_sm_0_iList.Add(_fm_sm_0_i_); string _fm_sma_cargoKey = @$"{{""group"":""{group}"",""cargoKey"":""{cargoKey}"",""quantity"":{quantity},""unitPrice"":""{unitPrice}"",""offerId"":""{offerId}"",""specId"":""{specId}"",""tbSkuId"":""{tbSkuId}"",""hasSkuUmp"":""false"",""chooseFreeFreight"":{skuChooseFreeFreight},""productAmount"":""{productAmount}"",""discount"":1,""isVirtual"":""0"",""gift"":"""",""cartId"":"""",""promotionId"":""{orderProductParameter.Couple}"",""ext"":""{{\""sceneCode\"":\""\""}}"",""buyerCharge"":false,""marketingScene"":""""}}"; _fm_sma_cargoKeyList.Add($"_fm.smar.{cargoKey}.m={UrlEncode(_fm_sma_cargoKey, "gb2312")}"); } string mixAmount = "100"; string smarts_m = @$"[{{""group"":""{group}"",""stepNo"":""1"",""templateId"":""30"",""stepName"":""{UrlEncode(stepName, "GB2312")}"",""instantPay"":""0"",""sellerActionName"":"""",""buyerPayTimeout"":""0"",""buyerConfirmTimeout"":""0"",""needSellerAction"":""0"",""transferAfterConfirm"":""0"",""needSellerCallNext"":""0"",""isStepPayAll"":""0"",""agreement"":"""",""needLogistics"":""1"",""percent"":""1.0"",""deliveryPercent"":""1.0"",""payFee"":""{payFee}"",""actualPayFee"":""{actualPayFee}"",""discountFee"":""{discountFee}"",""itemDiscountFee"":""0"",""price"":""0"",""amount"":""1"",""postFee"":""0"",""mergedJsonVar"":""""}}]"; smarts_mList.Add(smarts_m); string _fm_smart_group_me = @$"{{""group"":""{group}"",""tplCode"":""assureTrade"",""message"":""{remarkMesg}"",""sumCarriage"":""{sumCarriage}"",""totalAmount"":""{actualPay}"",""totalProductAmount"":""{totalProductAmount}"",""chooseFreeFreight"":{chooseFreeFreight},""mixAmount"":""{mixAmount}"",""mixNumber"":""1"",""promotionId"":""{shopCouple}"",""umpSysAvailble"":""1"",""toleranceFreight"":""${{model.toleranceCollection.toleranceFreight}}"",""checkCarriage"":1,""filledCarriage"":""0.00"",""isNeedSellerConfirmFlag"":""0"",""lvid"":""{lvid}"",""fundUsageSelected"":""0"",""hasTaosampleCard"":""0"",""anonymousBuyer"":true,""payEntry"":""multiStep"",""bizType"":""{flow}"",""payWay"":""100"",""orderCodFee"":0,""crossPromotionIds"":[],""crossPromotionIdsMap"":{{}},""crossShopPromotions"":[],""terminal"":""pc_browser_null_0.0.0"",""cna"":""{cna}"",""fromkv"":""{fromkv}""}}"; _fm_smart_group_meList.Add($"_fm.smart.{group}.me={UrlEncode(_fm_smart_group_me, "GB2312")}"); string _fm_smartin_group_me = @$"{{ ""invoiceFlag"":false,""invoiceType"":0,""invoiceMode"":"""",""streetAddress"":"""",""registerPhone"":"""",""bank"":"""",""accountId"":"""",""companyName"":"""",""localInvoiceId"":""undefined"",""taxpayerIdentifier"":"""",""extParams"":{{ ""email"":""""}},""group"":""{group}""}}"; _fm_smartin_group_meList.Add($"_fm.smartin.{group}.me={UrlEncode(_fm_smartin_group_me, "GB2312")}&_fm.smartin.{group}.i=false"); _fm_sma_group_g_fList.Add($"_fm.sma.{group}.g={group}&_fm.sma.{group}.f={flow}"); } var _fm_smarts_0_m = $"[{string.Join(",", smarts_mList)}]"; var _fm_sm_0_i = $"[{string.Join(",", _fm_sm_0_iList)}]"; string cargoKeyStr = string.Join("&", _fm_sma_cargoKeyList); string _fm_smart_group_meStr = string.Join("&", _fm_smart_group_meList); string _fm_smartin_group_meStr = string.Join("&", _fm_smartin_group_meList); string _fm_smart_group_g_fStr = string.Join("&", _fm_sma_group_g_fList); string url = orderUrl; string key = GetRegexValue(orderUrl, "key=(\\d+)"); Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); string adress = UrlEncode(addressDetail, "GB2312");// string userName = UrlEncode(personalName, "GB2312"); string phoneNumber = UrlEncode(mobileNO, "GB2312"); var timestamp = DateTimeOffset.UtcNow.ToUnixTimeSeconds(); string postData = $"action=SmartMakeOrderAction&event_submit_execute=Action&fromWhere=confirmOrder&fromType=normal&_fm.smarti._0.me=%7B%7D&_fm.smarti._0.i=false&_csrf_token={_csrf_token}" + $"&_fm.sm._0.f=xxx&_fm.sm._0.i={UrlEncode(_fm_sm_0_i, "GB2312")}&_fm.sm._0.k={key}&_fm.sm._0.a=0&_fm.sm._0.q=&_fm.sm._0.in=&_fm.sm._0.fr=&_fm.sm._0.fro=&_fm.sm._0.s=&_fm.sm._0.se=&_fm.sm._0.p=-1&_fm.sm._0.e=&_fm.sm._0.is=false&_fm.sm._0.null=cart&_fm.sm._0.ex=" + $"&_fm.sm._0.sc=&_fm.smart._PAGE_LEVEL_.me=%7B%22group%22%3A%22_PAGE_LEVEL_%22%7D&{_fm_smart_group_meStr}&{cargoKeyStr}" + $"&{_fm_smart_group_g_fStr}&_fm.smartm._0.m=&_fm.smarta._0.ar={addressCode}&_fm.smarta._0.p={addressCode}&_fm.smarta._0.c={addressCode}&_fm.smarta._0.po={divisionZip}&_fm.smarta._0.ad={adress}&_fm.smarta._0.t=&_fm.smarta._0.to=&_fm.smarta._0.f={userName}" + $"&_fm.smarta._0.ph=&_fm.smarta._0.m={phoneNumber}&_fm.smarta._0.i=false&_fm.smarta._0.is=true&_fm.smarta._0.a=-1&{_fm_smartin_group_meStr}&" + $"_fm.smarts._0.m={_fm_smarts_0_m}&_fm.r._0.w={timestamp}"; var s = GetOrderId(url, postData, _1688Cookie); if (s != null) { AddLog?.Invoke($"下单成功,返回订单号:{s}"); return new ApiResponse() { Code = 200, Data = s }; } else { AddLog?.Invoke("下单失败"); return new ApiResponse() { Code = 1000, Msg = "下单失败" }; } return new ApiResponse() { Code = 1000, Msg = "下单失败" }; } private string GetOrderId(string url, string postData, string cookie) { var response = PostHtml(url, postData, cookie); if (response.IsSuccessStatusCode) { Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); var sss = response.Content.ReadAsStringAsync().Result; if (response.Headers.Contains("Resin-Trace")) { //获取响应头 Resin-Trace的值 var trace = response.Headers.GetValues("Resin-Trace"); if (trace.Any()) { var traceValue = trace.FirstOrDefault(); if (traceValue.Contains("biz_order")) { var biz_order = GetRegexValue(traceValue, "biz_order=(\\d+[,]?\\d+)");//获取下单号 return biz_order; } } } } return null; } public HttpResponseMessage PostHtml(string url, string postData, string cookie) { HttpClient client = new HttpClient(); //使用 application/x-www-form-urlencoded post提交 client.DefaultRequestHeaders.Add("Cookie", cookie); //postData = "action=SmartMakeOrderAction&event_submit_execute=Action&fromWhere=confirmOrder&fromType=normal&_fm.smarti._0.me=%7B%7D&_fm.smarti._0.i=false&_csrf_token=e107b86e348b5ff07dd1d1e4b0dff58f&_fm.sm._0.f=xxx&_fm.sm._0.i=%5B%7B%22cartId%22%3A%22%22%2C%22offerId%22%3A%22755527819845%22%2C%22specId%22%3A%2248b8df3db448c6bad0e847c317886360%22%2C%22tbSkuId%22%3A%225207346876796%22%2C%22hasSkuUmp%22%3A%22false%22%2C%22quantity%22%3A1%2C%22tradeMode%22%3A%22multiStep%22%2C%22tradeWay%22%3A%22100%22%2C%22templateCode%22%3A%22assureTrade%22%2C%22flow%22%3A%22general%22%2C%22subflow%22%3A%22%22%2C%22ext%22%3A%22%7B%5C%22sceneCode%5C%22%3A%5C%22%5C%22%7D%22%7D%5D&_fm.sm._0.k=171179300009192219&_fm.sm._0.a=0&_fm.sm._0.q=&_fm.sm._0.in=&_fm.sm._0.fr=&_fm.sm._0.fro=&_fm.sm._0.s=&_fm.sm._0.se=&_fm.sm._0.p=-1&_fm.sm._0.e=&_fm.sm._0.is=false&_fm.sm._0.null=detail&_fm.sm._0.ex=&_fm.sm._0.sc=&_fm.smart._PAGE_LEVEL_.me=%7B%22group%22%3A%22_PAGE_LEVEL_%22%7D&_fm.smart.d4d7e431d5b30a44df6a8b2e50a58237.me=%7B%22group%22%3A%22d4d7e431d5b30a44df6a8b2e50a58237%22%2C%22tplCode%22%3A%22assureTrade%22%2C%22message%22%3A%22%22%2C%22sumCarriage%22%3A%222.40%22%2C%22totalAmount%22%3A%228.73%22%2C%22totalProductAmount%22%3A%226.33%22%2C%22chooseFreeFreight%22%3A0%2C%22mixAmount%22%3A%22%22%2C%22mixNumber%22%3A%221%22%2C%22promotionId%22%3A%22%22%2C%22umpSysAvailble%22%3A%221%22%2C%22toleranceFreight%22%3A%22%24%7Bmodel.toleranceCollection.toleranceFreight%7D%22%2C%22checkCarriage%22%3A1%2C%22filledCarriage%22%3A%220.00%22%2C%22isNeedSellerConfirmFlag%22%3A%220%22%2C%22lvid%22%3A%2224885bad17117929999545039e%22%2C%22fundUsageSelected%22%3A%220%22%2C%22hasTaosampleCard%22%3A%220%22%2C%22anonymousBuyer%22%3Afalse%2C%22payEntry%22%3A%22multiStep%22%2C%22bizType%22%3A%22general%22%2C%22payWay%22%3A%22100%22%2C%22orderCodFee%22%3A0%2C%22crossPromotionIds%22%3A%5B%5D%2C%22crossPromotionIdsMap%22%3A%7B%7D%2C%22crossShopPromotions%22%3A%5B%5D%2C%22terminal%22%3A%22pc_browser_null_0.0.0%22%2C%22cna%22%3A%224Ha%2FHb9%2B8QEBASQJijR52Awl%22%2C%22fromkv%22%3A%22offerdetail%3Apc%3BipvId%3A213e36ab17117929945421320e75bd%22%7D&_fm.smar.755527819845_48b8df3db448c6bad0e847c317886360.m=%7B%22group%22%3A%22d4d7e431d5b30a44df6a8b2e50a58237%22%2C%22cargoKey%22%3A%22755527819845_48b8df3db448c6bad0e847c317886360%22%2C%22quantity%22%3A1%2C%22unitPrice%22%3A%226.33%22%2C%22offerId%22%3A%22755527819845%22%2C%22specId%22%3A%2248b8df3db448c6bad0e847c317886360%22%2C%22tbSkuId%22%3A%225207346876796%22%2C%22hasSkuUmp%22%3A%22false%22%2C%22chooseFreeFreight%22%3A0%2C%22productAmount%22%3A%226.33%22%2C%22discount%22%3A1%2C%22isVirtual%22%3A%220%22%2C%22gift%22%3A%22%22%2C%22cartId%22%3A%22%22%2C%22promotionId%22%3A%22%22%2C%22ext%22%3A%22%7B%5C%22sceneCode%5C%22%3A%5C%22%5C%22%7D%22%2C%22buyerCharge%22%3Afalse%2C%22marketingScene%22%3A%22%22%7D&_fm.sma.d4d7e431d5b30a44df6a8b2e50a58237.g=d4d7e431d5b30a44df6a8b2e50a58237&_fm.sma.d4d7e431d5b30a44df6a8b2e50a58237.f=general&_fm.smartm._0.m=&_fm.smarta._0.ar=350502&_fm.smarta._0.p=350502&_fm.smarta._0.c=350502&_fm.smarta._0.po=362000&_fm.smarta._0.ad=%BD%F0%C1%FA%BD%D6%B5%C0%B9%C5%C1%FA%C2%B7%C3%BD%C8%CB%C7%C52%BA%C5%C8%FD%CE%C4%B9%AB%D4%A2%D2%BB%C2%A5%C6%EB%D4%BD%D6%D0%D7%AA%B2%D6&_fm.smarta._0.t=&_fm.smarta._0.to=&_fm.smarta._0.f=feiyu&_fm.smarta._0.ph=&_fm.smarta._0.m=19959858952&_fm.smarta._0.i=false&_fm.smarta._0.is=true&_fm.smarta._0.a=-1&_fm.smartin.d4d7e431d5b30a44df6a8b2e50a58237.me=%7B%22invoiceFlag%22%3Afalse%2C%22invoiceType%22%3A0%2C%22invoiceMode%22%3A%22%22%2C%22streetAddress%22%3A%22%22%2C%22registerPhone%22%3A%22%22%2C%22bank%22%3A%22%22%2C%22accountId%22%3A%22%22%2C%22companyName%22%3A%22%22%2C%22localInvoiceId%22%3A%22undefined%22%2C%22taxpayerIdentifier%22%3A%22%22%2C%22extParams%22%3A%7B%22email%22%3A%22%22%7D%2C%22group%22%3A%22d4d7e431d5b30a44df6a8b2e50a58237%22%7D&_fm.smartin.d4d7e431d5b30a44df6a8b2e50a58237.i=false&_fm.smarts._0.m=%5B%7B%22group%22%3A%22d4d7e431d5b30a44df6a8b2e50a58237%22%2C%22stepNo%22%3A%221%22%2C%22templateId%22%3A%2230%22%2C%22stepName%22%3A%22%C8%AB%BF%EE%BD%BB%D2%D7%22%2C%22instantPay%22%3A%220%22%2C%22sellerActionName%22%3A%22%22%2C%22buyerPayTimeout%22%3A%220%22%2C%22buyerConfirmTimeout%22%3A%220%22%2C%22needSellerAction%22%3A%220%22%2C%22transferAfterConfirm%22%3A%220%22%2C%22needSellerCallNext%22%3A%220%22%2C%22isStepPayAll%22%3A%220%22%2C%22agreement%22%3A%22%22%2C%22needLogistics%22%3A%221%22%2C%22percent%22%3A%221.0%22%2C%22deliveryPercent%22%3A%221.0%22%2C%22payFee%22%3A%22633%22%2C%22actualPayFee%22%3A%22873%22%2C%22discountFee%22%3A%220%22%2C%22itemDiscountFee%22%3A%220%22%2C%22price%22%3A%220%22%2C%22amount%22%3A%221%22%2C%22postFee%22%3A%220%22%2C%22mergedJsonVar%22%3A%22%22%7D%5D&_fm.r._0.u=140%232w2Dve%2FuzzFMcQo2HiuuFpSanxQgLwMah9FA4xt5yifr2OblcBB8%2FtDVlIZFbEvZcpX14c7HBH%2FAuyTRlaOhIoZWFnLe69cgf%2BoiOnbjo3hqzzn7YQqA3VuzzR8ZiahulFzx2DD3VthqzFrLGXY4U6SxzoObV2EqQG3Y2Ac%2Bx%2BmozFdO2XU%2BobTxzIc7VOg%2FlIXx2Dd6%2F61XrQc12XQzlpg7zPnRVr7uljFo2Aw%2B66G7zFrw2XQ%2B5TjqzWXf3YRLMZ2aMXm"; Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); HttpContent content = new StringContent(postData, Encoding.GetEncoding("GB2312"), "application/x-www-form-urlencoded"); var response = client.PostAsync(url, content).Result; return response; } public PrewOrderResponse PrewOrder(List orderProducts, string address, OrderModel orderModel,string phoneNumber,string UserName) { var flow = orderModel.ToString(); //下单类型 //获取时间戳 var timestamp = DateTimeOffset.UtcNow.ToUnixTimeSeconds(); var ipvId = Md5Helper.Md5_32(timestamp.ToString()); var productParameter = GetProductParameter(orderProducts, orderModel, ipvId); var _csrf_token = productParameter.Csrf_token; var lvid = productParameter.Lvid; var orderUrl = productParameter.OrderUrl; var adressModel = InputAddress(address, _csrf_token); if (adressModel == null) { return null; } AddLog?.Invoke($"获取地址信息成功,姓名:{adressModel.PersonalName},手机号:{adressModel.MobileNO},地址:{adressModel.AddressDetail},邮编:{adressModel.DivisionZip}"); var addressCode = adressModel.AddressCode; var addressDetail = adressModel.AddressDetail; adressModel.PersonalName = UserName; adressModel.MobileNO= phoneNumber; var divisionZip = adressModel.DivisionZip; //刷新地址 productParameter = ReflashAdress(productParameter, adressModel, orderModel); return new PrewOrderResponse { AddressModel = adressModel, orderParameter = productParameter, OrderModel = orderModel, ActualPay = productParameter.OrderGroupParameterList.Select(s => s.ActualPay).Sum(), SumCarriage = productParameter.OrderGroupParameterList.Select(s => s.SumCarriage).Sum(), TotalProductAmount = productParameter.OrderGroupParameterList.Select(s => s.TotalProductAmount).Sum() }; } } }