using NetLibrary.Log; using NetLibrary.OnlineTrade; using Newtonsoft.Json.Linq; using NPOI.HSSF.Model; using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Http; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Remoting.Metadata.W3cXsd2001; using System.Security.Cryptography; using System.Text; using System.Web; using System.Web.Script.Serialization; namespace TradeManageNew { public class Temu { //public string IP = "http://50.196.110.198:8081"; //美国跳转服务器ip地址 public string IP = "http://50.196.110.198:8099"; //美国跳转服务器ip地址 public string AccessToken { get; set; } public string AppKey { get; set; } public string AppSecret { get; set; } public int shopid { get; set; } JavaScriptSerializer JsonConvert = null; public Temu() { JsonConvert = new JavaScriptSerializer(); } public List GetOrders(DateTime sdate,DateTime edate, out string errorMessage) { var orderModels = new List(); try { if (string.IsNullOrEmpty(AccessToken) || string.IsNullOrEmpty(AppKey) || string.IsNullOrEmpty(AppSecret)) { errorMessage = "店铺未授权"; return null; } var nowPage = 1; int totalPage = 1; string error = ""; while (nowPage<=totalPage) { var orders = GetOrderList(sdate, edate, nowPage, out totalPage,out error); if (orders == null) break; foreach (var order in orders) { ErrorFollow.TraceWrite("自动导入TEMU订单循环model", "店铺名称:" + shopid, JsonConvert.Serialize(order)); //if (order.parentOrderMap.parentOrderSn != "576662364844036518" ) //{ // continue; //} //只同步待发货和已发货状态订单 if (order.parentOrderMap.parentOrderStatus==2 || order.parentOrderMap.parentOrderStatus == 4) { var receive = GetOrderReceiveInfo(order.parentOrderMap.parentOrderSn); var orderM = ToOrderModel(order, receive); if (orderM!=null) { orderModels.Add(orderM); var shipTracks = new List(); var temuShips=new List(); //获取订单的发货面单信息 foreach (var item in order.orderList) { var shipments = GetOrderShipmentInfo(order.parentOrderMap.parentOrderSn, item.orderSn); if (shipments != null && item.productList!=null) { foreach(var shipment in shipments) { var temuShip = new TemuShipmentODT() { ParentOrderSn = order.parentOrderMap.parentOrderSn, TrackCode = shipment.trackingNumber, Quantity = shipment.quantity, SKU = item.productList.First().extCode }; temuShips.Add(temuShip); //var detail = DataNew.GetGoodsInfoDetailBySku(item.productList.First().extCode); //var sku = detail != null ? shipment.quantity + "x" + detail.SKU1 : ""; //var _temuTrack = shipTracks.Where(r => r.ParentOrderSn == order.parentOrderMap.parentOrderSn && r.TrackCode == shipment.trackingNumber).FirstOrDefault(); //if (_temuTrack != null) //{ // _temuTrack.SKU = string.IsNullOrEmpty(_temuTrack.SKU) ? sku : (_temuTrack.SKU + "+" + sku); //} //else //{ // var temuTrack = new TemuOrderShipTrackCode() // { // ParentOrderSn = order.parentOrderMap.parentOrderSn, // //OrderSn = item.orderSn, // TrackCode = shipment.trackingNumber, // SKU = detail != null ? shipment.quantity + "x" + detail.SKU1 : "", // Weight = (detail != null && detail.Weight.HasValue) ? (detail.Weight.Value * shipment.quantity).ToString("0.00") : "", // Long = (detail != null && detail.Long.HasValue) ? detail.Long.Value.ToString("0.00") : "", // Width = (detail != null && detail.Width.HasValue) ? detail.Width.Value.ToString("0.00") : "", // Height = (detail != null && detail.Height.HasValue) ? detail.Height.Value.ToString("0.00") : "", // }; // shipTracks.Add(temuTrack); //} } } } if (temuShips != null) { var _GBtemuShips = temuShips.GroupBy(r => new { r.ParentOrderSn, r.TrackCode, r.SKU }).Select(g => new { ParentOrderSn = g.Key.ParentOrderSn, TrackCode = g.Key.TrackCode, SKU = g.Key.SKU, Quantity = g.Sum(r => r.Quantity) }).ToList(); foreach(var _gb in _GBtemuShips) { var strack = shipTracks.Where(r => r.ParentOrderSn == _gb.ParentOrderSn && r.TrackCode == _gb.TrackCode).FirstOrDefault(); if (strack != null) { strack.SKU = string.IsNullOrEmpty(strack.SKU) ? (_gb.Quantity + "x" + _gb.SKU) : (strack.SKU + "+" + (_gb.Quantity + "x" + _gb.SKU)); } else { var sku = ""; var detail = DataNew.GetGoodsInfoDetailBySku(_gb.SKU); if (detail == null) { continue; } if (detail.GoodsId == 5527) //组合商品,对应的SKU需要以SKU14为准 { if (string.IsNullOrEmpty(detail.SKU14)) { continue; } var skuarr = detail.SKU14.Split(','); foreach (var _sku in skuarr) { sku += _gb.Quantity.ToString() + "x" + _sku + "+"; } sku = sku.TrimEnd('+'); } else { sku = detail != null ? _gb.Quantity + "x" + detail.SKU1 : ""; } strack = new TemuOrderShipTrackCode { ParentOrderSn = _gb.ParentOrderSn, TrackCode = _gb.TrackCode, SKU = sku, Weight = (detail != null && detail.Weight.HasValue) ? (detail.Weight.Value * _gb.Quantity.Value).ToString("0.00") : "", Long = (detail != null && detail.Long.HasValue) ? detail.Long.Value.ToString("0.00") : "", Width = (detail != null && detail.Width.HasValue) ? detail.Width.Value.ToString("0.00") : "", Height = (detail != null && detail.Height.HasValue) ? detail.Height.Value.ToString("0.00") : "", }; shipTracks.Add(strack); } } } if (shipTracks != null) { foreach(var shipTrack in shipTracks) { DataNew.SaveTemuOrderShipTrackCode(shipTrack); } } } } } nowPage++; } errorMessage = error; } catch (Exception ex) { errorMessage = ex.Message; } ErrorFollow.TraceWrite("自动导入TEMU订单结束返回APImodel", "店铺名称:" + shopid, JsonConvert.Serialize(orderModels)); return orderModels; } /// /// 获取订单列表 /// /// /// /// /// /// /// public List GetOrderList(DateTime sdate, DateTime edate, int pageNum, out int totalPage, out string error) { var rdatas = new List(); try { var sdateStamp = (long)(sdate.Subtract(new DateTime(1970, 1, 1))).TotalSeconds; var edateStamp = (long)(edate.Subtract(new DateTime(1970, 1, 1))).TotalSeconds; long timeStamp = (long)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds; string[] fulfillmentTypeList = new string[] { "fulfillBySeller", "fulfillByCooperativeWarehouse" }; StringBuilder jsonFulfillmentTypes = new StringBuilder("["); bool isFirst = true; foreach (var item in fulfillmentTypeList) { if (!isFirst) { jsonFulfillmentTypes.Append(","); } jsonFulfillmentTypes.Append("\"").Append(item).Append("\""); isFirst = false; } jsonFulfillmentTypes.Append("]"); string result = jsonFulfillmentTypes.ToString(); //int regionId = 211; var apiType = "bg.order.list.get"; //var bodyStrArr = new string[] { "access_token" + AccessToken, "app_key" + AppKey, "createAfter" + sdateStamp, "createBefore" + edateStamp, "data_typeJSON", "fulfillmentTypeList" + result, "pageNumber" + pageNum.ToString(), "pageSize100", "parentOrderStatus0", "regionId211", "timestamp" + timeStamp, "type" + apiType }; var bodyStrArr = new string[] { "access_token" + AccessToken, "app_key" + AppKey, "createAfter" + sdateStamp, "createBefore" + edateStamp, "data_typeJSON", "pageNumber" + pageNum.ToString(), "pageSize100", "parentOrderStatus0", "timestamp" + timeStamp, "type" + apiType }; var bodyStr = AppSecret + string.Join("", bodyStrArr) + AppSecret;//参数按字母顺序排序 var sign = EncryptionHelp.GetMD5(bodyStr); var body = new { access_token = AccessToken, app_key = AppKey, createAfter = sdateStamp, createBefore = edateStamp, data_type = "JSON", //fulfillmentTypeList = fulfillmentTypeList, pageNumber = pageNum, pageSize = 100, parentOrderStatus = 0, //regionId = regionId, timestamp = timeStamp, type = apiType, sign = sign.ToUpper() }; var json = JsonConvert.Serialize(body); var path = EncryptionHelp.EncryptString(json, "ThisIsShopifyKey12365498"); var path2 = HttpUtility.UrlEncode(path); var url = IP + "/api/TemuHelp/GetTemuShopOrderList?bodyStr=" + path2; //using (HttpClient client = new HttpClient()) //{ // HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, url); // var response = client.SendAsync(request); // string responseContent = response.Result.Content.ReadAsStringAsync().GetAwaiter().GetResult(); // if (string.IsNullOrEmpty(responseContent) || responseContent == "Fail") // { // totalPage = 0; // error = "接口返回失败"; // return null; // } // else // { // var rModel = JsonConvert.Deserialize(responseContent); // if (rModel != null && rModel.result != null && rModel.result.result != null) // { // var result2 = rModel.result.result; // error = ""; // rdatas = result2.pageItems; // totalPage = result2.totalItemNum % 100 > 0 ? (result2.totalItemNum / 100 + 1) : (result2.totalItemNum / 100); // } // else // { // totalPage = 0; // error = "接口未返回数据"; // return null; // } // } //} using (WebClient client = new WebClient()) { client.Encoding = Encoding.UTF8; // 指定下载内容编码方式为 UTF-8 string responseContent = client.DownloadString(url); ErrorFollow.TraceWrite("自动导入TEMU订单返回结果", "店铺名称:" + shopid, responseContent); if (string.IsNullOrEmpty(responseContent) || responseContent == "Fail") { totalPage = 0; error = "接口返回失败"; return null; } else { var rModel = JsonConvert.Deserialize(responseContent); if (rModel != null && rModel.result != null && rModel.result.result != null) { var result2 = rModel.result.result; error = ""; rdatas = result2.pageItems; totalPage = result2.totalItemNum % 100 > 0 ? (result2.totalItemNum / 100 + 1) : (result2.totalItemNum / 100); } else { totalPage = 0; error = "接口未返回数据"; return null; } } } } catch (Exception ex) { error = ex.Message; totalPage = 0; } return rdatas; } /// /// 获取订单收货地址 /// /// /// public ReceiveResult GetOrderReceiveInfo(string orderno) { var rdata = new ReceiveResult(); try { //var timeStamp = DateTimeOffset.Now.ToUnixTimeSeconds(); long timeStamp = (long)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds; var apiType = "bg.order.shippinginfo.get"; var bodyStrArr = new string[] { "access_token" + AccessToken, "app_key" + AppKey, "data_typeJSON", "parentOrderSn" + orderno, "timestamp" + timeStamp, "type" + apiType }; var bodyStr = AppSecret + string.Join("", bodyStrArr) + AppSecret; var sign = EncryptionHelp.GetMD5(bodyStr); var body = new { access_token = AccessToken, app_key = AppKey, data_type = "JSON", parentOrderSn = orderno, timestamp = timeStamp, type = apiType, sign = sign.ToUpper(), }; var json = JsonConvert.Serialize(body); var path = EncryptionHelp.EncryptString(json, "ThisIsShopifyKey12365498"); var path2 = HttpUtility.UrlEncode(path); var url = IP + "/api/TemuHelp/getTemuShopOrderReceiveInfo?bodyStr=" + path2; //using (HttpClient client = new HttpClient()) //{ // HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, url); // var response = client.SendAsync(request); // string responseContent = response.Result.Content.ReadAsStringAsync().GetAwaiter().GetResult(); // if (string.IsNullOrEmpty(responseContent) || responseContent == "Fail") // { // return null; // } // else // { // var rModel = JsonConvert.Deserialize(responseContent); // if (rModel != null && rModel.result != null && rModel.result.result != null) // { // ReceiveResult result = rModel.result.result; // rdata = result; // } // else // { // return null; // } // } //} using (WebClient client = new WebClient()) { client.Encoding = Encoding.UTF8; // 指定下载内容编码方式为 UTF-8 string responseContent = client.DownloadString(url); if (string.IsNullOrEmpty(responseContent) || responseContent == "Fail") { return null; } else { var rModel = JsonConvert.Deserialize(responseContent); if (rModel != null && rModel.result != null && rModel.result.result != null) { ReceiveResult result = rModel.result.result; rdata = result; } else { return null; } } } } catch (Exception ex) { } return rdata; } /// /// 获取订单发货信息 /// /// /// public List GetOrderShipmentInfo(string parentOrderSn, string orderSn) { var rdata = new List(); if(parentOrderSn== "PO-211-19061389486712336") { } try { long timeStamp = (long)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds; var apiType = "bg.logistics.shipment.get"; var bodyStrArr = new string[] { "access_token" + AccessToken, "app_key" + AppKey, "data_typeJSON", "orderSn" + orderSn, "parentOrderSn" + parentOrderSn, "timestamp" + timeStamp, "type" + apiType }; var bodyStr = AppSecret + string.Join("", bodyStrArr) + AppSecret; var sign = EncryptionHelp.GetMD5(bodyStr); var body = new { access_token = AccessToken, app_key = AppKey, data_type = "JSON", orderSn= orderSn, parentOrderSn = parentOrderSn, timestamp = timeStamp, type = apiType, sign = sign.ToUpper(), }; var json = JsonConvert.Serialize(body); var path = EncryptionHelp.EncryptString(json, "ThisIsShopifyKey12365498"); var path2 = HttpUtility.UrlEncode(path); var url = IP + "/api/TemuHelp/getTemuShopOrderShipmentInfo?bodyStr=" + path2; //using (HttpClient client = new HttpClient()) //{ // HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, url); // var response = client.SendAsync(request); // string responseContent = response.Result.Content.ReadAsStringAsync().GetAwaiter().GetResult(); using (WebClient client = new WebClient()) { client.Encoding = Encoding.UTF8; // 指定下载内容编码方式为 UTF-8 string responseContent = client.DownloadString(url); if (string.IsNullOrEmpty(responseContent) || responseContent == "Fail") { return null; } else { var rModel = JsonConvert.Deserialize(responseContent); if (rModel != null && rModel.result != null && rModel.result.result != null) { ShipmentInfoResult2 result = rModel.result.result; if (result.shipmentInfoDTO != null) rdata = result.shipmentInfoDTO; else rdata = null; } else { return null; } } } } catch (Exception ex) { } return rdata; } public OrderModel ToOrderModel(TemuOrderPageItems topi, ReceiveResult rer) { try { OrderModel model = new OrderModel(); model.PlatOrderCode = topi.parentOrderMap.parentOrderSn; model.OrderCode = topi.parentOrderMap.parentOrderSn; model.OrderDate = GetDateTimeFromTimeStamp(topi.parentOrderMap.parentOrderTime.Value); model.OrderState = 1; if (rer != null) { model.BuyerName = rer.receiptName; model.BuyerCountry = rer.regionName1; model.BuyerProvince = rer.regionName2; model.BuyerCity = rer.regionName3; model.BuyerAddr = string.IsNullOrEmpty(rer.addressLineAll) ? (rer.addressLine1 + rer.addressLine2) : rer.addressLineAll; model.BuyerPhone = rer.mobile; model.BuyerZip = rer.postCode; } model.PayDate = model.OrderDate.Value; model.OutOrderDate = GetDateTimeFromTimeStamp(topi.parentOrderMap.expectShipLatestTime.Value); model.ListModel = new List(); decimal totalPrice = 0; //删除 DataNew.DeleteTemuShopOrderGoodsDetailByParentOrderSn(topi.parentOrderMap.parentOrderSn); if (topi.orderList!=null) { foreach (var item2 in topi.orderList) { OrderDetailModel model2 = new OrderDetailModel(); model2.TypeDesc = item2.spec; model2.GoodsNum = item2.quantity; model2.OrderItemId = item2.productList != null ? item2.productList.First().productId : "";//SPUID if (shopid == 94)//没有主体的店铺没有SPUID,SKUID做为唯一 { model2.OrderItemId = item2.skuId; } model2.GoodsName = item2.goodsId + "," + item2.skuId;//goodsId,skuId model2.GoodsSKU = item2.productList != null ? item2.productList.First().extCode : ""; model2.PostInfo = item2.orderSn; model.ListModel.Add(model2); if (!string.IsNullOrEmpty(model2.OrderItemId)) { var temuPrice = DataNew.GetTemuShopGoodPriceOne(shopid, model2.OrderItemId); if (temuPrice != null) totalPrice = totalPrice + (temuPrice.SalePrice.HasValue ? temuPrice.SalePrice.Value * item2.quantity : 0); } var temuOGD = new TemuShopOrderGoodsDetail() { Shopid = shopid, ParentOrderSn = topi.parentOrderMap.parentOrderSn, OrderSn = item2.orderSn, OrderStatus = item2.orderStatus, GoodsId = item2.goodsId, SKUId = item2.skuId, ThumbUrl = item2.thumbUrl, Quantity = item2.quantity, GoodsName = item2.goodsName, ProductList = item2.productList == null ? "" : JsonConvert.Serialize(item2.productList) }; DataNew.SaveTemuShopOrderGoodsDetail(temuOGD); } } model.TotalPrice = totalPrice; model.MoneyCode = "USD"; return model; } catch (Exception ex) { ErrorFollow.TraceWrite(ex.TargetSite.Name, ex.StackTrace, ex.Message); return null; } } public DateTime GetDateTimeFromTimeStamp(long st) { DateTime dtStart = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1)); long lTime = long.Parse(st + "0000000"); TimeSpan toNow = new TimeSpan(lTime); return dtStart.Add(toNow); } #region 订单列表model public class TemuOrdersReturn { public bool success { get; set; } public string requestId { get; set; } public int errorCode { get; set; } public string errorMsg { get; set; } public TemuOrderResult1 result { get; set; } } public class TemuOrderResult1 { public bool success { get; set; } public int errorCode { get; set; } public long serverTime { get; set; } public string errorMsg { get; set; } public TemuOrderResult2 result { get; set; } } public class TemuOrderResult2 { public int totalItemNum { get; set; } public List pageItems { get; set; } } public class TemuOrderPageItems { public ParentOrderMap parentOrderMap { get; set; } public List orderList { get; set; } } public class ParentOrderMap { public int regionId { get; set; } public string parentOrderSn { get; set; } public long? parentShippingTime { get; set; } public int? siteId { get; set; } public long? expectShipLatestTime { get; set; } public int? parentOrderStatus { get; set; } public long? parentOrderTime { get; set; } } public class TemuOrderModel { public int quantity { get; set; } public string orderSn { get; set; } public string goodsId { get;set; } public int orderStatus { get; set; } public string thumbUrl { get;set; } public string goodsName { get;set; } public string skuId { get; set; } public string spec { get; set; } public List productList { get; set; } } public class TemuOrderProduct { public string productSkuId { get; set; } public int soldFactor { get; set; } public string extCode { get; set; } public string productId { get; set; } } #endregion #region 订单收货地址model public class TemuReceiveReturn { public TemuReceiveResult1 result { get; set; } } public class TemuReceiveResult1 { public bool success { get; set; } public int errorCode { get; set; } public long serverTime { get; set; } public string errorMsg { get; set; } public ReceiveResult result { get; set; } } public class ReceiveResult { public string receiptName { get; set; } public string mobile { get; set; } public string regionName1 { get; set; } public string regionName2 { get; set; } public string regionName3 { get; set;} public string addressLine1 { get; set; } public string addressLine2 { get; set;} public string postCode { get; set; } public string addressLineAll { get; set; } } #endregion #region 订单发货信息model //public class TemuShipmentReturn //{ // public TemuShipmentResult1 result { get; set; } //} //public class TemuShipmentResult1 //{ // public bool success { get; set; } // public int errorCode { get; set; } // public long serverTime { get; set; } // public string errorMsg { get; set; } // public ShipmentResult result { get; set; } //} //public class ShipmentResult //{ // public List shipmentInfoDTO { get; set; } //} //public class DeliveryInfoMap //{ // public string carrierId { get; set; } // public string carrierName { get; set; } // public string trackingNumber { get; set; } // public string skuId { get; set; } // public string quantity { get; set; } //} //如果好用,请收藏地址,帮忙分享。 public class ShipmentInfoDTOItem { /// /// /// public int quantity { get; set; } /// /// /// public string carrierName { get; set; } /// /// /// public string carrierId { get; set; } /// /// /// public string trackingNumber { get; set; } /// /// /// public string skuId { get; set; } } public class ShipmentInfoResult2 { /// /// /// public List shipmentInfoDTO { get; set; } } public class ShipmentInfoResult1 { /// /// /// public ShipmentInfoResult2 result { get; set; } /// /// /// public string success { get; set; } /// /// /// public string errorCode { get; set; } /// /// /// public long serverTime { get; set; } /// /// /// public string errorMsg { get; set; } } public class TemuShipmentReturn { /// /// /// public ShipmentInfoResult1 result { get; set; } /// /// /// public string success { get; set; } /// /// /// public string requestId { get; set; } /// /// /// public string errorCode { get; set; } /// /// /// public string errorMsg { get; set; } } #endregion } }