In diesem Tutorial werde ich Ihnen zeigen, wie Sie Zahlungen mit der PayPal-REST-API und C # tätigen können. Alle Bibliotheken, die sie für verschiedene Sprachen haben, wie Ruby, Node.js, Python, PHP, sind sehr ähnlich, daher gelten alle Konzepte für alle Bibliotheken.
Zunächst habe ich ein MVC-Projekt in Visual Studio 2015 erstellt: Datei> Neu> Projekt, und wählen Sie ASP.NET-Anwendung.
Wähle aus ASP.NET 5-Webanwendung Vorlage, die die neue MVC 6 verwendet. Sie ist der MVC 5 ähnlich, wenn Sie damit vertraut sind.
Wie Sie auf dem Foto unten sehen können, habe ich der Lösung einige Dateien und Ordner hinzugefügt. Die zwei wichtigsten Dinge, die Sie beachten sollten:
Installieren Sie das PayPal-SDK mit NuGet. Rechtsklick Klicken Sie auf den Namen der Lösung und wählen Sie NuGet-Pakete verwalten, und suchen Sie dann nach "PayPal" und installieren Sie es.
Um unsere Anwendung in PayPal zu integrieren, müssen wir zu PayPal-Entwicklern navigieren und dann unter REST-API-Apps, klicke auf App erstellen.
Geben Sie Ihrer App einen Namen und wählen Sie ein Sandbox-Entwicklerkonto, das der App zugeordnet ist. Zu Testzwecken können wir dann zu http://sandbox.paypal.com navigieren und uns mit den Sandbox-Anmeldedaten anmelden, um das PayPal-Testkonto und die PayPal-Transaktionen anzuzeigen.
Nach dem Klicken auf App erstellen, Wir sehen den Bestätigungsbildschirm mit der Client-ID und den geheimen Token.
Kopieren Sie die Token clientId und clientSecret nach appsettings.json
, Wie Sie im folgenden Screenshot sehen können:
PayPal bietet eine Sandbox-Umgebung zum Testen. Dort können Sie Testkäufer- und Verkäuferkonten anlegen. Wenn Sie sich anmelden, haben Sie 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 Instrumententafel Tab und navigieren Sie zu Sandbox> Konten. Hier können Sie die Liste der Testkonten sehen, falls vorhanden:
Wenn Sie noch keine Testkonten erstellt haben, klicken Sie auf Benutzerkonto anlegen, oben rechts, um mindestens ein persönliches Testkonto und ein Testgeschäftskonto anzulegen.
Nachdem Sie die Testkonten erstellt haben, können Sie sich unter www.sandbox.paypal.com mit der Test-E-Mail-Adresse und dem Kennwort anmelden, die Sie jedem Konto im vorherigen Formular zugewiesen haben. Dies ist wirklich nützlich, um zu testen, dass beim Kauf eines Produkts mit Ihrem persönlichen Testkonto das Geld auf Ihr Testgeschäftskonto übertragen wird. Jetzt können Sie mit der Integration mit PayPal beginnen und testen, ob sich das Geld von einem Konto auf ein anderes bewegt.
PayPal bietet verschiedene Zahlungsmöglichkeiten an. Sie können direkte Kreditkartenzahlungen verwenden, was bedeutet, dass Ihre Kunden weder die PayPal-Anmeldeseite noch eine Übersicht sehen. Dies geschieht alles auf Ihrer Website. Sie müssen dazu PCI-kompatibel sein, und ich empfehle die Verwendung von Stripe, da Sie nur SSL verwenden, wenn Sie deren JavaScript-Bibliothek verwenden. Um dagegen Zahlungen per PayPal zu tätigen, sind drei Schritte erforderlich:
In meinem MVC-Projekt in der Dienstleistungen In diesem Ordner habe ich die PayPalPaymentService-Klasse erstellt, in der ich folgende Methoden hinzugefügt habe:
public static Payment CreatePayment (Zeichenfolge baseUrl, Zeichenfolgenabsicht) // ### Api Context // Übergeben Sie ein 'APIContext' -Objekt, um den Anruf zu authentifizieren und // eine eindeutige Anforderungs-ID zu senden (die Idempotenz gewährleistet). Das SDK generiert // eine Anforderungs-ID, wenn Sie nicht explizit eine übergeben haben. var apiContext = PayPalConfiguration.GetAPIContext (); // Payment Resource var payment = new Zahlung () Absicht = Absicht, // "Verkauf" oder "Autorisierung" payer = neuer Payer () payment_method = "paypal", transaction = GetTransactionsList (), redirect_urls = GetReturnUrls (baseUrl Absicht); // Eine Zahlung mit einem gültigen APIContext erstellen var createdPayment = payment.Create (apiContext); return erstelltPayment; private statische ListeGetTransactionsList () // Eine Transaktion definiert den Vertrag einer Zahlung, // für was die Zahlung gilt und wer sie erfüllt. var transactionList = neue Liste (); // Die API zur Zahlungserstellung erfordert eine Transaktionsliste. // füge die erstellte Transaktion zu einer Liste hinzu transactionList.Add (new Transaction () description = "Transaktionsbeschreibung"), rechnungsnummer = GetRandomInvoiceNumber (), betrag = neuer Betrag () currency = "USD", total = "100.00" , // Summe muss gleich der Summe aus Versand, Steuer und Zwischensumme sein details = new Details () // Details: Geben Sie die Details eines Zahlungsbetrags an. Tax = "15", shipping = "10", subtotal = "75", item_list = neue ItemList () items = neue Liste - () neuer Artikel () name = "Artikelname", Währung = "USD", Preis = "15", Anzahl = "5", sku = "sku"); return transactionList; private static RedirectUrls GetReturnUrls (Zeichenfolge baseUrl, Zeichenfolgenabsicht) var returnUrl = intent == "sale"? "/ Home / PaymentSuccessful": "/ Home / AuthorizeSuccessful"; // URLs umleiten // Diese URLs bestimmen, wie der Benutzer von PayPal umgeleitet wird, // wenn die Zahlung genehmigt oder storniert wurde. return new RedirectUrls () cancel_url = baseUrl + "/ Home / PaymentCancelled", return_url = baseUrl + returnUrl; public static Payment ExecutePayment (Zeichenfolge paymentId, string payerId) // ### Api Context // Übergeben Sie ein 'APIContext'-Objekt, um den Anruf zu authentifizieren und // eine eindeutige Anforderungs-ID zu senden (die Idempotenz gewährleistet). Das SDK generiert // eine Anforderungs-ID, wenn Sie nicht explizit eine übergeben haben. var apiContext = PayPalConfiguration.GetAPIContext (); var paymentExecution = new PaymentExecution () payer_id = payerId; var payment = neue Zahlung () id = paymentId; // Führen Sie die Zahlung aus. var donePayment = payment.Execute (apiContext, paymentExecution); Rückgabe ausgeführt
In diesem Aufruf werden einige Parameter übergeben:
Die bisherigen Funktionen können von Ihrem Controller aus folgendermaßen verwendet werden:
public IActionResult CreatePayment () var payment = PayPalPaymentService.CreatePayment (GetBaseUrl (), "sale"); return Umleitung (payment.GetApprovalUrl ()); public IActionResult PaymentCancelled () // TODO: Behandelte stornierte Zahlungsrückgabe RedirectToAction ("Error"); public IActionResult PaymentSuccessful (Zeichenfolge paymentId, Zeichenfolgentoken, Zeichenfolge PayerID) // Zahlung ausführen var payment = PayPalPaymentService.ExecutePayment (paymentId, PayerID); return View ();
Wie Sie sehen können, habe ich drei Aktionen erstellt:
Dieses Szenario ist dem vorherigen Fall sehr ähnlich. Möglicherweise möchten Sie diese Methode verwenden, wenn Sie Vorbestellungen für ein Produkt annehmen möchten, das noch nicht verfügbar ist. Die Schritte, um diese Zahlung zu erhalten, sind:
Um diese Zahlungsart zu implementieren, habe ich der Klasse PayPalPaymentService nur eine neue Methode hinzugefügt, um die Zahlung zu erfassen:
public static Capture CapturePayment (Zeichenfolge paymentId) var apiContext = PayPalConfiguration.GetAPIContext (); var payment = Payment.Get (apiContext, paymentId); var auth = zahlungstransaktionen [0] .bezogene_resourcen [0] .autorisierung; // Geben Sie einen Betrag für die Erfassung an. Wenn Sie "is_final_capture" auf "true" setzen, werden alle verbleibenden, von der Autorisierung gehaltenen Mittel aus dem Finanzierungsinstrument freigegeben. var capture = new Capture () Betrag = neuer Betrag () currency = "USD", total = "4.54", is_final_capture = true; // Erfassen einer autorisierten Zahlung durch POSTing an // URI v1 / Zahlungen / Berechtigung / Berechtigungs_ID / capture var responseCapture = auth.Capture (apiContext, capture); Antwort zurückgebenCapture;
Dann habe ich vom HomeController aus zwei neue Aktionen hinzugefügt, um diese Zahlungsart zu zeigen:
public IActionResult AuthorizePayment () var payment = PayPalPaymentService.CreatePayment (GetBaseUrl (), "authorize"); return Umleitung (payment.GetApprovalUrl ()); public IActionResult AuthorizeSuccessful (Zeichenfolge paymentId, Zeichenfolgentoken, Zeichenfolge PayerID) // Capture-Zahlung var capture = PayPalPaymentService.CapturePayment (paymentId); return View ();
In diesen Codebeispielen habe ich der Einfachheit halber die Zahlungsvariablenwerte fest codiert. In Ihrer realen Anwendung werden Sie sie wahrscheinlich in Methoden einfassen, die alle diese Werte als Variablen verwenden, damit alles dynamisch gesetzt und erneut verwendet werden kann.
Dies wird in PayPal als "Abrechnungspläne" bezeichnet. Sie können wiederkehrende Zahlungspläne erstellen und Ihre Kunden durch Erstellen einer Abrechnungsvereinbarung für einen Abrechnungsplan abonnieren. Mit der PayPal-REST-API können Sie Rechnungspläne erstellen, aktualisieren oder löschen. Dies ist etwas, das Sie verwenden könnten, wenn Sie ein Administrationsfenster erstellen möchten, um diese Dinge für Ihr Unternehmen zu verwalten.
Um wiederkehrende Gebühren für Ihre Kunden zu erstellen, führen Sie folgende Schritte aus:
Legen Sie einen Abrechnungsplan an, der die Abrechnungszeiträume definiert. Dies ist eine Zusammenfassung der Parameter, die zum Erstellen eines Plans übergeben werden müssen.
Dies ist ein Codeausschnitt, der zeigt, wie ein Fakturierungsplan erstellt wird:
// Definieren Sie den Plan und hängen Sie die Zahlungsdefinitionen und Händlerpräferenzen an. // Weitere Informationen: https://developer.paypal.com/webapps/developer/docs/api/#create-a-plan var billingPlan = neuer Plan name = "Tuts + Plus", description = "Monatsplan für Kurse. ", type =" fixed ", // Definieren Sie die Händlerpräferenzen. // Weitere Informationen: https://developer.paypal.com/webapps/developer/docs/api/#merchantpreferences-object merchant_preferences = new MerchantPreferences () setup_fee = GetCurrency ("0"), // $ 0 return_url = "returnURL ", // Abrufen von config cancel_url =" cancelURL ", // Abrufen von config auto_bill_amount =" YES ", initial_fail_amount_action =" CONTINUE ", max_fail_attieties =" 0 ", payment_definitions = neue Liste// Definieren Sie einen Testplan, für den im ersten Monat nur $ 9,99 berechnet werden. Danach wird der Standardplan für die verbleibenden elf Monate des Jahres übernommen. new PaymentDefinition () name = "Testplan", type = "TRIAL", Frequenz = "MONTH", frequency_interval = "1", betrag = GetCurrency ("0"), // Frei für die Zyklen des 1. Monats = "1 ", charge_models = neue Liste new ChargeModel () type = "TAX", Betrag = GetCurrency ("1.65") // Wenn wir Steuer berechnen müssen, neues ChargeModel () Typ = "SHIPPING", Betrag = GetCurrency ("9.99") / / Wenn wir Versandkosten berechnen müssen, // Definieren Sie den Standardzahlungsplan. Es handelt sich um einen monatlichen Plan für $ 19.99, der einmal monatlich für 11 Monate berechnet wird. new PaymentDefinition name = "Standardplan", type = "REGULAR", frequency = "MONTH", frequency_interval = "1", betrag = GetCurrency ("15.00"), //> HINWEIS: Für 'IFNINITE'-Typenpläne,' Für ein 'REGULARES "PaymentDefinition" -Objekt sollte "cycle" 0 sein. cycle = "11", charge_models = new List neues ChargeModel type = "TAX", Betrag = GetCurrency ("2.47"), neues ChargeModel () Typ = "SHIPPING", Betrag = GetCurrency ("9.99"); // Hole PayPal Config var apiContext = PayPalConfiguration.GetAPIContext (); // Plan erstellen plan.Create (apiContext);
Ein neu erstellter Fakturierungsplan befindet sich im Zustand ERSTELLT. Aktivieren Sie den Status ACTIVE, damit Ihre Kunden den Plan abonnieren können. Um den Plan zu aktivieren, müssen wir eine PATCH-Anfrage machen:
// Aktiviere den Plan var patchRequest = new PatchRequest () new Patch () op = "ersetzen", path = "/", value = new Plan () state = "ACTIVE"; plan.Update (apiContext, patchRequest);
Wie Sie sehen, sind PayPal-Bibliotheken ein direkter Wrapper über ihre REST-API, was zwar gut ist, aber die API ist im Vergleich zu anderen wie Stripe auch sehr komplex. Aus diesem Grund ist es wirklich eine gute Option, die gesamte PayPal-Kommunikation in Objekten mit klareren und einfacheren APIs für unsere Anwendungen einzubinden. Hier können Sie sehen, wie dieser Code in mehreren Funktionen mit Parametern dargestellt wird:
public static Plan CreatePlanObject (Zeichenfolge planName, Zeichenfolge planDescription, Zeichenfolge returnUrl, Zeichenfolge cancelUrl, Zeichenfolgenhäufigkeit, int frequencyInterval, decimal planPrice, decimal shippingAmount = 0, dezimales taxPercentage = 0, bool trial = false, int trialLength = 0, decimal trialPrice = 0 ) // Definieren Sie den Plan und fügen Sie die Zahlungsdefinitionen und Händlerpräferenzen hinzu. // Weitere Informationen: https://developer.paypal.com/docs/rest/api/payments.billing-plans/ return new Plan name = planName, description = planDescription, type = PlanType.Fixed, // Definieren Sie den Händler Präferenzen. // Weitere Informationen: https://developer.paypal.com/webapps/developer/docs/api/#merchantpreferences-object merchant_preferences = new MerchantPreferences () setup_fee = GetCurrency ("1"), return_url = returnUrl, cancel_url = cancelUrl auto_bill_amount = "YES", initial_fail_amount_action = "CONTINUE", max_fail_attieties = "0", payment_definitions = GetPaymentDefinitions (trial, trialLength, trialPrice, Häufigkeit, HäufigkeitInterval, planPrice, shippingAmount, taxPercentage); private statische ListeGetPaymentDefinitions (bool trial, int trialLength, decimal trialPrice, Zeichenfolgefrequenz, int frequencyInterval, decimal planPrice, decimal shippingAmount, decimal taxPercentage) var paymentDefinitions = new List (); if (trial) // Definieren Sie einen Testplan, der "trialPrice" für "trialLength" berechnet. // Danach übernimmt der Standardplan. paymentDefinitions.Add (new PaymentDefinition () name = "trial", type = "TRIAL", frequency = frequency, frequency_interval = frequencyInterval.ToString (), zahl = GetCurrency (trialPrice.ToString ()), Zyklen = trialLength.ToString ( ), charge_models = GetChargeModels (trialPrice, shippingAmount, taxPercentage)); // Definieren Sie den Standardzahlungsplan. Es wird eine "Häufigkeit" (monatlich usw.) für "planPrice" sein, die "planPrice" (einmal im Monat) für #cycles berechnet. var regularPayment = new PaymentDefinition name = "Standardplan", type = "REGULAR", Frequenz = Häufigkeit, frequency_interval = frequencyInterval.ToString (), betrag = GetCurrency (planPrice.ToString ()), //> HINWEIS: Für 'IFNINITE 'Typenpläne,' Zyklen 'sollte für ein' REGULAR-Objekt 'PaymentDefinition' 0 sein. Zyklen = "11", charge_models = GetChargeModels (trialPrice, shippingAmount, taxPercentage); paymentDefinitions.Add (regularPayment); return paymentDefinitions; private static Liste GetChargeModels (decimal planPreis, decimal shippingAmount, decimal taxPercentage) // Erstellen des Abrechnungsplans var chargeModels = new List (); if (shippingAmount> 0) chargeModels.Add (new ChargeModel () type = "SHIPPING") (Anzahl = GetCurrency (shippingAmount.ToString ())); if (taxPercentage> 0) chargeModels.Add (new ChargeModel () type = "TAX"), betrag = GetCurrency (String.Format ("0: f2", planPrice * taxPercentage / 100)); return chargeModels;
Sie können die Informationen für einen vorhandenen Fakturierungsplan aktualisieren, indem Sie eine PATCH-Anforderung stellen. Dies ist eine Funktion, die diesen Aufruf umschließt:
public static void UpdateBillingPlan (Zeichenfolge planId, Zeichenfolgenpfad, Objektwert) // PayPal-Authentifizierungstoken var apiContext = PayPalConfiguration.GetAPIContext (); // Plan abrufen var plan = Plan.Get (apiContext, planId); // Aktiviere den Plan var patchRequest = new PatchRequest () new Patch () op = "ersetzen", path = path, value = value; plan.Update (apiContext, patchRequest);
Um die Beschreibung des Abrechnungsplans zu aktualisieren, können Sie diese Funktion aufrufen und die richtigen Parameter übergeben:
UpdateBillingPlan (planId: "P-5FY40070P6526045UHFWUVEI", Pfad: "/", Wert: neuer Plan description = "new description");
Idealerweise möchten Sie, wenn Sie keine neuen Kunden für einen Fakturierungsplan akzeptieren möchten, den Status 'INACTIVE' aktualisieren. Bestehende Abrechnungsvereinbarungen für diesen Plan werden davon nicht berührt. Dies kann einfach durch Aufrufen der UpdateBillingPlan-Funktion erfolgen:
UpdateBillingPlan (planId: "P-5FY40070P6526045UHFWUVEI", Pfad: "/", Wert: neuer Plan state = "INACTIVE");
Nachdem Sie einen oder mehrere Abrechnungspläne erstellt haben, möchten Sie, dass Kunden sich für Ihre Abonnementpläne anmelden. Dazu 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:
public IActionResult Subscribe () var plan = PayPalSubscriptionsService.CreateBillingPlan ("Tuts + Plan", "Testplan für diesen Artikel", GetBaseUrl ()); var abonnement = PayPalSubscriptionsService.CreateBillingAgreement (plan.id, neue PayPal.Api.ShippingAddress city = "London", line1 = "Zeile 1", postal_code = "SW1A 1AA", country_code = "GB", "Pedro Alonso", "Tuts +", DateTime.Now); return Umleitung (Subscription.GetApprovalUrl ()); public IActionResult SubscribeSuccess (Zeichenfolgentoken) // Genehmigte Vereinbarung ausführen PayPalSubscriptionsService.ExecuteBillingAgreement (Token); return View (); public IActionResult SubscribeCancel (Zeichenfolgen-Token) // TODO: Behandelte stornierte Rückgabe von Zahlungen RedirectToAction ("Error");
Wie Sie im vorherigen Code-Snippet sehen können, habe ich die meisten Funktionen in mehrere Methoden eingebunden. Der erste ist "CreateBillingPlan", der im vorherigen Abschnitt erläutert wurde. Der zweite ist "CreateBillingAgreement", mit dem ein Benutzer einen Plan abonnieren kann:
public static Agreement CreateBillingAgreement (Zeichenfolge planId, ShippingAddress shippingAddress, Name der Zeichenfolge, Zeichenfolgenbeschreibung, DateTime startDate) // PayPal-Authentifizierungstoken var apiContext = PayPalConfiguration.GetAPIContext (); var agreement = new Agreement () name = name, description = description, start_date = startDate.ToString ("jjjj-MM-ttTHH: mm: ss") + "Z", Zahler = neuer Payer () payment_method = "paypal ", plan = new Plan () id = planId, shipping_address = shippingAddress; var createdAgreement = agreement.Create (apiContext); return erstelltAgreement;
Die dritte Methode ist "ExecuteBillingAgreement". Nach einer erfolgreichen Abonnementgenehmigung verwenden wir das zurückgegebene Token, um das Abonnement zu aktivieren:
public static void ExecuteBillingAgreement (Zeichenfolgen-Token) // PayPal-Authentifizierungs-Token var apiContext = PayPalConfiguration.GetAPIContext (); var agreement = neue Vereinbarung () token = token; var doneAgreement = agreement.Execute (apiContext);
Verwenden Sie diese Methode, um eine Vereinbarung auszusetzen:
public static void SuspendBillingAgreement (string agreementId) var apiContext = PayPalConfiguration.GetAPIContext (); var agreement = neue Vereinbarung () id = agreementId; agreement.Suspend (apiContext, new AgreementStateDescriptor () note = "Die Vereinbarung aussetzen");
Dieser ist dem vorherigen wirklich sehr ähnlich:
public static void ReactivateBillingAgreement (string agreementId) var apiContext = PayPalConfiguration.GetAPIContext (); var agreement = neue Vereinbarung () id = agreementId; agreement.ReActivate (apiContext, neuer AgreementStateDescriptor () note = "Reaktivieren der Vereinbarung");
Verwenden Sie diese Funktion, um einen Plan abzubrechen:
public static void CancelBillingAgreement (Zeichenfolge-VereinbarungId) var apiContext = PayPalConfiguration.GetAPIContext (); var agreement = neue Vereinbarung () id = agreementId; agreement.Cancel (apiContext, new AgreementStateDescriptor () note = "Abbruch der Vereinbarung");
Diese Option ist sehr begrenzt, und was ich von dieser Aufforderung erwarten würde, ist die Möglichkeit, das Abonnement zu ändern, um einen Kunden zu aktualisieren oder ein Downgrade durchzuführen. Dies wird in einem einzelnen Anruf nicht unterstützt, wie in Stripe. Sie müssen mit diesem Szenario umgehen, indem Sie die aktuelle Vereinbarung stornieren und eine neue für Upgrades oder Downgrades erstellen. Es ist nicht ideal, kann sich aber in Zukunft ändern.
Dies ist eine Übersicht über die am häufigsten verwendeten Funktionen zur Integration von PayPal. Ihre API ist viel größer als die in diesem Artikel erläuterten Integrationsmethoden. Sie können auch Rückerstattungen und Teilrückerstattungen ausgeben. In den in diesem Artikel beschriebenen Beispielen gibt es viele verschiedene Optionen für Randfälle. Wenn Sie an weiteren Details zu einer bestimmten Integration interessiert sind, hinterlassen Sie bitte einen Kommentar in den Kommentaren.