예제 #1
0
        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));
            }
        }
예제 #2
0
        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 {
            }));
        }