Bonjour,
Ci dessous un petit guide pour transformer votre site wordpress en e-boutique sans utiliser le plugin wp-e-commerce.
En plus de créer un boutton paypal, cela vous crée un formulaire pour demander plus d’informations à l’acheteur comme la taille, la couleur du produits, son signe astrologique, etc.
Fonctionnement général :
Vous placer un shortcode sur les pages de votre site ou vous voulez faire apparaitre un bouton paypal. Exemple, je vends une guitare en plastique à 8.35€, cela donne : [PaypalBuyNowButton item_name= »Guitare en plastique » amount= »8.35″]
Le code suivant est à placer dans le fichier functions.php :
function my_scripts_method() { wp_deregister_script( 'joinFields' ); wp_register_script( 'joinFields', 'http://www.votre-site.fr/wp-content/themes/votre-theme/joinFields.js'); wp_enqueue_script( 'joinFields' ); } add_action('wp_enqueue_scripts', 'my_scripts_method'); function PaypalBuyNowButton($atts){ global $wpdb, $post; extract( shortcode_atts( array('item_name' => 'Prevision astrale','amount' => '0.10'), $atts)); //$Output.='<a href="#" onclick="joinFields()">joinFields</a>'; //print_r($atts); $Output.='<form action="https://www.paypal.com/cgi-bin/webscr" method="post" name="fmBuy" id="fmBuy" onSubmit="joinFields()"> <input type="hidden" name="cmd" value="_xclick"> <input type="hidden" name="business" value="votreemailebay@hotmail.com"> <input type="hidden" name="lc" value="FR"> <input type="hidden" name="item_name" value="'.$item_name.'"> <input type="hidden" name="amount" value="'.$amount.'"> <input type="hidden" name="currency_code" value="EUR"> <INPUT TYPE="hidden" name="charset" value="utf-8"> <input type="hidden" name="button_subtype" value="services"> <input type="hidden" name="no_note" value="1"> <input type="hidden" name="no_shipping" value="1"> <input type="hidden" name="rm" value="1"> <p>Votre nom<br /> <input type="text" id="nom" name="nom" value="'.$keyarray['last_name'].'" size="40" /></span> </p> <p>Votre prénom<br /> <input type="text" id="prenom" name="prenom" value="'.$keyarray['first_name'].'" size="40" /></span> </p> <p>Votre date de naissance<br /> <input type="text" id="datedenaissance" name="datedenaissance" value="" size="40" /></span> </p> <p>Votre heure de naissance<br /> <input type="text" id="heuredenaissance" name="heuredenaissance" value="" size="40" /></span> </p> <p>Votre lieu de naissance<br /> <input type="text" id="lieudenaissance" name="lieudenaissance" value="" size="40" /></span> </p> <p>Votre email<br /> <input type="text" id="email" name="email" value="'.$keyarray['payer_email'].'" size="40" /></span></p> <p>Votre numéro de téléphone<br /> <input type="text" id="telephone" name="telephone" value="" size="40" /></span></p> <p>Votre adresse postale complète<br /> <input type="text" id="adresse" name="adresse" value="" size="100" /></span></p> <input type="hidden" name="custom" id="custom" value=""> <input type="hidden" name="return" value="http://www.votre-site.fr"> <input type="hidden" name="cancel_return" value="http://www.votre-site.fr"> <input type="hidden" name="notify_url" value="http://www.louisette-astro.fr/paypal_ipn.php"> <input type="hidden" name="bn" value="PP-BuyNowBF:btn_buynowCC_LG.gif:NonHosted"> <input type="image" src="https://www.paypalobjects.com/fr_FR/FR/i/btn/btn_buynowCC_LG.gif" border="0" name="submit" alt="PayPal - la solution de paiement en ligne la plus simple et la plus sécurisée !"> <img alt="" border="0" src="https://www.paypalobjects.com/fr_FR/i/scr/pixel.gif" width="1" height="1"> </form>'; return $Output; } add_shortcode( 'PaypalBuyNowButton', 'PaypalBuyNowButton' );
Ensuite il faut créer le fichier javascript joinFields.js qui va concaténer les elements du formulaire :
function joinFields(){ var nom = document.getElementById('nom').value; var prenom = document.getElementById('prenom').value; var datedenaissance = document.getElementById('datedenaissance').value; var heuredenaissance = document.getElementById('heuredenaissance').value; var lieudenaissance = document.getElementById('lieudenaissance').value; var email = document.getElementById('email').value; var telephone = document.getElementById('telephone').value; var adresse = document.getElementById('adresse').value; var req=nom+'&'+prenom+'&'+datedenaissance+'&'+heuredenaissance+'&'+lieudenaissance+'&'+email+'&'+telephone+'&'+adresse; var custom = document.getElementById('custom'); custom.value=req; }
Le troisième fichier paypal_ipn.php est à placer à la racine de votre site :
<?php error_reporting(E_ALL ^ E_NOTICE); $emailtext = ""; // Read the post from PayPal and add 'cmd' $req = 'cmd=_notify-validate'; if(function_exists('get_magic_quotes_gpc')){$get_magic_quotes_exits = true;} foreach ($_POST as $key => $value) // Handle escape characters, which depends on setting of magic quotes { if($get_magic_quotes_exists == true && get_magic_quotes_gpc() == 1) {$value = urlencode(stripslashes($value));} else {$value = urlencode($value);} $req .= "&$key=$value"; } // Post back to PayPal to validate $header .= "POST /cgi-bin/webscr HTTP/1.0rn"; $header .= "Content-Type: application/x-www-form-urlencodedrn"; $header .= "Content-Length: " . strlen($req) . "rnrn"; $fp = fsockopen ('ssl://www.paypal.com', 443, $errno, $errstr, 30); // Process validation from PayPal if (!$fp) { // HTTP ERROR } else { // NO HTTP ERROR fputs ($fp, $header . $req); while (!feof($fp)) { $res = fgets ($fp, 1024); if (strcmp ($res, "VERIFIED") == 0) { // Check the payment_status is Completed if ($_POST['payment_status']=='Completed') { $emailtext.='Bonjour,'."n".'Nous avons reçu votre commande '."n".'Détails de votre demande :'."n"; $emailtext.='Type de demande : '.$_POST['item_name']."n"; $custom = explode("&",$_POST['custom']); $emailtext.='Nom : '.$custom[0]."n".'Prénom : '.$custom[1]."n"; $emailtext.='Date de naissance :'.$custom[2]."n".'Heure de naissance :'.$custom[3]."n".'Lieu de naissance :'.$custom[4]."n"; $email=$custom[5]; $emailtext.='Email : '.$email."n".'Téléphone : '.$custom[6]."n"; $emailtext.='Adresse : '.$custom[7]."nn"; foreach ($_POST as $key => $value) { //$emailtext .= $key . " = " .$value ."nn"; } $headers = 'MIME-Version: 1.0' . "rn"; $headers .= 'Content-type: text/plain; charset=utf-8' . "rn"; $headers .= 'From: Vous <nepasrepondre@votre-site.fr>' . "rn"; $headers .= 'Bcc: votre-email@hotmail.com' . "rn"; mail($email, "Accusé de reception de votre commande", $emailtext,$headers); }//End if completed } else if (strcmp ($res, "INVALID") == 0) { foreach ($_POST as $key => $value){$emailtext .= $key . " = " .$value ."nn"; } mail('votre-email@hotmail.com', "Live-INVALID IPN at astro", $emailtext . "nn" . $req); } } fclose ($fp); } ?>
Enfin il est important de bien régler vos options de paypal, notamment pour l’ipn :
Paypal -> Préférences -> Plus d’options -> Mes outils de vente -> Notifications instantanées de paiement
(ou directement : https://www.paypal.com/cgi-bin/customerprofileweb?cmd=_profile-ipn-notify)
Note : La somme des champs réponses (nom, prénoms, …) ne peut dépasser 256 caractères (limitation de cette technique). Si besoin de plus de caractères, utiliser une base de données ou wpec.
Todo :
- intégrer dans un plugin.
- le lier à un plugin type contact form 7 pour ne pas avoir a créer le formulaire en dur
3 réponses sur « Paypal pour WordPress avec un formulaire personalisé »
Petite mise à jour pour rendre le code le plus indépendant possible du site internet où il est installé :
'; return $Output; } add_shortcode( 'PaypalBuyNowButton', 'PaypalBuyNowButton' );Dans functions.php :
Dans paypal_ipn.php :
Todo :
A cause du javascript et de l’id, ne marche pas lorsque deux boutons sur la même page. A corriger avec un int random généré et concaténé à l’id.
Pour que deux bouton sur la même page fonction :
function my_scripts_method() {
wp_deregister_script( ‘joinFields’ );
$uri=get_template_directory_uri();
wp_register_script( ‘joinFields’, $uri.’/joinFields.js’);
wp_enqueue_script( ‘joinFields’ );
}
add_action(‘wp_enqueue_scripts’, ‘my_scripts_method’);
function PaypalBuyNowButton($atts){
// Exemple : [PaypalBuyNowButton item_name= »Prevision astrale » amount= »0.1″ business= »louisette17@hotmail.com » debug= »false »]
global $wpdb, $post;
$siteurl=get_site_url();
extract( shortcode_atts( array(‘item_name’ => ‘Guitare en plastique’,’amount’ => ‘0.10’, ‘business’ =>’contact@6www.net’ , ‘debug’=> false ), $atts));
// Generate a random num to prevent issue when two or more forms on the same page.
//$new_string = ;
//$item_name_sanatized=sanitize_title($item_name);
$rand_id=’_’.rand().’_’.str_replace(« -« , » »,sanitize_title($item_name));
if ($debug){
$Output.=’joinFields‘;
$custom_type=’input’;
}
else {$custom_type=’hidden’;}
$Output.=’
‘;
return $Output;
}
add_shortcode( ‘PaypalBuyNowButton’, ‘PaypalBuyNowButton’ );
et dans le js :
function joinFields(rand_id){
var nom = document.getElementById(‘nom’+rand_id).value;
var prenom = document.getElementById(‘prenom’+rand_id).value;
var datedenaissance = document.getElementById(‘datedenaissance’+rand_id).value;
var heuredenaissance = document.getElementById(‘heuredenaissance’+rand_id).value;
var lieudenaissance = document.getElementById(‘lieudenaissance’+rand_id).value;
var email = document.getElementById(’email’+rand_id).value;
var telephone = document.getElementById(‘telephone’+rand_id).value;
var adresse = document.getElementById(‘adresse’+rand_id).value;
var req=nom+’&’+prenom+’&’+datedenaissance+’&’+heuredenaissance+’&’+lieudenaissance+’&’+email+’&’+telephone+’&’+adresse;
var custom = document.getElementById(‘custom’+rand_id);
custom.value=req;
}
Bonne soirée
Todo : formulaire modifiable
Une jolie petite amélioration : joinFields.js devient indépendant des champs !