În acest tutorial vă voi arăta cum puteți efectua plăți utilizând PayPal REST API și C #. Toate bibliotecile pe care le au pentru diferite limbi, cum ar fi Ruby, Node.js, Python, PHP sunt foarte asemănătoare, astfel încât toate conceptele de aici se aplică tuturor bibliotecilor.
Pentru a începe, am creat un proiect MVC în Visual Studio 2015: Fișier> Nou> Proiect, și selectați Aplicația ASP.NET.
Selectează ASP.NET 5 Application Web Șablon, care utilizează noul MVC 6. Este similar cu MVC 5 dacă sunteți familiarizat cu acesta.
După cum puteți vedea în fotografia de mai jos, am adăugat câteva fișiere și foldere la soluție. Principalele două lucruri de observat sunt:
Instalați PayPal SDK utilizând NuGet. Click dreapta pe numele soluției și selectați Gestionați pachetele NuGet, apoi căutați "PayPal" și instalați-l.
Pentru a integra aplicația noastră cu PayPal, trebuie să navigați la PayPal Developers și apoi la REST API apps, Click pe Creați aplicația.
Dați aplicației dvs. un nume și alegeți un cont de dezvoltator de nisip asociat aplicației. În scopuri de testare, putem naviga apoi la http://sandbox.paypal.com și conectați-vă cu detaliile de conectare pentru nisip pentru a vedea contul PayPal de testare și tranzacțiile.
După ce faceți clic pe Creați aplicația, vedem ecranul de confirmare cu ID-ul clientului și jetoanele Secret.
Copiați jetoanele clientId și clientSecret la appsettings.json
, după cum puteți vedea în imaginea de mai jos:
PayPal oferă un mediu Sandbox pentru testare. Puteți crea conturi de cumpărători și vânzări de testare de acolo. Când vă înscrieți, veți avea un cont de afaceri în cutia de nisip care este legat de contul dvs. de dezvoltator.
Pentru a crea un nou cont de testare, conectați-vă la site-ul Web pentru dezvoltatori, apoi faceți clic pe Tablou de bord și navigați la Sandbox> Conturi. Aici puteți vedea lista de conturi de testare dacă aveți:
Dacă nu ați creat încă conturile dvs. de testare, continuați și faceți clic pe Creează cont, în partea dreaptă sus, pentru a crea cel puțin un cont personal de testare și un cont de afaceri testat.
După crearea conturilor de testare, vă puteți conecta prin www.sandbox.paypal.com cu adresa de e-mail de testare și parola pe care le-ați atribuit fiecărui cont în formularul anterior. Acest lucru este cu adevărat util pentru a testa că atunci când achiziționați ceva cu "contul personal de testare", fondurile sunt transferate în contul dvs. de testare. Acum sunteți gata să începeți să vă integrați cu PayPal și să testați că fondurile se mută de la un cont la altul.
PayPal oferă diferite modalități de plată. Puteți utiliza plățile directe cu carduri de credit, ceea ce înseamnă că clienții dvs. nu primesc pagina de conectare sau rezumatul PayPal - totul se întâmplă pe site-ul dvs. Web. Trebuie să fiți compatibil cu PCI pentru aceasta și vă recomand să utilizați Stripe, deoarece aveți nevoie doar de SSL utilizând biblioteca JavaScript. Pe de altă parte, pentru a efectua plăți prin intermediul plăților PayPal, este nevoie de trei pași:
În proiectul meu MVC, în Servicii , am creat clasa PayPalPaymentService unde am adăugat aceste metode:
public static Plata CreatePayment (string baseUrl, interogare string) // ### Api Context // Treceți într-un obiect 'APIContext' pentru a autentifica // apelul și pentru a trimite un ID unic de cerere // (care asigură ipempotency). SDK generează // un id de cerere dacă nu o promiteți în mod explicit. var apiContext = PayPalConfiguration.GetAPIContext (); // Plată () intent = intenție, // 'vânzare' sau 'autorizare' plătitor = plătitor nou () payment_method = "paypal", transactions = GetTransactionsList (), redirect_urls = GetReturnUrls , intenție); // Creați o plată utilizând un APIC valabil var createdPayment = payment.Create (apiContext); retur creatPayment; listă statică privatăGetTransactionsList () // O tranzacție definește contractul de plată, care este plata și cine îl îndeplinește. var transactionList = listă nouă (); // API pentru crearea plăților necesită o listă a tranzacției; // adăugați tranzacția creată într-o listă transactionList.Add (new Transaction () description = "Descrierea tranzacției", invoice_number = GetRandomInvoiceNumber (), amount = new Suma () currency = "USD", total = , // Total: trebuie să fie egală cu suma transportului, taxei și subtotalului. Detalii = Detalii noi () // Detalii: Să specificăm detaliile unei sume de plată. "75", item_list = noul ItemList () items = listă nouă - () element nou () name = "Nume element", valută = "USD", preț = "15", cantitate = "5", sku = "sku"); retur tranzacțieList; private static RedirectUrls GetReturnUrls (string baseUrl, interogare șir) var returnUrl = intent == "vânzare"? "/ Acasă / Plata succes": "/ Acasă / AutorizațiSucces"; // Redirect URLS // Aceste adrese URL vor determina modul în care utilizatorul este redirecționat din PayPal // odată ce au aprobat sau au anulat plata. returnează noi RedirectUrls () cancel_url = baseUrl + "/ Home / PaymentCancelled", return_url = baseUrl + returnUrl; Static public Plată ExecutePayment (plată string-id, string payerId) // ### Api Context // Treceți într-un obiect 'APIContext' pentru a autentifica // apelul și pentru a trimite un ID unic de cerere // (care asigură idempotency). SDK generează // un id de cerere dacă nu o promiteți în mod explicit. var apiContext = PayPalConfiguration.GetAPIContext (); var paymentExecution = new PaymentExecution () payer_id = payerId; var payment = new Plată () id = paymentId; // Executați plata. var exectedPayment = plată.Execută (apiContext, paymentExecution); retur executatPayment;
În acest apel sunt difuzați câțiva parametri:
Funcțiile anterioare pot fi utilizate de la controlerul dvs. astfel:
public IActionResult CreatePayment () var pay = PayPalPaymentService.CreatePayment (GetBaseUrl (), "vânzare"); retur Redirecționare (payment.GetApprovalUrl ()); public IActionResult PaymentCancelled () // TODO: Gestionați returnarea de plată anulată RedirectToAction ("Error"); public IActionResult PaymentSuccessful (șir de platăId, șir de șir, șir de plătitor PayerID) // Execute Payment var payment = PayPalPaymentService.ExecutePayment (paymentId, PayerID); retur View ();
După cum puteți vedea, am creat trei acțiuni:
Acest scenariu este foarte similar cu cel precedent. Poate doriți să utilizați această metodă dacă încercați să faceți precomenzi pentru un produs care nu este încă disponibil. Pașii pentru a obține această plată sunt:
Pentru a implementa acest tip de plată, am adăugat doar o nouă metodă la clasa PayPalPaymentService pentru a captura plata:
public static Capture CapturePayment (șir plătitId) var apiContext = PayPalConfiguration.GetAPIContext (); plata var = Plata.Get (apiContext, paymentId); var auth = plata.transacții [0] .related_resources [0] .autorizare; // Specificați o sumă de capturat. Prin setarea "is_final_capture" la adevărat, toate fondurile rămase deținute de autorizare vor fi scoase din instrumentul de finanțare. var capture = Captură nouă () amount = new Sumă () currency = "USD", total = "4.54", is_final_capture = true; // Captură o plată autorizată prin POSTing la // URI v1 / payments / authorization / authorization_id / captură var răspunsCapture = auth.Capture (apiContext, capturare); return responseCapture;
Apoi, de la HomeController, am adăugat două acțiuni noi pentru a afișa acest tip de plată:
public IActionResult AutorizațiPayment () var pay = PayPalPaymentService.CreatePayment (GetBaseUrl (), "autorizează"); retur Redirecționare (payment.GetApprovalUrl ()); public IActionResult AuthorizeSuccessful (șir de plată string, chei string, șir PayerID) // Captură de plată var capture = PayPalPaymentService.CapturePayment (paymentId); retur View ();
În aceste mostre de cod, pentru simplitate, am codificat greu valorile variabilelor de plată. În aplicația dvs. reală, îi veți împacheta probabil în metode care iau toate aceste valori ca variabile astfel încât totul să poată fi setat dinamic și reutilizat.
Acest lucru se numește "planuri de facturare" în PayPal - puteți crea planuri de plată recurente și puteți să vă abonați clienții la un plan de facturare prin crearea unui acord de facturare. Utilizând API-ul PayPal REST puteți crea, actualiza sau șterge planurile de facturare; acest lucru este posibil să utilizați dacă doriți să creați un panou de administrare pentru a gestiona aceste lucruri pentru afacerea dvs..
Pașii pentru a crea costuri recurente pentru clienții dvs. ar fi:
Creați un plan de facturare care definește perioadele de facturare. Acesta este un rezumat al parametrilor pe care trebuie să trecem pentru a crea un plan.
Acesta este un fragment de cod care arată cum se creează un plan de facturare:
// Definiți planul și atașați definițiile de plată și preferințele comerciantului. // Mai multe informații: https://developer.paypal.com/webapps/developer/docs/api/#create-a-plan var billingPlan = plan nou name = "Tuts + Plus", description = "Plan lunar pentru cursuri. ", type =" fixed ", // Definiți preferințele comerciantului. // Mai multe informații: https://developer.paypal.com/webapps/developer/docs/api/#merchantpreferences-object merchant_preferences = new MerchantPreferences () setup_fee = GetCurrency ("0"), // $ 0 return_url = "returnURL ", / / Retrieve from config cancel_url =" cancelURL ", // Retrieve from config auto_bill_amount =" YES ", initial_fail_amount_action =" CONTINUE ", max_fail_attempts =" 0 ", payment_definitions =// Definirea unui plan de încercare care să perceapă numai 9,99 USD pentru prima // luna. După aceasta, planul standard va prelua pentru restul de 11 luni ale anului. new PaymentDefinition () name = "Trial Plan", tip = "TRIAL", frecvență = "MONTH", frequency_interval = "1", amount = GetCurrency ("0"), ", charge_models = Listă nouă new ChargeModel () type = "TAX", suma = GetCurrency ("1.65") // Dacă trebuie să percepem taxă, noi ChargeModel () type = "SHIPPING" / Dacă trebuie să percepem o taxă pentru transport, // Definiți planul de plată standard. Acesta va reprezenta un plan lunar // pentru $ 19.99 USD care se taxează o dată pe lună timp de 11 luni. new PaymentDefinition name = "Planul standard", tip = "REGULAR", frecvența = "MONTH", frequency_interval = "1", amount = GetCurrency (" cicluri "ar trebui să fie 0 pentru un obiect" REGULAMENT "de" PaymentDefinition "" cycles = "11", charge_models = new List new ChargeModel type = "TAX", suma = GetCurrency ("2.47"), noul ChargeModel () type = "SHIPPING", amount = GetCurrency ("9.99"); // Obțineți PayPal Config var apiContext = PayPalConfiguration.GetAPIContext (); // Creați plan plan.Creați (apiContext);
Un plan de facturare nou creat se află într-o stare CREATED. Activați-o în starea ACTIVE, astfel încât clienții dvs. să vă abonați la plan. Pentru a activa planul, trebuie să facem o solicitare PATCH:
// Activați planul var patchRequest = nou PatchRequest () new Patch () op = "înlocuiți", path = "/", value = new Plan () state = "ACTIVE"; plan.Update (apiContext, patchRequest);
După cum puteți vedea, bibliotecile PayPal sunt un înveliș direct peste API-ul REST, care este bun, dar API este de asemenea foarte complex în comparație cu alții ca Stripe. Din acest motiv, este într-adevăr o opțiune bună de a înfășura toate comunicările PayPal în obiecte cu API-uri mai clare și mai simple pentru aplicațiile noastre. Aici puteți vedea ce codifică acest cod în mai multe funcții, arătând parametrii:
planul public static CreatePlanObject (șir planName, șir planDescripție, șir returnUrl, șir cancelUrl, frecvență șir, frecvență intInterval, plan zecimalPrice, zecimal shipAmount = 0, taxă zecimalPercentaj = 0, bool trial = false, int trialLength = 0, trial decimalPrice = ) // Definiți planul și atașați definițiile de plată și preferințele comerciantului. // Mai multe informații: https://developer.paypal.com/docs/rest/api/payments.billing-plans/ return New plan name = planName, description = planDescription, type = PlanType.Fixed, // Definiți comerciantul preferinţe. // Mai multe informații: 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 = "DA", initial_fail_amount_action = "CONTINUE", max_fail_attempts = "0", payment_definitions = GetPaymentDefinitions (încercare, încercareLength, trialPrice, frecvență, frecvențăInterval, planPrice, shippingAmount, taxPercentage); listă statică privatăGetPaymentDefinitions (încercare bool, int trialLength, încercare zecimalăPrice, frecvență șir, frecvență intInterval, plan zecimalPrice, zecimal shippingAmount, taxă zecimalPercentaj) var paymentDefinitions = new List (); dacă (proces) // Definiți un plan de încercare care va percepe "trialPrice" pentru "trialLength" // După aceea, planul standard va prelua. payDefinitions.Add (new PaymentDefinition () name = "Trial", tip = "TRIAL", frecvență = frecvență, frecvență_interval = frecvențăInterval.ToString (), amount = GetCurrency (trialPrice.ToString ), charge_models = GetChargeModels (trialPrice, shippingAmount, taxPercentage)); // Definiți planul standard de plată. Acesta va reprezenta o "frecvență" (lunar, etc) // plan pentru "planPrice" care percepe "planPrice" (o dată pe lună) pentru #cycles. var regularPayment = PlatăDefinire nouă name = "Planul standard", tip = "REGULAR", frecvență = frecvență, frecvență_interval = frecvențăInterval.ToString (), sum = GetCurrency (planPrice.ToString "planuri de tip," cicluri "ar trebui să fie 0 pentru un obiect" REGULAR "PaymentDefinition" cicluri = "11", charge_models = GetChargeModels (trialPrice, shippingAmount, taxPercentage) paymentDefinitions.Add (regularPayment) Listă GetChargeModels (planeta zecimalăPrice, zecimalAguranță zecimal, taxa zecimală zecimală) // Creați planul de facturare var chargeModels = lista nouă (); dacă (shippingAmount> 0) chargeModels.Add (noul ChargeModel () type = "SHIPPING", amount = GetCurrency (shippingAmount.ToString ())); dacă (taxPercentage> 0) chargeModels.Add (nou ChargeModel () type = "TAX", suma = GetCurrency (String.Format ("0: f2"); taxă de returnareModeluri;
Puteți actualiza informațiile pentru un plan de facturare existent făcând o solicitare "PATCH". Aceasta este o funcție care ambalează apelul:
public static void UpdateBillingPlan (șir planId, cale de șir, valoare obiect) // PayPal Autentificare token var apiContext = PayPalConfiguration.GetAPIContext (); // Planul de recuperare var plan = Plan.Get (apiContext, planId); // Activați planul var patchRequest = nou PatchRequest () new Patch () op = "înlocuiți", path = path, value = value; plan.Update (apiContext, patchRequest);
Pentru a actualiza descrierea Planului de facturare, putem apela această funcție și putem trece parametrii potriviți:
UpdateBillingPlan (planId: "P-5FY40070P6526045UHFWUVEI", cale: "/", valoare: plan nou description = "new description");
În mod ideal, atunci când nu doriți să acceptați clienți noi către un plan de facturare, veți dori să îl actualizați în starea "INACTIV". Acest lucru nu va afecta acordurile de facturare existente privind acest plan. Acest lucru se poate face simplu apelând funcția UpdateBillingPlan:
UpdateBillingPlan (planId: "P-5FY40070P6526045UHFWUVEI", cale: "/", valoare: nou Plan state = "INACTIVE");
După ce ați creat unul sau mai multe planuri de facturare, doriți să începeți să vă conectați clienții pentru planurile dvs. de abonament. Pentru a face acest lucru, trebuie să colectați detaliile clienților și să faceți o solicitare pentru PayPal. Pentru a putea testa această funcție, am adăugat câteva acțiuni la HomeController:
public IActionResult Abonare () var plan = PayPalSubscriptionsService.CreateBillingPlan ("Tuts + Plan", "Plan de testare pentru acest articol", GetBaseUrl ()); var abonament = PayPalSubscriptionsService.CreateBillingAgreement (plan.id, noul PayPal.Api.ShippingAddress oraș = "Londra", line1 = "linia 1", postal_code = "SW1A 1AA", country_code = "GB", "Pedro Alonso" "Tuts +", DataTime.Now); retur Redirecționare (subscription.GetApprovalUrl ()); public IActionResult SubscriSuccess (șir de caractere) // Executați acordul aprobat PayPalSubscriptionsService.ExecuteBillingAgreement (token); retur View (); public IActionResult SubscrieCancelar (token șir) // TODO: Gestionați returnarea anulată de plată RedirectToAction ("Eroare");
După cum puteți vedea în fragmentul de cod anterior, am înfășurat cea mai mare parte a funcționalității în mai multe metode. Prima este "CreateBillingPlan" care a fost explicată în secțiunea anterioară. Al doilea este "CreateBillingAgreement", care este folosit pentru a subscrie un utilizator la un plan:
contract de statică publică CreateBillingAgreement (șir planId, expedițieAdăugareAdresă, nume șir, descriere șir, DateTime startDate) // Taste de autentificare PayPal var apiContext = PayPalConfiguration.GetAPIContext (); var acord = nou acord () name = nume, descriere = descriere, start_date = startDate.ToString ("yyyy-MM-ddTHH: mm: ss") "paypal ", plan = plan nou () id = planId, shipping_address = shippingAddress; var createdAgreement = agreement.Create (apiContext); retur a creatAgreement;
A treia metodă este "ExecuteBillingAgreement". După aprobarea cu succes a abonamentului, folosim tokenul returnat pentru a activa abonamentul:
public static void ExecuteBillingAgreement (token șir) // PayPal Autentificare token-uri var apiContext = PayPalConfiguration.GetAPIContext (); var acord = nou acord () token = token; var exectedAgreement = agreement.Execute (apiContext);
Utilizați această metodă pentru a suspenda un acord:
public static void SuspendAgreementAgreement (acordul șirId) var apiContext = PayPalConfiguration.GetAPIContext (); var acord = nou acord () id = agreementId; agreement.Suspend (apiContext, new AgreementStateDescriptor () note = "Suspendarea acordului");
Acesta este într-adevăr similar cu cel precedent:
public static void ReactivareArticol de acordare (acord stringId) var apiContext = PayPalConfiguration.GetAPIContext (); var acord = nou acord () id = agreementId; agreement.ReActivate (apiContext, new AgreementStateDescriptor () note = "Reactivarea acordului");
Utilizați această funcție pentru a anula un plan:
static public void CancelBillingAgreement (șir de acordId) var apiContext = PayPalConfiguration.GetAPIContext (); var acord = nou acord () id = agreementId; agreement.Anul (apiContext, new AgreementStateDescriptor () note = "Anularea acordului");
Această opțiune este foarte limitată și ceea ce aș aștepta de la acest apel este posibilitatea de a schimba planul de abonament, pentru a actualiza sau a devaloriza un client. Acest lucru nu este acceptat într-un singur apel, deoarece este în Stripe. Trebuie să rezolvați acest scenariu prin anularea acordului actual și crearea unui nou acord pentru actualizări sau downgrade-uri. Nu este ideal, dar s-ar putea schimba în viitor.
Aceasta este o prezentare generală a celor mai comune funcții pe care utilizatorii le utilizează pentru a se integra în PayPal. API-ul lor este cu mult mai mare decât metodele de integrare explicate în acest articol - puteți, de asemenea, să efectuați rambursări și rambursări parțiale și să aveți multe opțiuni diferite pentru cazurile de margine din eșantioanele acoperite în acest articol. Dacă sunteți interesat să obțineți mai multe detalii despre o anumită integrare, vă rugăm să lăsați o sugestie în comentarii.