| POST | /create-customer |
|---|
import Foundation
import ServiceStack
public class CreateSubscribeCustomer : IPost, Codable
{
public var email:String
required public init(){}
}
public class StripeCustomer : StripeId
{
public var accountBalance:Int
public var businessVatId:String
public var created:Date?
public var defaultSource:String
public var delinquent:Bool?
public var Description:String
public var discount:StripeDiscount
public var email:String
public var invoicePrefix:String
public var livemode:Bool
public var metadata:[String:String] = [:]
public var shipping:StripeShipping
public var sources:StripeCollection<StripeCard>
public var subscriptions:StripeCollection<StripeSubscription>
public var deleted:Bool
public var currency:String
required public init(){ super.init() }
private enum CodingKeys : String, CodingKey {
case accountBalance
case businessVatId
case created
case defaultSource
case delinquent
case Description
case discount
case email
case invoicePrefix
case livemode
case metadata
case shipping
case sources
case subscriptions
case deleted
case currency
}
required public init(from decoder: Decoder) throws {
try super.init(from: decoder)
let container = try decoder.container(keyedBy: CodingKeys.self)
accountBalance = try container.decodeIfPresent(Int.self, forKey: .accountBalance)
businessVatId = try container.decodeIfPresent(String.self, forKey: .businessVatId)
created = try container.decodeIfPresent(Date.self, forKey: .created)
defaultSource = try container.decodeIfPresent(String.self, forKey: .defaultSource)
delinquent = try container.decodeIfPresent(Bool.self, forKey: .delinquent)
Description = try container.decodeIfPresent(String.self, forKey: .Description)
discount = try container.decodeIfPresent(StripeDiscount.self, forKey: .discount)
email = try container.decodeIfPresent(String.self, forKey: .email)
invoicePrefix = try container.decodeIfPresent(String.self, forKey: .invoicePrefix)
livemode = try container.decodeIfPresent(Bool.self, forKey: .livemode)
metadata = try container.decodeIfPresent([String:String].self, forKey: .metadata) ?? [:]
shipping = try container.decodeIfPresent(StripeShipping.self, forKey: .shipping)
sources = try container.decodeIfPresent(StripeCollection<StripeCard>.self, forKey: .sources)
subscriptions = try container.decodeIfPresent(StripeCollection<StripeSubscription>.self, forKey: .subscriptions)
deleted = try container.decodeIfPresent(Bool.self, forKey: .deleted)
currency = try container.decodeIfPresent(String.self, forKey: .currency)
}
public override func encode(to encoder: Encoder) throws {
try super.encode(to: encoder)
var container = encoder.container(keyedBy: CodingKeys.self)
if accountBalance != nil { try container.encode(accountBalance, forKey: .accountBalance) }
if businessVatId != nil { try container.encode(businessVatId, forKey: .businessVatId) }
if created != nil { try container.encode(created, forKey: .created) }
if defaultSource != nil { try container.encode(defaultSource, forKey: .defaultSource) }
if delinquent != nil { try container.encode(delinquent, forKey: .delinquent) }
if Description != nil { try container.encode(Description, forKey: .Description) }
if discount != nil { try container.encode(discount, forKey: .discount) }
if email != nil { try container.encode(email, forKey: .email) }
if invoicePrefix != nil { try container.encode(invoicePrefix, forKey: .invoicePrefix) }
if livemode != nil { try container.encode(livemode, forKey: .livemode) }
if metadata.count > 0 { try container.encode(metadata, forKey: .metadata) }
if shipping != nil { try container.encode(shipping, forKey: .shipping) }
if sources != nil { try container.encode(sources, forKey: .sources) }
if subscriptions != nil { try container.encode(subscriptions, forKey: .subscriptions) }
if deleted != nil { try container.encode(deleted, forKey: .deleted) }
if currency != nil { try container.encode(currency, forKey: .currency) }
}
}
public class StripeId : StripeObject
{
public var id:String
required public init(){ super.init() }
private enum CodingKeys : String, CodingKey {
case id
}
required public init(from decoder: Decoder) throws {
try super.init(from: decoder)
let container = try decoder.container(keyedBy: CodingKeys.self)
id = try container.decodeIfPresent(String.self, forKey: .id)
}
public override func encode(to encoder: Encoder) throws {
try super.encode(to: encoder)
var container = encoder.container(keyedBy: CodingKeys.self)
if id != nil { try container.encode(id, forKey: .id) }
}
}
public class StripeObject : Codable
{
public var object:StripeType?
required public init(){}
}
public enum StripeType : String, Codable
{
case unknown
case account
case card
case charge
case coupon
case customer
case discount
case dispute
case event
case invoiceitem
case invoice
case line_item
case plan
case subscription
case token
case transfer
case list
case product
}
public class StripeDiscount : StripeId
{
public var customer:String
public var coupon:StripeCoupon
public var start:Date?
public var end:Date?
required public init(){ super.init() }
private enum CodingKeys : String, CodingKey {
case customer
case coupon
case start
case end
}
required public init(from decoder: Decoder) throws {
try super.init(from: decoder)
let container = try decoder.container(keyedBy: CodingKeys.self)
customer = try container.decodeIfPresent(String.self, forKey: .customer)
coupon = try container.decodeIfPresent(StripeCoupon.self, forKey: .coupon)
start = try container.decodeIfPresent(Date.self, forKey: .start)
end = try container.decodeIfPresent(Date.self, forKey: .end)
}
public override func encode(to encoder: Encoder) throws {
try super.encode(to: encoder)
var container = encoder.container(keyedBy: CodingKeys.self)
if customer != nil { try container.encode(customer, forKey: .customer) }
if coupon != nil { try container.encode(coupon, forKey: .coupon) }
if start != nil { try container.encode(start, forKey: .start) }
if end != nil { try container.encode(end, forKey: .end) }
}
}
public class StripeCoupon : StripeId
{
public var amountOff:Int?
public var created:Date?
public var currency:String
public var duration:StripeCouponDuration
public var durationInMonths:Int?
public var livemode:Bool
public var maxRedemptions:Int?
public var metadata:[String:String] = [:]
public var percentOff:Int?
public var redeemBy:Date?
public var timesRedeemed:Int
public var valid:Bool
required public init(){ super.init() }
private enum CodingKeys : String, CodingKey {
case amountOff
case created
case currency
case duration
case durationInMonths
case livemode
case maxRedemptions
case metadata
case percentOff
case redeemBy
case timesRedeemed
case valid
}
required public init(from decoder: Decoder) throws {
try super.init(from: decoder)
let container = try decoder.container(keyedBy: CodingKeys.self)
amountOff = try container.decodeIfPresent(Int.self, forKey: .amountOff)
created = try container.decodeIfPresent(Date.self, forKey: .created)
currency = try container.decodeIfPresent(String.self, forKey: .currency)
duration = try container.decodeIfPresent(StripeCouponDuration.self, forKey: .duration)
durationInMonths = try container.decodeIfPresent(Int.self, forKey: .durationInMonths)
livemode = try container.decodeIfPresent(Bool.self, forKey: .livemode)
maxRedemptions = try container.decodeIfPresent(Int.self, forKey: .maxRedemptions)
metadata = try container.decodeIfPresent([String:String].self, forKey: .metadata) ?? [:]
percentOff = try container.decodeIfPresent(Int.self, forKey: .percentOff)
redeemBy = try container.decodeIfPresent(Date.self, forKey: .redeemBy)
timesRedeemed = try container.decodeIfPresent(Int.self, forKey: .timesRedeemed)
valid = try container.decodeIfPresent(Bool.self, forKey: .valid)
}
public override func encode(to encoder: Encoder) throws {
try super.encode(to: encoder)
var container = encoder.container(keyedBy: CodingKeys.self)
if amountOff != nil { try container.encode(amountOff, forKey: .amountOff) }
if created != nil { try container.encode(created, forKey: .created) }
if currency != nil { try container.encode(currency, forKey: .currency) }
if duration != nil { try container.encode(duration, forKey: .duration) }
if durationInMonths != nil { try container.encode(durationInMonths, forKey: .durationInMonths) }
if livemode != nil { try container.encode(livemode, forKey: .livemode) }
if maxRedemptions != nil { try container.encode(maxRedemptions, forKey: .maxRedemptions) }
if metadata.count > 0 { try container.encode(metadata, forKey: .metadata) }
if percentOff != nil { try container.encode(percentOff, forKey: .percentOff) }
if redeemBy != nil { try container.encode(redeemBy, forKey: .redeemBy) }
if timesRedeemed != nil { try container.encode(timesRedeemed, forKey: .timesRedeemed) }
if valid != nil { try container.encode(valid, forKey: .valid) }
}
}
public enum StripeCouponDuration : String, Codable
{
case forever
case once
case repeating
}
public class StripeShipping : Codable
{
public var address:StripeAddress
public var name:String
public var phone:String
required public init(){}
}
public class StripeAddress : Codable
{
public var city:String
public var country:String
public var line1:String
public var line2:String
public var postalCode:String
public var state:String
required public init(){}
}
public class StripeCollection<T : Codable> : StripeId
{
public var url:String
public var totalCount:Int
public var hasMore:Bool?
public var data:[T] = []
required public init(){ super.init() }
private enum CodingKeys : String, CodingKey {
case url
case totalCount
case hasMore
case data
}
required public init(from decoder: Decoder) throws {
try super.init(from: decoder)
let container = try decoder.container(keyedBy: CodingKeys.self)
url = try container.decodeIfPresent(String.self, forKey: .url)
totalCount = try container.decodeIfPresent(Int.self, forKey: .totalCount)
hasMore = try container.decodeIfPresent(Bool.self, forKey: .hasMore)
data = try container.decodeIfPresent([T].self, forKey: .data) ?? []
}
public override func encode(to encoder: Encoder) throws {
try super.encode(to: encoder)
var container = encoder.container(keyedBy: CodingKeys.self)
if url != nil { try container.encode(url, forKey: .url) }
if totalCount != nil { try container.encode(totalCount, forKey: .totalCount) }
if hasMore != nil { try container.encode(hasMore, forKey: .hasMore) }
if data.count > 0 { try container.encode(data, forKey: .data) }
}
}
public class StripeCard : StripeId
{
public var brand:String
public var number:String
public var last4:String
public var dynamicLast4:String
public var expMonth:Int
public var expYear:Int
public var cvc:String
public var name:String
public var addressCity:String
public var addressCountry:String
public var addressLine1:String
public var addressLine2:String
public var addressState:String
public var addressZip:String
public var cvcCheck:StripeCvcCheck?
public var addressLine1Check:String
public var addressZipCheck:String
public var funding:String
public var fingerprint:String
public var customer:String
public var country:String
required public init(){ super.init() }
private enum CodingKeys : String, CodingKey {
case brand
case number
case last4
case dynamicLast4
case expMonth
case expYear
case cvc
case name
case addressCity
case addressCountry
case addressLine1
case addressLine2
case addressState
case addressZip
case cvcCheck
case addressLine1Check
case addressZipCheck
case funding
case fingerprint
case customer
case country
}
required public init(from decoder: Decoder) throws {
try super.init(from: decoder)
let container = try decoder.container(keyedBy: CodingKeys.self)
brand = try container.decodeIfPresent(String.self, forKey: .brand)
number = try container.decodeIfPresent(String.self, forKey: .number)
last4 = try container.decodeIfPresent(String.self, forKey: .last4)
dynamicLast4 = try container.decodeIfPresent(String.self, forKey: .dynamicLast4)
expMonth = try container.decodeIfPresent(Int.self, forKey: .expMonth)
expYear = try container.decodeIfPresent(Int.self, forKey: .expYear)
cvc = try container.decodeIfPresent(String.self, forKey: .cvc)
name = try container.decodeIfPresent(String.self, forKey: .name)
addressCity = try container.decodeIfPresent(String.self, forKey: .addressCity)
addressCountry = try container.decodeIfPresent(String.self, forKey: .addressCountry)
addressLine1 = try container.decodeIfPresent(String.self, forKey: .addressLine1)
addressLine2 = try container.decodeIfPresent(String.self, forKey: .addressLine2)
addressState = try container.decodeIfPresent(String.self, forKey: .addressState)
addressZip = try container.decodeIfPresent(String.self, forKey: .addressZip)
cvcCheck = try container.decodeIfPresent(StripeCvcCheck.self, forKey: .cvcCheck)
addressLine1Check = try container.decodeIfPresent(String.self, forKey: .addressLine1Check)
addressZipCheck = try container.decodeIfPresent(String.self, forKey: .addressZipCheck)
funding = try container.decodeIfPresent(String.self, forKey: .funding)
fingerprint = try container.decodeIfPresent(String.self, forKey: .fingerprint)
customer = try container.decodeIfPresent(String.self, forKey: .customer)
country = try container.decodeIfPresent(String.self, forKey: .country)
}
public override func encode(to encoder: Encoder) throws {
try super.encode(to: encoder)
var container = encoder.container(keyedBy: CodingKeys.self)
if brand != nil { try container.encode(brand, forKey: .brand) }
if number != nil { try container.encode(number, forKey: .number) }
if last4 != nil { try container.encode(last4, forKey: .last4) }
if dynamicLast4 != nil { try container.encode(dynamicLast4, forKey: .dynamicLast4) }
if expMonth != nil { try container.encode(expMonth, forKey: .expMonth) }
if expYear != nil { try container.encode(expYear, forKey: .expYear) }
if cvc != nil { try container.encode(cvc, forKey: .cvc) }
if name != nil { try container.encode(name, forKey: .name) }
if addressCity != nil { try container.encode(addressCity, forKey: .addressCity) }
if addressCountry != nil { try container.encode(addressCountry, forKey: .addressCountry) }
if addressLine1 != nil { try container.encode(addressLine1, forKey: .addressLine1) }
if addressLine2 != nil { try container.encode(addressLine2, forKey: .addressLine2) }
if addressState != nil { try container.encode(addressState, forKey: .addressState) }
if addressZip != nil { try container.encode(addressZip, forKey: .addressZip) }
if cvcCheck != nil { try container.encode(cvcCheck, forKey: .cvcCheck) }
if addressLine1Check != nil { try container.encode(addressLine1Check, forKey: .addressLine1Check) }
if addressZipCheck != nil { try container.encode(addressZipCheck, forKey: .addressZipCheck) }
if funding != nil { try container.encode(funding, forKey: .funding) }
if fingerprint != nil { try container.encode(fingerprint, forKey: .fingerprint) }
if customer != nil { try container.encode(customer, forKey: .customer) }
if country != nil { try container.encode(country, forKey: .country) }
}
}
public enum StripeCvcCheck : String, Codable
{
case Unknown
case Pass
case Fail
case Unchecked
}
public class StripeSubscription : StripeId
{
public var currentPeriodEnd:Date?
public var status:StripeSubscriptionStatus
public var plan:StripePlan
public var currentPeriodStart:Date?
public var start:Date?
public var trialStart:Date?
public var cancelAtPeriodEnd:Bool?
public var trialEnd:Date?
public var canceledAt:Date?
public var endedAt:Date?
public var customer:String
public var quantity:Int
required public init(){ super.init() }
private enum CodingKeys : String, CodingKey {
case currentPeriodEnd
case status
case plan
case currentPeriodStart
case start
case trialStart
case cancelAtPeriodEnd
case trialEnd
case canceledAt
case endedAt
case customer
case quantity
}
required public init(from decoder: Decoder) throws {
try super.init(from: decoder)
let container = try decoder.container(keyedBy: CodingKeys.self)
currentPeriodEnd = try container.decodeIfPresent(Date.self, forKey: .currentPeriodEnd)
status = try container.decodeIfPresent(StripeSubscriptionStatus.self, forKey: .status)
plan = try container.decodeIfPresent(StripePlan.self, forKey: .plan)
currentPeriodStart = try container.decodeIfPresent(Date.self, forKey: .currentPeriodStart)
start = try container.decodeIfPresent(Date.self, forKey: .start)
trialStart = try container.decodeIfPresent(Date.self, forKey: .trialStart)
cancelAtPeriodEnd = try container.decodeIfPresent(Bool.self, forKey: .cancelAtPeriodEnd)
trialEnd = try container.decodeIfPresent(Date.self, forKey: .trialEnd)
canceledAt = try container.decodeIfPresent(Date.self, forKey: .canceledAt)
endedAt = try container.decodeIfPresent(Date.self, forKey: .endedAt)
customer = try container.decodeIfPresent(String.self, forKey: .customer)
quantity = try container.decodeIfPresent(Int.self, forKey: .quantity)
}
public override func encode(to encoder: Encoder) throws {
try super.encode(to: encoder)
var container = encoder.container(keyedBy: CodingKeys.self)
if currentPeriodEnd != nil { try container.encode(currentPeriodEnd, forKey: .currentPeriodEnd) }
if status != nil { try container.encode(status, forKey: .status) }
if plan != nil { try container.encode(plan, forKey: .plan) }
if currentPeriodStart != nil { try container.encode(currentPeriodStart, forKey: .currentPeriodStart) }
if start != nil { try container.encode(start, forKey: .start) }
if trialStart != nil { try container.encode(trialStart, forKey: .trialStart) }
if cancelAtPeriodEnd != nil { try container.encode(cancelAtPeriodEnd, forKey: .cancelAtPeriodEnd) }
if trialEnd != nil { try container.encode(trialEnd, forKey: .trialEnd) }
if canceledAt != nil { try container.encode(canceledAt, forKey: .canceledAt) }
if endedAt != nil { try container.encode(endedAt, forKey: .endedAt) }
if customer != nil { try container.encode(customer, forKey: .customer) }
if quantity != nil { try container.encode(quantity, forKey: .quantity) }
}
}
public enum StripeSubscriptionStatus : String, Codable
{
case Unknown
case Trialing
case Active
case PastDue
case Canceled
case Unpaid
}
public class StripePlan : StripeId
{
public var amount:Int
public var created:Date?
public var currency:String
public var interval:StripePlanInterval
public var intervalCount:Int?
public var livemode:Bool
public var metadata:[String:String] = [:]
public var nickname:String
public var product:String
public var trialPeriodDays:Int?
required public init(){ super.init() }
private enum CodingKeys : String, CodingKey {
case amount
case created
case currency
case interval
case intervalCount
case livemode
case metadata
case nickname
case product
case trialPeriodDays
}
required public init(from decoder: Decoder) throws {
try super.init(from: decoder)
let container = try decoder.container(keyedBy: CodingKeys.self)
amount = try container.decodeIfPresent(Int.self, forKey: .amount)
created = try container.decodeIfPresent(Date.self, forKey: .created)
currency = try container.decodeIfPresent(String.self, forKey: .currency)
interval = try container.decodeIfPresent(StripePlanInterval.self, forKey: .interval)
intervalCount = try container.decodeIfPresent(Int.self, forKey: .intervalCount)
livemode = try container.decodeIfPresent(Bool.self, forKey: .livemode)
metadata = try container.decodeIfPresent([String:String].self, forKey: .metadata) ?? [:]
nickname = try container.decodeIfPresent(String.self, forKey: .nickname)
product = try container.decodeIfPresent(String.self, forKey: .product)
trialPeriodDays = try container.decodeIfPresent(Int.self, forKey: .trialPeriodDays)
}
public override func encode(to encoder: Encoder) throws {
try super.encode(to: encoder)
var container = encoder.container(keyedBy: CodingKeys.self)
if amount != nil { try container.encode(amount, forKey: .amount) }
if created != nil { try container.encode(created, forKey: .created) }
if currency != nil { try container.encode(currency, forKey: .currency) }
if interval != nil { try container.encode(interval, forKey: .interval) }
if intervalCount != nil { try container.encode(intervalCount, forKey: .intervalCount) }
if livemode != nil { try container.encode(livemode, forKey: .livemode) }
if metadata.count > 0 { try container.encode(metadata, forKey: .metadata) }
if nickname != nil { try container.encode(nickname, forKey: .nickname) }
if product != nil { try container.encode(product, forKey: .product) }
if trialPeriodDays != nil { try container.encode(trialPeriodDays, forKey: .trialPeriodDays) }
}
}
public enum StripePlanInterval : String, Codable
{
case month
case year
}
Swift 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
}