| POST | /create-customer |
|---|
import datetime
import decimal
from marshmallow.fields import *
from servicestack import *
from typing import *
from dataclasses import dataclass, field
from dataclasses_json import dataclass_json, LetterCase, Undefined, config
from enum import Enum, IntEnum
class StripeType(str, Enum):
UNKNOWN = 'unknown'
ACCOUNT = 'account'
CARD = 'card'
CHARGE = 'charge'
COUPON = 'coupon'
CUSTOMER = 'customer'
DISCOUNT = 'discount'
DISPUTE = 'dispute'
EVENT = 'event'
INVOICEITEM = 'invoiceitem'
INVOICE = 'invoice'
LINE_ITEM = 'line_item'
PLAN = 'plan'
SUBSCRIPTION = 'subscription'
TOKEN = 'token'
TRANSFER = 'transfer'
LIST = 'list'
PRODUCT = 'product'
@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class StripeObject:
object: Optional[StripeType] = None
@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class StripeId(StripeObject):
id: Optional[str] = None
class StripeCouponDuration(str, Enum):
FOREVER = 'forever'
ONCE = 'once'
REPEATING = 'repeating'
@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class StripeCoupon(StripeId):
amount_off: Optional[int] = None
created: Optional[datetime.datetime] = None
currency: Optional[str] = None
duration: Optional[StripeCouponDuration] = None
duration_in_months: Optional[int] = None
livemode: bool = False
max_redemptions: Optional[int] = None
metadata: Optional[Dict[str, str]] = None
percent_off: Optional[int] = None
redeem_by: Optional[datetime.datetime] = None
times_redeemed: int = 0
valid: bool = False
@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class StripeDiscount(StripeId):
customer: Optional[str] = None
coupon: Optional[StripeCoupon] = None
start: Optional[datetime.datetime] = None
end: Optional[datetime.datetime] = None
@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class StripeAddress:
city: Optional[str] = None
country: Optional[str] = None
line1: Optional[str] = None
line2: Optional[str] = None
postal_code: Optional[str] = None
state: Optional[str] = None
@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class StripeShipping:
address: Optional[StripeAddress] = None
name: Optional[str] = None
phone: Optional[str] = None
class StripeCvcCheck(str, Enum):
UNKNOWN = 'Unknown'
PASS_ = 'Pass'
FAIL = 'Fail'
UNCHECKED = 'Unchecked'
@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class StripeCard(StripeId):
brand: Optional[str] = None
number: Optional[str] = None
last4: Optional[str] = None
dynamic_last4: Optional[str] = None
exp_month: int = 0
exp_year: int = 0
cvc: Optional[str] = None
name: Optional[str] = None
address_city: Optional[str] = None
address_country: Optional[str] = None
address_line1: Optional[str] = None
address_line2: Optional[str] = None
address_state: Optional[str] = None
address_zip: Optional[str] = None
cvc_check: Optional[StripeCvcCheck] = None
address_line1_check: Optional[str] = None
address_zip_check: Optional[str] = None
funding: Optional[str] = None
fingerprint: Optional[str] = None
customer: Optional[str] = None
country: Optional[str] = None
class StripeSubscriptionStatus(str, Enum):
UNKNOWN = 'Unknown'
TRIALING = 'Trialing'
ACTIVE = 'Active'
PAST_DUE = 'PastDue'
CANCELED = 'Canceled'
UNPAID = 'Unpaid'
class StripePlanInterval(str, Enum):
MONTH = 'month'
YEAR = 'year'
@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class StripePlan(StripeId):
amount: int = 0
created: Optional[datetime.datetime] = None
currency: Optional[str] = None
interval: Optional[StripePlanInterval] = None
interval_count: Optional[int] = None
livemode: bool = False
metadata: Optional[Dict[str, str]] = None
nickname: Optional[str] = None
product: Optional[str] = None
trial_period_days: Optional[int] = None
@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class StripeSubscription(StripeId):
current_period_end: Optional[datetime.datetime] = None
status: Optional[StripeSubscriptionStatus] = None
plan: Optional[StripePlan] = None
current_period_start: Optional[datetime.datetime] = None
start: Optional[datetime.datetime] = None
trial_start: Optional[datetime.datetime] = None
cancel_at_period_end: Optional[bool] = None
trial_end: Optional[datetime.datetime] = None
canceled_at: Optional[datetime.datetime] = None
ended_at: Optional[datetime.datetime] = None
customer: Optional[str] = None
quantity: int = 0
@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class StripeCustomer(StripeId):
account_balance: int = 0
business_vat_id: Optional[str] = None
created: Optional[datetime.datetime] = None
default_source: Optional[str] = None
delinquent: Optional[bool] = None
description: Optional[str] = None
discount: Optional[StripeDiscount] = None
email: Optional[str] = None
invoice_prefix: Optional[str] = None
livemode: bool = False
metadata: Optional[Dict[str, str]] = None
shipping: Optional[StripeShipping] = None
sources: Optional[StripeCollection[StripeCard]] = None
subscriptions: Optional[StripeCollection[StripeSubscription]] = None
deleted: bool = False
currency: Optional[str] = None
@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class CreateSubscribeCustomer(IPost):
email: Optional[str] = None
T = TypeVar('T')
@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class StripeCollection(Generic[T], StripeId):
url: Optional[str] = None
total_count: int = 0
has_more: Optional[bool] = None
data: Optional[List[T]] = None
Python CreateSubscribeCustomer DTOs
To override the Content-type in your clients, use the HTTP Accept Header, append the .xml suffix or ?format=xml
The following are sample HTTP requests and responses. The placeholders shown need to be replaced with actual values.
POST /create-customer HTTP/1.1
Host: api.sfgtec.com
Accept: application/xml
Content-Type: application/xml
Content-Length: length
<CreateSubscribeCustomer xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/sfgboxapi.ServiceModel">
<Email>String</Email>
</CreateSubscribeCustomer>
HTTP/1.1 200 OK
Content-Type: application/xml
Content-Length: length
<StripeCustomer xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/ServiceStack.Stripe.Types">
<Object>unknown</Object>
<Id>String</Id>
<AccountBalance>0</AccountBalance>
<BusinessVatId>String</BusinessVatId>
<Created>0001-01-01T00:00:00</Created>
<Currency>String</Currency>
<DefaultSource>String</DefaultSource>
<Deleted>false</Deleted>
<Delinquent>false</Delinquent>
<Description>String</Description>
<Discount>
<Object>unknown</Object>
<Id>String</Id>
<Coupon>
<Object>unknown</Object>
<Id>String</Id>
<AmountOff>0</AmountOff>
<Created>0001-01-01T00:00:00</Created>
<Currency>String</Currency>
<Duration>forever</Duration>
<DurationInMonths>0</DurationInMonths>
<Livemode>false</Livemode>
<MaxRedemptions>0</MaxRedemptions>
<Metadata xmlns:d4p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
<d4p1:KeyValueOfstringstring>
<d4p1:Key>String</d4p1:Key>
<d4p1:Value>String</d4p1:Value>
</d4p1:KeyValueOfstringstring>
</Metadata>
<PercentOff>0</PercentOff>
<RedeemBy>0001-01-01T00:00:00</RedeemBy>
<TimesRedeemed>0</TimesRedeemed>
<Valid>false</Valid>
</Coupon>
<Customer>String</Customer>
<End>0001-01-01T00:00:00</End>
<Start>0001-01-01T00:00:00</Start>
</Discount>
<Email>String</Email>
<InvoicePrefix>String</InvoicePrefix>
<Livemode>false</Livemode>
<Metadata xmlns:d2p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
<d2p1:KeyValueOfstringstring>
<d2p1:Key>String</d2p1:Key>
<d2p1:Value>String</d2p1:Value>
</d2p1:KeyValueOfstringstring>
</Metadata>
<Shipping>
<Address xmlns:d3p1="http://schemas.datacontract.org/2004/07/ServiceStack.Stripe">
<d3p1:City>String</d3p1:City>
<d3p1:Country>String</d3p1:Country>
<d3p1:Line1>String</d3p1:Line1>
<d3p1:Line2>String</d3p1:Line2>
<d3p1:PostalCode>String</d3p1:PostalCode>
<d3p1:State>String</d3p1:State>
</Address>
<Name>String</Name>
<Phone>String</Phone>
</Shipping>
<Sources>
<Object>unknown</Object>
<Id>String</Id>
<Data>
<StripeCard>
<Object>unknown</Object>
<Id>String</Id>
<AddressCity>String</AddressCity>
<AddressCountry>String</AddressCountry>
<AddressLine1>String</AddressLine1>
<AddressLine1Check>String</AddressLine1Check>
<AddressLine2>String</AddressLine2>
<AddressState>String</AddressState>
<AddressZip>String</AddressZip>
<AddressZipCheck>String</AddressZipCheck>
<Brand>String</Brand>
<Country>String</Country>
<Customer>String</Customer>
<Cvc>String</Cvc>
<CvcCheck>Unknown</CvcCheck>
<DynamicLast4>String</DynamicLast4>
<ExpMonth>0</ExpMonth>
<ExpYear>0</ExpYear>
<Fingerprint>String</Fingerprint>
<Funding>String</Funding>
<Last4>String</Last4>
<Name>String</Name>
<Number>String</Number>
</StripeCard>
</Data>
<HasMore>false</HasMore>
<TotalCount>0</TotalCount>
<Url>String</Url>
</Sources>
<Subscriptions>
<Object>unknown</Object>
<Id>String</Id>
<Data>
<StripeSubscription>
<Object>unknown</Object>
<Id>String</Id>
<CancelAtPeriodEnd>false</CancelAtPeriodEnd>
<CanceledAt>0001-01-01T00:00:00</CanceledAt>
<CurrentPeriodEnd>0001-01-01T00:00:00</CurrentPeriodEnd>
<CurrentPeriodStart>0001-01-01T00:00:00</CurrentPeriodStart>
<Customer>String</Customer>
<EndedAt>0001-01-01T00:00:00</EndedAt>
<Plan>
<Object>unknown</Object>
<Id>String</Id>
<Amount>0</Amount>
<Created>0001-01-01T00:00:00</Created>
<Currency>String</Currency>
<Interval>month</Interval>
<IntervalCount>0</IntervalCount>
<Livemode>false</Livemode>
<Metadata xmlns:d6p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
<d6p1:KeyValueOfstringstring>
<d6p1:Key>String</d6p1:Key>
<d6p1:Value>String</d6p1:Value>
</d6p1:KeyValueOfstringstring>
</Metadata>
<Nickname>String</Nickname>
<Product>String</Product>
<TrialPeriodDays>0</TrialPeriodDays>
</Plan>
<Quantity>0</Quantity>
<Start>0001-01-01T00:00:00</Start>
<Status>Unknown</Status>
<TrialEnd>0001-01-01T00:00:00</TrialEnd>
<TrialStart>0001-01-01T00:00:00</TrialStart>
</StripeSubscription>
</Data>
<HasMore>false</HasMore>
<TotalCount>0</TotalCount>
<Url>String</Url>
</Subscriptions>
</StripeCustomer>