in src/Modules/SimplCommerce.Module.PaymentPaypalExpress/Areas/PaymentPaypalExpress/Controllers/PaypalExpressController.cs [118:170]
public async Task<ActionResult> ExecutePayment(PaymentExecuteVm model)
{
var accessToken = await GetAccessToken();
var currentUser = await _workContext.GetCurrentUser();
var cart = await _cartService.GetActiveCartDetails(currentUser.Id);
var orderCreateResult = await _orderService.CreateOrder(cart.Id, "PaypalExpress", CalculatePaymentFee(cart.OrderTotal), OrderStatus.PendingPayment);
if (!orderCreateResult.Success)
{
return BadRequest(orderCreateResult.Error);
}
var order = orderCreateResult.Value;
var payment = new Payment()
{
OrderId = order.Id,
PaymentFee = order.PaymentFeeAmount,
Amount = order.OrderTotal,
PaymentMethod = "Paypal Express",
CreatedOn = DateTimeOffset.UtcNow,
};
var httpClient = _httpClientFactory.CreateClient();
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
var paymentExecuteRequest = new PaymentExecuteRequest
{
payer_id = model.payerID
};
var response = await httpClient.PostJsonAsync($"https://api{_setting.Value.EnvironmentUrlPart}.paypal.com/v1/payments/payment/{model.paymentID}/execute", paymentExecuteRequest);
var responseBody = await response.Content.ReadAsStringAsync();
dynamic responseObject = JObject.Parse(responseBody);
if (response.IsSuccessStatusCode)
{
// Has to explicitly declare the type to be able to get the propery
string payPalPaymentId = responseObject.id;
payment.Status = PaymentStatus.Succeeded;
payment.GatewayTransactionId = payPalPaymentId;
_paymentRepository.Add(payment);
order.OrderStatus = OrderStatus.PaymentReceived;
await _paymentRepository.SaveChangesAsync();
return Ok(new { Status = "success", OrderId = order.Id });
}
payment.Status = PaymentStatus.Failed;
payment.FailureMessage = responseBody;
_paymentRepository.Add(payment);
order.OrderStatus = OrderStatus.PaymentFailed;
await _paymentRepository.SaveChangesAsync();
string errorName = responseObject.name;
string errorDescription = responseObject.message;
return BadRequest($"{errorName} - {errorDescription}");
}