I denne opplæringen skal jeg vise deg hvordan du kan ta betalinger med PayPal REST API og C #. Alle bibliotekene de har for forskjellige språk som Ruby, Node.js, Python, PHP, er veldig like, så alle begrepene gjelder her for alle bibliotekene.
For å starte, har jeg opprettet et MVC-prosjekt i Visual Studio 2015: Fil> Nytt> Prosjekt, og velg ASP.NET-applikasjon.
Velg ASP.NET 5 Web Application Mal, som bruker den nye MVC 6. Den ligner MVC 5 hvis du er kjent med den.
Som du kan se på bildet nedenfor, har jeg lagt til noen få filer og mapper til løsningen. De viktigste to ting å legge merke til er:
Installer PayPal SDK ved hjelp av NuGet. Høyreklikk på navnet på løsningen og velg Administrer NuGet-pakker, og søk deretter etter "PayPal" og installer den.
For å integrere søknaden vår med PayPal må vi navigere til PayPal Developers, og deretter under REST API-apper, klikk på Opprett app.
Gi appen et navn og velg en sandkasseutviklerkonto som er knyttet til appen. For testformål kan vi deretter navigere til http://sandbox.paypal.com og logge inn med innloggingsinformasjonen for sandboksen for å se testen for PayPal-konto og transaksjoner.
Etter å ha klikket på Opprett app, Vi ser bekreftelsesskjermen med klient-ID og hemmelige tokens.
Kopier clientId og clientSecret tokens til appsettings.json
, som du kan se på skjermbildet nedenfor:
PayPal gir et Sandbox-miljø for testing. Du kan opprette testkjøper og selgerkontoer derfra. Når du registrerer deg, har du en Business-konto i Sandkassen som er knyttet til utviklerkontoen din.
For å opprette en ny testkonto, logg inn på utviklernettstedet, og klikk deretter på dashbord kategorien og naviger til Sandkasse> Kontoer. Her kan du se listen over testkontoer hvis du har noen:
Hvis du ikke har opprettet testkontoene dine ennå, går du videre og klikker på Opprett konto, øverst til høyre, for å opprette minst én testpersonlig konto og en testkonto-konto.
Etter å ha opprettet testkontoene, kan du logge inn via www.sandbox.paypal.com med test-e-postadressen og passordet du tilordnet hver konto på forrige skjema. Dette er veldig nyttig å teste at når du kjøper noe med din personlige testkonto, blir midlene overført til din testkonto-konto. Nå er du klar til å begynne å integrere med PayPal og teste at pengene går fra en konto til en annen.
PayPal tilbyr forskjellige betalingsmåter. Du kan bruke direkte kredittkortbetalinger, noe som betyr at kundene dine ikke får se PayPal-innloggingssiden eller sammendrag - alt skjer på nettstedet ditt. Du må være PCI-kompatibel for dette, og jeg anbefaler at du bruker Stripe, siden du bare trenger SSL ved hjelp av JavaScript-biblioteket. På den annen side, for å ta betalinger via PayPal-betalinger, tar det tre trinn:
I mitt MVC prosjekt, i tjenester mappe, har jeg opprettet PayPalPaymentService-klassen der jeg har lagt til disse metodene:
offentlig statisk betaling CreatePayment (string baseUrl, streng hensikt) // ### Api Context // Pass inn et 'APIContext' objekt for å autentisere // anropet og sende et unikt forespørsel id // (som sikrer idempotency). SDK genererer // en forespørsel ID hvis du ikke bestiller en eksplisitt. var apiContext = PayPalConfiguration.GetAPIContext (); // Betalingsresurs var betaling = ny Betaling () intent = intent, // 'salg' eller 'autoriser' betaler = ny Betaler () payment_method = "paypal", transaksjoner = GetTransactionsList (), redirect_urls = GetReturnUrls (baseUrl , hensikt); // Opprett en betaling ved hjelp av en gyldig APIContext var createdPayment = payment.Create (apiContext); returnert createdPayment; privat statisk listeGetTransactionsList () // En transaksjon definerer kontrakten for en betaling // hva er betalingen for og hvem som oppfyller den. var transactionList = ny liste (); // API for betalingskapasitet krever en liste over Transaksjon; // Legg til den opprettede Transaksjonen til en Liste transaksjonsliste.Add (Ny Transaksjon () beskrivelse = "Transaksjonsbeskrivelse.", faktura_number = GetRandomInvoiceNumber (), beløp = nytt beløp () valuta = "USD", totalt = "100,00" , // Total må være lik summen av frakt, skatt og subtotal. Detaljer = Nye detaljer () // Detaljer: La oss spesifisere detaljer for et betalingsbeløp. Tax = "15", shipping = "10", subtotal = "75", item_list = new ItemList () items = new List - () new Item () name = "Item Name", valuta = "USD", pris = "15", quantity = "5", sku = "sku")); returnere transaksjonsliste; private statiske RedirectUrls GetReturnUrls (strengbasenUrl, strengintensjon) var returnUrl = intent == "sale"? "/ Hjem / PaymentSuccessful": "/ Home / AuthorizeSuccessful"; // Omadresser URLS // Disse nettadressene bestemmer hvordan brukeren blir omdirigert fra PayPal // når de enten har godkjent eller avbrutt betalingen. returner nye RedirectUrls () cancel_url = baseUrl + "/ Hjem / PaymentCancelled", return_url = baseUrl + returnUrl; offentlig statisk betalingsutbetalingstillegg (streng betalingId, strengbetalerId) // ### Api Context // Pass på et 'APIContext'-objekt for å autentisere // anropet og sende et unikt forespørsels-id // (som sikrer idempotency). SDK genererer // en forespørsel ID hvis du ikke bestiller en eksplisitt. var apiContext = PayPalConfiguration.GetAPIContext (); var paymentExecution = ny PaymentExecution () payer_id = payerId; var betaling = ny Betaling () id = betalingId; // Utfør betalingen. var executedPayment = payment.Execute (apiContext, paymentExecution); returnere executedPayment;
Det er noen parametere som blir sendt i denne samtalen:
De tidligere funksjonene kan brukes fra din kontroller slik:
offentlig IActionResult CreatePayment () var betaling = PayPalPaymentService.CreatePayment (GetBaseUrl (), "salg"); returnere omadressering (payment.GetApprovalUrl ()); offentlig IActionResult PaymentCancelled () // TODO: Håndter kansellert betalingsavkastning RedirectToAction ("Error"); offentlig IActionResult PaymentSuccessful (streng betalingId, strengtoken, streng PayerID) // Utfør betaling var betaling = PayPalPaymentService.ExecutePayment (paymentId, PayerID); returvisning ();
Som du ser, har jeg opprettet tre handlinger:
Dette scenariet er veldig lik det forrige tilfellet. Du vil kanskje bruke denne metoden hvis du prøver å ta forbestillinger for et produkt som ikke er tilgjengelig ennå. Fremgangsmåten for å få denne betalingen er:
For å implementere denne typen betaling har jeg bare lagt til en ny metode for klassen PayPalPaymentService for å fange betalingen:
offentlig statisk Capture CapturePayment (streng betalingId) var apiContext = PayPalConfiguration.GetAPIContext (); var payment = Payment.Get (apiContext, paymentId); var auth = payment.transactions [0] .related_resources [0] .authorization; // Angi et beløp som skal fanges. Ved å sette 'is_final_capture' til sann, vil alle gjenværende midler som er godkjent, frigis fra finansieringsinstrumentet. var capture = new Capture () amount = nytt beløp () currency = "USD", total = "4.54", is_final_capture = true; // Fang en autorisert betaling med POSTing til // URI v1 / betalinger / autorisasjon / authorization_id / capture var responseCapture = auth.Capture (apiContext, capture); return responseCapture;
Så fra HomeController har jeg lagt til to nye handlinger for å vise denne typen betaling:
offentlig IActionResult AuthorizePayment () var betaling = PayPalPaymentService.CreatePayment (GetBaseUrl (), "authorize"); returnere omadressering (payment.GetApprovalUrl ()); offentlig IActionResult AuthorizeSuccessful (streng betalingId, streng token, streng PayerID) // Capture Payment var capture = PayPalPaymentService.CapturePayment (paymentId); returvisning ();
I disse kodesamplene har jeg for enkelhets skyld hardkodede betalingsvariabelenes verdier. I ditt virkelige program vil du sannsynligvis pakke dem inn i metoder som tar alle disse verdiene som variabler, slik at alt kan settes dynamisk og gjenbrukes.
Dette kalles "Faktureringsplaner" i PayPal. Du kan opprette tilbakevendende betalingsplaner og abonnere dine kunder til en faktureringsplan ved å opprette en fakturaavtale. Ved hjelp av PayPal REST API kan du opprette, oppdatere eller slette faktureringsplaner; Dette er noe du kan bruke hvis du vil bygge et administrasjonspanel for å administrere disse tingene for bedriften din.
Fremgangsmåten for å opprette gjentatte kostnader til kundene dine vil være:
Opprett en faktureringsplan som definerer faktureringsperioder. Dette er et sammendrag av parametrene som vi må passere for å lage en plan.
Dette er en kodestykke som viser hvordan du oppretter en faktureringsplan:
// Definer planen og legg til betalingsdefinisjonene og selgerinnstillingene. // Mer informasjon: https://developer.paypal.com/webapps/developer/docs/api/#create-a-plan var billingPlan = ny Plan name = "Tuts + Plus", beskrivelse = "Månedlig plan for kurs. ", type =" fixed ", // Definer selgerenes preferanser. // Mer informasjon: https://developer.paypal.com/webapps/developer/docs/api/#merchantpreferences-object merchant_preferences = nye MerchantPreferences () setup_fee = GetCurrency ("0"), // $ 0 return_url = "returnURL ", // Hent fra config cancel_url =" cancelURL ", // Hent fra config auto_bill_amount =" YES ", initial_fail_amount_action =" CONTINUE ", max_fail_attempts =" 0 ", payment_definitions = ny liste// Definer en prøveplan som kun belaster $ 9,99 for den første // måneden. Etter det vil standardplanen overta for // resterende 11 måneder av året. New PaymentDefinition () name = "Trial Plan", type = "TRIAL", frekvens = "Måned", frequency_interval = "1", amount = GetCurrency ("0"), // Gratis for 1 måneders syklus = "1 ", charge_models = ny liste new ChargeModel () type = "TAX", beløp = GetCurrency ("1,65") // Hvis vi trenger å belaste Skatt, ny ChargeModel () type = "SHIPPING", beløp = GetCurrency ("9.99") / / Hvis vi må betale for Shipping, // Definer standardbetalingsplanen. Det vil utgjøre en månedlig // plan for $ 19,99 USD som belaster en måned for 11 måneder. New PaymentDefinition name = "Standard Plan", type = "REGULAR", frekvens = "MÅNED", frequency_interval = "1", amount = GetCurrency ("15,00"), //> MERK: For 'IFNINITE' sykluser 'skal være 0 for et' REGULAR 'PaymentDefinition' objekt. cycles = "11", charge_models = ny liste new ChargeModel type = "TAX", beløp = GetCurrency ("2,47"), ny ChargeModel () type = "SHIPPING", amount = GetCurrency ("9.99"); // Få PayPal Config var apiContext = PayPalConfiguration.GetAPIContext (); // Opprett Plan plan. Opprett (apiContext);
En nyopprettet faktureringsplan er i en CREATED-tilstand. Aktiver den til ACTIVE-tilstanden, slik at kundene dine kan abonnere på planen. For å aktivere planen, må vi gjøre en PATCH-forespørsel:
// Aktiver planen var patchRequest = new PatchRequest () new Patch () op = "replace", path = "/", value = ny Plan () state = "ACTIVE"; plan.Update (apiContext, patchRequest);
Som du kan se, er PayPal-biblioteker et direkte omslag over deres REST API, som er bra, men API er også veldig komplisert sammenlignet med andre som Stripe. Av denne grunn er det virkelig et godt alternativ å pakke inn all PayPal-kommunikasjon i objekter med klarere og enklere APIer for våre applikasjoner. Her kan du se hva denne koden er innpakket i flere funksjoner som tar parametere ut som:
offentlig statisk Plan CreatePlanObject (strengplannavn, strengplanBeskrivelse, streng returnUrl, streng avbrytUrl, strengfrekvens, int frekvensInterval, desimalplanPris, desimal shippingAmount = 0, desimalskattPercentasje = 0, bool prøve = false, int trialLength = 0, desimal prøvePrice = 0 ) // Definer planen og legg til betalingsdefinisjonene og selgerinnstillingene. // Mer informasjon: https://developer.paypal.com/docs/rest/api/payments.billing-plans/ returner ny plan name = planName, description = planDescription, type = PlanType.Fixed, // Definer selgeren preferanser. // Mer informasjon: https://developer.paypal.com/webapps/developer/docs/api/#merchantpreferences-object merchant_preferences = nye 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 (prøve, prøveLengde, prøvePris, frekvens, frekvensInterval, planPris, fraktAmount, skatteprosent); privat statisk listeGetPaymentDefinitions (bool trial, int trialLength, decimal trialPrice, strengfrekvens, int frequencyInterval, desimalplanPris, desimal shippingAmount, desimalskattPercentasje) var paymentDefinitions = new List (); if (trial) // Definer en prøveplan som vil belaste 'trialPrice' for 'trialLength' // Etter det vil standardplanen overta. paymentDefinitions.Add (new PaymentDefinition () name = "Trial", type = "TRIAL", frekvens = frekvens, frequency_interval = frequencyInterval.ToString (), amount = GetCurrency (trialPrice.ToString ()), sykluser = trialLength.ToString ), charge_models = GetChargeModels (trialPrice, shippingAmount, taxPercentage)); // Definer standardbetalingsplanen. Det vil representere en 'frekvens' (månedlig, etc) // plan for 'planpris' som belaster 'planpris' (en gang i måneden) for #cycles. var regularPayment = ny PaymentDefinition name = "Standard Plan", type = "REGULAR", frekvens = frekvens, frequency_interval = frequencyInterval.ToString (), amount = GetCurrency (planPrice.ToString ()), //> MERK: For 'IFNINITE 'type planer', 'sykluser' skal være 0 for et 'REGULAR' PaymentDefinition 'objekt. cycles = "11", charge_models = GetChargeModels (trialPrice, shippingAmount, taxPercentage); betalingDefinitions.Add (regularPayment); return paymentDefinitions; Liste GetChargeModels (desimalplanPris, desimal shippingAmount, desimalskattPercentasje) // Opprett faktureringsplanen var chargeModels = ny liste (); hvis (shippingAmount> 0) chargeModels.Add (new ChargeModel () type = "SHIPPING", beløp = GetCurrency (shippingAmount.ToString ())); if (taxPercentage> 0) chargeModels.Add (new ChargeModel () type = "TAX", beløp = GetCurrency (String.Format ("0: f2", planPris * skatteprosent / 100))); returneringsmodeller;
Du kan oppdatere informasjonen for en eksisterende faktureringsplan ved å gjøre en forespørsel om "PATCH". Dette er en funksjon som bryter den samtalen:
offentlig statisk tomt UpdateBillingPlan (strengplanId, strengbane, objektverdi) // PayPal Authentication tokens var apiContext = PayPalConfiguration.GetAPIContext (); // Hent Plan var plan = Plan.Get (apiContext, planId); // Aktiver planen var patchRequest = new PatchRequest () new Patch () op = "replace", path = path, value = value; plan.Update (apiContext, patchRequest);
For å oppdatere Faktureringsplanbeskrivelsen kan vi ringe denne funksjonen og sende de riktige parameterne:
UpdateBillingPlan (planId: "P-5FY40070P6526045UHFWUVEI", sti: "/", verdi: ny Plan description = "ny beskrivelse");
Ideelt sett, når du ikke vil godta nye kunder til en Faktureringsplan, vil du oppdatere den til "INAKTIVT" -tilstanden. Dette vil ikke påvirke eksisterende fakturaavtaler på denne planen. Dette kan gjøres ved å ringe UpdateBillingPlan-funksjonen:
UpdateBillingPlan (plan: "P-5FY40070P6526045UHFWUVEI", sti: "/", verdi: ny Plan state = "INACTIVE");
Når du har opprettet en eller flere faktureringsplaner, vil du begynne å få kunder til å registrere deg for abonnementsplanene dine. For å gjøre dette må du samle dine kundedetaljer og gjøre en forespørsel til PayPal. For å kunne teste denne funksjonaliteten har jeg lagt til flere handlinger i HomeController:
offentlig IActionResult Abonner () var plan = PayPalSubscriptionsService.CreateBillingPlan ("Tuts + Plan", "Testplan for denne artikkelen", GetBaseUrl ()); var abonnement = PayPalSubscriptionsService.CreateBillingAgreement (plan.id, ny PayPal.Api.ShippingAddress city = "London", line1 = "linje 1", postal_code = "SW1A 1AA", country_code = "GB", "Pedro Alonso" "Tuts +", DateTime.Now); returnere omadressering (abonnement.GetApprovalUrl ()); offentlig IActionResult SubscribeSuccess (strengtoken) // Utfør godkjent avtale PayPalSubscriptionsService.ExecuteBillingAgreement (token); returvisning (); offentlig IActionResult SubscribeCancel (strengtoken) // TODO: Håndter kansellert betalingsavkastning RedirectToAction ("Error");
Som du kan se i forrige kodebrikke, har jeg pakket inn det meste av funksjonaliteten i flere metoder. Den første er "CreateBillingPlan" som ble forklart i forrige avsnitt. Den andre er "CreateBillingAgreement" som brukes til å abonnere en bruker til en plan:
offentlig statisk Avtale CreateBillingAgreement (streng planId, ShippingAddress shippingAddress, strengnavn, strengbeskrivelse, DateTime startDate) // PayPal Authentication tokens var apiContext = PayPalConfiguration.GetAPIContext (); var agreement = ny avtale () navn = navn, beskrivelse = beskrivelse, start_date = startDate.ToString ("yyyy-MM-ddTHH: mm: ss") + "Z", betaleren = ny Betaler () payment_method = "paypal ", plan = ny Plan () id = planId, shipping_address = shippingAddress; var createdAgreement = agreement.Create (apiContext); returnert createdAgreement;
Den tredje metoden er "ExecuteBillingAgreement". Etter en vellykket abonnementsgodkjenning bruker vi token returnert for å aktivere abonnementet:
offentlig statisk tomrom ExecuteBillingAgreement (streng token) // PayPal Authentication tokens var apiContext = PayPalConfiguration.GetAPIContext (); var agreement = ny avtale () token = token; var executedAgreement = agreement.Execute (apiContext);
Bruk denne metoden for å suspendere en avtale:
Statisk statisk tomt SuspendBillingAgreement (strengavtaleId) var apiContext = PayPalConfiguration.GetAPIContext (); var agreement = ny avtale () id = agreementId; agreement.Suspend (apiContext, new AgreementStateDescriptor () note = "Suspending av avtalen");
Denne er virkelig lik den forrige:
offentlig statisk tomrom ReactivateBillingAgreement (strengavtaleId) var apiContext = PayPalConfiguration.GetAPIContext (); var agreement = ny avtale () id = agreementId; agreement.ReActivate (apiContext, new AgreementStateDescriptor () note = "Reaktivering av avtalen");
Bruk denne funksjonen til å avbryte en plan:
offentlig statisk tomrom CancelBillingAgreement (strengavtaleId) var apiContext = PayPalConfiguration.GetAPIContext (); var agreement = ny avtale () id = agreementId; agreement.Cancel (apiContext, new AgreementStateDescriptor () note = "Avbryte avtalen");
Dette alternativet er svært begrenset, og det jeg forventer av denne anropet er muligheten til å endre abonnementsplanen, for å oppgradere eller nedgradere en kunde. Dette støttes ikke i en enkelt samtale som den er i Stripe. Du må håndtere dette scenariet ved å kansellere gjeldende avtale og opprette en ny for oppgraderinger eller nedgraderinger. Det er ikke ideelt, men det kan endres i fremtiden.
Dette er en oversikt over de vanligste funksjonene som folk bruker til å integrere med PayPal. Deres API er langt større enn integrasjonsmetodene som er forklart i denne artikkelen. Du kan også utstede refusjoner og delvise tilbakebetalinger, og de har mange forskjellige muligheter for kantsaker i eksemplene dekket i denne artikkelen. Hvis du er interessert i å få mer informasjon om en hvilken som helst spesifikk integrasjon, vennligst legg et forslag i kommentarene.