Pour ce tutoriel, nous allons suivre les étapes nécessaires pour intégrer PayPal en tant que fournisseur de services de paiement pour un site utilisant WordPress. En travaillant avec des types de messages personnalisés, nous allons créer un panier d'achat de base et permettre le paiement via PayPal. Bien que l'exemple utilisé soit fonctionnel, vous devez prendre d'autres mesures pour nettoyer et stocker les données lorsque vous utilisez des paiements..
Nous utiliserons des pages personnalisées WP-Admin pour afficher les commandes, des types d'articles personnalisés pour la création de produits (classe CPT de Jeffrey Way) et des modèles de page personnalisés pour afficher les produits, les paniers et les traitements. Notre fonction brute sera créée en PHP et nous appliquerons un style de base avec CSS.
Dans les extraits de code ci-dessous, certaines balises peuvent avoir été supprimées pour des raisons de lisibilité..
Pour ceux qui ont choisi de participer ici, avancez et collectez 200 €, ou passez à l'étape 2 de ce didacticiel et bénéficiez d'un exemple de données..
Publions les pages dans WP-Admin que nous utiliserons tout au long du tutoriel.
Nous reverrons ces pages et attribuerons un modèle personnalisé à chacune d’elles..
Maintenant, nous allons créer les répertoires et les fichiers nécessaires à notre projet..
Nous créons ici un thème enfant à partir de Twenty Ten, il ne nous reste plus qu'à créer les fichiers que nous allons modifier ou créer à partir de rien. Tous les autres qui sont nécessaires, par exemple. footer.php WordPress remplira les blancs pour nous.
Nous allons travailler avec la classe de Jeffrey Way (requiert PHP 5.3) pour créer un type de publication personnalisé
qui permettra la création de produits, et non de billets de blog prétendant être des produits, via WP-Admin.
Dans le fichier /wppp/wppp/post_types.php ajouter les morceaux de code suivants.
Nous allons d'abord inclure la classe.
include ('jw_custom_posts.php');
Deuxièmement, créez un nouveau type de publication personnalisé et identifiez les composants de la page d'écriture à utiliser..
$ product = new JW_Post_type ('Product', array ('supports' => array ('title', 'editor', 'extrait', 'thumbnail', 'comments')));
Troisièmement, nous avons un champ spécifique qui convient mieux à un champ de texte seul. Prix.
$ product-> add_meta_box ('Informations sur le produit', array ('Price' => 'text'));
Quand tous ensemble cela ressemblera à ceci.
include ('jw_custom_posts.php'); $ product = new JW_Post_type ('Product', array ('supports' => array ('title', 'editor', 'extrait', 'thumbnail', 'comments'))); $ product-> add_meta_box ('Informations sur le produit', array ('Price' => 'text'));
WordPress Custom Post Types sont fantastiques et avec l'implémentation de classe de Jeffrey, il peut être rapide. Les données personnalisées peuvent être consultées très rapidement, un peu comme vous le feriez pour un blog dans la boucle..
Visitons wppp / tpl-products.php déposer et récupérer les produits.
// Nom du modèle: Produits
Ceci est une convention requise par WordPress pour créer un modèle personnalisé. Si le thème actif contient ce fichier, nous pouvons l'assigner à n'importe quelle page..
Continuez et attribuez ce modèle à la page de produits précédemment publiée..
$ products = new WP_Query (array ('post_type' => 'product'));
Ensuite, nous créons une nouvelle instance de WP_Query
et chercher
un post_type de "produit".
En utilisant WP_Query
nous avons accès à de nombreux modèles de balises existant dans WordPress.
Il ne reste plus maintenant qu’à faire une boucle sur les produits et à sortir les données.
tandis que ($ products-> have_posts ()): $ products-> the_post (); le titre(); écho 'Prix: '; echo get_post_meta ($ post-> ID, 'product_info_price', true); écho '
'; the_post_thumbnail ('product'); the_excerpt (); en attendant;
get_post_meta ();
récupérera les données stockées dans des champs personnalisés, et comme une méta-boîte a été ajoutée précédemment avec la classe de JW, voici ce qu'il faut utiliser pour récupérer sa valeur.
Notez que nous utilisons "product_info_price" comme second paramètre pour get_post_meta
. C'est le nom appliqué à notre champ personnalisé lors de l'utilisation de la classe CPT de JW. La convention semble être nom-de-post-type_info_field
.
WordPress servira single-custom-post-type.php si un type de message personnalisé existe et un fichier single-custom-post-name.php existe dans le thème actif. Ceci est utile lors de la création d'un nouveau modèle pour des produits uniques..
Un peu comme récupérer des multiples que nous pourrions utiliser WP_Query
(pour les requêtes personnalisées) et les balises de modèle fournies par WordPress. Cependant, lors de la visualisation d’un seul élément, techniquement, nous n’avons plus besoin d’une boucle WP_Query
.
la poste(); the_post_thumbnail ('product'); le titre(); echo get_post_meta ($ post-> ID, 'product_info_price', true); le contenu();
Un autre ajout à notre single-product.php file, un formulaire qui permettra à cet article d'être ajouté à la session du panier d'achat.
Deux champs cachés ont été ajoutés à ce formulaire, 1 qui stockera l’ID de publication (ou ID du produit) et l’autre, qui sera utilisé un peu plus tard. Une quantité par défaut de 1 est également définie.
Le bouton "Ajouter au panier" se trouve sur la seule page du produit, comme illustré à l'étape précédente. Après qu'un utilisateur ait choisi d'ajouter un produit, le formulaire sera envoyé à la page du panier..
Travaillons avec le wppp / tpl-cart.php déposer maintenant.
/ * NOM DE GABARIT: Cart * /
tpl-cart.php est un modèle personnalisé, nous devons donc informer WordPress et l'assigner à la page de panier via WP-Admin.
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; Pause; case "vide": unset ($ _SESSION ['cart']); Pause; case "remove": unset ($ _SESSION ['cart'] [$ product_id]); Pause; fin si;
Maintenant, nous vérifions si les données de publication appropriées ont été envoyées et, si vrai, nous les stockons pour des raisons de commodité sous forme de variables..
Utilisation d'un commutateur pour déterminer l'action en cours et le processus en conséquence.
foreach ($ _SESSION ['cart'] sous la forme $ product => qté $): $ 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); fin de chaque
Pour imprimer le panier sur la page, une boucle est utilisée pour parcourir les données de la session..
Dans cette boucle, nous interrogeons des données lisibles par l'homme au lieu de la représentation numérique de chaque produit / article stocké dans la session..
Pour faire ça get_post ()
est parfait, ce qui permet d'interroger WordPress rapidement en passant un identifiant de publication. Les données renvoyées sont une version réduite de WP_Query
et il est stocké dans $ row
.
$ row
peut maintenant être imprimé sur la page avec un total cumulé montrant le prix du produit multiplié par la quantité.
Dans la boucle, un formulaire est placé qui, par souci de commodité, permettra à un utilisateur de retirer entièrement un article de son panier..
En utilisant le commutateur écrit précédemment, une coche pour la case "supprimer" permettra à l'élément d'être supprimé de la session.
PayPal propose plusieurs méthodes pour envoyer et récupérer des données. Nous utiliserons la notification instantanée de paiement ou l'IPN..
Pour que PayPal puisse calculer et traiter toutes les transactions, les données peuvent être envoyées par un formulaire contenant des champs correspondant aux conventions de dénomination et de données attendues définies par PayPal..
Le guide IPN se trouve dans l'en-tête ou les menus de pied de page de paypal.com/ipn.
Passons… à l'intérieur tpl-cart.php, en dessous de tout un formulaire est ajouté avec les exigences de base de PayPal.
Visitez developer.paypal.com pour un environnement sandbox et de test.
Une fois connecté à votre compte de développeur, vous serez en mesure de créer des comptes acheteurs et vendeurs de test et "Entrer sur le site de test du bac à sable"..
Envoi du panier à "https://www.sandbox.paypal.com/cgi-bin/webscr
"permettra l'utilisation de l'environnement de test.
Si vous décidez de vous connecter, l'URL de l'action de formulaire changera simplement en "https://www.paypal.com/cgi-bin/webscr
".
developer.paypal.com
peut être un buggy et une expérience lente, avoir de la patience. En écrivant ce tutoriel, j'ai dû attendre que PayPal se corrige et revienne quelques heures plus tard..
$ qté):?>
Tout comme la boucle de session précédente, les données sont récupérées et présentées avec une combinaison de PHP brut et d'une fonction WordPress..
Si vous envoyez à PayPal le type de données approprié, il sera traité via IPN..
Dans le formulaire ci-dessus, le nom du produit, les quantités correspondantes et les prix pour chaque produit sont tous envoyés. PayPal effectuera le calcul cette fois pour des multiples basés sur le prix par article et la quantité.
Les "variables de transaction et de notification" décrites dans le Guide IPN ont été implémentées sous la forme de champs de formulaire masqués, un peu comme les autres types de variables dirigés par PayPal..
En passant un courrier électronique à l'entrée avec le nom "entreprise", on indique à PayPal quel compte est le vendeur. Ici, pour plus de commodité, nous utilisons le courrier électronique de l'administrateur WordPress actuel.
business - adresse e-mail ou identifiant du compte du destinataire du paiement (c'est-à-dire le
marchande). Équivalent aux valeurs de receiver_email (si le paiement est
envoyé au compte principal) et à l'entreprise définie dans le site de paiement
HTML.
- Guide IPN -
Les 3 URL transmises avec le formulaire (revenir
, cancel_return
et notify_url
) permet de placer des liens dans le processus de commande lorsqu'un utilisateur visite paypal.com à partir du panier. Le "Annuler
"L'URL sera affichée avant et pendant la transaction, alors que"revenir
"est affiché après la transaction.
Vous pourriez dire que le domaine le plus important est "notify_url
"qui permet au développeur d'écouter les instructions de PayPal en coulisse pendant que l'utilisateur traite sa transaction.
Lorsque PayPal envoie une réponse au ipn.php classer les détails de la transaction peuvent être stockés dans une base de données, des e-mails peuvent être envoyés et les téléchargements présentés. Il vous appartient de traiter les données à l'aide de méthodes reflétant le type de produit à vendre..
Créons donc la table de base de données dans le ipn.php classer et passer à la récupération des commandes.
Pour la rapidité de mise en œuvre, un champ longtext pour Les articles commandés
est créé pour stocker les articles achetés avec chaque commande et la quantité sous forme de données sérialisées. Il peut être conseillé avec un magasin actif de normaliser les tables de la base de données situées derrière votre magasin à 4 FN ou d’envisager l’utilisation d’un type de publication personnalisé lors de l’enregistrement des commandes..
Vous devriez maintenant pouvoir publier de nouveaux produits, ajouter un ou plusieurs produits à la session de panier, afficher la session de panier et passer à PayPal.
Après qu'un client ait payé les marchandises chez PayPal, que se passe-t-il alors? Comment pouvons-nous déterminer si la transaction a réussi, quels biens ont été achetés et où doivent-ils être expédiés??
À l’étape 8, les comptes d’acheteur et de vendeur ont été mis en évidence pour les achats testés..
Aussi, auparavant "return_url
"a été créé en tant que champ de formulaire caché dans tpl-cart.php, ce fichier peut être utilisé si l'utilisateur choisit de "retourner sur le site marchand" après la transaction chez PayPal.
Une boucle sur les données après affichera ce qui se passe.
foreach ($ _ POST as $ key => $ value): echo 'Clé: '. $ clé.'
'; écho 'Valeur: ". $ valeur."
'; fin de chaque
Cette boucle imprimera toutes les données renvoyées par PayPal par la poste. Vous pouvez décider de l'utiliser pour stocker des données, ce n'est vraiment pas pratique de le faire.
Pour arriver à la page de remerciement, nous espérons que l'utilisateur cliquera sur "Retour au site Web du commerçant" à partir de PayPal. Dans le cas où un utilisateur décide de fermer le navigateur, quoi?
À cause de cet écueil, tout ce qui devrait être fait via tpl-thankyou.php est de vider le panier et d'afficher le contenu comme indiqué ci-dessous.
/ * NOM DE GABARIT: Page: Merci * / session_destroy (); la poste(); le titre(); le contenu();
Nous sommes ensuite informés par PayPal, peu importe ce que l'utilisateur décide de faire après le paiement. C’est ici que la "Notification" de Notification instantanée de paiement entre en jeu..
Lorsque le formulaire a été initialement envoyé à PayPal "notify_url
"avait une valeur. Cela indiquait à PayPal que nous aimerions utiliser le fichier http://votresite.com/wp-content/themes/wppp/ipn.php pour la communication..
Dans cet esprit, nous pouvons désormais "écouter" PayPal (et non l'utilisateur) pour des mises à jour sur l'état et le processus de paiement. Créons ce fichier final et nommez-le ipn.php.
$ req = 'cmd = _notify-validate'; foreach ($ _ POST en tant que $ clé => $ valeur): $ valeur = urlencode (stripslashes ($ valeur)); $ req. = "& $ key = $ value"; fin de chaque $ header. = "POST / cgi-bin / webscr HTTP / 1.0 \ r \ n"; $ header. = "Type de contenu: application / x-www-formulaire-urlencoded \ r \ n"; $ header. = "Longueur du contenu:". strlen ($ req). "\ r \ n \ r \ n"; $ fp = fsockopen ('ssl: //www.sandbox.paypal.com', 443, $ errno, $ errstr, 30); if (! $ fp): // ERREUR HTTP sinon: fputs ($ fp, $ en-tête. $ req); while (! feof ($ fp)): $ res = fgets ($ fp, 1024); $ fh = fopen ('result.txt', 'w'); fwrite ($ fh, $ res); fclose ($ fh); if (strcmp ($ res, "VERIFIED") == 0): // Assurez-vous d'avoir accès aux fonctions WP, à savoir WPDB include_once ($ _ SERVER ['DOCUMENT_ROOT']. '/ wp-load.php'); // Vous devez valider contre ces valeurs. $ firstName = $ _POST ['first_name']; $ lastName = $ _POST ['last_name']; $ payEmail = $ _POST ['pay_email']; $ addressStreet = $ _POST ['address_street']; $ addressZip = $ _POST ['address_zip']; $ addressCity = $ _POST ['address_city']; $ productsBought = $ _POST ["]; $ txnID = $ _POST ['txn_id']; // Utilisé pour stocker rapidement les articles achetés $ i = 1; foreach ($ _PART en tant que $ key => $ valeur): if ($ key == 'item_name'. $ i): $ products_bought [] = $ value; $ i ++; endif; endforeach; $ products = serialize ($ products_bought); $ wpdb-> insert ('clients', tableau ('prénom' = > $ firstName, 'patronyme' => $ lastName, 'email' => $ payerEmail, 'address_line_1' => $ addressStreet, 'postcode' => $ addressZip, 'town' => $ addressCity, 'items_ordered' => $ produits, 'created' => current_time ('mysql'), 'txn_id' => $ txnID, 'user_ip' => $ _SERVER ['REMOTE_ADDR']), array ('% s', // FORENAME '% s' , // NOM '% s', // EMAIL '% s', // ADRESSE 1 '% s', // PCODE '% s', // TOWN '% s', // ORDERED '% s', // STATUS '% s', // CREATED '% s' // USER IP)); elseif (strcmp ($ res, "INVALID") == 0): // Vous pouvez préférer stocker la transaction même en cas d'échec. pour complément d’investigation: endif; endwhile; fclose ($ fp); endif;
Le code ci-dessus semble un peu effrayant, vous pouvez voir comment il est reconstitué en regardant le code-sample.php simplifié sur PayPal.
Sans expliquer l'exemple fourni par PayPal, nous écoutons les réponses VALID ou INVALID et les traitons en conséquence. WPDB est utilisé pour stocker toutes les données requises retournées par PayPal..
foreach ($ _ POST en tant que $ key => $ valeur): if ($ key == 'item_name _'. $ i): $ products_bought [] = $ value; $ i ++; fin si; fin de chaque
Cet extrait parcourt les données de publication et vérifie si l'élément en cours est une item_name_x
que nous connaissons est le nom de notre produit. Les données sont ensuite sérialisées et stockées dans un tableau..
La méthode d'insertion WPDB est utilisée ultérieurement pour envoyer les données sérialisées avec d'autres valeurs à la table des clients..
Notre dernière étape consiste à créer une page de menu WP-Admin et à renseigner cette page avec les données clients / commandes précédemment stockées..
Vous pouvez décider de créer une page de commandes plus robuste pour permettre la pagination, le marquage de chaque article pour l'expédition, l'impression facile des étiquettes d'expédition et toute autre chose..
Suivons les conventions de style de WordPress et créons une longue liste de commandes raisonnablement bien présentée..
définir (ADMIN_URL, admin_url ()); // Fonction d'assistance wppp_orders () add_menu_page ('Commandes', 'Commandes', 'administrateur', __FILE__, 'wppp_orders_page', ADMIN_URL.'images / generic.png ');
add_menu_page ()
est exécuté avec 6 paramètres sur 7 possibles.
Un paramètre optionnel "position du menu" peut être passé mais encore une fois, ne luttons pas avec d'autres auteurs.
fonction wppp_orders_page () ?>Ordres
Ci-dessous une liste de toutes les commandes.
# Prénom Nom de famille Adresse Produits achetés Utilisateur ip ID Prénom Nom de famille Adresse Produits achetés Utilisateur ip Ci-dessus, une fonction est créée et, à l'intérieur, un balisage pour afficher les commandes. Lors de l'ajout de la nouvelle page de menu, cette fonction a également été transmise, indiquant à WordPress d'exécuter ce code lors de l'affichage de la page de menu correspondante..
En utilisant
wpdb
pour sortir les commandes sera la dernière étape.fonction wppp_orders_page ()Ordres
Ci-dessous une liste de toutes les commandes.
# Prénom Nom de famille Adresse Produits achetés Utilisateur ip get_results ("SELECT * FROM clients"); ?> Les articles commandés); ?>id; ?> prénom; ?> nom de famille; ?> email; ?> Adresse 1; ?>, code postal; ?>, ville; ?> '. $ produits [$ i].''; endfor; ?>
user_ip; ?> Aucune commande pour le moment. Lors de l'envoi de produits et de quantités à la base de données, les données ont été sérialisées. Il est maintenant temps d'inverser cela avec
désérialiser
à chaque itération.Une boucle imbriquée permet de séparer chaque ligne de données non sérialisées et de les afficher sous forme d’éléments de liste..
add_action ('admin_menu', 'wppp_orders');Enfin, les fonctions créées précédemment sont exécutées à l’aide de la touche
add_action
fonction et laadmin_menu
action spécifiquement. Pour une liste complète des actions, visitez la référence Action.
Conclusion
Dans ce didacticiel, une combinaison de meilleures pratiques, de techniques de piratage et de techniques a été montrée, et une grande partie sera ouverte au débat. Une partie du code et de la discussion ont été omis du tutoriel, à savoir supplémentaire.css, et functions.php.
supplémentaire.css est importé dans la feuille de style pour Twenty Ten (style.css) et applique quelques styles de base pour l'affichage tout au long de l'exemple.
functions.php requiert des fichiers pour les publications personnalisées et l'affichage des commandes dans WP-Admin. Une nouvelle taille d’image est également définie. Elle permet de recadrer la vignette du produit..
Nous utilisons la fonctionnalité de menu de Twenty Ten pour afficher les liens de menu supérieurs pour "Produits" et "Panier".
Faites-nous savoir dans les commentaires ce que vous pensez de cette introduction à l'utilisation de PayPal avec WordPress.