use serde::{Deserialize, Serialize};
use crate::client::{Client, Response};
use crate::params::{Expandable, Metadata, SearchList};
use crate::resources::{Currency, PaymentSource, Shipping};
use crate::{PaymentIntent, PaymentIntentCancellationReason};
impl PaymentIntent {
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: CapturePaymentIntent,
) -> Response<PaymentIntent> {
client.post_form(&format!("/payment_intents/{}/capture", payment_intent_id), params)
}
pub fn cancel(
client: &Client,
payment_intent_id: &str,
params: CancelPaymentIntent,
) -> Response<PaymentIntent> {
client.post_form(&format!("/payment_intents/{}/cancel", payment_intent_id), params)
}
pub fn search(
client: &Client,
params: PaymentIntentSearchParams,
) -> Response<SearchList<PaymentIntent>> {
client.get_query("/payment_intents/search", params)
}
}
#[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<Expandable<PaymentSource>>,
}
#[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 PaymentIntentMethodType {
Card,
Ideal,
SepaDebit,
}
#[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 PaymentIntentNextActionType {
RedirectToUrl,
UseStripeSdk,
#[serde(other, skip_serializing)]
Other,
}
#[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<Shipping>,
#[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<Shipping>,
#[serde(skip_serializing_if = "Option::is_none")]
pub source: Option<&'a str>,
}
#[derive(Clone, Debug, Default, Serialize)]
pub struct CapturePaymentIntent {
#[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 CancelPaymentIntent {
#[serde(skip_serializing_if = "Option::is_none")]
pub cancellation_reason: Option<PaymentIntentCancellationReason>,
}
#[derive(Clone, Debug, Default, Serialize)]
pub struct PaymentIntentSearchParams<'a> {
pub query: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub limit: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub page: Option<u64>,
pub expand: &'a [&'a str],
}
impl<'a> PaymentIntentSearchParams<'a> {
pub fn new() -> PaymentIntentSearchParams<'a> {
PaymentIntentSearchParams { query: String::new(), limit: None, page: None, expand: &[] }
}
}