most of the events we want

This commit is contained in:
Brandon Thomas committed 2022-09-10 04:26:24 -04:00
1 parent 4acec068aa
commit 9feded54bd
9 files changed
+137 -36

No files matched your search

@@ -5,8 +5,9 @@ use actix_web::web::{Bytes, Path};
use actix_web::{web, HttpResponse, HttpRequest};
use chrono::{DateTime, Utc};
use crate::stripe::stripe_config::StripeConfig;
use crate::stripe::webhook_event_handlers::checkout_session_completed_handler::checkout_session_completed_handler;
use crate::stripe::webhook_event_handlers::checkout_session::checkout_session_completed_handler::checkout_session_completed_handler;
use crate::stripe::webhook_event_handlers::customer::customer_created_handler::customer_created_handler;
use crate::stripe::webhook_event_handlers::customer::customer_deleted_handler::customer_deleted_handler;
use crate::stripe::webhook_event_handlers::customer::customer_updated_handler::customer_updated_handler;
use crate::stripe::webhook_event_handlers::customer_subscription::customer_subscription_created_handler::customer_subscription_created_handler;
use crate::stripe::webhook_event_handlers::customer_subscription::customer_subscription_deleted_handler::customer_subscription_deleted_handler;
@@ -14,6 +15,7 @@ use crate::stripe::webhook_event_handlers::customer_subscription::customer_subsc
use crate::stripe::webhook_event_handlers::invoice::invoice_paid_handler::invoice_paid_handler;
use crate::stripe::webhook_event_handlers::invoice::invoice_payment_failed::invoice_payment_failed_handler;
use crate::stripe::webhook_event_handlers::invoice::invoice_payment_succeeded_handler::invoice_payment_succeeded_handler;
use crate::stripe::webhook_event_handlers::invoice::invoice_updated_handler::invoice_updated_handler;
use crate::stripe::webhook_event_handlers::stripe_webhook_error::StripeWebhookError;
use http_server_common::request::get_request_header_optional::get_request_header_optional;
use http_server_common::response::serialize_as_json_error::serialize_as_json_error;
@@ -23,7 +25,6 @@ use sqlx::MySqlPool;
use std::collections::HashMap;
use std::fmt;
use stripe::{EventObject, EventType, PaymentIntentStatus, Webhook};
use crate::stripe::webhook_event_handlers::customer::customer_deleted_handler::customer_deleted_handler;
#[derive(Serialize)]
pub struct StripeWebhookSuccessResponse {
@@ -104,9 +105,9 @@ pub async fn stripe_webhook_handler(
}
}
// EventType::CheckoutSessionExpired
// EventType::CheckoutSessionAsyncPaymentFailed
// EventType::CheckoutSessionAsyncPaymentSucceeded
// EventType::CheckoutSessionExpired => {}
// EventType::CheckoutSessionAsyncPaymentFailed => {}
// EventType::CheckoutSessionAsyncPaymentSucceeded => {}
// =============== CUSTOMERS ===============
@@ -143,9 +144,10 @@ pub async fn stripe_webhook_handler(
let _r = customer_subscription_deleted_handler(&subscription)?;
}
}
// EventType::CustomerSubscriptionPendingUpdateApplied
// EventType::CustomerSubscriptionPendingUpdateExpired
// EventType::CustomerSubscriptionTrialWillEnd
// EventType::CustomerSubscriptionPendingUpdateApplied => {}
// EventType::CustomerSubscriptionPendingUpdateExpired => {}
// EventType::CustomerSubscriptionTrialWillEnd => {}
// =============== INVOICES ===============
@@ -153,9 +155,9 @@ pub async fn stripe_webhook_handler(
// TODO: We need to respond to this so we don't hold payments up by 72 hours!
// See: https://stripe.com/docs/billing/subscriptions/webhooks
}
EventType::InvoicePaymentSucceeded => {
EventType::InvoiceUpdated => {
if let EventObject::Invoice(invoice) = webhook_payload.data.object {
let _r = invoice_payment_succeeded_handler(&invoice)?;
let _r = invoice_updated_handler(&invoice)?;
}
}
EventType::InvoicePaid => {
@@ -163,24 +165,29 @@ pub async fn stripe_webhook_handler(
let _r = invoice_paid_handler(&invoice)?;
}
}
EventType::InvoicePaymentSucceeded => {
if let EventObject::Invoice(invoice) = webhook_payload.data.object {
let _r = invoice_payment_succeeded_handler(&invoice)?;
}
}
EventType::InvoicePaymentFailed => {
if let EventObject::Invoice(invoice) = webhook_payload.data.object {
let _r = invoice_payment_failed_handler(&invoice)?;
}
}
// EventType::InvoiceDeleted
// EventType::InvoiceFinalizationFailed
// EventType::InvoiceFinalized
// EventType::InvoiceItemCreated
// EventType::InvoiceItemDeleted
// EventType::InvoiceItemUpdated
// EventType::InvoiceMarkedUncollectible
// EventType::InvoicePaymentActionRequired
// EventType::InvoiceSent
// EventType::InvoiceUpcoming
// EventType::InvoiceUpdated
// EventType::InvoiceVoided
// EventType::InvoiceDeleted => {}
// EventType::InvoiceFinalizationFailed => {}
// EventType::InvoiceFinalized => {}
// EventType::InvoiceItemCreated => {}
// EventType::InvoiceItemDeleted => {}
// EventType::InvoiceItemUpdated => {}
// EventType::InvoiceMarkedUncollectible => {}
// EventType::InvoicePaymentActionRequired => {}
// EventType::InvoiceSent => {}
// EventType::InvoiceUpcoming => {}
// EventType::InvoiceUpdated => {}
// EventType::InvoiceVoided => {}
// =============== PAYMENT INTENTS ===============
@@ -188,6 +195,66 @@ pub async fn stripe_webhook_handler(
if let EventObject::PaymentIntent(payment_intent) = webhook_payload.data.object {
}
}
// EventType::PaymentIntentAmountCapturableUpdated => {}
// EventType::PaymentIntentCanceled => {}
// EventType::PaymentIntentCreated => {}
// EventType::PaymentIntentPartiallyFunded => {}
// EventType::PaymentIntentPaymentFailed => {}
// EventType::PaymentIntentProcessing => {}
// EventType::PaymentIntentRequiresAction => {}
// EventType::PaymentIntentRequiresCapture => {}
// =============== Ignored ===============
// Ignoring these types:
// Account* (6),
// ApplicationFee* (2),
// BalanceAvailable (1),
// BillingPortal* (2),
// CapabilityCreated (1),
// Charge* (13),
// [CheckoutSession* handled above],
// Coupon* (3),
// CreditNote* (3),
// CustomerDiscount* (3),
// CustomerSource* (4),
// [CustomerSubscription* handled above],
// CreditTax* (3),
// FileCreated (1),
// IdentityVerification* (6),
// [Invoice* handled above],
// IssuingAuthorization* (3),
// IssuingCard* (2),
// IssuingCardholder* (2),
// IssuingDispute* (2),
// IssuingTransaction* (2),
// MandateUpdated (1),
// Order* (6),
// [PaymentIntent* handled above],
// PaymentLink* (2),
// PaymentMethod* (4),
// Payout* (5),
// Person* (3),
// Plan* (3),
// Price* (3),
// Product* (3),
// PromotionCode* (2),
// Quote* (4),
// RadarEarlyFraudWarning* (2),
// Recipient* (3),
// ReportingReport* (3),
// Review* (2),
// SetupIntent* (5),
// SigmaScheduledQueryRunCreated (1),
// Sku (3),
// Source* (7),
// TaxRate* (2),
// TerminalReader* (2),
// TestHelpersTestClock* (5),
// Topup* (5),
// Transfer* (5),
_ => {},
}
@@ -0,0 +1 @@
pub (crate) mod checkout_session_completed_handler;
@@ -5,22 +5,25 @@ use log::{error, warn};
use stripe::Subscription;
/// Handle event type: 'customer.subscription.created'
/// Sent when the subscription is created. The subscription status may be incomplete if customer
/// authentication is required to complete the payment or if you set payment_behavior to
/// default_incomplete. For more details, read about subscription payment behavior.
pub fn customer_subscription_created_handler(subscription: &Subscription) -> Result<(), StripeWebhookError> {
let stripe_subscription_id = subscription.id.to_string();
let stripe_subscription_status = subscription.status.to_string();
// NB: We'll need this to send them to the "customer portal", which is how they can modify or
// cancel their subscriptions.
let maybe_stripe_customer_id = subscription.customer
.as_ref()
.map(|c| expand_customer_id(c));
let maybe_stripe_customer_id = expand_customer_id(&subscription.customer);
// NB: Our internal user token.
// NB: This *should* be present if checkout flow attached metadata to the subscription.
let maybe_user_token = subscription.metadata.get(METADATA_USER_TOKEN)
.map(|t| t.to_string());
error!(">>> customer.subscription.created: {:?}, {:?}, {:?}",
stripe_subscription_id, maybe_stripe_customer_id, maybe_user_token);
error!(">>> customer.subscription.created: {:?}, {:?}, {:?}, {:?}",
stripe_subscription_id, maybe_stripe_customer_id, maybe_user_token, stripe_subscription_status);
Ok(())
}
@@ -5,15 +5,14 @@ use log::{error, warn};
use stripe::Subscription;
/// Handle event type: 'customer.subscription.deleted'
/// Sent when a customer’s subscription ends.
pub fn customer_subscription_deleted_handler(subscription: &Subscription) -> Result<(), StripeWebhookError> {
let stripe_subscription_id = subscription.id.to_string();
// NB: We'll need this to send them to the "customer portal", which is how they can modify or
// cancel their subscriptions.
let maybe_stripe_customer_id = subscription.customer
.as_ref()
.map(|c| expand_customer_id(c));
let maybe_stripe_customer_id = expand_customer_id(&subscription.customer);
// NB: Our internal user token.
let maybe_user_token = subscription.metadata.get(METADATA_USER_TOKEN)
@@ -8,19 +8,18 @@ use stripe::Subscription;
pub fn customer_subscription_updated_handler(subscription: &Subscription) -> Result<(), StripeWebhookError> {
let stripe_subscription_id = subscription.id.to_string();
let stripe_subscription_status = subscription.status.to_string();
// NB: We'll need this to send them to the "customer portal", which is how they can modify or
// cancel their subscriptions.
let maybe_stripe_customer_id = subscription.customer
.as_ref()
.map(|c| expand_customer_id(c));
let maybe_stripe_customer_id = expand_customer_id(&subscription.customer);
// NB: Our internal user token.
let maybe_user_token = subscription.metadata.get(METADATA_USER_TOKEN)
.map(|t| t.to_string());
error!(">>> customer.subscription.updated: {:?}, {:?}, {:?}",
stripe_subscription_id, maybe_stripe_customer_id, maybe_user_token);
error!(">>> customer.subscription.updated: {:?}, {:?}, {:?}, {:?}",
stripe_subscription_id, maybe_stripe_customer_id, maybe_user_token, stripe_subscription_status);
Ok(())
}
@@ -0,0 +1,31 @@
use container_common::anyhow_result::AnyhowResult;
use crate::stripe::helpers::common_metadata_keys::METADATA_USER_TOKEN;
use crate::stripe::helpers::expand_customer_id::expand_customer_id;
use crate::stripe::webhook_event_handlers::stripe_webhook_error::StripeWebhookError;
use log::warn;
use stripe::Invoice;
// Handle event type: 'invoice.updated'
// Sent when a payment succeeds or fails.
// If payment is successful the `paid` attribute is set to true and the `status` is `paid`.
// If payment fails, `paid` is set to false and the `status` remains `open`.
// Payment failures also trigger a invoice.payment_failed event.
pub fn invoice_updated_handler(invoice: &Invoice) -> Result<(), StripeWebhookError> {
let is_paid = invoice.paid;
let invoice_status = invoice.status;
// NB: We'll need this to send them to the "customer portal", which is how they can modify
// or cancel their subscriptions.
let maybe_stripe_customer_id = invoice.customer
.as_ref()
.map(|c| expand_customer_id(c));
// NB: Our internal user token.
let maybe_user_token = invoice.metadata.get(METADATA_USER_TOKEN)
.map(|t| t.to_string());
warn!(">>> invoice.updated: {:?}, {:?}, {:?}, {:?}", is_paid, invoice_status, maybe_stripe_customer_id, maybe_user_token);
Ok(())
}
@@ -1,3 +1,4 @@
pub (crate) mod invoice_paid_handler;
pub (crate) mod invoice_payment_failed;
pub (crate) mod invoice_payment_succeeded_handler;
pub (crate) mod invoice_updated_handler;
@@ -1,6 +1,6 @@
pub mod stripe_webhook_error;
pub (crate) mod checkout_session_completed_handler;
pub (crate) mod checkout_session;
pub (crate) mod customer;
pub (crate) mod customer_subscription;
pub (crate) mod invoice;