Für dieses Tutorial gehen wir die Schritte durch, um PayPal als Ihren Zahlungsdienstleister für eine WordPress-basierte Website zu integrieren. Wenn Sie mit benutzerdefinierten Posttypen arbeiten, erstellen wir einen grundlegenden Warenkorb und ermöglichen die Bezahlung über PayPal. Während dieses Beispiel funktioniert, sollten Sie weitere Schritte zur Datenbereinigung und -speicherung beim Arbeiten mit Zahlungen einleiten.
Wir werden benutzerdefinierte WP-Admin-Seiten für die Anzeige von Bestellungen, benutzerdefinierte Post-Typen für die Produkterstellung (die CPT-Klasse von Jeffrey Way) und benutzerdefinierte Seitenvorlagen für die Anzeige von Produkten, Einkaufswagen und Verarbeitung verwenden. Unsere Raw-Funktion wird in PHP erstellt und wir werden einige grundlegende Styling-Funktionen mit CSS anwenden.
In den folgenden Codeausschnitten wurden einige Markups möglicherweise zur besseren Lesbarkeit entfernt.
Für diejenigen, die sich hier anmelden, können Sie 200 USD sammeln oder zur Stufe 2 dieses Tutorials springen und von den Beispieldaten profitieren.
Lassen Sie uns die Seiten in WP-Admin veröffentlichen, die wir im gesamten Tutorial verwenden werden.
Wir werden diese Seiten erneut besuchen und ihnen später eine benutzerdefinierte Vorlage zuweisen.
Jetzt erstellen wir die Verzeichnisse und Dateien, die für unser Projekt erforderlich sind.
Wir erstellen hier ein untergeordnetes Thema aus Twenty Ten. Wir müssen nur die Dateien erstellen, die wir ändern oder neu erstellen. Alle anderen, die erforderlich sind, z. footer.php WordPress füllt die Lücken für uns aus.
Wir werden mit der Klasse von Jeffrey Way (erfordert PHP 5.3) zusammenarbeiten, um einen benutzerdefinierten Beitragstyp für ein Produkt zu erstellen
Dies ermöglicht die Erstellung von Produkten und nicht Blogbeiträge, die sich als Produkte darstellen, über WP-Admin.
In der Datei /wppp/wppp/post_types.php Fügen Sie den folgenden Code hinzu.
Zuerst werden wir die Klasse einschließen.
include ('jw_custom_posts.php');
Zweitens erstellen Sie einen neuen benutzerdefinierten Beitragstyp, und geben Sie an, welche Komponenten der Schreibseite verwendet werden sollen.
$ product = new JW_Post_type ('Product', array ('unterstützt' => array ('title', 'editor', 'excerpt', 'thumbnail', 'comments')));
Drittens haben wir ein bestimmtes Feld, das mit einem eigenen Textfeld besser geeignet ist. Preis.
$ product-> add_meta_box ('Produktinfo', Array ('Preis' => 'Text'));
Wenn alles zusammen so aussehen wird.
include ('jw_custom_posts.php'); $ product = new JW_Post_type ('Product', array ('unterstützt' => array ('title', 'editor', 'excerpt', 'thumbnail', 'comments'))); $ product-> add_meta_box ('Produktinfo', Array ('Preis' => 'Text'));
Benutzerdefinierte PostPress-Typen von WordPress sind fantastisch und mit Jeffreys Klassenimplementierung kann es schnell gehen. Auf die benutzerdefinierten Daten kann sehr schnell zugegriffen werden, ähnlich wie Sie in "the loop" Blogbeiträge verfassen würden..
Lass uns besuchen wppp / tpl-products.php ablegen und die Produkte abrufen.
// Vorlagenname: Produkte
Dies ist eine Konvention, die WordPress von uns verlangt, um eine benutzerdefinierte Vorlage zu erstellen. Wenn das aktive Design diese Datei enthält, können wir sie jeder Seite zuweisen.
Weisen Sie diese Vorlage der zuvor veröffentlichten Produktseite zu.
$ products = new WP_Query (array ('post_type' => 'product'));
Als Nächstes erstellen wir eine neue Instanz von WP_Query
und suchen
ein post_type von "produkt".
Verwenden WP_Query
Wir haben Zugriff auf viele in WordPress vorhandene Vorlagen-Tags.
Jetzt müssen Sie nur noch die Produkte durchlaufen und die Daten ausgeben.
while ($ products-> have_posts ()): $ products-> the_post (); der Titel(); Echo 'Preis: '; echo get_post_meta ($ post-> ID, 'product_info_price', true); Echo '
'; the_post_thumbnail ('product'); der Auszug(); endtime;
get_post_meta ();
ruft Daten ab, die in benutzerdefinierten Feldern gespeichert sind, und da zuvor ein Meta-Feld mit der Klasse von JW hinzugefügt wurde, müssen Sie diesen Wert verwenden, um den Wert abzurufen.
Beachten Sie, dass wir "product_info_price" als zweiten Parameter für verwenden get_post_meta
. Dies ist der Name, der auf unser benutzerdefiniertes Feld angewendet wird, wenn die CPT-Klasse von JW verwendet wird. Die Konvention scheint zu sein name-of-post-type_info_field
.
WordPress wird dienen single-custom-post-type.php Wenn ein benutzerdefinierter Beitragstyp vorhanden ist und eine Datei single-custom-post-name.php existiert innerhalb des aktiven Themas. Dies ist hilfreich, wenn Sie eine neue Vorlage für einzelne Produkte erstellen.
Ähnlich wie das Abrufen von Multiples, die wir verwenden könnten WP_Query
(für benutzerdefinierte Abfragen) und die Vorlagen-Tags von WordPress. Wenn Sie jedoch einen einzelnen Artikel anzeigen, benötigen wir technisch keine Schleife oder einen benutzerdefinierten Wert mehr WP_Query
.
die Post(); the_post_thumbnail ('product'); der Titel(); echo get_post_meta ($ post-> ID, 'product_info_price', true); der Inhalt();
Eine weitere Ergänzung zu unserem Einzelprodukt.php Datei, ein Formular, mit dem dieser Artikel zur Warenkorbsitzung hinzugefügt werden kann.
Zu diesem Formular wurden zwei ausgeblendete Felder hinzugefügt 1, in denen die Beitrags-ID (oder Produkt-ID) gespeichert wird, und das andere wird etwas später verwendet. Eine Standardmenge von 1 ist ebenfalls festgelegt.
Die Schaltfläche "In den Warenkorb" befindet sich auf der einzelnen Produktseite, wie im vorherigen Schritt dargestellt. Nachdem ein Benutzer das Produkt hinzugefügt hat, wird das Formular an die Warenkorbseite gesendet.
Lass uns mit dem arbeiten wppp / tpl-cart.php Datei jetzt.
/ * TEMPLATE NAME: Warenkorb * /
tpl-cart.php ist eine benutzerdefinierte Vorlage, also müssen wir WordPress wissen lassen und die Vorlage über WP-Admin der Warenkorb-Seite zuweisen.
if ($ _ POST ['wppp_product_id']): $ product_id = $ _POST ['wppp_product_id']; $ qty = $ _POST ['wppp_qty']; $ action = $ _POST ['wppp_action']; switch ($ action) case "add": $ _SESSION ['cart'] [$ product_id] = $ _SESSION ['cart'] [$ product_id] + $ qty; brechen; Fall "leer": unset ($ _ SESSION ['cart']); brechen; case "remove": unset ($ _ SESSION ['cart'] [$ product_id])); brechen; endif;
Jetzt prüfen wir, ob geeignete Postdaten gesendet wurden, und wenn wahr, speichern wir die Daten als Variable.
Verwenden Sie einen Schalter, um die aktuelle Aktion zu ermitteln und entsprechend zu verarbeiten.
foreach ($ _ SESSION ['cart'] als $ product => $ qty): $ row = get_post ($ product); echo $ row-> post_name echo $ row-> post_title; echo get_post_meta ($ product, 'product_info_price', true); echo $ qty; echo number_format (get_post_meta ($ product, 'product_info_price', true) * $ qty, 2); endforeach;
Um den Einkaufswagen auf die Seite zu drucken, wird eine Schleife verwendet, um die Sitzungsdaten zu durchlaufen.
In dieser Schleife fragen wir nach vom Menschen lesbaren Daten statt nach der numerischen Darstellung jedes Produkts / Beitrags, die in der Sitzung gespeichert sind.
Um dies zu tun get_post ()
ist perfekt, was eine schnelle Möglichkeit zur Abfrage von WordPress durch Übergeben einer Beitrags-ID ermöglicht. Die zurückgegebenen Daten sind eine verkleinerte Version von WP_Query
und es ist darin gespeichert $ row
.
$ row
kann jetzt zusammen mit einer laufenden Summe auf der Seite gedruckt werden, die den Produktpreis multipliziert mit der Menge zeigt.
Innerhalb der Schleife befindet sich ein Formular, das es einem Benutzer aus praktischen Gründen ermöglicht, einen Artikel vollständig aus dem Warenkorb zu entfernen.
Wenn Sie den zuvor beschriebenen Schalter verwenden, wird bei einer Prüfung auf "Entfernen" der Gegenstand aus der Sitzung entfernt.
PayPal bietet verschiedene Möglichkeiten zum Senden und Abrufen von Daten. Wir verwenden Instant Payment Notification oder IPN.
Damit PayPal alle Transaktionen berechnen und verarbeiten kann, können Daten über ein Formular mit Feldern gesendet werden, die mit den von PayPal festgelegten Namens- und erwarteten Datenkonventionen übereinstimmen.
Die IPN-Anleitung finden Sie in der Kopfzeile oder in den Fußzeilenmenüs von paypal.com/ipn.
Lass uns weitergehen… in uns tpl-cart.php, Unter allem wird ein Formular mit den grundlegenden PayPal-Anforderungen hinzugefügt.
Sehen Sie sich unter developer.paypal.com eine Sandbox und eine Testumgebung an.
Sobald Sie in Ihrem Entwicklerkonto angemeldet sind, können Sie Käufer- und Verkäuferkonten für Testkunden erstellen und "Sandbox-Testseite eingeben"..
Senden des Warenkorbs an "https://www.sandbox.paypal.com/cgi-bin/webscr
"erlaubt die Verwendung der Testumgebung.
Wenn Sie sich entscheiden, online zu gehen, ändert sich die URL für die Formularaktion einfach in "https://www.paypal.com/cgi-bin/webscr
".
developer.paypal.com
kann ein Buggy und eine langsame Erfahrung sein, Geduld haben. Beim Schreiben dieses Tutorials musste ich darauf warten, dass sich PayPal reparierte und einige Stunden später zurückkehrte.
$ qty):?>
Ähnlich wie bei der vorherigen Session-Schleife werden die Daten abgerufen und mit einer Kombination aus rohem PHP und einer WordPress-Funktion dargestellt.
Vorausgesetzt, Sie senden PayPal die korrekten Daten an, die über IPN verarbeitet werden.
In dem Formular über dem Produktnamen werden alle entsprechenden Mengen und Preise für jedes Produkt gesendet. PayPal führt die Berechnung dieses Mal für Vielfache basierend auf dem Preis pro Artikel und Menge durch.
"Transaktions- und Benachrichtigungsvariablen", wie im IPN-Handbuch beschrieben, wurden als ausgeblendete Formularfelder implementiert, ähnlich wie die anderen Variablentypen, die von PayPal geleitet werden.
Wenn Sie eine E-Mail mit dem Namen "business" an die Eingabe übergeben, wird PayPal darüber informiert, welches Konto der Verkäufer ist. Der Einfachheit halber verwenden wir die E-Mail des aktuellen WordPress-Administrators.
business - E-Mail-Adresse oder Konto-ID des Zahlungsempfängers (d. h
Händler). Entspricht den Werten von receiver_email (wenn Zahlung ist)
an das primäre Konto gesendet) und das in der Website-Zahlung festgelegte Geschäft
HTML.
- IPN-Handbuch -
Die 3 URLs, die mit dem Formular übergeben wurden (Rückkehr
, cancel_return
und notify_url
) können Links in den Checkout-Prozess eingefügt werden, wenn ein Benutzer paypal.com vom Warenkorb aus besucht. Das "stornieren
"Die URL wird vor und während der Transaktion angezeigt."Rückkehr
"wird nach der Transaktion angezeigt.
Man könnte sagen, das wichtigste Feld hier ist "notify_url
"Damit kann ein Entwickler hinter den Kulissen auf PayPal - Anweisungen achten, während der Benutzer seine Transaktion verarbeitet.
Wenn PayPal eine Antwort an den sendet ipn.php Datei Die Transaktionsdetails können in einer Datenbank gespeichert werden, E-Mails können gesendet und Downloads angezeigt werden. Es liegt an Ihnen, die Daten mit Methoden zu verarbeiten, die den zu verkaufenden Produkttyp widerspiegeln.
Also lassen Sie uns die Datenbanktabelle im erstellen ipn.php archivieren und zum Abrufen von Bestellungen übergehen.
Für die Geschwindigkeit der Implementierung ein Langtextfeld für Bestellte Artikel
wird erstellt, um die mit jeder Bestellung gekauften Artikel und die Menge als serialisierte Daten zu speichern. Bei einem Live-Store kann es ratsam sein, alle Datenbanktabellen hinter Ihrem Store auf 4NF zu normalisieren oder beim Speichern von Bestellungen die Verwendung eines benutzerdefinierten Beitragstyps in Betracht zu ziehen.
Jetzt sollten Sie in der Lage sein, neue Produkte zu veröffentlichen, der Warenkorbsitzung ein oder mehrere Produkte hinzuzufügen, die Warenkorbsitzung anzuzeigen und mit PayPal fortzufahren.
Nachdem ein Kunde seine Waren bei PayPal bezahlt hat, was dann? Wie können wir feststellen, ob die Transaktion erfolgreich war, welche Waren gekauft wurden und wohin sie versendet werden sollen??
In Schritt 8 wurden Käufer- und Verkäuferkonten für Testkäufe hervorgehoben.
Auch vorher "return_url
"wurde als verstecktes Formularfeld innerhalb von erstellt tpl-cart.php, Diese Datei kann verwendet werden, wenn der Benutzer nach der Transaktion bei PayPal "Zurück zur Händlerseite" wählen soll.
Das Durchlaufen der Postdaten zeigt, was los ist.
foreach ($ _ POST als $ key => $ value): echo 'Schlüssel: '. $ key.'
'; Echo 'Wert: '. $ value.'
'; endforeach;
Diese Schleife druckt alle von PayPal zurückgesendeten Daten per Post. Sie können sich entscheiden, dies zum Speichern von Daten zu verwenden. Dies ist wirklich nicht praktikabel.
Um auf die Dankesseite zu gelangen, hoffen wir, dass der Benutzer von PayPal auf "Zur Händler-Website zurückkehren" klickt. Für den Fall, dass ein Benutzer sich entscheidet, den Browser zu schließen, dann?
Wegen dieser Fallstricke sollte das alles über erfolgen tpl-danke.php Leert den Warenkorb und zeigt den Inhalt wie unten gezeigt an.
/ * TEMPLATE NAME: Seite: Vielen Dank * / session_destroy (); die Post(); der Titel(); der Inhalt();
Wir werden dann von PayPal benachrichtigt, unabhängig davon, was der Benutzer nach der Zahlung entscheidet. Hier kommt die "Benachrichtigung" über die sofortige Zahlungsbenachrichtigung.
Wenn das Formular ursprünglich an PayPal gesendet wurde "notify_url
"hatte einen Wert. Dies wies PayPal an, dass wir die Datei http://yoursite.com/wp-content/themes/wppp/ipn.php für die Kommunikation verwenden möchten.
Zu diesem Zweck können wir jetzt auf PayPal (und nicht auf den Benutzer) auf Updates zum Zahlungsstatus und -prozess achten. Lassen Sie uns die endgültige Datei erstellen und benennen ipn.php.
$ req = 'cmd = _notify-validate'; foreach ($ _ POST als $ key => $ value): $ value = urlencode (striplashes ($ value)); $ req. = "& $ key = $ value"; endforeach; $ header. = "POST / cgi-bin / webscr HTTP / 1.0 \ r \ n"; $ header. = "Content-Type: 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-FEHLER 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): // Stellen Sie sicher, dass wir Zugriff auf WP-Funktionen haben, und zwar WPDB include_once ($ _ SERVER ['DOCUMENT_ROOT']. '/ wp-load.php'); // Sie sollten diese Werte überprüfen. $ firstName = $ _POST ['first_name']; $ lastName = $ _POST ['last_name']; $ payerEmail = $ _POST ['payer_email']; $ addressStreet = $ _POST ['address_street']; $ addressZip = $ _POST ['address_zip']; $ addressCity = $ _POST ['address_city']; $ productsBought = $ _POST ["]; $ txnID = $ _POST ['txn_id']; // Zum schnellen Speichern von gekauften Artikeln $ i = 1; foreach ($ _ POST als $ key => $ value): if ($ key) == 'item_name'. $ i): $ products_bought [] = $ value; $ i ++; endif; endforeach; $ products = serialize ($ products_bought); $ wpdb-> insert ('Kunden', Array ('Vorname' =) > $ firstName, 'Nachname' => $ lastName, 'email' => $ payerEmail, 'address_line_1' => $ addressStreet, 'postcode' => $ addressZip, 'town' => $ addressCity, 'items_ordered' => $ products, 'created' => current_time ('mysql'), 'txn_id' => $ txnID, 'user_ip' => $ _SERVER ['REMOTE_ADDR']), Array ('% s', // FORENAME '% s' , // SURNAME '% s', // EMAIL '% s', // ADRESSE 1 '% s', // PCODE '% s', // TOWN '% s', // BESTELLT '% s', // STATUS '% s', // CREATED '% s' // USER IP)); elseif (strcmp ($ res, "INVALID") == 0): // Möglicherweise möchten Sie die Transaktion auch speichern, wenn sie fehlschlägt für weitere Untersuchungen. endif; endwhile; fclose ($ fp); endif;
Der obige Code sieht etwas beängstigend aus. Sie können sehen, wie er zusammengesetzt wird, indem Sie die vereinfachte code-sample.php bei PayPal überblicken.
Ohne das von PayPal als Leitfaden angeführte Beispiel zu erläutern, hören wir auf VALID- oder INVALID-Antworten und verarbeiten sie entsprechend. WPDB dient zum Speichern der von PayPal zurückgegebenen erforderlichen Daten.
foreach ($ _ POST als $ key => $ value): if ($ key == 'item_name _'. $ i): $ products_bought [] = $ value; $ i ++; endif; endforeach;
Dieses Snippet durchläuft die Postdaten und prüft, ob das aktuelle Element ein ist item_name_x
Wir wissen, ist der Name unseres Produktes. Die Daten werden dann serialisiert und in einem Array gespeichert.
Die WPDB-Einfügemethode wird später verwendet, um die serialisierten Daten zusammen mit anderen Werten an die Kundentabelle zu senden.
Der letzte Schritt besteht darin, eine WP-Admin-Menüseite zu erstellen und diese Seite mit den zuvor gespeicherten Kunden- / Auftragsdaten zu füllen.
Sie können sich entscheiden, eine robustere Bestellseite zu erstellen, um Seitenumbrüche zuzulassen, jeden Artikel für den Versand zu markieren, Versandetiketten und alles andere einfach zu drucken.
Folgen Sie den Stilkonventionen von WordPress und erstellen Sie eine recht gut präsentierte lange Liste von Bestellungen.
define (ADMIN_URL, admin_url ()); // Hilfsfunktion wppp_orders () add_menu_page ('Orders', 'Orders', 'administrator', __FILE__, 'wppp_orders_page', ADMIN_URL.'images / generic.png ');
add_menu_page ()
wird mit 6 Parametern eines möglichen 7 ausgeführt.
Ein optionaler Parameter "Menüposition" könnte übergeben werden, aber wir wollen nicht mit anderen Autoren ringen.
Funktion wppp_orders_page () ?>Aufträge
Nachfolgend finden Sie eine Liste aller Bestellungen.
# Vorname Nachname Adresse Gekaufte Produkte Benutzer-IP ICH WÜRDE Vorname Nachname Adresse Gekaufte Produkte Benutzer-IP Oben wird eine Funktion erstellt, und innerhalb einiger Markierungen, um die Aufträge anzuzeigen. Beim Hinzufügen der neuen Menüseite wurde auch diese Funktion übergeben, die WordPress anweist, diesen Code auszuführen, wenn die entsprechende Menüseite angezeigt wird.
Verwenden
wpdb
Die Ausgabe der Aufträge wird die letzte Stufe sein.Funktion wppp_orders_page ()Aufträge
Nachfolgend finden Sie eine Liste aller Bestellungen.
# Vorname Nachname Adresse Gekaufte Produkte Benutzer-IP get_results ("SELECT * FROM Kunden"); ?> Bestellte Artikel); ?>Ich würde; ?> Vorname; ?> Nachname; ?> Email; ?> Anschrift Zeile 1; ?>, Postleitzahl; ?>, Stadt, Dorf; ?> '. $ products [$ i].''; endfor; ?>
user_ip; ?> Noch keine Bestellungen. Beim Senden von Produkten und Mengen an die Datenbank wurden die Daten serialisiert. Es ist jetzt an der Zeit, dies mit umzukehren
unserialisieren
bei jeder Wiederholung.Eine geschachtelte Schleife ermöglicht das Aufteilen und Speichern von Zeilen in undirialisierten Daten als Listenelemente.
add_action ('admin_menu', 'wppp_orders'));Abschließend werden die zuvor erstellten Funktionen mit der ausgeführt
add_action
Funktion und dieadmin_menu
Aktion spezifisch. Eine vollständige Liste der Aktionen finden Sie in der Aktionsreferenz.
Fazit
In diesem Tutorial wurde eine Kombination aus Best Practices, Hacks und Techniken gezeigt, von denen viele für die Debatte offen sind. Ein Teil des Codes und der Diskussion wurde aus dem Tutorial weggelassen, nämlich additional.css, und Functions.php.
additional.css wird im Stylesheet für Twenty Ten importiert (style.css) und wendet im gesamten Beispiel einige grundlegende Stile für die Anzeige an.
Functions.php Erfordert alle Dateien für benutzerdefinierte Posts und Anzeigenaufträge in WP-Admin. Außerdem wird eine neue Bildgröße festgelegt, die die Miniaturansicht des Produkts entsprechend beschneidet.
Wir nutzen die Menüfunktion von Twenty Ten, um die Top-Menü-Links für "Produkte" und "Warenkorb" anzuzeigen..
Teilen Sie uns in den Kommentaren mit, was Sie von dieser Einführung zur Verwendung von PayPal mit WordPress halten.