diff --git a/billing.go b/billing.go new file mode 100644 index 0000000..b6a9a32 --- /dev/null +++ b/billing.go @@ -0,0 +1,3 @@ +package paypalsdk + +import () diff --git a/billing_test.go b/billing_test.go new file mode 100644 index 0000000..d8e75dc --- /dev/null +++ b/billing_test.go @@ -0,0 +1,164 @@ +package paypalsdk + +import ( + "encoding/json" + "github.com/stretchr/testify/assert" + "testing" +) + +func TestJsonStructure(t *testing.T) { + expected_str := `{ + "name": "Plan with Regular and Trial Payment Definitions", + "description": "Plan with regular and trial payment definitions.", + "type": "fixed", + "payment_definitions": [ + { + "name": "Regular payment definition", + "type": "REGULAR", + "frequency": "MONTH", + "frequency_interval": "2", + "amount": + { + "value": "100", + "currency": "USD" + }, + "cycles": "12", + "charge_models": [ + { + "type": "SHIPPING", + "amount": + { + "value": "10", + "currency": "USD" + } + }, + { + "type": "TAX", + "amount": + { + "value": "12", + "currency": "USD" + } + }] + }, + { + "name": "Trial payment definition", + "type": "trial", + "frequency": "week", + "frequency_interval": "5", + "amount": + { + "value": "9.19", + "currency": "USD" + }, + "cycles": "2", + "charge_models": [ + { + "type": "SHIPPING", + "amount": + { + "value": "1", + "currency": "USD" + } + }, + { + "type": "TAX", + "amount": + { + "value": "2", + "currency": "USD" + } + }] + }], + "merchant_preferences": + { + "setup_fee": + { + "value": "1", + "currency": "USD" + }, + "return_url": "http://www.paypal.com", + "cancel_url": "http://www.paypal.com/cancel", + "auto_bill_amount": "YES", + "initial_fail_amount_action": "CONTINUE", + "max_fail_attempts": "0" + } +}` + plan := BillingPlan{ + Name: "Plan with Regular and Trial Payment Definitions", + Description: "Plan with regular and trial payment definitions.", + Type: "fixed", + PaymentDefinitions: []PaymentDefinition{ + PaymentDefinition{ + Name: "Regular payment definition", + Type: "REGULAR", + Frequency: "MONTH", + FrequencyInterval: "2", + Amount: AmountPayout{ + Value: "100", + Currency: "USD", + }, + Cycles: "12", + ChargeModels: []ChargeModel{ + ChargeModel{ + Type: "SHIPPING", + Amount: AmountPayout{ + Value: "10", + Currency: "USD", + }, + }, + ChargeModel{ + Type: "TAX", + Amount: AmountPayout{ + Value: "12", + Currency: "USD", + }, + }, + }, + }, + PaymentDefinition{ + Name: "Trial payment definition", + Type: "trial", + Frequency: "week", + FrequencyInterval: "5", + Amount: AmountPayout{ + Value: "9.19", + Currency: "USD", + }, + Cycles: "2", + ChargeModels: []ChargeModel{ + ChargeModel{ + Type: "SHIPPING", + Amount: AmountPayout{ + Value: "1", + Currency: "USD", + }, + }, + ChargeModel{ + Type: "TAX", + Amount: AmountPayout{ + Value: "2", + Currency: "USD", + }, + }, + }, + }, + }, + MerchantPreferences: MerchantPreferences{ + SetupFee: AmountPayout{ + Value: "1", + Currency: "USD", + }, + ReturnUrl: "http://www.paypal.com", + CancelUrl: "http://www.paypal.com/cancel", + AutoBillAmount: "YES", + InitialFailAmountAction: "CONTINUE", + MaxFailAttempts: "0", + }, + } + _, err := json.Marshal(&plan) + expected := new(BillingPlan) + json.Unmarshal([]byte(expected_str), expected) + assert.NoError(t, err) + assert.Equal(t, expected, &plan, "Wrong billing builder") +} diff --git a/types.go b/types.go index 074a46f..1860cfa 100644 --- a/types.go +++ b/types.go @@ -93,6 +93,15 @@ type ( SenderBatchHeader *SenderBatchHeader `json:"sender_batch_header,omitempty"` } + // BillingPlan struct + BillingPlan struct { + Name string `json:"name,omitempty"` + Description string `json:"description,omitempty"` + Type string `json:"type,omitempty"` + PaymentDefinitions []PaymentDefinition `json:"payment_definitions,omitempty"` + MerchantPreferences MerchantPreferences `json:"merchant_preferences,omitempty"` + } + // Capture struct Capture struct { Amount *Amount `json:"amount,omitempty"` @@ -105,14 +114,20 @@ type ( Links []Link `json:"links,omitempty"` } + // ChargeModel struct + ChargeModel struct { + Type string `json:"type,omitempty"` + Amount AmountPayout `json:"amount,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 + 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 tokenExpiresAt time.Time } @@ -218,6 +233,16 @@ type ( Enctype string `json:"enctype,omitempty"` } + // MerchantPreferences struct + MerchantPreferences struct { + SetupFee AmountPayout `json:"setup_fee,omitempty"` + ReturnUrl string `json:"return_url,omitempty"` + CancelUrl string `json:"cancel_url,omitempty"` + AutoBillAmount string `json:"auto_bill_amount,omitempty"` + InitialFailAmountAction string `json:"initial_fail_amount_action,omitempty"` + MaxFailAttempts string `json:"max_fail_attempts,omitempty"` + } + // Order struct Order struct { ID string `json:"id,omitempty"` @@ -263,6 +288,17 @@ type ( ExperienceProfileID string `json:"experience_profile_id,omitempty"` } + // PaymentDefinition struct + PaymentDefinition struct { + Name string `json:"name,omitempty"` + Type string `json:"type,omitempty"` + Frequency string `json:"frequency,omitempty"` + FrequencyInterval string `json:"frequency_interval,omitempty"` + Amount AmountPayout `json:"amount,omitempty"` + Cycles string `json:"cycles,omitempty"` + ChargeModels []ChargeModel `json:"charge_models,omitempty"` + } + // PaymentResponse structure PaymentResponse struct { ID string `json:"id"`