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.
939 lines
47 KiB
939 lines
47 KiB
|
|
using BBWYB.Common.Models;
|
|
using BBWYB.Server.Model._1688;
|
|
using BBWYB.Server.Model.Dto;
|
|
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("&", "&");
|
|
|
|
//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':'{\"detailOrderBizAttributes\":{\"b_cargo_from\":\"offerdetail:pc;ipvId:2150462317125683404374580e106c\"}}',
|
|
var ext = GetRegexValue(data_source, "'ext':'([^']+)'")?.Replace("\\"","\"");
|
|
|
|
//'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,
|
|
|
|
});
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
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)
|
|
{
|
|
//'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<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, OrderModel orderModel, ConsigneeRequest Consignee)
|
|
{
|
|
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 address = Consignee.Province+ Consignee.City+ Consignee.County;
|
|
|
|
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;
|
|
|
|
adressModel.PersonalName = Consignee.ContactName;
|
|
adressModel.MobileNO= Consignee.Mobile;
|
|
|
|
adressModel.AddressDetail = Consignee.Town+ Consignee.Address;
|
|
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()
|
|
};
|
|
}
|
|
}
|
|
}
|
|
|