WordPress en PayPal een introductie

Voor deze zelfstudie doorlopen we de stappen die nodig zijn om PayPal te integreren als uw Payment Service Provider voor een WordPress-site. Als we met aangepaste berichttypen werken, maken we een standaard winkelwagentje en zorgen we ervoor dat betalingen via PayPal kunnen worden gedaan. Hoewel het uitgewerkte voorbeeld functioneel is, moet u verdere stappen ondernemen om gegevens te schonen en op te slaan wanneer u met betalingen werkt.


Invoering

We gebruiken aangepaste WP-Admin-pagina's voor het bekijken van orders, aangepaste berichttypen voor het maken van producten (de CPT-klasse van Jeffrey Way) en aangepaste paginasjablonen voor het bekijken van producten, winkelwagen en verwerking. Onze onbewerkte functie wordt gemaakt in PHP en we zullen wat basisstyling toepassen met CSS.

Binnen de codefragmenten onder sommige markeringen is mogelijk de leesbaarheid weggenomen.

Degenen die hier voor opt-in gaan, verzoeken u om $ 200 te verzamelen of door te gaan naar fase 2 van deze tutorial en te profiteren van voorbeeldgegevens.


Stap 1 WP-beheerder en paginastructuur

Laten we de pagina's publiceren in WP-Admin die we tijdens de zelfstudie zullen gebruiken.

  1. kar
  2. producten
  3. Dank je

We zullen deze pagina's opnieuw bezoeken en elk later een aangepast sjabloon toewijzen.


Stap 2 Kinderthema

Nu zullen we de mappen en bestanden maken die nodig zijn voor ons project.

We maken hier een kindthema van Twenty Ten, we hoeven alleen de bestanden te maken die we zullen aanpassen of helemaal opnieuw willen maken. Alle andere die vereist zijn, bijvoorbeeld. footer.php WordPress vult de lege plekken voor ons in.


Stap 3 Aangepaste berichttypen van Jeffrey Way

We zullen werken met Jeffrey Way's klasse (vereist PHP 5.3) om een ​​aangepast posttype op maat te maken
waarmee producten kunnen worden aangemaakt, en geen blogposts die doen alsof ze producten zijn, via WP-Admin.

In het bestand /wppp/wppp/post_types.php voeg de volgende stukjes code toe.

Eerst zullen we de klas opnemen.

omvatten (jw_custom_posts.php);

Ten tweede, maak een nieuw Aangepast berichttype en identificeer welke componenten van de schrijfpagina moeten worden gebruikt.

$ product = nieuw JW_Post_type ('Product', array ('supports' => array ('title', 'editor', 'excerpt', 'thumbnail', 'comments')));

Ten derde hebben we een specifiek veld dat beter geschikt is voor een tekstveld op zich. Prijs.

$ product-> add_meta_box ('Productinfo', array ('Prijs' => 'tekst'));

Als alles bij elkaar ziet het er zo uit.

omvatten (jw_custom_posts.php); $ product = nieuw JW_Post_type ('Product', array ('supports' => array ('title', 'editor', 'excerpt', 'thumbnail', 'comments'))); $ product-> add_meta_box ('Productinfo', array ('Prijs' => 'tekst'));

Stap 5 Alle producten ophalen

WordPress Custom Post typen zijn fantastisch en met Jeffrey's klasse implementatie kan snel zijn. De aangepaste gegevens zijn heel snel toegankelijk, net zoals je blogs zou bloggen binnen "de lus".

Laten we bezoeken wppp / tpl-products.php bestand en haal de producten terug.

// Sjabloonnaam: producten

Dit is een conventie die WordPress van ons vereist om een ​​aangepaste sjabloon te maken. Als het actieve thema dit bestand bevat, kunnen we het aan elke pagina toewijzen.

Ga je gang en wijs deze sjabloon toe aan de eerder gepubliceerde productenpagina.

$ products = new WP_Query (array ('post_type' => 'product'));

Vervolgens maken we een nieuw exemplaar van WP_Query en zoek naar
een post_type van "product".

Gebruik makend van WP_Query we hebben toegang tot vele sjabloontags die bestaan ​​binnen WordPress.

Het enige wat nu nodig is, is om de producten te omlopen en de gegevens uit te voeren.

while ($ products-> have_posts ()): $ products-> the_post (); de titel(); echo '

Prijs: '; echo get_post_meta ($ post-> ID, 'product_info_price', true); echo '

'; the_post_thumbnail ( 'product'); the_excerpt (); endwhile;

get_post_meta (); verzamelt gegevens die zijn opgeslagen in aangepaste velden, en omdat er een metabox is toegevoegd met behulp van de klasse van JW eerder, is dit wat moet worden gebruikt om de waarde ervan te achterhalen.

Merk op dat we "product_info_price" gebruiken als de tweede parameter voor get_post_meta. Dit is de naam die wordt toegepast op ons aangepaste veld bij het gebruik van JW's CPT-klasse. De conventie lijkt te zijn naam-van-post-type_info_field.


Stap 6 Een enkel product ophalen

WordPress zal dienen single-custom-post-type.php als er een aangepast berichttype bestaat en een bestand single-custom-post-name.php bestaat binnen het actieve thema. Dit is handig bij het maken van een nieuwe sjabloon voor afzonderlijke producten.

Net zoals het ophalen van veelvouden die we zouden kunnen gebruiken WP_Query (voor aangepaste query's) en de sjabloonlabels die WordPress biedt. Bij het bekijken van een enkel item hebben we echter niet langer een loop of een custom nodig WP_Query.

de post(); the_post_thumbnail ( 'product'); de titel(); echo get_post_meta ($ post-> ID, 'product_info_price', true); de inhoud();

Nog een toevoeging aan onze single-product.php bestand, een formulier waarmee dit item aan de winkelwagen-sessie kan worden toegevoegd.

Er zijn twee verborgen velden aan dit formulier toegevoegd, 1 die het bericht-ID (of product-ID) zal opslaan en het andere iets later zal worden gebruikt. Er is ook een standaardhoeveelheid van 1 ingesteld.


Stap 7 Een item aan de sessie toevoegen

De knop "Toevoegen aan winkelwagentje" bevindt zich op de pagina met één product zoals geïllustreerd in de vorige stap, nadat een gebruiker ervoor heeft gekozen om een ​​product toe te voegen, wordt het formulier naar de winkelwagentjepagina verzonden.

Laten we werken met de wppp / tpl-cart.php bestand nu.

/ * TEMPLATE NAME: winkelwagen * /

tpl-cart.php is een aangepaste sjabloon, dus we moeten WordPress laten weten en de sjabloon via WP-Admin aan de winkelwagenpagina toewijzen.

if ($ _ POST ['wppp_product_id']): $ product_id = $ _POST ['wppp_product_id']; $ qty = $ _POST ['wppp_qty']; $ action = $ _POST ['wppp_action']; switch ($ action) case "add": $ _SESSION ['winkelwagen'] [$ product_id] = $ _SESSION ['winkelwagen'] [$ product_id] + $ aantal; breken; case "empty": unset ($ _ SESSION ['winkelwagen']); breken; case "remove": unset ($ _ SESSION ['winkelwagen'] [$ product_id]); breken;  stop als;

Nu controleren we of geschikte postgegevens zijn verzonden en indien waar slaan we gegevens gemakshalve op als variabelen.

Gebruik een schakelaar om de huidige actie te bepalen en dienovereenkomstig te verwerken.

foreach ($ _ SESSION ['winkelwagen'] als $ product => $ aantal): $ row = get_post ($ product); echo $ row-> post_name echo $ row-> post_title; echo get_post_meta ($ product, 'product_info_price', true); echo $ aantal; echo number_format (get_post_meta ($ product, 'product_info_price', true) * $ qty, 2); endforeach;

Om de winkelwagen naar de pagina af te drukken, wordt een lus gebruikt om de sessiegegevens te herhalen.

Terwijl we in deze loop zoeken naar menselijke leesbare gegevens in plaats van de numerieke weergave van elk product / bericht dat in de sessie is opgeslagen.

Om dit te doen get_post () is perfect, waarmee u snel een vraag kunt stellen naar WordPress door een bericht-ID door te geven. De geretourneerde gegevens zijn een verkleinde versie van WP_Query en het is opgeslagen in $ row.

$ row kan nu naar de pagina worden afgedrukt samen met een lopend totaal dat de prijs van het product vermenigvuldigd met de hoeveelheid weergeeft.

Binnen de lus wordt een formulier geplaatst dat, voor het gemak, een gebruiker in staat stelt om een ​​item volledig uit hun winkelwagentje te verwijderen.

Met behulp van de eerder geschreven schakelaar controleert een controle op het geval van "verwijderen" dat het item uit de sessie wordt verwijderd.


Stap 8 Voorbereiden voor PayPal

PayPal biedt een aantal manieren om gegevens te verzenden en op te halen, we gebruiken Directe betalingsmeldingen of IPN.

  • Over IPN
  • Testen met IPN-gids

Opdat PayPal transacties zou kunnen berekenen en verwerken, kunnen gegevens worden verzonden via een formulier met velden die overeenkomen met de naamgeving en verwachte gegevensconventies zoals uiteengezet door PayPal.
De IPN-gids is te vinden in de kop- of voettekstmenu's van paypal.com/ipn.

Laten we doorgaan ... binnen tpl-cart.php, onder al een formulier wordt toegevoegd met de naakte essentiële PayPal-vereisten.

$ aantal):?>

Bekijk developer.paypal.com voor een sandbox- en testomgeving.

Nadat u bent ingelogd op uw ontwikkelaarsaccount, kunt u testkoper- en verkopersaccounts maken en "Sandbox-testsite invoeren".

De winkelwagen verzenden naar "https://www.sandbox.paypal.com/cgi-bin/webscr"staat het gebruik van de testomgeving toe.

Als u besluit om live te gaan, verandert de URL van de formulieractie gewoon in 'https://www.paypal.com/cgi-bin/webscr".

developer.paypal.com kan een buggy en een trage ervaring zijn, heb geduld. Toen ik deze tutorial schreef, moest ik wachten totdat PayPal zichzelf herstelde en een paar uur later terugkeerde.

  $ aantal):?>      

Net als de vorige sessielus worden de gegevens opgehaald en gepresenteerd met een combinatie van ruwe PHP en een WordPress-functie.

Mits u PayPal de juiste soort gegevens stuurt, wordt deze verwerkt via IPN.

In de vorm boven de productnaam worden gerelateerde hoeveelheden en prijzen voor elk product verzonden. PayPal voert deze keer de berekening uit voor veelvouden op basis van prijs per artikel en aantal.

        

"Transactie- en meldingsvariabelen" zoals beschreven in de IPN-gids zijn geïmplementeerd als verborgen formuliervelden, net zoals de andere variabelietypen die door PayPal zijn gestuurd.

Door een e-mail door te geven aan de invoer met de naam 'zakelijk' geeft PayPal aan welk account de verkoper is. Hier gebruiken we voor het gemak de e-mail van de huidige WordPress-beheerder.

zakelijke - e-mailadres of account-ID van de betalingsontvanger (dat wil zeggen, de
handelaar). Gelijk aan de waarden van receiver_email (als de betaling is
verzonden naar het primaire account) en het bedrijf dat is ingesteld in de websitebetaling
HTML.
- IPN-gids -

De 3 URL's die zijn doorgegeven met het formulier (terugkeer, cancel_return en notify_url) toestaan ​​dat koppelingen worden geplaatst in het afrekenproces als een gebruiker PayPal vanuit de winkelwagen bezoekt. De "annuleren"URL wordt voor en tijdens de transactie getoond, terwijl"terugkeer"wordt weergegeven na de transactie.

Je zou kunnen zeggen dat het belangrijkste veld hier is "notify_url"waarmee een ontwikkelaar achter de schermen naar PayPal-instructies kan luisteren terwijl de gebruiker zijn transactie verwerkt.

Wanneer PayPal een reactie stuurt naar de ipn.php bestand de transactiegegevens kunnen worden opgeslagen in een database, e-mails kunnen worden verzonden en downloads worden gepresenteerd. Het is aan u om de gegevens te verwerken met behulp van methoden die het te verkopen producttype weerspiegelen.

Laten we dus de databasetabel maken in de ipn.php bestand en ga verder met het ophalen van bestellingen.


Stap 9 Database

Voor implementatiesnelheid een longtext-veld voor items_ordered is gemaakt om de artikelen die bij elke bestelling zijn gekocht en de hoeveelheid als geserialiseerde gegevens op te slaan. Het kan raadzaam zijn om bij een live store database-tabellen achter uw winkel te normaliseren naar 4NF of een aangepast berichttype te gebruiken bij het opslaan van bestellingen.


Stap 10 Testen

Nu zou u in staat moeten zijn om nieuwe producten te publiceren, een product (en) aan de cart-sessie toe te voegen, de winkelwagen-sessie te bekijken en door te gaan naar PayPal.

Nadat een klant goederen heeft betaald bij PayPal, wat dan? Hoe kunnen we identificeren of de transactie succesvol is geweest, welke goederen zijn gekocht en waar moeten ze worden verzonden?

In stap 8 werden kopers- en verkopersaccounts gemarkeerd voor testaankopen.

Ook eerder "return_url"is gemaakt als een verborgen formulierveld binnen tpl-cart.php, dit bestand kan worden gebruikt als de gebruiker na de transactie bij PayPal heeft gekozen voor "Terug naar handelaarssite".

Doorloopgegevens worden weergegeven om te laten zien wat er aan de hand is.

foreach ($ _ POST als $ key => $ value): echo '

Sleutel: '$ Te drukken.'

'; echo '

Waarde: '$ Value.'

'; endforeach;

Deze lus print alle geretourneerde gegevens van PayPal via de post. Je zou kunnen besluiten om dit te gebruiken voor het opslaan van gegevens, het is echt niet praktisch om dit te doen.

Om te komen tot de bedankpagina hopen we dat de gebruiker op "Terug naar handelaarswebsite" van PayPal klikt. In het geval dat een gebruiker beslist om de browser te sluiten, wat dan?

Vanwege deze valkuil zou alles via moeten gebeuren tpl-thankyou.php is om het wagentje te legen en de inhoud weer te geven zoals hieronder wordt getoond.

/ * SJABLOONNAAM: Pagina: Bedankt * / session_destroy (); de post(); de titel(); de inhoud();

We worden dan via PayPal op de hoogte gesteld, ongeacht wat de gebruiker beslist na betaling te doen. Dit is waar de "Melding" van Directe Betaling Melding binnenkomt.

Toen het formulier oorspronkelijk naar PayPal werd verzonden "notify_url"had een waarde, dit gaf PayPal de opdracht om het bestand http://yoursite.com/wp-content/themes/wppp/ipn.php voor communicatie te gebruiken.

Met dit in gedachten kunnen we nu "luisteren" naar PayPal (en niet de gebruiker) voor updates over de betalingsstatus en het betalingsproces. Laten we dat laatste bestand maken en een naam geven ipn.php.

$ req = 'cmd = _notify-validate'; foreach ($ _ POST als $ key => $ value): $ value = urlencode (stripslashes ($ value)); $ req. = "& $ key = $ value"; endforeach; $ header. = "POST / cgi-bin / webscr HTTP / 1.0 \ r \ n"; $ header. = "Inhoudstype: application / x-www-form-urlencoded \ r \ n"; $ header. = "Content-Length:". strlen ($ req). "\ R \ n \ r \ n"; $ fp = fsockopen ('ssl: //www.sandbox.paypal.com', 443, $ errno, $ errstr, 30); if (! $ fp): // HTTP ERROR else: fputs ($ fp, $ header. $ req); while (! feof ($ fp)): $ res = fgets ($ fp, 1024); $ fh = fopen ('result.txt', 'w'); fwrite ($ fh, $ res); fclose ($ fh); if (strcmp ($ res, "VERIFIED") == 0): // Zorg ervoor dat we toegang hebben tot WP-functies, namelijk WPDB include_once ($ _ SERVER ['DOCUMENT_ROOT']. '/ wp-load.php'); // U moet valideren tegen deze waarden. $ firstName = $ _POST ['first_name']; $ lastName = $ _POST ['achternaam']; $ payerEmail = $ _POST ['betaler_email']; $ addressStreet = $ _POST ['address_street']; $ addressZip = $ _POST ['address_zip']; $ addressCity = $ _POST ['address_city']; $ productsBought = $ _POST ["]; $ txnID = $ _POST ['txn_id']; // Gebruikt om snel items op te slaan die $ i = 1 hebben gekocht, foreach ($ _ POST als $ key => $ value): if ($ key == 'item_name'. $ i): $ products_bought [] = $ value; $ i ++; endif; endforeach; $ products = serialize ($ products_bought); $ wpdb-> insert ('customers', array ('voornaam' = > $ firstName, 'surname' => $ lastName, 'email' => $ payerEmail, 'address_line_1' => $ addressStreet, 'postcode' => $ addressZip, 'town' => $ addressCity, 'items_ordered' => $ producten, 'created' => current_time ('mysql'), 'txn_id' => $ txnID, 'user_ip' => $ _SERVER ['REMOTE_ADDR']), array ('% s', // FORENAME '% s' , // SURNAAM '% s', // EMAIL '% s', // ADRES 1 '% s', // PCODE '% s', // STAD '% s', // BESTELD '% s', // STATUS '% s', // CREATED '% s' // USER IP)); elseif (strcmp ($ res, "INVALID") == 0): // U wilt misschien de transactie opslaan, zelfs als dit mislukt voor verder onderzoek endif; endc; fclose ($ fp); endif;

De bovenstaande code ziet er een beetje angstaanjagend uit, je kunt zien hoe deze in elkaar wordt gezet door te kijken naar de vereenvoudigde code-sample.php bij PayPal.

Zonder uit te leggen welk voorbeeld PayPal heeft gegeven als leidraad, luisteren we naar GELDIGE of ONGELDIGE reacties en verwerken we dienovereenkomstig. WPDB wordt gebruikt voor het opslaan van vereiste gegevens die door PayPal worden geretourneerd.

foreach ($ _ POST als $ key => $ value): if ($ key == 'item_name _'. $ i): $ products_bought [] = $ waarde; $ I ++; stop als; endforeach;

Met dit fragment worden postgegevens doorgelust en wordt gecontroleerd of het huidige item een ​​is item_name_x waarvan we weten dat het onze productnaam is. De gegevens worden vervolgens geserialiseerd en opgeslagen in een array.

De WPDB-invoegmethode wordt later gebruikt om de geserialiseerde gegevens samen met andere waarden naar de tabel met klanten te verzenden.


Stap 12 Pagina WP-beheerdersorders

Onze laatste stap bestaat uit het maken van een WP-Admin-menupagina en het invullen van die pagina met de eerder opgeslagen klant- / ordergegevens.

U kunt besluiten om een ​​robuustere orderspagina te maken voor paginering, elk artikel te markeren voor verzending, eenvoudig verzendlabels te printen en al het andere.

Laten we de stijlconventies van WordPress volgen en een redelijk goed gepresenteerde lange lijst met bestellingen maken.

define (ADMIN_URL, admin_url ()); // Helper-functie wppp_orders () add_menu_page ('Orders', 'Orders', 'administrator', __FILE__, 'wppp_orders_page', ADMIN_URL.'images / generic.png '); 

add_menu_page () wordt uitgevoerd met 6 parameters van een mogelijke 7.

  1. Pagina titel
  2. Menutitel
  3. Gebruikersrol
  4. URL voor onze optiespagina. In plaats van te concurreren voor rang gebruiken we de bestandslocatie en naam
  5. Uit te voeren functie tijdens het openen van deze pagina
  6. Pictogram voor het menu

Een optionele parameter "menupositie" kan worden doorgegeven, maar laten we niet opnieuw worstelen met andere auteurs.

functie wppp_orders_page () ?> 

bestellingen

Hieronder staat een lijst met alle bestellingen.

# Voornaam Achternaam E-mail Adres Producten gekocht Gebruiker ip
ID kaart Voornaam Achternaam E-mail Adres Producten gekocht Gebruiker ip

Hierboven wordt een functie gemaakt, en binnen een paar markeringen om de orders weer te geven. Bij het toevoegen van de nieuwe menupagina is deze functie ook doorgegeven die WordPress de opdracht geeft om deze code uit te voeren bij het bekijken van de bijbehorende menupagina.

Gebruik makend van wpdb om de orders uit te voeren, zal de laatste fase zijn.

functie wppp_orders_page ()  

bestellingen

Hieronder staat een lijst met alle bestellingen.

get_results ("SELECT * FROM klanten"); ?> items_ordered); ?>
# Voornaam Achternaam E-mail Adres Producten gekocht Gebruiker ip
ID kaart; ?> voornaam; ?> achternaam; ?> e-mail; ?> Adres regel 1; ?>, postcode; ?>, stad; ?>
    '$ Producten [$ i].''; endfor; ?>
user_ip; ?>
Nog geen bestellingen.

Bij het verzenden van producten en hoeveelheden naar de database werden de gegevens geserialiseerd. Het is nu tijd om dat om te keren unserialize bij elke iteratie.

Met een geneste lus kan elke regel met niet-geserialiseerde gegevens worden gesplitst en weergegeven als lijstitems.

add_action ('admin_menu', 'wppp_orders');

Ten slotte worden de eerder gemaakte functies uitgevoerd met behulp van de add_action functie en de ADMIN_MENU actie specifiek. Ga voor een volledige lijst met acties naar de Action-referentie.


Conclusie

In deze tutorial is een combinatie van best practices, hacks en technieken getoond waarvan er veel open zullen staan ​​voor debat. Sommige code en discussie zijn weggelaten uit de tutorial, namelijk additional.css, en functions.php.

additional.css wordt geïmporteerd in de stylesheet voor Twenty Ten (style.css) en past in het voorbeeld enkele basisstijlen toe voor de weergave.

functions.php vereist alle bestanden voor aangepaste berichten en het bekijken van bestellingen binnen WP-Admin. Er is ook een nieuwe afbeeldingsgrootte ingesteld waarmee de productminiatuur wordt bijgesneden om overeen te komen.

We maken gebruik van de menufunctie van Twenty Ten om de koppelingen naar het topmenu voor "Producten" en "Winkelwagen" weer te geven.

Laat ons in de reacties weten wat u vindt van deze introductie tot PayPal met WordPress.