You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

930 lines
47 KiB

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
{
/// <summary>
/// 手动支付采购单业务
/// </summary>
public class Collect1688Helper
{
private string _1688Cookie { get; set; }
public Action<string> 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));
}
///// <summary>
/////
///// </summary>
///// <param name="offerId"></param>
//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<PP_OrderProductParamRequest> 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<string> orderProductIds = new List<string>();
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("&amp;", "&");
//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选择器获取<div id="order" class="layout">元素
HtmlNode orderDiv = htmlDoc.DocumentNode.SelectSingleNode("//div[@id='order']");
if (orderDiv != null)
{
List<OrderGroupParameter> OrderGroupParameterList = new List<OrderGroupParameter>();
// 获取<div id="order" class="layout">内的所有子元素
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<dynamic>(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<dynamic>(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<decimal> productAmountList = new List<decimal>();
List<OrderProductParameter> OrderProductParameterList = new List<OrderProductParameter>();
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':'{\&quot;detailOrderBizAttributes\&quot;:{\&quot;b_cargo_from\&quot;:\&quot;offerdetail:pc;ipvId:2150462317125683404374580e106c\&quot;}}',
var ext = GetRegexValue(data_source, "'ext':'([^']+)'")?.Replace("\\&quot;","\"");
//'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':[{&quot;ba&quot;:1,&quot;ea&quot;:0,&quot;p&quot;:2.5}]
var offerPriceRangeJson = GetRegexValue(data_source, "'offerPriceRangeJson'\\s*:\\s*\\[(.*?)\\]")?.Replace("&quot;", "\"");
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
});
}
}
}
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;
}
/// <summary>
/// 输入临时收货地址(姓名 手机号 收货地址)或者直接输入地址 (主要获取邮编编码) //feiyu 19959858952 福建省泉州市鲤城区金龙街道古龙路媒人桥2号三文公寓一楼齐越中转仓
/// </summary>
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<string> generalOrders_orderGroupKeyList = new List<string>();
foreach (var orderGroup in oldData.OrderGroupParameterList)
{
List<string> orderList = new List<string>();
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<dynamic>(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<decimal>();
//selectedUmpBundle 的couple
var skuSelectedUmpBundle = item.Value["selectedUmpBundle"];
if (skuSelectedUmpBundle != null)
{
var couple = skuSelectedUmpBundle["couple"].ToString();
var sceneUnitPrice = skuSelectedUmpBundle["sceneUnitPrice"].ToObject<decimal>();
var discountFee = skuSelectedUmpBundle["price"].ToObject<decimal>();//折扣价格
var skuChooseFreeFreight = skuSelectedUmpBundle["isFreeFreight"].ToObject<bool>() ? 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<bool>();//是否包邮
shopDiscountFee = selectedShopUmpBundle["price"].ToObject<decimal>();//店铺优惠金额
}
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<dynamic>(html);
if (json.success)
{
AddLog?.Invoke("成功加入购物车");
}
else
{
AddLog?.Invoke("加入购物车失败");
}
}
}
catch (Exception ex)
{
AddLog?.Invoke($"加入购物车失败:{ex.Message}");
}
}
public ApiResponse<string> 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<string> _fm_sm_0_iList = new List<string>();
List<string> _fm_sma_cargoKeyList = new List<string>();
List<string> _fm_smartin_group_meList = new List<string>();
List<string> smarts_mList = new List<string>();
List<string> _fm_smart_group_meList = new List<string>();
List<string> _fm_sma_group_g_fList = new List<string>();
foreach (var OrderGroupParameter in productParameter.OrderGroupParameterList)
{
var group = OrderGroupParameter.Group;
var discountFee = OrderGroupParameter.DiscountFee;
var sumCarriage = OrderGroupParameter.SumCarriage;
var stepName = OrderGroupParameter.StepName;
var totalProductAmount = OrderGroupParameter.TotalProductAmount.ToString("0.00");
var actualPay = OrderGroupParameter.ActualPay;
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;
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 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"":"""",""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<string>() { Code = 200, Data = s };
}
else
{
AddLog?.Invoke("下单失败");
return new ApiResponse<string>() { Code = 1000, Msg = "下单失败" };
}
return new ApiResponse<string>() { 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<PP_OrderProductParamRequest> orderProducts, string address, OrderModel orderModel)
{
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;
var personalName = adressModel.PersonalName;
var mobileNO = adressModel.MobileNO;
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()
};
}
}
}