package paypalsdk import ( "fmt" "io" "net/http" "time" ) const ( // APIBaseSandBox points to the sandbox (for testing) version of the API APIBaseSandBox = "https://api.sandbox.paypal.com" // APIBaseLive points to the live version of the API APIBaseLive = "https://api.paypal.com" // RequestNewTokenBeforeExpiresIn is used by SendWithAuth and try to get new Token when it's about to expire RequestNewTokenBeforeExpiresIn = 60 ) // Possible values for `no_shipping` in InputFields // // https://developer.paypal.com/docs/api/payment-experience/#definition-input_fields const ( NoShippingDisplay uint = 0 NoShippingHide uint = 1 NoShippingBuyerAccount uint = 2 ) // Possible values for `address_override` in InputFields // // https://developer.paypal.com/docs/api/payment-experience/#definition-input_fields const ( AddrOverrideFromFile uint = 0 AddrOverrideFromCall uint = 1 ) // Possible values for `landing_page_type` in FlowConfig // // https://developer.paypal.com/docs/api/payment-experience/#definition-flow_config const ( LandingPageTypeBilling string = "Billing" LandingPageTypeLogin string = "Login" ) type ( // Address struct Address struct { Line1 string `json:"line1"` Line2 string `json:"line2,omitempty"` City string `json:"city"` CountryCode string `json:"country_code"` PostalCode string `json:"postal_code,omitempty"` State string `json:"state,omitempty"` Phone string `json:"phone,omitempty"` } // Amount struct Amount struct { Currency string `json:"currency"` Total string `json:"total"` } // AmountPayout struct AmountPayout struct { Currency string `json:"currency"` Value string `json:"value"` } // Authorization struct Authorization struct { Amount *Amount `json:"amount,omitempty"` CreateTime *time.Time `json:"create_time,omitempty"` UpdateTime *time.Time `json:"update_time,omitempty"` State string `json:"state,omitempty"` ParentPayment string `json:"parent_payment,omitempty"` ID string `json:"id,omitempty"` ValidUntil *time.Time `json:"valid_until,omitempty"` Links []Link `json:"links,omitempty"` ClearingTime string `json:"clearing_time,omitempty"` ProtectionEligibility string `json:"protection_eligibility,omitempty"` ProtectionEligibilityType string `json:"protection_eligibility_type,omitempty"` } // BatchHeader struct BatchHeader struct { Amount *AmountPayout `json:"amount,omitempty"` Fees *AmountPayout `json:"fees,omitempty"` PayoutBatchID string `json:"payout_batch_id,omitempty"` BatchStatus string `json:"batch_status,omitempty"` TimeCreated *time.Time `json:"time_created,omitempty"` TimeCompleted *time.Time `json:"time_completed,omitempty"` SenderBatchHeader *SenderBatchHeader `json:"sender_batch_header,omitempty"` } // Capture struct Capture struct { Amount *Amount `json:"amount,omitempty"` IsFinalCapture bool `json:"is_final_capture"` CreateTime *time.Time `json:"create_time,omitempty"` UpdateTime *time.Time `json:"update_time,omitempty"` State string `json:"state,omitempty"` ParentPayment string `json:"parent_payment,omitempty"` ID string `json:"id,omitempty"` Links []Link `json:"links,omitempty"` } // Client represents a Paypal REST API Client Client struct { client *http.Client ClientID string Secret string APIBase string Log io.Writer // If user set log file name all requests will be logged there Token *TokenResponse } // CreditCard struct CreditCard struct { ID string `json:"id,omitempty"` PayerID string `json:"payer_id,omitempty"` ExternalCustomerId string `json:"external_customer_id,omitempty"` Number string `json:"number"` Type string `json:"type"` ExpireMonth string `json:"expire_month"` ExpireYear string `json:"expire_year"` CVV2 string `json:"cvv2,omitempty"` FirstName string `json:"first_name,omitempty"` LastName string `json:"last_name,omitempty"` BillingAddress *Address `json:"billing_address,omitempty"` State string `json:"state,omitempty"` ValidUntil string `json:"valid_until,omitempty"` } // CreditCards GET /v1/vault/credit-cards CreditCards struct { Items []CreditCard `json:"items"` Links []Link `json:"links"` TotalItems int `json:"total_items"` TotalPages int `json:"total_pages"` } // CreditCardToken struct CreditCardToken struct { CreditCardID string `json:"credit_card_id"` PayerID string `json:"payer_id,omitempty"` Last4 string `json:"last4,omitempty"` ExpireYear string `json:"expire_year,omitempty"` ExpireMonth string `json:"expire_month,omitempty"` } // CreditCardsFilter struct CreditCardsFilter struct { PageSize int Page int } // CreditCardField PATCH /v1/vault/credit-cards/credit_card_id CreditCardField struct { Operation string `json:"op"` Path string `json:"path"` Value string `json:"value"` } // Currency struct Currency struct { Currency string `json:"currency,omitempty"` Value string `json:"value,omitempty"` } // ErrorResponse https://developer.paypal.com/docs/api/errors/ ErrorResponse struct { Response *http.Response `json:"-"` Name string `json:"name"` DebugID string `json:"debug_id"` Message string `json:"message"` InformationLink string `json:"information_link"` Details string `json:"details"` } // ExecuteResponse struct ExecuteResponse struct { ID string `json:"id"` Links []Link `json:"links"` State string `json:"state"` Transactions []Transaction `json:"transactions,omitempty"` } // FundingInstrument struct FundingInstrument struct { CreditCard *CreditCard `json:"credit_card,omitempty"` CreditCardToken *CreditCardToken `json:"credit_card_token,omitempty"` } // Item struct Item struct { Quantity int `json:"quantity"` Name string `json:"name"` Price string `json:"price"` Currency string `json:"currency"` SKU string `json:"sku,omitempty"` Description string `json:"description,omitempty"` Tax string `json:"tax,omitempty"` } // ItemList struct ItemList struct { Items []Item `json:"items,omitempty"` ShippingAddress *ShippingAddress `json:"shipping_address,omitempty"` } // Link struct Link struct { Href string `json:"href"` Rel string `json:"rel,omitempty"` Method string `json:"method,omitempty"` Enctype string `json:"enctype,omitempty"` } // Order struct Order struct { ID string `json:"id,omitempty"` CreateTime *time.Time `json:"create_time,omitempty"` UpdateTime *time.Time `json:"update_time,omitempty"` State string `json:"state,omitempty"` Amount *Amount `json:"amount,omitempty"` PendingReason string `json:"pending_reason,omitempty"` ParentPayment string `json:"parent_payment,omitempty"` Links []Link `json:"links,omitempty"` } // Payer struct Payer struct { PaymentMethod string `json:"payment_method"` FundingInstruments []FundingInstrument `json:"funding_instruments,omitempty"` PayerInfo *PayerInfo `json:"payer_info,omitempty"` Status string `json:"payer_status,omitempty"` } // PayerInfo struct PayerInfo struct { Email string `json:"email,omitempty"` FirstName string `json:"first_name,omitempty"` LastName string `json:"last_name,omitempty"` PayerID string `json:"payer_id,omitempty"` Phone string `json:"phone,omitempty"` ShippingAddress *ShippingAddress `json:"shipping_address,omitempty"` TaxIDType string `json:"tax_id_type,omitempty"` TaxID string `json:"tax_id,omitempty"` } // Payment struct Payment struct { Intent string `json:"intent"` Payer *Payer `json:"payer"` Transactions []Transaction `json:"transactions"` RedirectURLs *RedirectURLs `json:"redirect_urls,omitempty"` ID string `json:"id,omitempty"` CreateTime *time.Time `json:"create_time,omitempty"` State string `json:"state,omitempty"` UpdateTime *time.Time `json:"update_time,omitempty"` ExperienceProfileID string `json:"experience_profile_id,omitempty"` } // PaymentResponse structure PaymentResponse struct { ID string `json:"id"` Links []Link `json:"links"` } // Payout struct Payout struct { SenderBatchHeader *SenderBatchHeader `json:"sender_batch_header"` Items []PayoutItem `json:"items"` } // PayoutItem struct PayoutItem struct { RecipientType string `json:"recipient_type"` Receiver string `json:"receiver"` Amount *AmountPayout `json:"amount"` Note string `json:"note,omitempty"` SenderItemID string `json:"sender_item_id,omitempty"` } // PayoutItemResponse struct PayoutItemResponse struct { PayoutItemID string `json:"payout_item_id"` TransactionID string `json:"transaction_id"` TransactionStatus string `json:"transaction_status"` PayoutBatchID string `json:"payout_batch_id,omitempty"` PayoutItemFee *AmountPayout `json:"payout_item_fee,omitempty"` PayoutItem *PayoutItem `json:"payout_item"` TimeProcessed *time.Time `json:"time_processed,omitempty"` Links []Link `json:"links"` } // PayoutResponse struct PayoutResponse struct { BatchHeader *BatchHeader `json:"batch_header"` Items []PayoutItemResponse `json:"items"` Links []Link `json:"links"` } // RedirectURLs struct RedirectURLs struct { ReturnURL string `json:"return_url,omitempty"` CancelURL string `json:"cancel_url,omitempty"` } // Refund struct Refund struct { ID string `json:"id,omitempty"` Amount *Amount `json:"amount,omitempty"` CreateTime *time.Time `json:"create_time,omitempty"` State string `json:"state,omitempty"` CaptureID string `json:"capture_id,omitempty"` ParentPayment string `json:"parent_payment,omitempty"` UpdateTime *time.Time `json:"update_time,omitempty"` } // Related struct Related struct { Sale *Sale `json:"sale,omitempty"` Authorization *Authorization `json:"authorization,omitempty"` Order *Order `json:"order,omitempty"` Capture *Capture `json:"capture,omitempty"` Refund *Refund `json:"refund,omitempty"` } // Sale struct Sale struct { ID string `json:"id,omitempty"` Amount *Amount `json:"amount,omitempty"` Description string `json:"description,omitempty"` CreateTime *time.Time `json:"create_time,omitempty"` State string `json:"state,omitempty"` ParentPayment string `json:"parent_payment,omitempty"` UpdateTime *time.Time `json:"update_time,omitempty"` PaymentMode string `json:"payment_mode,omitempty"` PendingReason string `json:"pending_reason,omitempty"` ReasonCode string `json:"reason_code,omitempty"` ClearingTime string `json:"clearing_time,omitempty"` ProtectionEligibility string `json:"protection_eligibility,omitempty"` ProtectionEligibilityType string `json:"protection_eligibility_type,omitempty"` Links []Link `json:"links,omitempty"` } // SenderBatchHeader struct SenderBatchHeader struct { EmailSubject string `json:"email_subject"` } // ShippingAddress struct ShippingAddress struct { RecipientName string `json:"recipient_name,omitempty"` Type string `json:"type,omitempty"` Line1 string `json:"line1"` Line2 string `json:"line2,omitempty"` City string `json:"city"` CountryCode string `json:"country_code"` PostalCode string `json:"postal_code,omitempty"` State string `json:"state,omitempty"` Phone string `json:"phone,omitempty"` } // TokenResponse is for API response for the /oauth2/token endpoint TokenResponse struct { RefreshToken string `json:"refresh_token"` Token string `json:"access_token"` Type string `json:"token_type"` ExpiresIn int64 `json:"expires_in"` } // Transaction struct Transaction struct { Amount *Amount `json:"amount"` Description string `json:"description,omitempty"` ItemList *ItemList `json:"item_list,omitempty"` InvoiceNumber string `json:"invoice_number,omitempty"` Custom string `json:"custom,omitempty"` SoftDescriptor string `json:"soft_descriptor,omitempty"` RelatedResources []Related `json:"related_resources,omitempty"` } // UserInfo struct UserInfo struct { ID string `json:"user_id"` Name string `json:"name"` GivenName string `json:"given_name"` FamilyName string `json:"family_name"` Email string `json:"email"` Verified bool `json:"verified,omitempty"` Gender string `json:"gender,omitempty"` BirthDate string `json:"birthdate,omitempty"` ZoneInfo string `json:"zoneinfo,omitempty"` Locale string `json:"locale,omitempty"` Phone string `json:"phone_number,omitempty"` Address *Address `json:"address,omitempty"` VerifiedAccount bool `json:"verified_account,omitempty"` AccountType string `json:"account_type,omitempty"` AgeRange string `json:"age_range,omitempty"` PayerID string `json:"payer_id,omitempty"` } // WebProfile represents the configuration of the payment web payment experience // // https://developer.paypal.com/docs/api/payment-experience/ WebProfile struct { ID string `json:"id,omitempty"` Name string `json:"name"` Presentation Presentation `json:"presentation,omitempty"` InputFields InputFields `json:"input_fields,omitempty"` FlowConfig FlowConfig `json:"flow_config,omitempty"` } // Presentation represents the branding and locale that a customer sees on // redirect payments // // https://developer.paypal.com/docs/api/payment-experience/#definition-presentation Presentation struct { BrandName string `json:"brand_name,omitempty"` LogoImage string `json:"logo_image,omitempty"` LocaleCode string `json:"locale_code,omitempty"` } // InputFields represents the fields that are displayed to a customer on // redirect payments // // https://developer.paypal.com/docs/api/payment-experience/#definition-input_fields InputFields struct { AllowNote bool `json:"allow_note,omitempty"` NoShipping uint `json:"no_shipping,omitempty"` AddressOverride uint `json:"address_override,omitempty"` } // FlowConfig represents the general behaviour of redirect payment pages // // https://developer.paypal.com/docs/api/payment-experience/#definition-flow_config FlowConfig struct { LandingPageType string `json:"landing_page_type,omitempty"` BankTXNPendingURL string `json:"bank_txn_pending_url,omitempty"` UserAction string `json:"user_action,omitempty"` } ) // Error method implementation for ErrorResponse struct func (r *ErrorResponse) Error() string { return fmt.Sprintf("%v %v: %d %s", r.Response.Request.Method, r.Response.Request.URL, r.Response.StatusCode, r.Message) }