private async Task<CreatePaymentResponse> CreatePayment(UpdateOrderValidationResult result) { var token = await _paypalOauthClient.GetAccessToken(_settingsProvider.GetPaypalClientId(), _settingsProvider.GetPaypalClientSecret(), new PaypalOauthClientOptions { ApplicationMode = PaypalApplicationModes.sandbox }); var items = result.Order.OrderLines.Select(o => { var product = result.Products.First(p => p.Id == o.ProductId); return new PaypalItem { Name = product.Name, Description = product.Description, Currency = Constants.Currency, Quantity = o.Quantity, Price = product.Price }; }); return await _paypalClient.CreatePayment(new CreatePaymentParameter { AccessToken = token.AccessToken, Intent = IntentPayments.authorize, Payer = new PaypalPayer { PaymentMethod = PaypalPaymentMethods.Paypal, Email = result.PayerPaypalEmail }, Transactions = new[] { new PaymentTransaction { Currency = Constants.Currency, Total = result.ShippingPrice + items.Sum(i => i.Price * i.Quantity), Shipping = result.ShippingPrice, SubTotal = items.Sum(i => i.Price * i.Quantity), Items = items, Payee = new PaypalPayee { Email = result.SellerPaypalEmail } } }, CancelUrl = $"{_settingsProvider.GetBaseWebsite()}/cancelpayment", ReturnUrl = $"{_settingsProvider.GetBaseWebsite()}/acceptpayment" }); }
public async Task <IActionResult> Execute(string id, string subject, JObject jObj) { if (jObj == null) { throw new ArgumentNullException(nameof(jObj)); } var command = _requestBuilder.GetPurchaseOrderLabelCommand(jObj); command.OrderId = id; var validationResult = await _validator.Validate(subject, command); if (!validationResult.IsValid) { var error = _responseBuilder.GetError(ErrorCodes.Request, validationResult.Message); return(_controllerHelper.BuildResponse(HttpStatusCode.BadRequest, error)); } var token = await _paypalOauthClient.GetAccessToken(_settingsProvider.GetPaypalClientId(), _settingsProvider.GetPaypalClientSecret(), new PaypalOauthClientOptions { ApplicationMode = PaypalApplicationModes.sandbox }); var payment = await _paypalClient.CreatePayment(new CreatePaymentParameter { AccessToken = token.AccessToken, Intent = IntentPayments.sale, Payer = new PaypalPayer { PaymentMethod = PaypalPaymentMethods.Paypal, Email = validationResult.PayerPaypalEmail }, Transactions = new[] { new PaymentTransaction { Currency = Constants.Currency, Total = validationResult.ShippingPrice, Shipping = validationResult.ShippingPrice, Payee = new PaypalPayee { Email = _settingsProvider.GetPaypalEmail() } } }, CancelUrl = $"{_settingsProvider.GetBaseWebsite()}/cancelpurchaselabel", ReturnUrl = $"{_settingsProvider.GetBaseWebsite()}/acceptpurchaselabel" }); if (!payment.IsValid) { var error = _responseBuilder.GetError(ErrorCodes.Request, payment.ErrorResponse.Message); return(_controllerHelper.BuildResponse(HttpStatusCode.BadRequest, error)); } var approvalUrl = payment.Links.FirstOrDefault(l => l.Rel == "approval_url").Href; command.TrackingNumber = validationResult.TrackingNumber; command.ShippingPrice = validationResult.ShippingPrice; command.ShipmentDigest = validationResult.ShipmentDigest; var order = validationResult.Order; order.ShippingPrice = command.ShippingPrice; order.ShipmentDigest = command.ShipmentDigest; order.OrderParcel.Height = command.ParcelSize.Height; order.OrderParcel.Length = command.ParcelSize.Length; order.OrderParcel.Weight = command.ParcelSize.Weight; order.OrderParcel.Width = command.ParcelSize.Width; await _orderRepository.Update(order); var res = new JObject(); res.Add("approval_url", approvalUrl); res.Add("shipping_price", command.ShippingPrice); return(new OkObjectResult(res)); }