public async Task <IActionResult> Execute(string orderId, string subject) { if (string.IsNullOrWhiteSpace(orderId)) { throw new ArgumentNullException(nameof(orderId)); } if (string.IsNullOrWhiteSpace(subject)) { throw new ArgumentNullException(nameof(subject)); } var validationResult = await _validator.Validate(orderId, subject); if (!validationResult.IsValid) { var error = _responseBuilder.GetError(ErrorCodes.Request, validationResult.Message); return(_controllerHelper.BuildResponse(HttpStatusCode.BadRequest, error)); } var isPaymentReceived = false; if (validationResult.Order.TransportMode == OrderTransportModes.Packet) { var token = await _paypalOauthClient.GetAccessToken(_settingsProvider.GetPaypalClientId(), _settingsProvider.GetPaypalClientSecret(), new PaypalOauthClientOptions { ApplicationMode = PaypalApplicationModes.sandbox }); var payment = validationResult.Order.OrderPayment; var executePaymentResult = await _paypalClient.ExecutePayment(payment.TransactionId, new ExecutePaymentParameter { AccessToken = token.AccessToken, PayerId = payment.PayerId }); if (!executePaymentResult.IsValid) { var error = _responseBuilder.GetError(ErrorCodes.Request, executePaymentResult.ErrorResponse.Message); return(_controllerHelper.BuildResponse(HttpStatusCode.BadRequest, error)); } isPaymentReceived = true; } _commandSender.Send(new ReceiveOrderCommand { OrderId = orderId, IsPaymentReceived = isPaymentReceived }); return(new OkResult()); }
public async Task <IActionResult> Execute(string orderId, string subject, string commonId, JObject jObj) { if (jObj == null) { throw new ArgumentNullException(nameof(jObj)); } ConfirmOrderLabelPurchaseCommand command = null; try { command = _requestBuilder.GetConfirmOrderLabelPurchase(jObj); } catch (ArgumentException ex) { var error = _responseBuilder.GetError(ErrorCodes.Request, ex.Message); return(_controllerHelper.BuildResponse(HttpStatusCode.BadRequest, error)); } command.OrderId = orderId; command.CommonId = commonId; var validationResult = await _validator.Validate(subject, command); // Validate the command. if (!validationResult.IsValid) { var error = _responseBuilder.GetError(ErrorCodes.Request, validationResult.Message); return(_controllerHelper.BuildResponse(HttpStatusCode.BadRequest, error)); } if (validationResult.Order.OrderParcel.Transporter != Transporters.Ups) // Only UPS transport mode is supported. { var error = _responseBuilder.GetError(ErrorCodes.Request, ErrorDescriptions.TheUpsIsOnlySupported); return(_controllerHelper.BuildResponse(HttpStatusCode.BadRequest, error)); } var acceptUpsShipment = await _upsClient.AcceptShip(new AcceptShipParameter // 1. Accept UPS shipment. { Credentials = new UpsCredentials { LicenseNumber = _settingsProvider.GetUpsLicenseNumber(), Password = _settingsProvider.GetUpsPassword(), UserName = _settingsProvider.GetUpsUsername() }, ShipmentDigest = validationResult.Order.ShipmentDigest }); if (acceptUpsShipment.Response.ResponseStatusCode == "0") { var error = _responseBuilder.GetError(ErrorCodes.Request, acceptUpsShipment.Response.Error.ErrorDescription); return(_controllerHelper.BuildResponse(HttpStatusCode.BadRequest, error)); } var order = validationResult.Order; var token = await _paypalOauthClient.GetAccessToken(_settingsProvider.GetPaypalClientId(), _settingsProvider.GetPaypalClientSecret(), new PaypalOauthClientOptions { ApplicationMode = PaypalApplicationModes.sandbox }); if (order.OrderPayment.PaymentMethod == OrderPayments.Paypal) // Update transaction. { var transactionId = order.OrderPayment.TransactionId; var newPrice = new JObject(); var newPriceDetails = new JObject(); newPriceDetails.Add("shipping", order.ShippingPrice); newPriceDetails.Add("subtotal", order.TotalPrice); newPrice.Add("total", order.TotalPrice + order.ShippingPrice); newPrice.Add("currency", "EUR"); newPrice.Add("details", newPriceDetails); var updatePayment = await _paypalClient.UpdatePayment(transactionId, new UpdatePaymentParameter { AccessToken = token.AccessToken, JsonPatches = new[] { new JsonPatch { Operation = JsonPatchOperations.replace, Path = "/transactions/0/amount", Value = newPrice } } }); if (!updatePayment.IsValid) { var error = _responseBuilder.GetError(ErrorCodes.Request, updatePayment.ErrorResponse.Message); return(_controllerHelper.BuildResponse(HttpStatusCode.BadRequest, error)); } } var acceptedPayment = await _paypalClient.ExecutePayment(command.TransactionId, new ExecutePaymentParameter // Accept the payment. { AccessToken = token.AccessToken, PayerId = command.PayerId }); if (!acceptedPayment.IsValid) { await _upsClient.Cancel(acceptUpsShipment.ShipmentResults.ShipmentIdentificationNumber, new UpsCredentials { LicenseNumber = _settingsProvider.GetUpsLicenseNumber(), Password = _settingsProvider.GetUpsPassword(), UserName = _settingsProvider.GetUpsUsername() }); var error = _responseBuilder.GetError(ErrorCodes.Request, acceptedPayment.ErrorResponse.Message); return(_controllerHelper.BuildResponse(HttpStatusCode.BadRequest, error)); } command.TrackingNumber = acceptUpsShipment.ShipmentResults.PackageResults.TrackingNumber; _commandSender.Send(command); return(new OkResult()); }