public async Task <ActionResult> PaynowNotification([FromBody] PaynowNotificationRequest dto) { if (Request.Headers.ContainsKey("Signature")) { var signatureHeader = Request.Headers["Signature"]; await _paymentService.ProcessPaynowNotification(dto, signatureHeader); return(Accepted()); } return(BadRequest()); }
public async Task <bool> ProcessPaynowNotification(PaynowNotificationRequest dto, string signature) { // validate signature header string serializedData = JsonSerializer.Serialize(dto); string calculatedSignature = CalculatePaynowSignature(serializedData); if (!String.Equals(signature, calculatedSignature)) { throw new AppException("Calculated signature is not matching header signature"); } var payment = await _unitOfWork.Payments.Get(Guid.Parse(dto.ExternalId)); if (payment is null) { throw new KeyNotFoundException("Payment not found."); } // convert string to Status enum type Status parsedStatus = (Status)Enum.Parse(typeof(Status), dto.Status, true); // update payment status if (ShouldStatusBeUpdated(payment.Status, parsedStatus)) { payment.Status = parsedStatus; payment.Updated = DateTime.UtcNow; // if payment is confirmed update quote status if (payment.Status == Status.Confirmed) { await _quoteService.UpdateQuoteStatus(payment.QuoteId, Status.Paid); } _unitOfWork.Commit(); return(true); } return(false); }