diff --git a/billing_agreements.go b/billing_agreements.go new file mode 100644 index 00000000..981550e2 --- /dev/null +++ b/billing_agreements.go @@ -0,0 +1,42 @@ +package paypal + +import ( + "context" + "fmt" +) + +// CreateBillingAgreementToken - Use this call to create a billing agreement +// Endpoint: POST /v1/billing-agreements/agreement-tokens +func (c *Client) CreateBillingAgreementToken( + ctx context.Context, + name string, + description string, + startDate string, + payer *Payer, + plan *BillingPlan, +) (*BillingAgreementToken, error) { + type createBARequest struct { + Name string `json:"name"` + Description string `json:"description"` + StartDate string `json:"start_date"` + Payer *Payer `json:"payer"` + Plan *BillingPlan `json:"plan"` + } + + billingAgreementToken := &BillingAgreementToken{} + + req, err := c.NewRequest( + ctx, + "POST", + fmt.Sprintf("%s%s", c.APIBase, "/v1/billing-agreements/agreement-tokens"), + createBARequest{Name: name, Description: description, StartDate: startDate, Payer: payer, Plan: plan}) + if err != nil { + return nil, err + } + + if err = c.SendWithAuth(req, billingAgreementToken); err != nil { + return billingAgreementToken, err + } + + return billingAgreementToken, nil +} diff --git a/types.go b/types.go index 908fefde..e963983b 100644 --- a/types.go +++ b/types.go @@ -328,6 +328,36 @@ type ( OverrideMerchantPreferences *MerchantPreferences `json:"override_merchant_preferences,omitempty"` } + // BillingAgreementToken response struct + BillingAgreementToken struct { + ID string `json:"id,omitempty"` + Name string `json:"name,omitempty"` + Description string `json:"description,omitempty"` + StartDate string `json:"start_date,omitempty"` + AgreementDetails *AgreementDetails `json:"agreement_details,omitempty"` + Payer *Payer `json:"payer,omitempty"` + ShippingAddress *ShippingAddress `json:"shipping_address,omitempty"` + OverrideMerchantPreferences *MerchantPreferences `json:"override_merchant_preferences,omitempty"` + OverrideChargeModels *OverrideChargeModel `json:"override_charge_models,omitempty"` + Plan *Plan `json:"plan,omitempty"` + } + + //OverrideChargeModel struct + OverrideChargeModel struct { + ChargeID string `json:"charge_id"` + Amount *Amount `json:"amount"` + } + + // Plan struct + Plan struct { + ID string `json:"id"` + Name string `json:"name"` + Description string `json:"description"` + CreateTime string `json:"create_time,omitempty"` + UpdateTime string `json:"update_time,omitempty"` + PaymentDefinitions []PaymentDefinition `json:"payment_definitions,omitempty"` + } + // BillingInfo struct BillingInfo struct { OutstandingBalance AmountPayout `json:"outstanding_balance,omitempty"` diff --git a/unit_test.go b/unit_test.go index b1623a40..81b7acab 100644 --- a/unit_test.go +++ b/unit_test.go @@ -392,6 +392,11 @@ func (ts *webprofileTestServer) ServeHTTP(w http.ResponseWriter, r *http.Request ts.deleteinvalid(w, r) } } + if r.RequestURI == "/v1/billing-agreements/agreement-tokens" { + if r.Method == "POST" { + ts.create(w, r) + } + } } func (ts *webprofileTestServer) create(w http.ResponseWriter, r *http.Request) { @@ -744,3 +749,24 @@ func TestDeleteWebProfile_invalid(t *testing.T) { } } + +func TestCreateBillingAgreementToken(t *testing.T) { + + ts := httptest.NewServer(&webprofileTestServer{t: t}) + defer ts.Close() + + c, _ := NewClient("foo", "bar", ts.URL) + + _, err := c.CreateBillingAgreementToken( + context.Background(), + "name A", + "description A", + "start date A", + &Payer{PaymentMethod: "paypal"}, + &BillingPlan{ID: "id B", Name: "name B", Description: "description B", Type: "type B"}) + + if err != nil { + t.Fatal(err) + } + +} \ No newline at end of file