Advertisement
  1. Code
  2. PayPal

PayPal Integration Teil 2: PayPal REST API Endproduktbild

Scroll to top
Read Time: 20 min
This post is part of a series called PayPal Integration.
PayPal Integration Part 1: PayPal Payment Buttons
PayPal Integration Part 3: PayPal Webhooks

() translation by (you can also view the original English article)

Final product imageFinal product imageFinal product image
What You'll Be Creating

In diesem Tutorial zeige ich Ihnen, wie Sie mit der PayPal-REST-API und C # Zahlungen tätigen können.  Alle Bibliotheken, die sie für verschiedene Sprachen wie Ruby, Node.js, Python, PHP haben, sind sehr ähnlich, so dass alle Konzepte hier für alle Bibliotheken gelten. 

Projektaufbau

Zu Beginn habe ich in Visual Studio 2015 ein MVC-Projekt erstellt: Datei> Neu> Projekt und ASP.NET-Anwendung auswählen. 

Setting up a ProjectSetting up a ProjectSetting up a Project

Wählen Sie die ASP.NET 5-Webanwendungsvorlage aus, die die neue MVC 6 verwendet.  Sie ist MVC 5 ähnlich, wenn Sie damit vertraut sind.

ASPNET MVC5ASPNET MVC5ASPNET MVC5

Wie Sie auf dem Foto sehen können, habe ich der Lösung einige Dateien und Ordner hinzugefügt.  Die wichtigsten zwei Dinge zu beachten sind:

  1. In Referenzen habe ich den Ziel-DNX-Core 5.0 entfernt, was es uns ermöglichen würde, dieses Projekt unter Mac OS X oder Linux auszuführen, aber die von uns benötigte PayPal-Bibliothek wurde noch nicht aktualisiert. 
  2. Ich habe den Ordner "Services" hinzugefügt, in dem ich die Logik für PayPal-Anrufe verpacken werde, damit wir die Controller schön und kurz halten können.
Solution ExplorerSolution ExplorerSolution Explorer

Installieren Sie PayPal SDK mit NuGet.  Klicken Sie mit der rechten Maustaste auf den Namen der Lösung und wählen Sie NuGet-Pakete verwalten. Suchen Sie dann nach "PayPal" und installieren Sie es. 

Package ManagerPackage ManagerPackage Manager

Erstellen Sie eine PayPal-App

Um unsere Anwendung mit PayPal zu integrieren, müssen wir zu PayPal-Entwicklern navigieren und dann unter REST-API-Apps auf App erstellen klicken.

PayPal Developer App DashboardPayPal Developer App DashboardPayPal Developer App Dashboard

Geben Sie Ihrer App einen Namen und wählen Sie ein Sandbox-Entwicklerkonto aus, das mit der App verknüpft ist.  Zu Testzwecken können Sie dann zu http://sandbox.paypal.com navigieren und sich mit den Anmeldedaten für die Sandbox anmelden, um das PayPal-Testkonto und die Transaktionen zu testen. 

PayPal Developer AppPayPal Developer AppPayPal Developer App

Nach dem Klicken auf "App erstellen" sehen wir den Bestätigungsbildschirm mit der Client-ID und den geheimen Token. 

PayPal App CredentialsPayPal App CredentialsPayPal App Credentials

Kopieren Sie die Token clientId und clientSecret in appsettings.json, wie Sie im folgenden Screenshot sehen können: 

Application Settings JSONApplication Settings JSONApplication Settings JSON

Zahlungen testen

PayPal stellt eine Sandbox-Umgebung zum Testen bereit.  Sie können Testkäufer- und Verkäuferkonten von dort erstellen.  Wenn Sie sich anmelden, verfügen Sie über ein Business-Konto in der Sandbox, das an Ihr Entwicklerkonto gebunden ist. 

Um ein neues Testkonto zu erstellen, melden Sie sich bei der Entwicklerseite an und klicken Sie dann auf die Registerkarte Dashboard und navigieren Sie zu Sandbox> Konten.  Hier können Sie die Liste der Testkonten sehen, wenn Sie Folgendes haben: 

PayPal SandboxPayPal SandboxPayPal Sandbox

Wenn Sie Ihre Testkonten noch nicht erstellt haben, klicken Sie rechts oben auf Konto erstellen, um mindestens ein persönliches Testkonto und ein Testgeschäftskonto zu erstellen.

PayPal Test AccountPayPal Test AccountPayPal Test Account

Nachdem Sie die Testkonten erstellt haben, können Sie sich über www.sandbox.paypal.com mit der Test-E-Mail-Adresse und dem Passwort anmelden, die Sie den einzelnen Konten auf dem vorherigen Formular zugewiesen haben.  Dies ist sehr nützlich, um zu testen, ob die Gelder bei Ihrem "persönlichen Testkonto" auf Ihr "Testgeschäftskonto" überwiesen werden.  Jetzt können Sie mit der Integration in PayPal beginnen und testen, ob die Mittel von einem Konto auf ein anderes übertragen werden.

Einzel-PayPal-Zahlung 

PayPal bietet verschiedene Zahlungsmethoden an.  Sie können direkte Kreditkartenzahlungen verwenden, was bedeutet, dass Ihre Kunden die PayPal-Anmeldeseite oder -zusammenfassung nicht sehen können - alles geschieht auf Ihrer Website.  Sie müssen dafür PCI-kompatibel sein, und ich empfehle Stripe, da Sie nur SSL mit ihrer JavaScript-Bibliothek benötigen.  Auf der anderen Seite, um Zahlungen über PayPal-Zahlungen zu nehmen, dauert es drei Schritte: 

  1. Geben Sie Zahlungsinformationen an, um eine Zahlung zu erstellen. 
  2. Holen Sie sich die Zahlungsgenehmigung, indem Sie Ihren Kunden an PayPal weiterleiten, um die Transaktion zu genehmigen. 
  3. Führen Sie die Zahlung aus, um die Beträge zu erfassen, nachdem PayPal Ihren Kunden auf Ihre Website weitergeleitet hat. 

In meinem MVC-Projekt habe ich im Ordner "Services" die PayPalPaymentService-Klasse erstellt, der ich diese Methoden hinzugefügt habe:

1
public static Payment CreatePayment(string baseUrl, string intent)
2
{
3
    // ### Api Context

4
    // Pass in a `APIContext` object to authenticate 

5
    // the call and to send a unique request id 

6
    // (that ensures idempotency). The SDK generates

7
    // a request id if you do not pass one explicitly. 

8
    var apiContext = PayPalConfiguration.GetAPIContext();
9
10
    // Payment Resource

11
    var payment = new Payment()
12
    {
13
        intent = intent,    // `sale` or `authorize`

14
        payer = new Payer() { payment_method = "paypal" },
15
        transactions = GetTransactionsList(),
16
        redirect_urls = GetReturnUrls(baseUrl, intent)
17
    };
18
19
    // Create a payment using a valid APIContext

20
    var createdPayment = payment.Create(apiContext);
21
22
    return createdPayment;
23
}
24
25
private static List<Transaction> GetTransactionsList()
26
{
27
    // A transaction defines the contract of a payment

28
    // what is the payment for and who is fulfilling it. 

29
    var transactionList = new List<Transaction>();
30
31
    // The Payment creation API requires a list of Transaction; 

32
    // add the created Transaction to a List

33
    transactionList.Add(new Transaction()
34
    {
35
        description = "Transaction description.",
36
        invoice_number = GetRandomInvoiceNumber(),
37
        amount = new Amount()
38
        {
39
            currency = "USD",
40
            total = "100.00",       // Total must be equal to sum of shipping, tax and subtotal.

41
            details = new Details() // Details: Let's you specify details of a payment amount.

42
            {
43
                tax = "15",
44
                shipping = "10",
45
                subtotal = "75"
46
            }
47
        },
48
        item_list = new ItemList()
49
        {
50
            items = new List<Item>()
51
            {
52
                new Item()
53
                {
54
                    name = "Item Name",
55
                    currency = "USD",
56
                    price = "15",
57
                    quantity = "5",
58
                    sku = "sku"
59
                }
60
            }
61
        }
62
    });
63
    return transactionList;
64
}
65
66
private static RedirectUrls GetReturnUrls(string baseUrl, string intent)
67
{
68
    var returnUrl = intent == "sale" ? "/Home/PaymentSuccessful" : "/Home/AuthorizeSuccessful";
69
70
    // Redirect URLS

71
    // These URLs will determine how the user is redirected from PayPal 

72
    // once they have either approved or canceled the payment.

73
    return new RedirectUrls()
74
    {
75
        cancel_url = baseUrl + "/Home/PaymentCancelled",
76
        return_url = baseUrl + returnUrl
77
    };
78
}
79
80
public static Payment ExecutePayment(string paymentId, string payerId)
81
{
82
    // ### Api Context

83
    // Pass in a `APIContext` object to authenticate 

84
    // the call and to send a unique request id 

85
    // (that ensures idempotency). The SDK generates

86
    // a request id if you do not pass one explicitly. 

87
    var apiContext = PayPalConfiguration.GetAPIContext();
88
    
89
    var paymentExecution = new PaymentExecution() { payer_id = payerId };
90
    var payment = new Payment() { id = paymentId };
91
92
    // Execute the payment.

93
    var executedPayment = payment.Execute(apiContext, paymentExecution);
94
95
    return executedPayment;
96
}

In diesem Aufruf werden einige Parameter übergeben: 

  • Absicht: Drei mögliche Werte: "Verkauf" für sofortige Zahlungen, "Autorisieren", um eine Zahlung zu autorisieren, um später zu erfassen, oder "Bestellung", um einen Auftrag zu erstellen.  Wenn Sie die Autorisierung für eine später zu erfassende Zahlung erhalten, haben Sie 3 Tage Garantie, obwohl Sie versuchen können, die Zahlung bis zu 29 Tage später zu erfassen. 
  • Payer: Quelle der Mittel für diese Zahlung, wobei die Zahlungsmethode PayPal-Wallet-Zahlung, Banklastschrift oder direkte Kreditkarte verwendet wird.
  • Transaktionen: Hier wird der Betrag für die Zahlung angegeben und optional die Artikel angegeben, für die bezahlt wird.  Sie können bei Bedarf auch Zwischensumme, Versand und Steuern angeben. 
  • Umleitungs-URLs: Geben Sie die URL an, an die PayPal Ihre Kunden nach einer Transaktion weiterleitet, sodass Sie Ihre Datenbank aktualisieren und eine Bestätigungsnachricht anzeigen können.

Die vorherigen Funktionen können von Ihrem Controller wie folgt verwendet werden: 

1
public IActionResult CreatePayment()
2
{
3
    var payment = PayPalPaymentService.CreatePayment(GetBaseUrl(), "sale");
4
    
5
    return Redirect(payment.GetApprovalUrl());
6
}
7
8
public IActionResult PaymentCancelled()
9
{
10
    // TODO: Handle cancelled payment

11
    return RedirectToAction("Error");
12
}
13
14
public IActionResult PaymentSuccessful(string paymentId, string token, string PayerID)
15
{
16
    // Execute Payment

17
    var payment = PayPalPaymentService.ExecutePayment(paymentId, PayerID);
18
19
    return View();
20
}

Wie Sie sehen können, habe ich drei Aktionen erstellt: 

  • CreatePayment: Dies ist die Aktion, die die Zahlung auslöst.  Es ruft PayPal an, um die Zahlung zu erstellen, und leitet den Benutzer dann an PayPal weiter, um die Transaktion zu genehmigen. 
  • PaymentSuccessful: Dies ist die Aktion, bei der PayPal unseren Kunden nach einer erfolgreichen Zahlung zurückleitet.  An diesem Punkt können wir die Zahlung ausführen, um die Gelder auf unser Händlerkonto zu übertragen. 
  • PaymentCancelled: Bei dieser Aktion wird der Benutzer von PayPal umgeleitet, wenn der Benutzer den Genehmigungsprozess abbricht.  Zu diesem Zeitpunkt möchten Sie dem Kunden möglicherweise die Möglichkeit geben, es erneut zu versuchen oder sich mit Ihnen in Verbindung zu setzen.

Autorisieren Sie eine Zahlung, um sie später zu erfassen

Dieses Szenario ist dem vorherigen Fall sehr ähnlich.  Möglicherweise möchten Sie diese Methode verwenden, wenn Sie Vorbestellungen für ein Produkt durchführen möchten, das noch nicht verfügbar ist.  Die Schritte, um diese Zahlung zu erhalten, sind: 

  1. Autorisierung der Zahlung: Der Parameter 'intent' für diesen Aufruf sollte 'authorize' lauten. 
  2. Erfassung der Zahlung: Beachten Sie, dass Berechtigungen für bis zu 3 Tage garantiert sind. Sie können jedoch versuchen, eine Zahlung für bis zu 29 Tage zu erfassen. 

Um diese Zahlungsart zu implementieren, habe ich der Klasse PayPalPaymentService nur eine neue Methode hinzugefügt, um die Zahlung zu erfassen: 

1
public static Capture CapturePayment(string paymentId)
2
{
3
    var apiContext = PayPalConfiguration.GetAPIContext();
4
5
    var payment = Payment.Get(apiContext, paymentId);
6
    var auth = payment.transactions[0].related_resources[0].authorization;
7
8
    // Specify an amount to capture.  By setting 'is_final_capture' to true, all remaining funds held by the authorization will be released from the funding instrument.

9
    var capture = new Capture()
10
    {
11
        amount = new Amount()
12
        {
13
            currency = "USD",
14
            total = "4.54"
15
        },
16
        is_final_capture = true
17
    };
18
19
    // Capture an authorized payment by POSTing to

20
    // URI v1/payments/authorization/{authorization_id}/capture

21
    var responseCapture = auth.Capture(apiContext, capture);
22
23
    return responseCapture;
24
}

Dann habe ich vom HomeController zwei neue Aktionen hinzugefügt, um diese Zahlungsart anzuzeigen:

1
public IActionResult AuthorizePayment()
2
{
3
    var payment = PayPalPaymentService.CreatePayment(GetBaseUrl(), "authorize");
4
    
5
    return Redirect(payment.GetApprovalUrl());
6
}
7
8
public IActionResult AuthorizeSuccessful(string paymentId, string token, string PayerID)
9
{
10
    // Capture Payment

11
    var capture = PayPalPaymentService.CapturePayment(paymentId);
12
13
    return View();
14
}
  • AuthorizePayment ist die Aktion, die die Zahlung auslöst.  Es ist der vorherigen "CreatePayment" -Funktion sehr ähnlich, aber wir übergeben in diesem Fall "authorize" als den Parameter "intent". 
  • AuthorizeSuccessful ist die Aktion, bei der Ihr Kunde nach erfolgreicher Genehmigung der Zahlung auf PayPal umgeleitet wird.  An dieser Stelle erfasse ich die Zahlung, aber Sie könnten die PaymentId in Ihrer Datenbank speichern und die Zahlung erfassen, wenn Sie müssen. 

In diesen Codebeispielen habe ich zur Vereinfachung die Zahlungsvariablenwerte fest codiert.  In Ihrer realen Anwendung werden Sie sie wahrscheinlich in Methoden einschließen, die all diese Werte als Variablen annehmen, so dass alles dynamisch festgelegt und wiederverwendet werden kann. 

Abonnements

Dies wird in PayPal als "Abrechnungspläne" bezeichnet. Sie können wiederkehrende Zahlungspläne erstellen und Ihre Kunden für einen Abrechnungsplan anmelden, indem Sie eine Abrechnungsvereinbarung erstellen.  Mit der PayPal REST API können Sie Fakturierungspläne erstellen, aktualisieren oder löschen. Dies ist etwas, das Sie verwenden können, wenn Sie ein Admin-Panel erstellen möchten, um diese Dinge für Ihr Unternehmen zu verwalten. 

Die Schritte zum Erstellen wiederkehrender Kosten für Ihre Kunden wären:

  1. Erstellen Sie einen Abrechnungsplan und aktivieren Sie ihn.  Nachdem Sie einen Fakturierungsplan erstellt haben, befindet er sich in einem CREATED-Status.  Es muss aktiviert werden, indem eine PATCH-Anfrage gestellt wird. 
  2. Legen Sie eine Abrechnungsvereinbarung an und führen Sie sie aus: Die Antwort auf den Aufruf zum Erstellen einer Abrechnungsvereinbarung enthält die Links zu approval_url und execute_url.  Wir müssen die Genehmigung für die Abrechnungsvereinbarung einholen und dann die Abrechnungsvereinbarung ausführen.

Abrechnungspläne

Erstellen Sie einen Abrechnungsplan

Erstellen Sie einen Fakturierungsplan, der die Abrechnungsperioden definiert.  Dies ist eine Zusammenfassung der Parameter, die zum Erstellen eines Plans übergeben werden müssen. 

  • Name: Name des Abrechnungsplans.
  • Beschreibung: Beschreibung des Fakturierungsplans. 
  • Typ: Zulässige Werte sind 'FIXED' für eine festgelegte Anzahl wiederkehrender Zahlungen oder 'INFINITE' für einen Plan, der wiederholt wird, bis er manuell abgebrochen wird. 
  • Merchant Preferences: Dies ist ein Objekt, das Präferenzen wie Setup-Gebühr, maximale Fehlerversuche einer Zahlung, Rückgabe-URL, Abbruch-URL, Benachrichtigungs-URL angibt, wobei PayPal den Nutzer nach einer Zahlung umleitet.    
  • Zahlungsdefinitionen: Array mit Zahlungsdefinitionen für diesen Plan.  Normalerweise würde dieses Array eine oder zwei Zahlungsdefinitionen haben.  Wenn wir eine kostenlose Testversion oder eine Testversion zu einem reduzierten Preis anbieten möchten, richten wir zwei Zahlungsdefinitionen ein.  Die erste wird die Definition für die Probezeit sein, und die zweite Definition wäre die regelmäßige Zahlung.  Die Eigenschaften für eine Zahlungsdefinition sind Name, Typ (Probe oder Normal), Häufigkeit (Tag, Woche, Monat, Jahr), Häufigkeitsintervall (wenn wir die Frequenz auf "WOCHE" und das Frequenzintervall auf "1" setzen, sind wir Definieren einer wöchentlichen Zahlung), Betrag, der dem Kunden berechnet wird, und Zyklen ist die Anzahl der gesamten Zahlungen.  Charge Models dient dazu, die Versandkosten und Steuern zusätzlich zum Betragswert für den Plan anzugeben. 

Dies ist ein Code-Snippet, das zeigt, wie ein Fakturierungsplan erstellt wird:

1
// Define the plan and attach the payment definitions and merchant preferences.

2
// More Information: https://developer.paypal.com/webapps/developer/docs/api/#create-a-plan

3
var billingPlan = new Plan
4
{
5
    name = "Tuts+ Plus",
6
    description = "Monthly plan for courses.",
7
    type = "fixed",
8
    // Define the merchant preferences.

9
    // More Information: https://developer.paypal.com/webapps/developer/docs/api/#merchantpreferences-object

10
    merchant_preferences = new MerchantPreferences()
11
    {
12
        setup_fee = GetCurrency("0"), // $0

13
        return_url = "returnURL", // Retrieve from config

14
        cancel_url = "cancelURL", // Retrieve from config

15
        auto_bill_amount = "YES",
16
        initial_fail_amount_action = "CONTINUE",
17
        max_fail_attempts = "0"
18
    },
19
    payment_definitions = new List<PaymentDefinition>
20
    {
21
        // Define a trial plan that will only charge $9.99 for the first

22
        // month. After that, the standard plan will take over for the

23
        // remaining 11 months of the year.

24
        new PaymentDefinition()
25
        {
26
            name = "Trial Plan",
27
            type = "TRIAL",
28
            frequency = "MONTH",
29
            frequency_interval = "1",
30
            amount = GetCurrency("0"), // Free for the 1st month

31
            cycles = "1",
32
            charge_models = new List<ChargeModel>
33
            {
34
                new ChargeModel()
35
                {
36
                    type = "TAX",
37
                    amount = GetCurrency("1.65") // If we need to charge Tax

38
                },
39
                new ChargeModel()
40
                {
41
                    type = "SHIPPING",
42
                    amount = GetCurrency("9.99") // If we need to charge for Shipping

43
                }
44
            }
45
        },
46
        // Define the standard payment plan. It will represent a monthly

47
        // plan for $19.99 USD that charges once month for 11 months.

48
        new PaymentDefinition
49
        {
50
            name = "Standard Plan",
51
            type = "REGULAR",
52
            frequency = "MONTH",
53
            frequency_interval = "1",
54
            amount = GetCurrency("15.00"),
55
            // > NOTE: For `IFNINITE` type plans, `cycles` should be 0 for a `REGULAR` `PaymentDefinition` object.

56
            cycles = "11",
57
            charge_models = new List<ChargeModel>
58
            {
59
                new ChargeModel
60
                {
61
                    type = "TAX",
62
                    amount = GetCurrency("2.47")
63
                },
64
                new ChargeModel()
65
                {
66
                    type = "SHIPPING",
67
                    amount = GetCurrency("9.99")
68
                }
69
            }
70
        }
71
    }
72
};
73
74
// Get PayPal Config

75
var apiContext = PayPalConfiguration.GetAPIContext();
76
77
// Create Plan

78
plan.Create(apiContext);

Ein neu erstellter Fakturierungsplan hat den Status CREATED.  Aktivieren Sie es in den Status AKTIV, damit Ihre Kunden den Plan abonnieren können.  Um den Plan zu aktivieren, müssen wir eine PATCH-Anfrage machen: 

1
// Activate the plan

2
var patchRequest = new PatchRequest()
3
{
4
    new Patch()
5
    {
6
        op = "replace",
7
        path = "/",
8
        value = new Plan() { state = "ACTIVE" }
9
    }
10
};
11
plan.Update(apiContext, patchRequest);

Wie Sie sehen können, sind PayPal-Bibliotheken ein direkter Wrapper für ihre REST-API, was gut ist, aber die API ist auch sehr komplex im Vergleich zu anderen wie Stripe.  Aus diesem Grund ist es wirklich eine gute Option, alle PayPal-Kommunikation in Objekte mit klareren und einfacheren APIs für unsere Anwendungen zu wickeln.  Hier können Sie sehen, wie dieser Code in mehrere Funktionen eingepackt ist und wie Parameter aussehen:

1
public static Plan CreatePlanObject(string planName, string planDescription, string returnUrl, string cancelUrl,
2
    string frequency, int frequencyInterval, decimal planPrice,
3
    decimal shippingAmount = 0, decimal taxPercentage = 0, bool trial = false, int trialLength = 0, decimal trialPrice = 0)
4
{
5
    // Define the plan and attach the payment definitions and merchant preferences.

6
    // More Information: https://developer.paypal.com/docs/rest/api/payments.billing-plans/

7
    return new Plan
8
    {
9
        name = planName,
10
        description = planDescription,
11
        type = PlanType.Fixed,
12
13
        // Define the merchant preferences.

14
        // More Information: https://developer.paypal.com/webapps/developer/docs/api/#merchantpreferences-object

15
        merchant_preferences = new MerchantPreferences()
16
        {
17
            setup_fee = GetCurrency("1"),
18
            return_url = returnUrl,
19
            cancel_url = cancelUrl,
20
            auto_bill_amount = "YES",
21
            initial_fail_amount_action = "CONTINUE",
22
            max_fail_attempts = "0"
23
        },
24
        payment_definitions = GetPaymentDefinitions(trial, trialLength, trialPrice, frequency, frequencyInterval, planPrice, shippingAmount, taxPercentage)
25
    };
26
}
27
28
private static List<PaymentDefinition> GetPaymentDefinitions(bool trial, int trialLength, decimal trialPrice,
29
    string frequency, int frequencyInterval, decimal planPrice, decimal shippingAmount, decimal taxPercentage)
30
{
31
    var paymentDefinitions = new List<PaymentDefinition>();
32
33
    if (trial)
34
    {
35
        // Define a trial plan that will charge 'trialPrice' for 'trialLength'

36
        // After that, the standard plan will take over.

37
        paymentDefinitions.Add(
38
            new PaymentDefinition()
39
            {
40
                name = "Trial",
41
                type = "TRIAL",
42
                frequency = frequency,
43
                frequency_interval = frequencyInterval.ToString(),
44
                amount = GetCurrency(trialPrice.ToString()),
45
                cycles = trialLength.ToString(),
46
                charge_models = GetChargeModels(trialPrice, shippingAmount, taxPercentage)
47
            });
48
    }
49
50
    // Define the standard payment plan. It will represent a 'frequency' (monthly, etc)

51
    // plan for 'planPrice' that charges 'planPrice' (once a month) for #cycles.

52
    var regularPayment = new PaymentDefinition
53
    {
54
        name = "Standard Plan",
55
        type = "REGULAR",
56
        frequency = frequency,
57
        frequency_interval = frequencyInterval.ToString(),
58
        amount = GetCurrency(planPrice.ToString()),
59
        // > NOTE: For `IFNINITE` type plans, `cycles` should be 0 for a `REGULAR` `PaymentDefinition` object.

60
        cycles = "11",
61
        charge_models = GetChargeModels(trialPrice, shippingAmount, taxPercentage)
62
    };
63
    paymentDefinitions.Add(regularPayment);
64
65
    return paymentDefinitions;
66
}
67
68
private static List<ChargeModel> GetChargeModels(decimal planPrice, decimal shippingAmount, decimal taxPercentage)
69
{
70
    // Create the Billing Plan

71
    var chargeModels = new List<ChargeModel>();
72
    if (shippingAmount > 0)
73
    {
74
        chargeModels.Add(new ChargeModel()
75
        {
76
            type = "SHIPPING",
77
            amount = GetCurrency(shippingAmount.ToString())
78
        });
79
    }
80
    if (taxPercentage > 0)
81
    {
82
        chargeModels.Add(new ChargeModel()
83
        {
84
            type = "TAX",
85
            amount = GetCurrency(String.Format("{0:f2}", planPrice * taxPercentage / 100))
86
        });
87
    }
88
89
    return chargeModels;
90
}

Aktualisierungsabrechnungsplan 

Sie können die Informationen für einen bestehenden Abrechnungsplan aktualisieren, indem Sie eine "PATCH" -Anfrage stellen.  Dies ist eine Funktion, die diesen Aufruf umschließt:

1
public static void UpdateBillingPlan(string planId, string path, object value)
2
{
3
    // PayPal Authentication tokens

4
    var apiContext = PayPalConfiguration.GetAPIContext();
5
6
    // Retrieve Plan

7
    var plan = Plan.Get(apiContext, planId);
8
9
    // Activate the plan

10
    var patchRequest = new PatchRequest()
11
    {
12
        new Patch()
13
        {
14
            op = "replace",
15
            path = path,
16
            value = value
17
        }
18
    };
19
    plan.Update(apiContext, patchRequest);
20
}

Um die Beschreibung des Fakturierungsplans zu aktualisieren, können wir diese Funktion aufrufen und die richtigen Parameter übergeben: 

1
UpdateBillingPlan(
2
    planId: "P-5FY40070P6526045UHFWUVEI", 
3
    path: "/", 
4
    value: new Plan { description = "new description" });

Löschen eines Fakturierungsplans

Wenn Sie keine neuen Kunden für einen Abrechnungsplan akzeptieren möchten, sollten Sie sie idealerweise auf den Status "INAKTIV" aktualisieren.  Dies wirkt sich nicht auf bestehende Abrechnungsvereinbarungen für diesen Plan aus.  Dies kann einfach durch Aufruf der Funktion UpdateBillingPlan erfolgen: 

1
UpdateBillingPlan(
2
    planId: "P-5FY40070P6526045UHFWUVEI",
3
    path: "/",
4
    value: new Plan { state = "INACTIVE" });

Abrechnungsvereinbarungen

Erstellen Sie eine Abrechnungsvereinbarung 

Sobald Sie einen oder mehrere Fakturierungspläne erstellt haben, möchten Sie damit beginnen, dass sich Kunden für Ihre Abonnementpläne anmelden.  Um dies zu tun, müssen Sie Ihre Kundendaten sammeln und eine Anfrage an PayPal stellen.  Um diese Funktionalität testen zu können, habe ich dem HomeController mehrere Aktionen hinzugefügt: 

1
public IActionResult Subscribe()
2
{
3
    var plan = PayPalSubscriptionsService.CreateBillingPlan("Tuts+ Plan", "Test plan for this article", GetBaseUrl());
4
5
    var subscription = PayPalSubscriptionsService.CreateBillingAgreement(plan.id, 
6
        new PayPal.Api.ShippingAddress
7
        {
8
            city = "London", 
9
            line1 = "line 1",
10
            postal_code = "SW1A 1AA",
11
            country_code = "GB"
12
        }, "Pedro Alonso", "Tuts+", DateTime.Now);
13
    
14
    return Redirect(subscription.GetApprovalUrl());
15
}
16
17
public IActionResult SubscribeSuccess(string token)
18
{
19
    // Execute approved agreement

20
    PayPalSubscriptionsService.ExecuteBillingAgreement(token);
21
22
    return View();
23
}
24
25
public IActionResult SubscribeCancel(string token)
26
{
27
    // TODO: Handle cancelled payment

28
    return RedirectToAction("Error");
29
}
  • Abonnieren: Dies ist die erste Aktion, die aufgerufen wird.  Es wird ein Testabrechnungsplan erstellt und anschließend wird eine Abrechnungsvereinbarung (Abonnement) für diesen Plan erstellt, und der Benutzer wird zur Bestätigung der Zahlung an PayPal weitergeleitet. 
  • SubscribeSuccess: Diese Aktion wird als 'Return URL' nach einem erfolgreichen Abonnement verwendet.  Die Übereinstimmungstoken-ID wird in der Abfragezeichenfolge übergeben, und wir verwenden dieses Token, um die Fakturierungsvereinbarung auszuführen und sie aktiv zu machen.
  • SubscribeCancel: Diese Aktion wird als "URL abbrechen" verwendet.  Wenn aus irgendeinem Grund die Zahlung fehlschlägt oder Ihr Kunde die Zahlung auf PayPal storniert, wird der Benutzer zu dieser Aktion geleitet, und Sie müssen damit umgehen.  Vielleicht bieten Sie die Möglichkeit, es erneut zu versuchen. 

Wie Sie im vorherigen Code-Snippet sehen können, habe ich den Großteil der Funktionalität in verschiedene Methoden eingepackt.  Der erste ist "CreateBillingPlan", der im vorherigen Abschnitt erklärt wurde.  Der zweite ist "CreateBillingAgreement", mit dem ein Benutzer einen Plan abonniert: 

1
public static Agreement CreateBillingAgreement(string planId, ShippingAddress shippingAddress, 
2
    string name, string description, DateTime startDate)
3
{
4
    // PayPal Authentication tokens

5
    var apiContext = PayPalConfiguration.GetAPIContext();
6
7
    var agreement = new Agreement()
8
    {
9
        name = name,
10
        description = description,
11
        start_date = startDate.ToString("yyyy-MM-ddTHH:mm:ss") + "Z",
12
        payer = new Payer() { payment_method = "paypal" },
13
        plan = new Plan() { id = planId },
14
        shipping_address = shippingAddress
15
    };
16
    
17
    var createdAgreement = agreement.Create(apiContext);
18
    return createdAgreement;
19
}

Die dritte Methode ist "ExecuteBillingAgreement".  Nach einer erfolgreichen Genehmigung des Abonnements verwenden wir das zurückgegebene Token, um das Abonnement zu aktivieren: 

1
public static void ExecuteBillingAgreement(string token)
2
{
3
    // PayPal Authentication tokens

4
    var apiContext = PayPalConfiguration.GetAPIContext();
5
6
    var agreement = new Agreement() { token = token };
7
    var executedAgreement = agreement.Execute(apiContext);
8
}

Eine Abrechnungsvereinbarung aussetzen

Verwenden Sie diese Methode, um eine Vereinbarung auszusetzen: 

1
public static void SuspendBillingAgreement(string agreementId)
2
{
3
    var apiContext = PayPalConfiguration.GetAPIContext();
4
5
    var agreement = new Agreement() { id = agreementId };
6
    agreement.Suspend(apiContext, new AgreementStateDescriptor()
7
        { note = "Suspending the agreement" });
8
}

Reaktivieren Sie eine Abrechnungsvereinbarung 

Dieser ist dem vorherigen sehr ähnlich: 

1
public static void ReactivateBillingAgreement(string agreementId)
2
{
3
    var apiContext = PayPalConfiguration.GetAPIContext();
4
5
    var agreement = new Agreement() { id = agreementId };
6
    agreement.ReActivate(apiContext, new AgreementStateDescriptor()
7
        { note = "Reactivating the agreement" });
8
}

Stornieren einer Abrechnungsvereinbarung 

Verwenden Sie diese Funktion, um einen Plan abzubrechen: 

1
public static void CancelBillingAgreement(string agreementId)
2
{
3
    var apiContext = PayPalConfiguration.GetAPIContext();
4
5
    var agreement = new Agreement() { id = agreementId };
6
    agreement.Cancel(apiContext, new AgreementStateDescriptor()
7
        { note = "Cancelling the agreement" });
8
}

Aktualisieren Sie eine Abrechnungsvereinbarung

Diese Option ist sehr begrenzt, und was ich von diesem Anruf erwarten würde, ist die Möglichkeit, den Abonnementplan zu ändern, um einen Kunden zu aktualisieren oder herabzustufen.  Dies wird in einem einzelnen Aufruf nicht unterstützt, wie es in Stripe ist.  Sie müssen dieses Szenario behandeln, indem Sie die aktuelle Vereinbarung aufheben und eine neue für Upgrades oder Downgrades erstellen.  Es ist nicht ideal, aber es könnte sich in Zukunft ändern. 

Fazit 

Dies ist eine Übersicht über die gängigsten Funktionen, die Benutzer zur Integration in PayPal verwenden.  Ihre API ist weitaus größer als die in diesem Artikel beschriebenen Integrationsmethoden. Sie können auch Rückerstattungen und teilweise Rückerstattungen ausgeben und sie haben viele verschiedene Optionen für Edge Cases in den in diesem Artikel behandelten Samples.  Wenn Sie mehr Details zu einer bestimmten Integration erfahren möchten, hinterlassen Sie einen Vorschlag in den Kommentaren.

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.