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

763 lines
25 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Security.Cryptography;
using System.Text;
using NetLibrary.OnlineTrade;
using NetLibrary;
using System.Web.Script.Serialization;
namespace TradeManageNew
{
public class ShopeeApi
{
/// <summary>
/// 是否测试 默认false正式 false正式 true测试
/// </summary>
private bool IsTest = false;
public int Partner_Id = 0;
public string Partner_Key = "";
public int shopid = 0;
/// <summary>
/// 域名
/// </summary>
public string HostUrl = "";
//public ShopeeApi(bool isTest = false)
//{
// IsTest = isTest;
// if (!IsTest) {
// HostUrl = "https://partner.shopeemobile.com";
// Partner_Id = 846936;
// Partner_Key = "660400cc224f0cfef1fcd409f9ccfe57c507c3be9bf173592fc8c9bc01e6b150";
// }
// else {
// HostUrl = "https://partner.uat.shopeemobile.com";//测试
// Partner_Id = 845572;
// Partner_Key = "e2ff57deae953f738a160f74bbe29f4c4c37f475c77ebe0228b216c9f354a6ae";
// }
//}
/// token计算
/// </summary>
/// <param name="strData"></param>
/// <returns></returns>
public static string GetSHA256HashFromString(string strData) {
byte[] bytValue = System.Text.Encoding.UTF8.GetBytes(strData);
SHA256 sha256 = new SHA256CryptoServiceProvider();
byte[] retVal = sha256.ComputeHash(bytValue);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < retVal.Length; i++) {
sb.Append(retVal[i].ToString("x2"));
}
return sb.ToString();
}
public static string CreateToken(string message, string secret)
{
secret = secret ?? "";
var encoding = new System.Text.UTF8Encoding();
byte[] keyByte = encoding.GetBytes(secret);
byte[] messageBytes = encoding.GetBytes(message);
using (var hmacsha256 = new HMACSHA256(keyByte))
{
byte[] hashmessage = hmacsha256.ComputeHash(messageBytes);
StringBuilder builder = new StringBuilder();
for (int i = 0; i < hashmessage.Length; i++)
{
builder.Append(hashmessage[i].ToString("x2"));
}
return builder.ToString();
}
}
/// <summary>
/// 生成签名
/// </summary>
public static string CreateSignature(string url, string data, string signKey) {
var str = url + "|" + data;
return HmacSHA256(str, signKey).ToLower();
}
/// 加密算法HmacSHA256
/// </summary>
/// <param name="secret"></param>
/// <param name="signKey"></param>
/// <returns></returns>
public static string HmacSHA256(string secret, string signKey) {
string signRet = string.Empty;
using (HMACSHA256 mac = new HMACSHA256(Encoding.UTF8.GetBytes(signKey))) {
byte[] hash = mac.ComputeHash(Encoding.UTF8.GetBytes(secret));
signRet = ToHexString(hash);
}
return signRet;
}
/// <summary>
/// byte[]转16进制格式string
/// </summary>
public static string ToHexString(byte[] bytes) {
string hexString = string.Empty;
if (bytes != null) {
StringBuilder strB = new StringBuilder();
foreach (byte b in bytes) {
strB.AppendFormat("{0:x2}", b);
}
hexString = strB.ToString();
}
return hexString;
}
#region 读取订单
public List<OrderModel> GetOrders(out string ErrorMessage)
{
string Url = "https://partner.shopeemobile.com/api/v1/orders/basics";
List<OrderModel> ListModel = new List<OrderModel>();
#region 设置市场所在地借口地址
//switch (country)
//{
// case "印尼":
// Url = "https://api.sellercenter.lazada.co.id";
// break;
// case "马来":
// Url = "https://api.sellercenter.lazada.com.my";
// break;
// case "泰国":
// Url = "https://api.sellercenter.lazada.co.th";
// break;
// case "菲律宾":
// Url = "https://api.sellercenter.lazada.com.ph";
// break;
// case "新加坡":
// Url = "https://api.sellercenter.lazada.sg";
// break;
// case "越南":
// Url = "https://api.sellercenter.lazada.vn";
// break;
//}
#endregion
var param = new Dictionary<string, object>();
param.Add("partner_id",Partner_Id);
param.Add("update_time_to", GetTimeStamp(DateTime.Now));
param.Add("update_time_from", GetTimeStamp(DateTime.Now.AddDays(-7)));
//param.Add("Status", "pending");
param.Add("shopid",shopid);
param.Add("pagination_offset", 0);
param.Add("timestamp",GetTimeStamp(DateTime.Now));
param.Add("pagination_entries_per_page",50);
string surl ="";
if (param != null)
{
foreach (var item in param)
{
surl += item.Key + "=" + item.Value + "&";
}
}
surl = surl.TrimEnd('&');
var JsonConvert = new JavaScriptSerializer();
var sign = CreateSignature(Url, JsonConvert.Serialize(param), Partner_Key);
string postmessage = JsonConvert.Serialize(param);
List<string> ListHeader = new List<string>();
ListHeader.Add("Authorization:" + sign);
//string sss = postmessage.Substring(1087, 50);
UTF8Encoding encoding = new UTF8Encoding();
byte[] data = encoding.GetBytes(postmessage);
string XmlContent = CustomIO.HttpRequest2(Url, "Post", "application/json;charset=UTF-8", ListHeader, System.Net.HttpVersion.Version10, data, out ErrorMessage);
if (string.IsNullOrEmpty(ErrorMessage) == false)
{
return null;
}
var smd = JsonConvert.Deserialize<ShopeeOrdersRoot>(XmlContent);
bool flag = false;
if(smd!=null&&smd.more==true)
flag = true;
if (smd != null && smd.orders!=null)
{
List<string> olist = new List<string>();
foreach (var omd in smd.orders)
{
if (omd.order_status == "READY_TO_SHIP")
{
olist.Add(omd.ordersn);
}
}
var dlist=GetOrdersdetail(olist, out ErrorMessage);
if (dlist != null)
{
foreach (var dmd in dlist)
{
ListModel.Add(dmd);
}
}
}
int pagination_offset = 0;
while (flag)
{
pagination_offset += 50;
param = new Dictionary<string, object>();
param.Add("partner_id", Partner_Id);
param.Add("update_time_to", GetTimeStamp(DateTime.Now));
param.Add("update_time_from", GetTimeStamp(DateTime.Now.AddDays(-7)));
//param.Add("Status", "pending");
param.Add("shopid", shopid);
param.Add("pagination_offset", pagination_offset);
param.Add("timestamp", GetTimeStamp(DateTime.Now));
param.Add("pagination_entries_per_page", 50);
surl = "";
if (param != null)
{
foreach (var item in param)
{
surl += item.Key + "=" + item.Value + "&";
}
}
surl = surl.TrimEnd('&');
sign = CreateSignature(Url, JsonConvert.Serialize(param), Partner_Key);
postmessage = JsonConvert.Serialize(param);
ListHeader = new List<string>();
ListHeader.Add("Authorization:" + sign);
//string sss = postmessage.Substring(1087, 50);
data = encoding.GetBytes(postmessage);
XmlContent = CustomIO.HttpRequest2(Url, "Post", "application/json;charset=UTF-8", ListHeader, System.Net.HttpVersion.Version10, data, out ErrorMessage);
smd = JsonConvert.Deserialize<ShopeeOrdersRoot>(XmlContent);
flag = false;
if (smd != null && smd.more == true)
flag = true;
if (smd != null && smd.orders != null)
{
List<string> olist = new List<string>();
foreach (var omd in smd.orders)
{
if (omd.order_status == "READY_TO_SHIP")
{
olist.Add(omd.ordersn);
}
}
var dlist = GetOrdersdetail(olist, out ErrorMessage);
if (dlist != null)
{
foreach (var dmd in dlist)
{
ListModel.Add(dmd);
}
}
}
}
return ListModel;
}
#endregion
/// <summary>
/// 时间戳转为C#格式时间
/// </summary>
/// <param name="timeStamp">Unix时间戳格式</param>
/// <returns>C#格式时间</returns>
public static DateTime GetStampTimeToDate(string timeStamp)
{
DateTime dtStart = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1));
long lTime = long.Parse(timeStamp + "0000000");
TimeSpan toNow = new TimeSpan(lTime);
return dtStart.Add(toNow);
}
#region 读取订单
public List<OrderModel> GetOrdersdetail(List<string> olist,out string ErrorMessage)
{
string Url = "https://partner.shopeemobile.com/api/v1/orders/detail";
List<OrderModel> ListModel = new List<OrderModel>();
var param = new Dictionary<string, object>();
// List<string> os = new List<string>();
// os.Add("210225SWK6PJP8");
param.Add("ordersn_list", olist);
param.Add("partner_id", Partner_Id);
param.Add("shopid", shopid);
param.Add("timestamp", GetTimeStamp(DateTime.Now));
string surl = "";
if (param != null)
{
foreach (var item in param)
{
surl += item.Key + "=" + item.Value + "&";
}
}
surl = surl.TrimEnd('&');
var JsonConvert = new JavaScriptSerializer();
var sign = CreateSignature(Url, JsonConvert.Serialize(param), Partner_Key);
string postmessage = JsonConvert.Serialize(param);
List<string> ListHeader = new List<string>();
ListHeader.Add("Authorization:" + sign);
//string sss = postmessage.Substring(1087, 50);
UTF8Encoding encoding = new UTF8Encoding();
byte[] data = encoding.GetBytes(postmessage);
string XmlContent = CustomIO.HttpRequest2(Url, "Post", "application/json;charset=UTF-8", ListHeader, System.Net.HttpVersion.Version10, data, out ErrorMessage);
if (string.IsNullOrEmpty(ErrorMessage) == false)
{
return null;
}
var smd = JsonConvert.Deserialize<ShopeeRoot>(XmlContent);
if (smd != null)
{
if (smd.orders != null)
{
foreach (var ordermd in smd.orders)
{
OrderModel model = new OrderModel();
model.OrderCode = ordermd.ordersn.ToString();
//if (model.OrderCode == "190206133129H0M")
//{
// string a = "1";
//}
model.TotalPrice = Convert.ToDecimal(ordermd.total_amount);
model.MoneyCode = ordermd.currency;
model.OrderDate = GetStampTimeToDate(ordermd.create_time.ToString());
model.BuyerID = "";
model.OrderState = 2;
if (ordermd.recipient_address != null)
model.BuyerName = ordermd.recipient_address.name;
if (ordermd.recipient_address != null)
model.BuyerCountry = ordermd.recipient_address.country;
if (model.BuyerCountry == null || model.BuyerCountry == "")
model.BuyerCountry = ordermd.country;
if (ordermd.recipient_address != null)
model.BuyerAddr = ordermd.recipient_address.full_address;
model.BuyerPhone = "";
model.BuyerPhone = ordermd.recipient_address.phone;
model.BuyerMobile = "";
model.BuyerMail = "";
//model.logisticsAmount =ordermd.buyerInfo.logisticsAmount;
if (ordermd.escrow_tax != null)
{
model.escrowFee = Convert.ToDecimal(ordermd.escrow_tax);
// model.TotalPrice = Convert.ToDecimal(ordermd.escrow_amount);
}
if (ordermd.escrow_amount != null && ordermd.escrow_amount != "")
model.TotalPrice = Convert.ToDecimal(ordermd.escrow_amount);
model.BuyerFax = "";
if (ordermd.recipient_address != null)
model.BuyerZip = ordermd.recipient_address.zipcode;
if (ordermd.recipient_address != null)
model.BuyerProvince = ordermd.recipient_address.state;
if (ordermd.recipient_address != null)
model.BuyerCity = ordermd.recipient_address.city;
if (ordermd.recipient_address != null)
model.BuyerArea = ordermd.recipient_address.district;
model.OrderRemark = ""; //memo
model.LeaveWord = ordermd.message_to_seller;
model.PayDate = model.OrderDate;
model.OutOrderDate = model.OrderDate.Value.AddDays(7);
if (ordermd.days_to_ship != null)
model.OutOrderDate = model.OrderDate.Value.AddDays(ordermd.days_to_ship.Value);
model.PostInfo = ordermd.shipping_carrier;
model.ListModel = new List<OrderDetailModel>();
if (ordermd.items != null)
{
foreach (var item2 in ordermd.items)
{
OrderDetailModel model2 = new OrderDetailModel();
// {"item_name":"Adjustable Kids Safety Harness Wrist Leash Anti-lost Link","item_sku":"\tZHI049","variation_discounted_price":"7.74","variation_id":320874188,"variation_name":"Blue, 250CM","item_id":418147192,
// "variation_quantity_purchased":1,"variation_sku":"\tZHI049","variation_original_price":"8.60"
model2.TypeDesc = item2.variation_sku;
model2.productImgUrl = "";
model2.GoodsNum = item2.variation_quantity_purchased;
if (item2.variation_original_price != null)
model2.GoodsPrice = Convert.ToDecimal(item2.variation_original_price);
model2.MoneyCode = "";
model2.GoodsName = item2.item_name + " " + item2.variation_name;
model2.GoodsSKU = item2.variation_sku;
model2.PostInfo = "";
model.ListModel.Add(model2);
}
}
ListModel.Add(model);
}
}
}
return ListModel;
}
#endregion
private int GetTimeStamp(DateTime dt)
{
DateTime dateStart = new DateTime(1970, 1, 1, 8, 0, 0);
int timeStamp = Convert.ToInt32((dt - dateStart).TotalSeconds);
return timeStamp;
}
}
public class Recipient_address
{
/// <summary>
///
/// </summary>
public string town { get; set; }
/// <summary>
///
/// </summary>
public string city { get; set; }
/// <summary>
///
/// </summary>
public string name { get; set; }
/// <summary>
///
/// </summary>
public string district { get; set; }
/// <summary>
///
/// </summary>
public string country { get; set; }
/// <summary>
///
/// </summary>
public string zipcode { get; set; }
/// <summary>
///
/// </summary>
public string full_address { get; set; }
/// <summary>
///
/// </summary>
public string phone { get; set; }
/// <summary>
///
/// </summary>
public string state { get; set; }
}
public class Items
{
/// <summary>
///
/// </summary>
public string group_id { get; set; }
/// <summary>
///
/// </summary>
public double weight { get; set; }
/// <summary>
///
/// </summary>
public string item_name { get; set; }
/// <summary>
///
/// </summary>
public bool? is_wholesale { get; set; }
/// <summary>
///
/// </summary>
public string promotion_type { get; set; }
/// <summary>
///
/// </summary>
public string item_sku { get; set; }
/// <summary>
///
/// </summary>
public string variation_discounted_price { get; set; }
/// <summary>
///
/// </summary>
public string variation_id { get; set; }
/// <summary>
///
/// </summary>
public string variation_name { get; set; }
/// <summary>
///
/// </summary>
public bool? is_set_item { get; set; }
/// <summary>
///
/// </summary>
public bool? is_add_on_deal { get; set; }
/// <summary>
///
/// </summary>
public string item_id { get; set; }
/// <summary>
///
/// </summary>
public string promotion_id { get; set; }
/// <summary>
///
/// </summary>
public string add_on_deal_id { get; set; }
/// <summary>
///
/// </summary>
public Int32? variation_quantity_purchased { get; set; }
/// <summary>
///
/// </summary>
public string variation_sku { get; set; }
/// <summary>
///
/// </summary>
public string variation_original_price { get; set; }
/// <summary>
///
/// </summary>
public bool? is_main_item { get; set; }
/// <summary>
///
/// </summary>
public string order_item_id { get; set; }
}
public class ShopeeOrdersDeatil
{
/// <summary>
///
/// </summary>
public string estimated_shipping_fee { get; set; }
/// <summary>
///
/// </summary>
public string order_flag { get; set; }
/// <summary>
///
/// </summary>
public string payment_method { get; set; }
/// <summary>
///
/// </summary>
public long? update_time { get; set; }
/// <summary>
///
/// </summary>
public string message_to_seller { get; set; }
/// <summary>
///
/// </summary>
public string shipping_carrier { get; set; }
/// <summary>
///
/// </summary>
public string currency { get; set; }
/// <summary>
///
/// </summary>
public long? create_time { get; set; }
/// <summary>
///
/// </summary>
public long? pay_time { get; set; }
/// <summary>
///
/// </summary>
public string note { get; set; }
/// <summary>
///
/// </summary>
public string credit_card_number { get; set; }
/// <summary>
///
/// </summary>
public int? days_to_ship { get; set; }
/// <summary>
///
/// </summary>
public bool? is_split_up { get; set; }
/// <summary>
///
/// </summary>
public int? ship_by_date { get; set; }
/// <summary>
///
/// </summary>
public string escrow_tax { get; set; }
/// <summary>
///
/// </summary>
public string tracking_no { get; set; }
/// <summary>
///
/// </summary>
public string order_status { get; set; }
/// <summary>
///
/// </summary>
public long? note_update_time { get; set; }
/// <summary>
///
/// </summary>
public string fm_tn { get; set; }
/// <summary>
///
/// </summary>
public string dropshipper_phone { get; set; }
/// <summary>
///
/// </summary>
public string cancel_reason { get; set; }
/// <summary>
///
/// </summary>
public string checkout_shipping_carrier { get; set; }
/// <summary>
///
/// </summary>
public Recipient_address recipient_address { get; set; }
/// <summary>
///
/// </summary>
public string cancel_by { get; set; }
/// <summary>
///
/// </summary>
public string escrow_amount { get; set; }
/// <summary>
///
/// </summary>
public string buyer_cancel_reason { get; set; }
/// <summary>
///
/// </summary>
public bool? goods_to_declare { get; set; }
/// <summary>
///
/// </summary>
public string lm_tn { get; set; }
/// <summary>
///
/// </summary>
public string total_amount { get; set; }
/// <summary>
///
/// </summary>
public string service_code { get; set; }
/// <summary>
///
/// </summary>
public List<Items> items { get; set; }
/// <summary>
///
/// </summary>
public string actual_shipping_cost { get; set; }
/// <summary>
///
/// </summary>
public bool? cod { get; set; }
/// <summary>
///
/// </summary>
public string country { get; set; }
/// <summary>
///
/// </summary>
public string ordersn { get; set; }
/// <summary>
///
/// </summary>
public string dropshipper { get; set; }
/// <summary>
///
/// </summary>
public bool? is_actual_shipping_fee_confirmed { get; set; }
/// <summary>
///
/// </summary>
public string buyer_username { get; set; }
}
public class ShopeeRoot
{
/// <summary>
///
/// </summary>
public List<string> errors { get; set; }
/// <summary>
///
/// </summary>
public List<ShopeeOrdersDeatil> orders { get; set; }
/// <summary>
///
/// </summary>
public string request_id { get; set; }
}
public class ShopeeOrders
{
/// <summary>
///
/// </summary>
public string ordersn { get; set; }
/// <summary>
///
/// </summary>
public string order_status { get; set; }
/// <summary>
///
/// </summary>
public int update_time { get; set; }
/// <summary>
///
/// </summary>
public bool is_actual_shipping_fee_confirmed { get; set; }
}
public class ShopeeOrdersRoot
{
/// <summary>
///
/// </summary>
public string request_id { get; set; }
/// <summary>
///
/// </summary>
public List<ShopeeOrders> orders { get; set; }
/// <summary>
///
/// </summary>
public bool more { get; set; }
}
}