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());
        }
Esempio n. 2
0
        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);
        }