using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Text; using System.Threading.Tasks; using Newtonsoft.Json.Linq; using Newtonsoft.Json; using System.Collections; namespace RetailCrm { public class RestApi { protected string apiUrl; protected string apiKey; protected string apiVersion = "3"; protected DateTime generatedAt; protected Dictionary parameters; private string userAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)"; private string contentType = "application/x-www-form-urlencoded"; /// адрес CRM /// ключ для работы с api public RestApi(string crmUrl, string crmKey) { apiUrl = crmUrl + "/api/v" + apiVersion + "/"; apiKey = crmKey; parameters = new Dictionary(); parameters.Add("apiKey", apiKey); } /// /// Получение заказа по id /// /// идентификатор заказа /// поиск заказа по id или externalId /// информация о заказе public Dictionary orderGet(int id, string by) { Dictionary result = new Dictionary(); string url = apiUrl + "orders/" + id.ToString(); if (by.Equals("externalId")) { parameters.Add("by", by); } result = request(url, "GET"); return result; } /// /// Создание заказа /// /// информация о заказе /// public Dictionary orderCreate(Dictionary order) { Dictionary result = new Dictionary(); string url = apiUrl + "orders/create"; string dataJson = JsonConvert.SerializeObject(order); parameters.Add("order", dataJson); result = request(url, "POST"); return result; } /// /// Изменение заказа /// /// информация о заказе /// public Dictionary orderEdit(Dictionary order) { Dictionary result = new Dictionary(); string url = apiUrl + "orders/" + order["externalId"].ToString() + "/edit"; string dataJson = JsonConvert.SerializeObject(order); parameters.Add("order", dataJson); result = request(url, "POST"); return result; } /// /// Пакетная загрузка заказов /// /// массив заказов /// public Dictionary orderUpload(Dictionary orders) { Dictionary result = new Dictionary(); string url = apiUrl + "orders/upload"; string dataJson = JsonConvert.SerializeObject(orders); parameters.Add("orders", dataJson); result = request(url, "POST"); if (result.ContainsKey("uploadedOrders") && result != null) { return getDictionary(result["uploadedOrders"]); } return result; } /// /// Обновление externalId у заказов с переданными id /// /// массив, содержащий id и externalId заказа /// public Dictionary orderFixExternalIds(Dictionary orders) { Dictionary result = new Dictionary(); string url = apiUrl + "orders/fix-external-ids"; string dataJson = JsonConvert.SerializeObject(orders); parameters.Add("orders", dataJson); result = request(url, "POST"); return result; } /// /// Получение последних измененных заказов /// /// начальная дата выборки /// конечная дата /// ограничение на размер выборки /// сдвиг /// массив заказов public Dictionary orderHistory(DateTime startDate, DateTime endDate, int limit, int offset) { Dictionary result = new Dictionary(); string url = apiUrl + "orders/history"; parameters.Add("startDate", startDate.ToString()); parameters.Add("startDate", endDate.ToString()); parameters.Add("limit", limit.ToString()); parameters.Add("offset", offset.ToString()); result = request(url, "GET"); return result; } /// /// Получение клиента по id /// /// идентификатор /// поиск заказа по id или externalId /// информация о клиенте public Dictionary customerGet(string id, string by) { Dictionary result = new Dictionary(); string url = apiUrl + "customers/" + id; if (by.Equals("externalId")) { parameters.Add("by", by); } result = request(url, "GET"); return result; } /// /// Получение списка клиентов в соответсвии с запросом /// /// телефон /// почтовый адрес /// фио пользователя /// ограничение на размер выборки /// сдвиг /// массив клиентов public Dictionary customers(string phone, string email, string fio, int limit, int offset) { Dictionary result = new Dictionary(); string url = apiUrl + "customers"; parameters.Add("phone", phone); parameters.Add("email", email); parameters.Add("fio", fio); parameters.Add("limit", limit.ToString()); parameters.Add("offset", offset.ToString()); result = request(url, "GET"); return result; } /// /// Создание клиента /// /// информация о клиенте /// public Dictionary customerCreate(Dictionary customer) { Dictionary result = new Dictionary(); string url = apiUrl + "customers/create"; string dataJson = JsonConvert.SerializeObject(customer); parameters.Add("customer", dataJson); result = request(url, "POST"); return result; } /// /// Редактирование клиента /// /// информация о клиенте /// public Dictionary customerEdit(Dictionary customer) { Dictionary result = new Dictionary(); string url = apiUrl + "customers/" + customer["externalId"].ToString() + "/edit"; string dataJson = JsonConvert.SerializeObject(customer); parameters.Add("customer", dataJson); result = request(url, "POST"); return result; } /// /// Пакетная загрузка клиентов /// /// массив клиентов /// public Dictionary customerUpload(Dictionary customers) { Dictionary result = new Dictionary(); string url = apiUrl + "customers/upload"; string dataJson = JsonConvert.SerializeObject(customers); parameters.Add("customers", dataJson); result = request(url, "POST"); if (result.ContainsKey("uploaded") && result != null) { return getDictionary(result["uploaded"]); } return result; } /// /// Обновление externalId у клиентов с переданными id /// /// массив, содержащий id и externalId заказа /// public Dictionary customerFixExternalIds(Dictionary customers) { Dictionary result = new Dictionary(); string url = apiUrl + "customers/fix-external-ids"; string dataJson = JsonConvert.SerializeObject(customers); parameters.Add("customers", dataJson); result = request(url, "POST"); return result; } /// /// Получение списка заказов клиента /// /// идентификатор клиента /// начальная дата выборки /// конечная дата /// ограничение на размер выборки /// сдвиг /// поиск заказа по id или externalId /// массив заказов public Dictionary customerOrdersList(string id, DateTime startDate, DateTime endDate, int limit, int offset, string by) { Dictionary result = new Dictionary(); string url = apiUrl + "customers/" + id + "/orders"; if (by.Equals("externalId")) { parameters.Add("by", by); } parameters.Add("startDate", startDate.ToString()); parameters.Add("endDate", endDate.ToString()); parameters.Add("limit", limit.ToString()); parameters.Add("offset", offset.ToString()); result = request(url, "POST"); return result; } /// /// Получение списка типов доставки /// /// массив типов доставки public Dictionary deliveryTypesList() { Dictionary result = new Dictionary(); string url = apiUrl + "reference/delivery-types"; result = request(url, "GET"); return result; } /// /// Редактирование типа доставки /// /// информация о типе доставки /// public Dictionary deliveryTypeEdit(Dictionary deliveryType) { Dictionary result = new Dictionary(); string url = apiUrl + "reference/delivery-types/" + deliveryType["code"].ToString() + "/edit"; string dataJson = JsonConvert.SerializeObject(deliveryType); parameters.Add("deliveryType", dataJson); result = request(url, "POST"); return result; } /// /// Получение списка служб доставки /// /// массив служб доставки public Dictionary deliveryServicesList() { Dictionary result = new Dictionary(); string url = apiUrl + "reference/delivery-services"; result = request(url, "GET"); return result; } /// /// Редактирование службы доставки /// /// информация о службе доставки /// public Dictionary deliveryServiceEdit(Dictionary deliveryService) { Dictionary result = new Dictionary(); string url = apiUrl + "reference/delivery-services/" + deliveryService["code"].ToString() + "/edit"; string dataJson = JsonConvert.SerializeObject(deliveryService); parameters.Add("deliveryService", dataJson); result = request(url, "POST"); return result; } /// /// Получение списка типов оплаты /// /// массив типов оплаты public Dictionary paymentTypesList() { Dictionary result = new Dictionary(); string url = apiUrl + "reference/payment-types"; result = request(url, "GET"); return result; } /// /// Редактирование типа оплаты /// /// информация о типе оплаты /// public Dictionary paymentTypesEdit(Dictionary paymentType) { Dictionary result = new Dictionary(); string url = apiUrl + "reference/payment-types/" + paymentType["code"].ToString() + "/edit"; string dataJson = JsonConvert.SerializeObject(paymentType); parameters.Add("paymentType", dataJson); result = request(url, "POST"); return result; } /// /// Получение списка статусов оплаты /// /// массив статусов оплаты public Dictionary paymentStatusesList() { Dictionary result = new Dictionary(); string url = apiUrl + "reference/payment-statuses"; result = request(url, "GET"); return result; } /// /// Редактирование статуса оплаты /// /// информация о статусе оплаты /// public Dictionary paymentStatusesEdit(Dictionary paymentStatus) { Dictionary result = new Dictionary(); string url = apiUrl + "reference/payment-statuses/" + paymentStatus["code"].ToString() + "/edit"; string dataJson = JsonConvert.SerializeObject(paymentStatus); parameters.Add("paymentStatus", dataJson); result = request(url, "POST"); return result; } /// /// Получение списка типов заказа /// /// массив типов заказа public Dictionary orderTypesList() { Dictionary result = new Dictionary(); string url = apiUrl + "reference/order-types"; result = request(url, "GET"); return result; } /// /// Редактирование типа заказа /// /// информация о типе заказа /// public Dictionary orderTypesEdit(Dictionary orderType) { Dictionary result = new Dictionary(); string url = apiUrl + "reference/order-types/" + orderType["code"].ToString() + "/edit"; string dataJson = JsonConvert.SerializeObject(orderType); parameters.Add("orderType", dataJson); result = request(url, "POST"); return result; } /// /// Получение списка способов оформления заказа /// /// массив способов оформления заказа public Dictionary orderMethodsList() { Dictionary result = new Dictionary(); string url = apiUrl + "reference/order-methods"; result = request(url, "GET"); return result; } /// /// Редактирование способа оформления заказа /// /// информация о способе оформления заказа /// public Dictionary orderMethodsEdit(Dictionary orderMethod) { Dictionary result = new Dictionary(); string url = apiUrl + "reference/order-methods/" + orderMethod["code"].ToString() + "/edit"; string dataJson = JsonConvert.SerializeObject(orderMethod); parameters.Add("orderMethod", dataJson); result = request(url, "POST"); return result; } /// /// Получение списка статусов заказа /// /// массив статусов заказа public Dictionary orderStatusesList() { Dictionary result = new Dictionary(); string url = apiUrl + "reference/statuses"; result = request(url, "GET"); return result; } /// /// Редактирование статуса заказа /// /// информация о статусе заказа /// public Dictionary orderStatusEdit(Dictionary status) { Dictionary result = new Dictionary(); string url = apiUrl + "reference/statuses/" + status["code"].ToString() + "/edit"; string dataJson = JsonConvert.SerializeObject(status); parameters.Add("status", dataJson); result = request(url, "POST"); return result; } /// /// Получение списка групп статусов заказа /// /// массив групп статусов заказа public Dictionary orderStatusGroupsList() { Dictionary result = new Dictionary(); string url = apiUrl + "reference/status-groups"; result = request(url, "GET"); return result; } /// /// Обновление статистики /// /// статус выполненного обновления public Dictionary statisticUpdate() { Dictionary result = new Dictionary(); string url = apiUrl + "statistic/update"; result = request(url, "GET"); return result; } /// дата генерации public DateTime getGeneratedAt() { return generatedAt; } /// /// /// protected Dictionary request(string url, string method) { Dictionary data = new Dictionary(); string urlParameters = httpBuildQuery(parameters); if (method.Equals("GET") && urlParameters.Length > 0) { url += "?" + urlParameters; } Exception exception = null; HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); request.Method = method; if (method.Equals("POST")) { UTF8Encoding encoding = new UTF8Encoding(); byte[] postBytes = encoding.GetBytes(urlParameters); request.ContentType = contentType; request.ContentLength = postBytes.Length; request.UserAgent = userAgent; Stream postStream = request.GetRequestStream(); postStream.Write(postBytes, 0, postBytes.Length); postStream.Flush(); postStream.Close(); } HttpWebResponse response = null; try { response = (HttpWebResponse)request.GetResponse(); } catch (WebException ex) { response = (HttpWebResponse)ex.Response; exception = ex; } if (request == null || response == null) { throw new CurlException(exception.ToString(), exception); } int statusCode = (int)response.StatusCode; Stream dataStream = response.GetResponseStream(); StreamReader reader = new StreamReader(dataStream); string serverResponse = reader.ReadToEnd(); parameters.Clear(); parameters.Add("apiKey", apiKey); data = jsonDecode(serverResponse); if (data.ContainsKey("generatedAt")) { generatedAt = DateTime.ParseExact(data["generatedAt"].ToString(), "Y-m-d H:i:s", System.Globalization.CultureInfo.InvariantCulture); data.Remove("generatedAt"); } if (statusCode >= 400 || (data.ContainsKey("success") && !(bool)data["success"])) { throw new ApiException(getErrorMessage(data)); } data.Remove("success"); if (data.Count == 0) { return null; } return data; } /// /// protected string getErrorMessage(Dictionary data) { string error = ""; if (data.ContainsKey("message")) { error = data["message"].ToString(); } else if (data.ContainsKey("0")) { Dictionary sub = getDictionary(data["0"]); if (sub.ContainsKey("message")) { error = sub["message"].ToString(); } } else if (data.ContainsKey("errorMsg")) { error = data["errorMsg"].ToString(); } else if (data.ContainsKey("error")) { Dictionary sub = getDictionary(data["error"]); if (sub.ContainsKey("message")) { error = sub["message"].ToString(); } } if (data.ContainsKey("errors")) { Dictionary sub = getDictionary(data["errors"]); foreach (KeyValuePair kvp in data) { error += ". " + kvp.Value.ToString(); } } return error; } /// /// public Dictionary getDictionary(object data) { Dictionary result = new Dictionary(); IDictionary idict = (IDictionary)data; foreach (object key in idict.Keys) { result.Add(key.ToString(), idict[key]); } return result; } /// /// protected Dictionary jsonDecode(string json) { Dictionary data = new Dictionary(); data = JsonConvert.DeserializeObject>(json); data = jsonToDictionary(data); return data; } /// /// protected static Dictionary jsonToDictionary(Dictionary data) { Dictionary result = new Dictionary(); foreach (KeyValuePair kvp in data) { string key = kvp.Key; object value = kvp.Value; if (value.GetType() == typeof(JObject)) { Dictionary valueJson = JsonConvert.DeserializeObject>(value.ToString()); value = jsonToDictionary(valueJson); } result.Add(key, value); } return result; } /// /// protected string httpBuildQuery(Dictionary data) { string queryString = null; foreach (KeyValuePair kvp in data) { queryString += kvp.Key + "=" + kvp.Value + "&"; } if (queryString.Length > 0) { queryString = queryString.Substring(0, queryString.Length - 1); } return queryString; } } }