In deze zelfstudie laat ik u zien hoe u betalingen kunt doen met de PayPal REST API en C #. Alle bibliotheken die ze hebben voor verschillende talen zoals Ruby, Node.js, Python, PHP lijken erg op elkaar, dus alle concepten zijn hier van toepassing op alle bibliotheken.
Om te beginnen heb ik een MVC-project gemaakt in Visual Studio 2015: Bestand> Nieuw> Project, en selecteer ASP.NET-toepassing.
Selecteer de ASP.NET 5-webapplicatie Sjabloon, die de nieuwe MVC 6 gebruikt. Het is vergelijkbaar met MVC 5 als u hiermee bekend bent.
Zoals je op de onderstaande foto kunt zien, heb ik een paar bestanden en mappen aan de oplossing toegevoegd. De belangrijkste twee dingen om op te merken zijn:
Installeer PayPal SDK met NuGet. Klik met de rechtermuisknop op de naam van de oplossing en selecteer Beheer NuGet-pakketten, en zoek dan naar "PayPal" en installeer het.
Om onze applicatie te integreren met PayPal, moeten we navigeren naar PayPal-ontwikkelaars en vervolgens naar REST API-apps, Klik op Maak een app.
Geef je app een naam en kies een sandbox-ontwikkelaarsaccount die is gekoppeld aan de app. Voor testdoeleinden kunnen we vervolgens navigeren naar http://sandbox.paypal.com en inloggen met de sandbox-inloggegevens om de PayPal-rekening en -transacties van de test te zien.
Na klikken op Maak een app, we zien het bevestigingsscherm met de Client ID en geheime tokens.
Kopieer de clientId- en clientSecret-tokens naar appsettings.json
, zoals je kunt zien in de onderstaande screenshot:
PayPal biedt een Sandbox-omgeving voor testen. U kunt hier testkopers en verkopersaccounts maken. Wanneer u zich aanmeldt, heeft u een zakelijk account in de Sandbox dat is gekoppeld aan uw ontwikkelaarsaccount.
Als u een nieuw testaccount wilt maken, logt u in op de ontwikkelaarssite en klikt u vervolgens op Dashboard tab en navigeer naar Sandbox> Accounts. Hier kunt u de lijst met testaccounts bekijken als u:
Als je je testaccounts nog niet hebt gemaakt, ga je gang en klik je op Maak een account aan, in de rechterbovenhoek, om ten minste één persoonlijk testaccount en één testbedrijfsaccount te maken.
Nadat u de testaccounts hebt gemaakt, kunt u zich aanmelden via www.sandbox.paypal.com met het teste-mailadres en -wachtwoord dat u aan elk account op het vorige formulier hebt toegewezen. Dit is erg handig om te testen dat wanneer u iets koopt met uw 'persoonlijke testaccount', het geld wordt overgeschreven naar uw 'testbedrijfsaccount'. Nu bent u klaar om te beginnen met de integratie met PayPal en te testen of het geld van het ene naar het andere account gaat.
PayPal biedt verschillende betaalmethoden. U kunt directe creditcardbetalingen gebruiken, wat betekent dat uw klanten de PayPal-inlogpagina of samenvatting niet te zien krijgen - het gebeurt allemaal op uw website. Hiervoor moet je PCI-compatibel zijn en ik raad Stripe aan, omdat je alleen SSL nodig hebt met hun JavaScript-bibliotheek. Aan de andere kant, om betalingen te accepteren via PayPal-betalingen, zijn er drie stappen nodig:
In mijn MVC-project, in de Diensten map, ik heb de PayPalPaymentService-klasse gemaakt waar ik deze methoden heb toegevoegd:
public static Payment CreatePayment (string baseUrl, stringintent) // ### Api Context // Geef een 'APIContext'-object door om de // -aanroep te verifiëren en een unieke aanvraag-id // (die idempotency garandeert) te verzenden. De SDK genereert // een verzoek-id als u er niet expliciet een doorgeeft. var apiContext = PayPalConfiguration.GetAPIContext (); // Payment Resource var payment = new Payment () intent = intent, // 'sale' of 'authorize' payer = new Payer () payment_method = "paypal", transacties = GetTransactionsList (), redirect_urls = GetReturnUrls (baseUrl , intentie); // Maak een betaling met een geldige APIC-tekst var createdPayment = payment.Create (apiContext); return createdPayment; private statische lijstGetTransactionsList () // Een transactie definieert het contract van een betaling // wat is de betaling voor en wie vervult deze. var transactionList = new List (); // De API voor het maken van betalingen vereist een transactielijst; // voeg de gemaakte transactie toe aan een lijst transactionList.Add (nieuwe transactie () description = "transactiebeschrijving.", invoice_number = GetRandomInvoiceNumber (), amount = new Amount () currency = "USD", total = "100.00" , // Totaal moet gelijk zijn aan de som van verzendkosten, BTW en subtotaal. Details = nieuw Details () // Details: laat u details van een betalingsbedrag opgeven. Tax = "15", shipping = "10", subtotal = "75", item_list = new ItemList () items = new List - () new Item () name = "Item Name", currency = "USD", price = "15", quantity = "5", sku = "sku"); return transactionList; private static RedirectUrls GetReturnUrls (string baseUrl, string intent) var returnUrl = intent == "sale"? "/ Home / PaymentSuccessful": "/ Home / AuthorizeSuccessful"; // Doorverwijzende URL's // Deze URL's bepalen hoe de gebruiker wordt omgeleid van PayPal // nadat ze de betaling hebben goedgekeurd of geannuleerd. retourneer nieuwe RedirectUrls () cancel_url = baseUrl + "/ Home / PaymentCancelled", return_url = baseUrl + returnUrl; public static Payment ExecutePayment (string paymentId, string payerId) // ### Api Context // Geef een 'APIContext'-object door om de // -aanroep te verifiëren en een unieke aanvraag-id // (die idempotency garandeert) te verzenden. De SDK genereert // een verzoek-id als u er niet expliciet een doorgeeft. var apiContext = PayPalConfiguration.GetAPIContext (); var paymentExecution = new PaymentExecution () payer_id = payerId; var payment = new Payment () id = paymentId; // Voer de betaling uit. var uitgevoerdPayment = payment.Execute (apiContext, paymentExecution); terugkeer uitgevoerdBetaling;
Er worden enkele parameters doorgegeven in deze aanroep:
De voorgaande functies kunnen als volgt uit uw controller worden gebruikt:
public IActionResult CreatePayment () var payment = PayPalPaymentService.CreatePayment (GetBaseUrl (), "sale"); return Redirect (payment.GetApprovalUrl ()); public IActionResult PaymentCancelled () // TODO: verwerking geannuleerde betaling retour RedirectToAction ("Fout"); public IActionResult PaymentSuccessful (string paymentId, string token, string PayerID) // Execute Payment var payment = PayPalPaymentService.ExecutePayment (paymentId, PayerID); return View ();
Zoals je kunt zien, heb ik drie acties gemaakt:
Dit scenario lijkt veel op het vorige geval. U kunt deze methode gebruiken als u pre-orders probeert uit te voeren voor een product dat nog niet beschikbaar is. De stappen om deze betaling te krijgen zijn:
Om dit type betaling te implementeren, heb ik slechts één nieuwe methode toegevoegd aan de klasse PayPalPaymentService om de betaling vast te leggen:
openbare statische Capture CapturePayment (string paymentId) var apiContext = PayPalConfiguration.GetAPIContext (); var payment = Payment.Get (apiContext, paymentId); var auth = payment.transactions [0] .related_resources [0] .autorisatie; // Geef een hoeveelheid op die moet worden vastgelegd. Door 'is_final_capture' in te stellen op true, worden alle resterende middelen die in het bezit zijn van de autorisatie vrijgegeven van het financieringsinstrument. var capture = new Capture () amount = new Amount () currency = "USD", total = "4.54", is_final_capture = true; // Een geautoriseerde betaling vastleggen door te POSTEN naar // URI v1 / payments / authorization / authorization_id / capture var responseCapture = auth.Capture (apiContext, capture); return responseCapture;
Vervolgens heb ik vanuit de HomeController twee nieuwe acties toegevoegd om dit type betaling te tonen:
public IActionResult AuthorizePayment () var payment = PayPalPaymentService.CreatePayment (GetBaseUrl (), "authorize"); return Redirect (payment.GetApprovalUrl ()); public IActionResult AuthorizeSuccessful (string paymentId, string token, string PayerID) // Capture Payment var capture = PayPalPaymentService.CapturePayment (paymentId); return View ();
In deze codevoorbeelden heb ik voor de eenvoud de betalingsvariabele-waarden hard gecodeerd. In uw echte toepassing zult u ze waarschijnlijk verpakken in methoden die al die waarden als variabelen opnemen, zodat alles dynamisch kan worden ingesteld en opnieuw kan worden gebruikt.
Dit wordt in PayPal 'factureringsplannen' genoemd. U kunt periodieke betalingsplannen maken en uw klanten abonneren op een factureringsplan door een factureringsovereenkomst te maken. Met behulp van de PayPal REST API kunt u facturatieplannen maken, bijwerken of verwijderen; dit is iets dat u zou kunnen gebruiken als u een beheerderspaneel wilt bouwen om deze zaken voor uw bedrijf te beheren.
De stappen om terugkerende kosten voor uw klanten te creëren, zijn:
Maak een factureringsplan dat de factureringsperioden definieert. Dit is een samenvatting van de parameters die we moeten doorgeven om een plan te maken.
Dit is een codefragment dat laat zien hoe u een facturatieplan kunt maken:
// Definieer het plan en voeg de betalingsdefinities en merchant-voorkeuren bij. // Meer informatie: https://developer.paypal.com/webapps/developer/docs/api/#create-a-plan var billingPlan = nieuw plan name = "Tuts + Plus", description = "Maandelijks plan voor cursussen. ", type =" fixed ", // Definieer de winkelvoorkeuren. // Meer informatie: https://developer.paypal.com/webapps/developer/docs/api/#merchantpreferences-object merchant_preferences = new MerchantPreferences () setup_fee = GetCurrency ("0"), // $ 0 return_url = "returnURL ", // Ophalen uit configuratie cancel_url =" cancelURL ", // Ophalen uit configuratie auto_bill_amount =" YES ", initial_fail_amount_action =" CONTINUE ", max_fail_attempts =" 0 ", payment_definitions = new Lijst// Definieer een proefplan dat slechts $ 9,99 in rekening brengt voor de eerste // maand. Daarna neemt het standaardplan het over voor de // resterende 11 maanden van het jaar. new PaymentDefinition () name = "Trial Plan", type = "TRIAL", frequency = "MONTH", frequency_interval = "1", amount = GetCurrency ("0"), // Free for the 1st month cycles = "1 ", charge_models = nieuwe lijst new ChargeModel () type = "TAX", amount = GetCurrency ("1.65") // Als we belasting moeten in rekening brengen, new ChargeModel () type = "SHIPPING", amount = GetCurrency ("9.99") / / Als we de verzendkosten moeten in rekening brengen, // Definieer het standaard betalingsplan. Het vertegenwoordigt een maandelijks // plan voor $ 19,99 USD dat eenmaal per maand gedurende 11 maanden in rekening wordt gebracht. nieuwe PaymentDefinition name = "Standard Plan", type = "REGULAR", frequency = "MONTH", frequency_interval = "1", amount = GetCurrency ("15.00"), //> OPMERKING: voor 'IFNINITE' type plannen, ' cycles 'moet 0 zijn voor een object' REGULAR 'PaymentDefinition' cycles = "11", charge_models = new Lijst new ChargeModel type = "TAX", amount = GetCurrency ("2.47"), new ChargeModel () type = "SHIPPING", amount = GetCurrency ("9.99"); // Ontvang PayPal Config var apiContext = PayPalConfiguration.GetAPIContext (); // Planplan maken. Maken (apiContext);
Een nieuw factureringsplan is in de staat CREATED. Activeer deze in de ACTIVE-status, zodat uw klanten zich kunnen abonneren op het plan. Om het plan te activeren, moeten we een PATCH-verzoek doen:
// Activeer het plan var patchRequest = new PatchRequest () new Patch () op = "replace", path = "/", value = new Plan () state = "ACTIVE"; plan.Update (apiContext, patchRequest);
Zoals u kunt zien, zijn PayPal-bibliotheken een directe omkoping van hun REST-API, wat goed is, maar de API is ook erg complex in vergelijking met anderen, zoals Stripe. Om deze reden is het echt een goede optie om alle PayPal-communicatie in objecten in te pakken met duidelijkere en eenvoudigere API's voor onze toepassingen. Hier kunt u zien wat deze code verpakt in meerdere functies die parameters aannemen eruit ziet als:
public static Plan CreatePlanObject (stringplanName, stringplanDescription, string returnUrl, string cancelUrl, string frequency, int frequencyInterval, decimal planPrice, decimal shippingAmount = 0, decimal taxPercentage = 0, bool trial = false, int trialLength = 0, decimal trialPrice = 0 ) // Definieer het plan en voeg de betalingsdefinities en merchant-voorkeuren bij. // Meer informatie: https://developer.paypal.com/docs/rest/api/payments.billing-plans/ retourneer nieuw plan name = planName, description = planDescription, type = PlanType.Fixed, // Definieer de verkoper voorkeuren. // Meer informatie: 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_attempts = "0", payment_definitions = GetPaymentDefinitions (trial, trialLength, trialPrice, frequency, frequencyInterval, planPrice, shippingAmount, taxPercentage); private statische lijstGetPaymentDefinitions (bool trial, int trialLength, decimal trialPrice, string frequency, int frequencyInterval, decimal planPrice, decimal shippingAmount, decimal taxPercentage) var paymentDefinitions = new Lijst (); if (trial) // Definieer een proefplan dat 'trialPrice' in rekening brengt voor 'trialLength' // Daarna zal het standaardplan het roer overnemen. paymentDefinitions.Add (new PaymentDefinition () name = "Trial", type = "TRIAL", frequency = frequency, frequency_interval = frequencyInterval.ToString (), amount = GetCurrency (trialPrice.ToString ()), cycles = trialLength.ToString ( ), charge_models = GetChargeModels (trialPrice, shippingAmount, taxPercentage)); // Definieer het standaard betalingsplan. Het zal een 'frequentie' (maandelijks, etc) vertegenwoordigen // plan voor 'planPrice' dat 'planPrice' (een keer per maand) laadt voor #cycles. var regularPayment = new PaymentDefinition name = "Standard Plan", type = "REGULAR", frequency = frequency, frequency_interval = frequencyInterval.ToString (), amount = GetCurrency (planPrice.ToString ()), //> OPMERKING: voor 'IFNINITE 'type plannen,' cycli 'moet 0 zijn voor een' REGULAR "PaymentDefinition 'object. cycles =" 11 ", charge_models = GetChargeModels (trialPrice, shippingAmount, taxPercentage); paymentDefinitions.Add (regularPayment); return paymentDefinitions; private static Lijst GetChargeModels (decimaal planPrijs, decimale verzendkostenAmount, decimale belastingPercentage) // Maak het facturatieplan var chargeModels = new Lijst (); if (shippingAmount> 0) chargeModels.Add (new ChargeModel () type = "SHIPPING", amount = GetCurrency (shippingAmount.ToString ())); if (taxPercentage> 0) chargeModels.Add (new ChargeModel () type = "TAX", amount = GetCurrency (String.Format ("0: f2", planPrice * taxPercentage / 100))); return chargeModels;
U kunt de informatie voor een bestaand facturatieplan bijwerken door een 'PATCH'-verzoek in te dienen. Dit is een functie die die oproep omspant:
public static void UpdateBillingPlan (string planId, string path, object value) // PayPal authenticatie tokens var apiContext = PayPalConfiguration.GetAPIContext (); // Haal Plan var plan = Plan.Get op (apiContext, planId); // Activeer het plan var patchRequest = new PatchRequest () new Patch () op = "replace", path = path, value = value; plan.Update (apiContext, patchRequest);
Om de beschrijving van het facturatieplan bij te werken, kunnen we deze functie aanroepen en de juiste parameters doorgeven:
UpdateBillingPlan (planId: "P-5FY40070P6526045UHFWUVEI", pad: "/", waarde: nieuw Plan description = "nieuwe beschrijving");
Idealiter, als u geen nieuwe klanten wilt accepteren voor een facturatieplan, moet u dit bijwerken naar de status 'INACTIEF'. Dit heeft geen invloed op bestaande factureringsovereenkomsten voor dit plan. Dit kan eenvoudig worden gedaan door de functie UpdateBillingPlan aan te roepen:
UpdateBillingPlan (planId: "P-5FY40070P6526045UHFWUVEI", pad: "/", waarde: nieuw Plan state = "INACTIVE");
Als u eenmaal een of meer facturatieplannen hebt aangemaakt, wilt u dat klanten zich aanmelden voor uw abonnementen. Om dit te doen, moet u uw klantgegevens verzamelen en een verzoek indienen bij PayPal. Om deze functionaliteit te kunnen testen, heb ik verschillende acties toegevoegd aan de HomeController:
public IActionResult Abonneren () var plan = PayPalSubscriptionsService.CreateBillingPlan ("Tuts + Plan", "Testplan voor dit artikel", GetBaseUrl ()); var abonnement = PayPal SubscriptionsService.CreateBillingAgreement (plan.id, nieuw PayPal.Api.ShippingAddress city = "London", line1 = "line 1", postal_code = "SW1A 1AA", country_code = "GB", "Pedro Alonso", "Tuts +", DateTime.Now); return Redirect (subscription.GetApprovalUrl ()); public IActionResult AbonnerenSuccess (tekenreekstoken) // Goedgekeurde overeenkomst uitvoeren PayPalSubscriptionsService.ExecuteBillingAgreement (token); return View (); public IActionResult SubscribeCancel (tekenreekstoken) // TODO: verwerking van geannuleerde betaling retour RedirectToAction ("Fout");
Zoals je in het vorige codefragment kunt zien, heb ik de meeste functionaliteit op verschillende manieren ingepakt. De eerste is "CreateBillingPlan" die in de vorige sectie werd uitgelegd. De tweede is "CreateBillingAgreement" die wordt gebruikt om een gebruiker te abonneren op een abonnement:
public static Agreement CreateBillingAgreement (string planId, ShippingAddress shippingAddress, string name, string description, DateTime startDate) // PayPal-verificatietokens var apiContext = PayPalConfiguration.GetAPIContext (); var agreement = new Agreement () name = naam, description = description, start_date = startDate.ToString ("jjjj-MM-ddTHH: mm: ss") + "Z", betaler = nieuwe Betaler () payment_method = "paypal ", plan = nieuw Plan () id = planId, shipping_address = shippingAddress; var createdAgreement = agreement.Create (apiContext); return createdAgreement;
De derde methode is "ExecuteBillingAgreement". Na een succesvolle goedkeuring van het abonnement gebruiken we het token terug om het abonnement te activeren:
public static void ExecuteBillingAgreement (tekenreeksstokje) // PayPal-verificatietokens var apiContext = PayPalConfiguration.GetAPIContext (); var agreement = new Agreement () token = token; var uitgevoerdAgreement = agreement.Execute (apiContext);
Gebruik deze methode om een overeenkomst op te schorten:
public static void SuspendBillingAgreement (string agreementId) var apiContext = PayPalConfiguration.GetAPIContext (); var agreement = new Agreement () id = agreementId; agreement.Suspend (apiContext, new AgreementStateDescriptor () note = "De overeenkomst opschorten");
Deze is echt vergelijkbaar met de vorige:
public static void ReactivateBillingAgreement (string agreementId) var apiContext = PayPalConfiguration.GetAPIContext (); var agreement = new Agreement () id = agreementId; agreement.ReActivate (apiContext, new AgreementStateDescriptor () note = "Reactivering van de overeenkomst");
Gebruik deze functie om een plan te annuleren:
public static void CancelBillingAgreement (string agreementId) var apiContext = PayPalConfiguration.GetAPIContext (); var agreement = new Agreement () id = agreementId; agreement.Cancel (apiContext, new AgreementStateDescriptor () note = "De overeenkomst annuleren");
Deze optie is zeer beperkt en wat ik van deze oproep zou verwachten, is de mogelijkheid om het abonnement te wijzigen, een klant te upgraden of te downgraden. Dit wordt niet ondersteund in een enkele oproep zoals in Stripe. U moet dit scenario afhandelen door de huidige overeenkomst te annuleren en een nieuwe te maken voor upgrades of downgrades. Het is niet ideaal, maar het kan in de toekomst veranderen.
Dit is een overzicht van de meest voorkomende functies die mensen gebruiken om met PayPal te integreren. Hun API is veel groter dan de integratiemethoden die in dit artikel worden uitgelegd - u kunt ook restituties en gedeeltelijke terugbetalingen uitgeven en ze hebben veel verschillende opties voor randgevallen in de voorbeelden die in dit artikel worden behandeld. Als u meer wilt weten over een specifieke integratie, laat dan een suggestie achter in de opmerkingen.