| 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 .jsv suffix or ?format=jsv
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: text/jsv
Content-Type: text/jsv
Content-Length: length
{
email: String
}
HTTP/1.1 200 OK
Content-Type: text/jsv
Content-Length: length
{
accountBalance: 0,
businessVatId: String,
created: 0001-01-01,
defaultSource: String,
delinquent: False,
description: String,
discount:
{
customer: String,
coupon:
{
amountOff: 0,
created: 0001-01-01,
currency: String,
duration: forever,
durationInMonths: 0,
livemode: False,
maxRedemptions: 0,
metadata:
{
String: String
},
percentOff: 0,
redeemBy: 0001-01-01,
timesRedeemed: 0,
valid: False,
id: String,
object: unknown
},
start: 0001-01-01,
end: 0001-01-01,
id: String,
object: unknown
},
email: String,
invoicePrefix: String,
livemode: False,
metadata:
{
String: String
},
shipping:
{
address:
{
city: String,
country: String,
line1: String,
line2: String,
postalCode: String,
state: String
},
name: String,
phone: String
},
sources:
{
url: String,
totalCount: 0,
hasMore: False,
data:
[
{
brand: String,
number: String,
last4: String,
dynamicLast4: String,
expMonth: 0,
expYear: 0,
cvc: String,
name: String,
addressCity: String,
addressCountry: String,
addressLine1: String,
addressLine2: String,
addressState: String,
addressZip: String,
cvcCheck: Unknown,
addressLine1Check: String,
addressZipCheck: String,
funding: String,
fingerprint: String,
customer: String,
country: String,
id: String,
object: unknown
}
],
id: String,
object: unknown
},
subscriptions:
{
url: String,
totalCount: 0,
hasMore: False,
data:
[
{
currentPeriodEnd: 0001-01-01,
status: Unknown,
plan:
{
amount: 0,
created: 0001-01-01,
currency: String,
interval: month,
intervalCount: 0,
livemode: False,
metadata:
{
String: String
},
nickname: String,
product: String,
trialPeriodDays: 0,
id: String,
object: unknown
},
currentPeriodStart: 0001-01-01,
start: 0001-01-01,
trialStart: 0001-01-01,
cancelAtPeriodEnd: False,
trialEnd: 0001-01-01,
canceledAt: 0001-01-01,
endedAt: 0001-01-01,
customer: String,
quantity: 0,
id: String,
object: unknown
}
],
id: String,
object: unknown
},
deleted: False,
currency: String,
id: String,
object: unknown
}