protected static void ChangeMarketStatusToDelivered(IOrder order) { var status = new YaStatus() { order = new YaStatusOrder() { status = "DELIVERED" } }; var orderId = YaMarketByuingService.GetMarketOrderId(order.OrderID); if (orderId == 0) { return; } MakeRequest(string.Format(MarketApiUrl, YaMarketBuyingSettings.CampaignId, orderId, "json"), JsonConvert.SerializeObject(status, new JsonSerializerSettings() { NullValueHandling = NullValueHandling.Ignore })); }
// POST order/status protected static void Status(string json) { try { var yaOrderStatus = JsonConvert.DeserializeObject <YaMarketOrderStatusRequest>(json); if (yaOrderStatus == null || yaOrderStatus.order == null) { return; } var marketOrderId = yaOrderStatus.order.id.TryParseInt(); var yaOrder = YaMarketByuingService.GetOrder(marketOrderId); if (yaOrder == null) { WriteError("нет заказа с данным id"); return; } var order = OrderService.GetOrder(yaOrder.OrderId); if (order == null) { WriteError("нет заказа с данным id"); return; } var status = string.Format("[{0}] Статус: ", DateTime.Now.ToString("g")); switch (yaOrderStatus.order.status) { case "UNPAID": status += "заказ оформлен, но еще не оплачен (если выбрана оплата при оформлении)"; if (YaMarketBuyingSettings.UpaidStatusId != 0) { OrderService.ChangeOrderStatus(order.OrderID, YaMarketBuyingSettings.UpaidStatusId); order.OrderStatusId = YaMarketBuyingSettings.UpaidStatusId; } break; case "PROCESSING": status += "заказ можно выполнять"; if (YaMarketBuyingSettings.ProcessingStatusId != 0) { OrderService.ChangeOrderStatus(order.OrderID, YaMarketBuyingSettings.ProcessingStatusId); order.OrderStatusId = YaMarketBuyingSettings.ProcessingStatusId; } break; case "CANCELLED": status += "заказ отменен: "; OrderService.ChangeOrderStatus(order.OrderID, OrderService.CanceledOrderStatus); order.OrderStatusId = OrderService.CanceledOrderStatus; if (yaOrderStatus.order.substatus.IsNotEmpty()) { switch (yaOrderStatus.order.substatus) { case "RESERVATION_EXPIRED": status += "покупатель не завершил оформление зарезервированного заказа вовремя"; break; case "USER_NOT_PAID": status += "покупатель не оплатил заказ (для типа оплаты PREPAID)"; break; case "USER_UNREACHABLE": status += "не удалось связаться с покупателем"; break; case "USER_CHANGED_MIND": status += "покупатель отменил заказ по собственным причинам"; break; case "USER_REFUSED_DELIVERY": status += "покупателя не устраивают условия доставки"; break; case "USER_REFUSED_PRODUCT": status += "покупателю не подошел товар"; break; case "SHOP_FAILED": status += "магазин не может выполнить заказ"; break; case "USER_REFUSED_QUALITY": status += "покупателя не устраивает качество товара"; break; case "REPLACING_ORDER": status += "покупатель изменяет состав заказа"; break; case "PROCESSING_EXPIRED": status += "магазин не обработал заказ вовремя"; break; } } break; } var html = new StringBuilder(); var paymentMethod = ""; switch (yaOrderStatus.order.paymentMethod) { case "YANDEX": paymentMethod = "оплата при оформлении"; break; case "SHOP_PREPAID": paymentMethod = "предоплата напрямую магазину (только для Украины)"; break; case "CASH_ON_DELIVERY": paymentMethod = "наличный расчет при получении заказа"; break; case "CARD_ON_DELIVERY": paymentMethod = "оплата банковской картой при получении заказа"; break; } html.AppendFormat("<div>Заказ #{0} изменил свой статус.</div>", yaOrder.OrderId); html.AppendFormat("<div>{0}</div>", status); html.AppendFormat("<div>Дата оформления заказа: {0}</div>", yaOrderStatus.order.creationDate); html.AppendFormat("<div>Валюта: {0}</div>", yaOrderStatus.order.currency == "RUR" ? "российский рубль" : "украинская гривна"); html.AppendFormat("<div>Сумма заказа без учета доставки: {0}</div>", yaOrderStatus.order.itemsTotal); html.AppendFormat("<div>Сумма заказа с учетом доставки: {0}</div>", yaOrderStatus.order.total); html.AppendFormat("<div>Тип оплаты заказа: {0}</div>", yaOrderStatus.order.paymentType == "PREPAID" ? "предоплата" : "постоплата при получении заказа"); html.AppendFormat("<div>Способ оплаты заказа: {0}</div>", paymentMethod); html.AppendFormat("<div>Тестовый: {0}</div>", yaOrderStatus.order.fake ? "Да" : "Нет"); html.AppendFormat("<div>Комментарий к заказу: {0}</div>", yaOrderStatus.order.notes); if (yaOrderStatus.order.buyer != null) { html.Append("<div>Пользователь</div>"); html.AppendFormat("<div>Идентификатор покупателя: {0}</div>", yaOrderStatus.order.buyer.id); html.AppendFormat("<div>Имя покупателя: {0}</div>", yaOrderStatus.order.buyer.firstName); html.AppendFormat("<div>Номер телефона: {0}</div>", yaOrderStatus.order.buyer.phone); html.AppendFormat("<div>Email: {0}</div>", yaOrderStatus.order.buyer.email); html.AppendFormat("<div>Фамилия Отчество: {0} {1}</div>", yaOrderStatus.order.buyer.lastName, yaOrderStatus.order.buyer.middleName); order.OrderCustomer.FirstName = yaOrderStatus.order.buyer.firstName; order.OrderCustomer.MobilePhone = yaOrderStatus.order.buyer.phone; order.OrderCustomer.Email = yaOrderStatus.order.buyer.email; order.OrderCustomer.LastName = (yaOrderStatus.order.buyer.lastName ?? string.Empty) + (yaOrderStatus.order.buyer.middleName ?? string.Empty); OrderService.UpdateOrderCustomer(order.OrderCustomer); } if (yaOrderStatus.order.delivery != null) { html.Append("<div>Доставка</div>"); html.AppendFormat("<div>Метод: {0}</div>", yaOrderStatus.order.delivery.serviceName); html.AppendFormat("<div>Стоимость: {0}</div>", yaOrderStatus.order.delivery.price); html.AppendFormat("<div>Время: {0} до {1}</div>", yaOrderStatus.order.delivery.dates.fromDate, yaOrderStatus.order.delivery.dates.toDate); if (yaOrderStatus.order.delivery.outletId != 0) { html.AppendFormat("<div>Id пункта самовывоза: {0}</div>", yaOrderStatus.order.delivery.outletId); } if (yaOrderStatus.order.delivery.address != null) { html.Append("<div>Адрес</div>"); html.AppendFormat("<div>Страна: {0}</div>", yaOrderStatus.order.delivery.address.country); html.AppendFormat("<div>Город: {0}</div>", yaOrderStatus.order.delivery.address.city); html.AppendFormat("<div>Номер дома: {0}</div>", yaOrderStatus.order.delivery.address.house); if (yaOrderStatus.order.delivery.address.postcode.IsNotEmpty()) { html.AppendFormat("<div>Почтовый индекс: {0}</div>", yaOrderStatus.order.delivery.address.postcode); } if (yaOrderStatus.order.delivery.address.street.IsNotEmpty()) { html.AppendFormat("<div>Улица: {0}</div>", yaOrderStatus.order.delivery.address.street); } if (yaOrderStatus.order.delivery.address.subway.IsNotEmpty()) { html.AppendFormat("<div>Станция метро: {0}</div>", yaOrderStatus.order.delivery.address.subway); } if (yaOrderStatus.order.delivery.address.block.IsNotEmpty()) { html.AppendFormat("<div>Номер корпуса либо строения: {0}</div>", yaOrderStatus.order.delivery.address.block); } if (yaOrderStatus.order.delivery.address.entrance.IsNotEmpty()) { html.AppendFormat("<div>Номер подъезда: {0}</div>", yaOrderStatus.order.delivery.address.entrance); } if (yaOrderStatus.order.delivery.address.entryphone.IsNotEmpty()) { html.AppendFormat("<div>Код домофона: {0}</div>", yaOrderStatus.order.delivery.address.entryphone); } if (yaOrderStatus.order.delivery.address.floor.IsNotEmpty()) { html.AppendFormat("<div>Этаж: {0}</div>", yaOrderStatus.order.delivery.address.floor); } if (yaOrderStatus.order.delivery.address.apartment.IsNotEmpty()) { html.AppendFormat("<div>Номер квартиры либо офиса: {0}</div>", yaOrderStatus.order.delivery.address.apartment); } if (yaOrderStatus.order.delivery.address.recipient.IsNotEmpty()) { html.AppendFormat("<div>ФИО получателя заказа: {0}</div>", yaOrderStatus.order.delivery.address.recipient); } if (yaOrderStatus.order.delivery.address.phone.IsNotEmpty()) { html.AppendFormat("<div>Номер телефона получателя заказа: {0}</div>", yaOrderStatus.order.delivery.address.phone); } } } var result = html.ToString(); order.AdminOrderComment = result.Replace("<div>", "").Replace("</div>", "\r\n"); OrderService.UpdateOrderMain(order); YaMarketByuingService.UpdateOrder(new YaOrder() { MarketOrderId = yaOrder.MarketOrderId, OrderId = order.OrderID, Status = yaOrder.Status + "\r\n------\r\n" + result.Replace("<div>", "").Replace("</div>", "\r\n") }); SendMail.SendMailNow(SettingsMail.EmailForOrders, "Заказ через Яндекс.Маркет. Изменение статуса заказа", result, true); } catch (Exception ex) { Debug.LogError(ex); WriteError(ex.StackTrace); return; } var context = HttpContext.Current; context.Response.ContentType = "application/json"; context.Response.Write("OK"); context.Response.End(); }
// POST /cart protected static void Cart(string json) { var yaCart = JsonConvert.DeserializeObject <YaCart>(json); if (yaCart == null || yaCart.cart == null) { return; } var yaResponse = new YaMarketCartResponse(); try { var shoppingCart = new ShoppingCart(); foreach (var marketItem in yaCart.cart.items) { var offer = OfferService.GetOffer(Convert.ToInt32(marketItem.offerId)); var isEnabled = offer != null && offer.Product.Enabled; yaResponse.items.Add(new YaMarketItem(marketItem) { price = isEnabled ? offer.Price : 0, count = isEnabled ? offer.Amount : 0, delivery = isEnabled }); if (isEnabled) { shoppingCart.Add(new ShoppingCartItem() { OfferId = offer.OfferId, Amount = marketItem.count, AttributesXml = string.Empty, ShoppingCartType = ShoppingCartType.ShoppingCart, }); } } var city = GetByType("CITY", yaCart.cart.delivery.region) ?? string.Empty; var region = GetByType("REGION", yaCart.cart.delivery.region) ?? (GetByType("SUBJECT_FEDERATION", yaCart.cart.delivery.region) ?? string.Empty); var country = GetByType("COUNTRY", yaCart.cart.delivery.region) ?? "Россия"; var countryId = CountryService.GetCountryByName(country).CountryId; var shippingManager = new ShippingManager(); var shippingRates = shippingManager.GetShippingRates(countryId, "", city, region, shoppingCart, 0); var yaMarketShippings = YaMarketByuingService.GetShippings(); foreach (var shippingRate in shippingRates.OrderBy(x => x.Rate)) { var shipping = yaMarketShippings.FirstOrDefault(x => x.ShippingMethodId == shippingRate.MethodId); if (shipping == null) { continue; } var delivery = new YaMarketDeliveryResponse() { id = shippingRate.Id.ToString(), type = shipping.Type, serviceName = shippingRate.MethodNameRate, price = shippingRate.Rate, dates = new YaMarketDate() { fromDate = DateTime.Now.AddDays(shipping.MinDate).ToString("dd-MM-yyyy"), // todo toDate = DateTime.Now.AddDays(shipping.MaxDate).ToString("dd-MM-yyyy") } }; if (delivery.type == "PICKUP" && YaMarketBuyingSettings.Outlets.IsNotEmpty()) { delivery.outlets = new List <YaMarketOutlet>(); foreach (var outlet in YaMarketBuyingSettings.Outlets.Split(';')) { delivery.outlets.Add(new YaMarketOutlet() { id = Convert.ToInt32(outlet) }); } } yaResponse.deliveryOptions.Add(delivery); } foreach (var payment in YaMarketBuyingSettings.Payments.Split(';')) { yaResponse.paymentMethods.Add(payment); } } catch (Exception ex) { Debug.LogError(ex); } var context = HttpContext.Current; context.Response.ContentType = "application/json"; context.Response.Write(JsonConvert.SerializeObject(new { cart = yaResponse })); context.Response.End(); }
// POST /order/accept protected static void Accept(string json) { var yaOrder = JsonConvert.DeserializeObject <YaMarketOrderRequest>(json); if (yaOrder == null || yaOrder.order == null) { return; } Order order = null; try { var adminComment = ""; adminComment = "Заказ номер: " + yaOrder.order.id + (yaOrder.order.fake ? "(тестовый)" : "") + "\r\n"; if (yaOrder.order.paymentType.IsNotEmpty()) { adminComment += "Тип оплаты заказа: " + (yaOrder.order.paymentType == "PREPAID" ? "предоплата" : "постоплата при получении заказа") + "\r\n"; } if (yaOrder.order.paymentMethod.IsNotEmpty()) { adminComment += "Способ оплаты заказа: "; switch (yaOrder.order.paymentMethod) { case "YANDEX": adminComment += "оплата при оформлении"; break; case "SHOP_PREPAID": adminComment += "предоплата напрямую магазину (только для Украины)"; break; case "CASH_ON_DELIVERY": adminComment += "наличный расчет при получении заказа"; break; case "CARD_ON_DELIVERY": adminComment += "оплата банковской картой при получении заказа"; break; } } adminComment += "\r\n"; var orderContact = new OrderContact(); var shippingCost = 0f; var shippingMethodName = ""; if (yaOrder.order.delivery != null) { adminComment += string.Format("Доставка: {0}, стоимость доставки: {1}, даты: {2} до {3}\r\n", yaOrder.order.delivery.serviceName, yaOrder.order.delivery.price ?? 0, yaOrder.order.delivery.dates.fromDate, yaOrder.order.delivery.dates.toDate); orderContact = new OrderContact { Address = yaOrder.order.delivery.address.street + " " + yaOrder.order.delivery.address.house + " " + yaOrder.order.delivery.address.subway + " " + yaOrder.order.delivery.address.block + " " + yaOrder.order.delivery.address.floor, City = yaOrder.order.delivery.address.city, Country = yaOrder.order.delivery.address.country, Name = string.Empty, Zip = yaOrder.order.delivery.address.postcode ?? string.Empty, Zone = string.Empty }; if (yaOrder.order.delivery.price != null) { shippingCost = (float)yaOrder.order.delivery.price; } shippingMethodName = yaOrder.order.delivery.serviceName; } var orderItems = (from item in yaOrder.order.items let offer = OfferService.GetOffer(Convert.ToInt32(item.offerId)) where offer != null let product = offer.Product select new OrderItem() { Name = product.Name, Price = item.price, Amount = item.count, SupplyPrice = product.Offers[0].SupplyPrice, ProductID = product.ProductId, ArtNo = product.ArtNo, IsCouponApplied = false, Weight = product.Weight }).ToList(); var orderCurrency = yaOrder.order.currency == "RUR" ? (CurrencyService.GetAllCurrencies(true) .FirstOrDefault(x => x.Iso3 == yaOrder.order.currency || x.Iso3 == "RUB") ?? CurrencyService.GetAllCurrencies(true).FirstOrDefault()) : (CurrencyService.GetAllCurrencies(true).FirstOrDefault(x => x.Iso3 == yaOrder.order.currency) ?? CurrencyService.GetAllCurrencies(true).FirstOrDefault()); order = new Order() { AdminOrderComment = adminComment, CustomerComment = yaOrder.order.notes, OrderCustomer = new OrderCustomer() { Email = "*****@*****.**", CustomerIP = "127.0.0.1" }, OrderItems = orderItems, OrderCurrency = orderCurrency, ShippingContact = orderContact, BillingContact = orderContact, ShippingCost = shippingCost, ArchivedShippingName = shippingMethodName, OrderStatusId = OrderService.DefaultOrderStatus, OrderDate = DateTime.Now, Number = OrderService.GenerateNumber(1), }; order.OrderID = OrderService.AddOrder(order); order.Number = OrderService.GenerateNumber(order.OrderID); OrderService.UpdateNumber(order.OrderID, order.Number); OrderService.ChangeOrderStatus(order.OrderID, OrderService.DefaultOrderStatus); if (order.OrderID != 0) { YaMarketByuingService.AddOrder(new YaOrder() { MarketOrderId = yaOrder.order.id.TryParseInt(), OrderId = order.OrderID, Status = string.Format("[{0}] Создан заказ {1}", DateTime.Now.ToString("g"), order.OrderID) }); try { var orderTable = OrderService.GenerateHtmlOrderTable(order.OrderItems, order.OrderCurrency, orderItems.Sum(x => x.Price * x.Amount), 0, null, null, 0, 0, 0, 0, 0, 0); var mailTemplate = new BuyInOneClickMailTemplate(order.OrderID.ToString(), "", "", "", orderTable); mailTemplate.BuildMail(); SendMail.SendMailNow(SettingsMail.EmailForOrders, "Заказ через Яндекс.Маркет", mailTemplate.Body, true); } catch (Exception ex) { Debug.LogError(ex); } } } catch (Exception ex) { Debug.LogError(ex); } /* * Если магазин считает запрос, поступающий от Яндекс.Маркета, некорректным, * магазин должен вернуть статус ответа 400 с описанием причины ошибки в теле ответа. * Такие ответы будут анализироваться на предмет нарушений и недоработок API со стороны Яндекс.Маркета. * */ var orderResponse = new YaMarketOrderResponse() { order = new YaMarketOrderAccept() { accepted = order != null && order.OrderID != 0, id = yaOrder.order.id } }; var context = HttpContext.Current; context.Response.ContentType = "application/json"; context.Response.Write(JsonConvert.SerializeObject(orderResponse)); context.Response.End(); }
public bool InstallModule() { return(YaMarketByuingService.InstallModule()); }