private void ProcessingMd5(HttpContext context, ref ProcessingResult processingResult, ref TypeRequestYandex typeRequest, ref string invoiceId) { var parameters = ReadParametersMd5(context, ref typeRequest); invoiceId = parameters.ContainsKey("invoiceId") ? parameters["invoiceId"] : string.Empty; if (IsCheckMd5(parameters)) { if (IsCheckFields(parameters, typeRequest)) { if (typeRequest == TypeRequestYandex.paymentAviso) { OrderService.PayOrder(parameters["orderNumber"].TryParseInt(), true); } processingResult = ProcessingResult.Success; } else { processingResult = typeRequest == TypeRequestYandex.checkOrder ? ProcessingResult.TranslationFailure : ProcessingResult.ErrorParsing; } } else { processingResult = ProcessingResult.ErrorAuthorize; } }
private Dictionary <string, string> ReadParametersMd5(HttpContext context, ref TypeRequestYandex typeRequest) { if (context.Request["action"].IsNotEmpty()) { if (context.Request["action"].Equals("checkOrder", StringComparison.InvariantCultureIgnoreCase)) { typeRequest = TypeRequestYandex.checkOrder; } else if (context.Request["action"].Equals("paymentAviso", StringComparison.InvariantCultureIgnoreCase)) { typeRequest = TypeRequestYandex.paymentAviso; } } return(context.Request.Params.AllKeys.ToDictionary(key => key, key => context.Request[key])); }
private bool IsCheckFields(Dictionary <string, string> parameters, TypeRequestYandex typeRequest) { decimal orderSumAmount; if (parameters["shopId"].Equals(ShopId, StringComparison.InvariantCultureIgnoreCase) && parameters["invoiceId"].IsNotEmpty() && parameters["invoiceId"].All(char.IsDigit) && parameters["orderNumber"].IsNotEmpty() && parameters["orderNumber"].All(char.IsDigit) && parameters["orderSumAmount"].IsNotEmpty() && decimal.TryParse(parameters["orderSumAmount"], NumberStyles.Float, CultureInfo.InvariantCulture, out orderSumAmount)) { var ord = OrderService.GetOrder(parameters["orderNumber"].TryParseInt()); if (ord != null && // Если это запрос "Уведомление о переводе", которые могут повторяться несколько раз (упомянуто в документации), // тогда неважно заказ был уже отмечен оплаченным или уже отменен (typeRequest == TypeRequestYandex.paymentAviso || (!ord.Payed && ord.OrderStatusId != OrderService.CanceledOrderStatus)) && ord.OrderCustomer.CustomerID.ToString().Normalize().Equals(parameters["customerNumber"], StringComparison.InvariantCultureIgnoreCase) && orderSumAmount >= Math.Round((decimal)(ord.Sum / CurrencyValue), 2)) { return(true); } } return(false); }
private string RendAnswer(TypeRequestYandex typeRequest, ProcessingResult processingResult, string invoiceId) { return(string.Format( "<?xml version=\"1.0\" encoding=\"UTF-8\"?><{0}Response performedDatetime=\"{1}\" code=\"{2}\" invoiceId=\"{3}\" shopId=\"{4}\"/>", typeRequest, DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ss.fzzz"), (int)processingResult, invoiceId, ShopId)); }