use crate::config::{Client, Response};
use crate::params::{Identifiable, List, Metadata, RangeQuery, Timestamp};
use crate::resources::{Charge, Currency, ShippingDetails};
use serde_derive::{Deserialize, Serialize};
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct PaymentError {
#[serde(rename = "type")]
pub payment_error_type: PaymentErrorType,
pub charge: Option<String>,
pub code: Option<String>,
pub decline_code: Option<String>,
pub doc_url: Option<String>,
pub message: Option<String>,
pub param: Option<String>,
pub source: Option<String>,
}
#[derive(Deserialize, Serialize, PartialEq, Debug, Clone, Eq)]
pub enum PaymentErrorType {
#[serde(rename = "api_error")]
Api,
#[serde(rename = "api_connection_error")]
Connection,
#[serde(rename = "authentication_error")]
Authentication,
#[serde(rename = "card_error")]
Card,
#[serde(rename = "idempotency_error")]
Idempotency,
#[serde(rename = "invalid_request_error")]
InvalidRequest,
#[serde(rename = "rate_limit_error")]
RateLimit,
#[serde(other, skip_serializing)]
Other,
}
#[derive(Deserialize, Serialize, PartialEq, Debug, Clone, Eq)]
#[serde(rename_all = "snake_case")]
pub enum PaymentIntentSourceType {
Card,
}
#[derive(Deserialize, Serialize, PartialEq, Debug, Clone, Eq)]
#[serde(rename_all = "snake_case")]
pub enum PaymentIntentStatus {
RequiresSource,
RequiresConfirmation,
RequiresSourceAction,
Processing,
RequiresCapture,
Canceled,
Succeeded,
#[serde(other, skip_serializing)]
Other,
}
#[derive(Deserialize, Serialize, PartialEq, Debug, Clone, Eq)]
#[serde(rename_all = "snake_case")]
pub enum CancellationReason {
Duplicate,
Fraudulent,
RequestedByCustomer,
#[serde(other, skip_serializing)]
Other,
}
#[derive(Deserialize, Serialize, PartialEq, Debug, Clone, Eq)]
#[serde(rename_all = "snake_case")]
pub enum CaptureMethod {
Automatic,
Manual,
#[serde(other, skip_serializing)]
Other,
}
#[derive(Deserialize, Serialize, PartialEq, Debug, Clone, Eq)]
#[serde(rename_all = "snake_case")]
pub enum ConfirmationMethod {
Secret,
Publishable,
#[serde(other, skip_serializing)]
Other,
}
#[derive(Deserialize, Serialize, PartialEq, Debug, Clone, Eq)]
#[serde(rename_all = "snake_case")]
pub enum SourceActionType {
AuthorizeWithUrl,
UseStripeSdk,
#[serde(other, skip_serializing)]
Other,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct NextSourceAction {
pub authorize_with_url: AuthorizeWithUrl,
#[serde(rename = "type")]
pub action_type: SourceActionType,
pub use_stripe_sdk: serde_json::Value,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct AuthorizeWithUrl {
pub return_url: Option<String>,
pub url: Option<String>,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct TransferData {
pub destination: Option<String>,
}
#[derive(Clone, Debug, Default, Serialize)]
pub struct PaymentIntentCreateParams<'a> {
pub allowed_source_types: Vec<PaymentIntentSourceType>,
pub amount: u64,
pub currency: Currency,
#[serde(skip_serializing_if = "Option::is_none")]
pub application_fee_amount: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub capture_method: Option<CaptureMethod>,
#[serde(skip_serializing_if = "Option::is_none")]
pub confirm: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub customer: Option<&'a str>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<&'a str>,
#[serde(skip_serializing_if = "Option::is_none")]
pub metadata: Option<Metadata>,
#[serde(skip_serializing_if = "Option::is_none")]
pub on_behalf_of: Option<&'a str>,
#[serde(skip_serializing_if = "Option::is_none")]
pub receipt_email: Option<&'a str>,
#[serde(skip_serializing_if = "Option::is_none")]
pub return_url: Option<&'a str>,
#[serde(skip_serializing_if = "Option::is_none")]
pub save_source_to_customer: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub shipping: Option<ShippingDetails>,
#[serde(skip_serializing_if = "Option::is_none")]
pub source: Option<&'a str>,
#[serde(skip_serializing_if = "Option::is_none")]
pub statement_descriptor: Option<&'a str>,
#[serde(skip_serializing_if = "Option::is_none")]
pub transfer_data: Option<TransferData>,
#[serde(skip_serializing_if = "Option::is_none")]
pub transfer_group: Option<&'a str>,
}
#[derive(Clone, Debug, Default, Serialize)]
pub struct PaymentIntentUpdateParams<'a> {
#[serde(skip_serializing_if = "Option::is_none")]
pub amount: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub application_fee_amount: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub currency: Option<Currency>,
#[serde(skip_serializing_if = "Option::is_none")]
pub customer: Option<&'a str>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<&'a str>,
#[serde(skip_serializing_if = "Option::is_none")]
pub metadata: Option<Metadata>,
#[serde(skip_serializing_if = "Option::is_none")]
pub receipt_email: Option<&'a str>,
#[serde(skip_serializing_if = "Option::is_none")]
pub save_source_to_customer: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub shipping: Option<ShippingDetails>,
#[serde(skip_serializing_if = "Option::is_none")]
pub source: Option<&'a str>,
#[serde(skip_serializing_if = "Option::is_none")]
pub transfer_group: Option<&'a str>,
}
#[derive(Clone, Debug, Default, Serialize)]
pub struct PaymentIntentConfirmParams<'a> {
#[serde(skip_serializing_if = "Option::is_none")]
pub receipt_email: Option<&'a str>,
#[serde(skip_serializing_if = "Option::is_none")]
pub return_url: Option<&'a str>,
#[serde(skip_serializing_if = "Option::is_none")]
pub save_source_to_customer: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub shipping: Option<ShippingDetails>,
#[serde(skip_serializing_if = "Option::is_none")]
pub source: Option<&'a str>,
}
#[derive(Clone, Debug, Default, Serialize)]
pub struct PaymentIntentCaptureParams {
#[serde(skip_serializing_if = "Option::is_none")]
pub amount_to_capture: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub application_fee_amount: Option<u64>,
}
#[derive(Clone, Debug, Default, Serialize)]
pub struct PaymentIntentCancelParams {
#[serde(skip_serializing_if = "Option::is_none")]
pub cancellation_reason: Option<CancellationReason>,
}
#[derive(Clone, Debug, Default, Deserialize, Serialize)]
pub struct PaymentIntentListParams {
#[serde(skip_serializing_if = "Option::is_none")]
pub created: Option<RangeQuery<Timestamp>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub ending_before: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub limit: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub starting_after: Option<String>,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct PaymentIntent {
pub id: String,
pub allowed_source_types: Vec<String>,
pub amount: u64,
pub amount_capturable: u64,
pub amount_received: u64,
pub application: Option<String>,
pub application_fee_amount: Option<u64>,
pub canceled_at: Option<Timestamp>,
pub cancellation_reason: Option<CancellationReason>,
pub capture_method: CaptureMethod,
pub charges: List<Charge>,
pub client_secret: Option<String>,
pub confirmation_method: Option<ConfirmationMethod>,
pub created: Timestamp,
pub currency: Currency,
pub customer: Option<String>,
pub description: Option<String>,
pub last_payment_error: Option<PaymentError>,
pub livemode: bool,
pub metadata: Metadata,
pub next_source_action: Option<NextSourceAction>,
pub on_behalf_of: Option<String>,
pub receipt_email: Option<String>,
pub review: Option<String>,
pub shipping: Option<ShippingDetails>,
pub source: Option<String>,
pub statement_descriptor: Option<String>,
pub status: PaymentIntentStatus,
pub transfer_data: Option<TransferData>,
pub transfer_group: Option<String>,
}
impl PaymentIntent {
pub fn create(
client: &Client,
params: PaymentIntentCreateParams<'_>,
) -> Response<PaymentIntent> {
client.post_form("/payment_intents", params)
}
pub fn retrieve(client: &Client, payment_intent_id: &str) -> Response<PaymentIntent> {
client.get(&format!("/payment_intents/{}", payment_intent_id))
}
pub fn update(
client: &Client,
payment_intent_id: &str,
params: PaymentIntentUpdateParams<'_>,
) -> Response<PaymentIntent> {
client.post_form(&format!("/payment_intents/{}", payment_intent_id), params)
}
pub fn confirm(
client: &Client,
payment_intent_id: &str,
params: PaymentIntentConfirmParams<'_>,
) -> Response<PaymentIntent> {
client.post_form(&format!("/payment_intents/{}/confirm", payment_intent_id), params)
}
pub fn capture(
client: &Client,
payment_intent_id: &str,
params: PaymentIntentCaptureParams,
) -> Response<PaymentIntent> {
client.post_form(&format!("/payment_intents/{}/capture", payment_intent_id), params)
}
pub fn cancel(
client: &Client,
payment_intent_id: &str,
params: PaymentIntentCancelParams,
) -> Response<PaymentIntent> {
client.post_form(&format!("/payment_intents/{}/cancel", payment_intent_id), params)
}
pub fn list(client: &Client, params: PaymentIntentListParams) -> Response<List<PaymentIntent>> {
client.get_query("/payment_intents", ¶ms)
}
}
impl Identifiable for PaymentIntent {
fn id(&self) -> &str {
&self.id
}
}