public async Task <CommandResult <PaymentUpdateModel> > StartOrderAsync(PaymentUpdateModel model) { try { if (Validate(model)) { using (var transaction = transactionScope.BeginTransaction()) { var productContract = query.Get <ProductEntity>().Where(x => x.Id == model.Product.Id).SelectProductContract().Single(); var customerEntity = await _customerService.CreateAsync(model.Customer); var orderEntity = new OrderEntity { Id = Guid.NewGuid(), CustomerId = customerEntity.Id, ProductId = model.Product.Id, Start = DateTime.Now, OrderStatusId = (int)OrderStatusEnum.PENDING, Token = Tokenizer.Token(), OrderTypeId = (int)OrderTypeEnum.PAYU, Quantity = 1, }; store.Create(orderEntity); // Send request to PayU var payuProduct = new PayuProductContract { Name = productContract.FullName, Quantity = 1, UnitPrice = (int)(productContract.GrossPrice * 100), }; var payuBuyer = new PayuBuyerContract { FirstName = customerEntity.FirstName, LastName = customerEntity.LastName, Email = customerEntity.Email, Phone = customerEntity.Phone, Language = PayuConsts.Language, }; var payuResult = await _payuManager.CreateOrderAsync(orderEntity.Token, payuProduct, payuBuyer); if (payuResult.Succeeded) { var payuOutput = payuResult.Value; model.RedirectUrl = payuOutput.RedirectUri; } else { orderEntity.OrderStatusId = (int)OrderStatusEnum.PENDING; store.Update(orderEntity); // cancel order } transaction.Commit(); return(new CommandResult <PaymentUpdateModel>(model)); } } return(new CommandResult <PaymentUpdateModel>(model, Localization.Resource.Validation_Summary_Error)); } catch (Exception e) { log.Error(nameof(StartOrderAsync), model, e); return(new CommandResult <PaymentUpdateModel>(model, e)); } }
public async Task <CommandResult <PayuOutputContract> > CreateOrderAsync(string token, PayuProductContract product, PayuBuyerContract buyer) { var connection = _httpContextAccessor.HttpContext.Connection; var request = _httpContextAccessor.HttpContext.Request; string baseUrl = $"{request.Scheme}://{request.Host}"; if (!string.IsNullOrWhiteSpace(request.PathBase)) { baseUrl = $"{baseUrl}/{request.PathBase}"; } var payuInput = new PayuInputContract { NotifyUrl = $"{baseUrl}/Payment/Finish?token={token}", CustomerIp = connection.RemoteIpAddress.ToString(), MerchantPosId = _payuConfiguration.PosId, CurrencyCode = PayuConsts.CurrencyCode, Description = PayuConsts.Description, Settings = new PayuSettingsContract { InvoiceDisabled = true, }, TotalAmount = product.UnitPrice, Buyer = buyer, Products = new List <PayuProductContract> { product } }; var oAuth = await GetSecretAsync(); var jsonSerializerSettings = new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() }; string httpData = JsonConvert.SerializeObject(payuInput, Formatting.Indented, jsonSerializerSettings); using (var httpClient = new HttpClient()) { httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(oAuth.TokenType, oAuth.AccessToken); var httpContent = new StringContent(httpData, Encoding.UTF8, "application/json"); var result = await httpClient.PostAsync(_payuConfiguration.OrderUrl, httpContent); if (result.StatusCode == System.Net.HttpStatusCode.Found) { return(new CommandResult <PayuOutputContract>(new PayuOutputContract { RedirectUri = result.RequestMessage.RequestUri.AbsoluteUri, })); } } return(new CommandResult <PayuOutputContract>(new PayuOutputContract { })); }