public void ChargeFailed(DateTime?eventTimestamp, StripeCharge charge) { _logger.Debug("Processing charge.failed event for charge id " + charge.Id); var notes = $"{charge.FailureCode ?? "No Stripe Failure Code"}: {charge.FailureMessage ?? "No Stripe Failure Message"}"; _donationService.UpdateDonationStatus(charge.Id, _donationStatusDeclined, eventTimestamp, notes); _donationService.ProcessDeclineEmail(charge.Id); // Create a refund if it is a bank account failure if (charge.Source != null && "bank_account".Equals(charge.Source.Object) && charge.Refunds?.Data != null && charge.Refunds.Data.Any()) { var refundData = _paymentProcessorService.GetRefund(charge.Refunds.Data[0].Id); _donationService.CreateDonationForBankAccountErrorRefund(new StripeRefund { Data = new List <StripeRefundData> { refundData } }); } }