Paypal pour WordPress avec un formulaire personalisé

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)

Paypal Réglage IPN
Paypal Réglage IPN

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 thoughts on “Paypal pour WordPress avec un formulaire personalisé”

  1. Petite mise à jour pour rendre le code le plus indépendant possible du site internet où il est installé :
    Dans functions.php :

    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' => 'Prevision astrale','amount' => '0.10', 'business' =>'contact@6www.net' , 'debug'=> false ), $atts));
      if ($debug){
      $Output.='joinFields';
      $custom_type='input';
      }
      else {
      $custom_type='hidden';
      }
      $Output.='

    Votre nom

    Votre prénom

    Votre date de naissance

    Votre heure de naissance

    Votre lieu de naissance

    Votre email

    Votre numéro de téléphone

    Votre adresse postale complète (pour recevoir le résultat de la voyance)

    '; return $Output; } add_shortcode( 'PaypalBuyNowButton', 'PaypalBuyNowButton' );

    Dans paypal_ipn.php :

    < ?php
    //global $wpdb;
    // Envoi du mail
    //$domain = str_replace("www.","", $_SERVER['HTTP_HOST']);
    //mail('thomas@6www.net', 'Paypal AutoResponse Found','Paypal '.$domain.' AutoResponse Found'.$_POST['item_number'].' '.$_POST['receiver_email']);
    
    // This file is beeing copied to root of your website when activating the plugin. So it is not used when in production !
    // To have access to wp variables and functions :
    //require_once('wp-load.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
    	{
    	$domain = str_replace("www.","", $_SERVER['HTTP_HOST']); 
    	// 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 demande de voyance et nous allons vous répondre très prochainement'."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: '.$domain.' ' . "rn";
    					$headers .= 'Bcc: '.$_POST['receiver_email']. "rn";
    					mail($email, "Accusé de reception de votre achat", $emailtext,$headers);
    				}//End if completed
    			}
    		else if (strcmp ($res, "INVALID") == 0)
    			{
    			foreach ($_POST as $key => $value){$emailtext .= $key . " = " .$value ."nn"; }
    				// mail($_POST['receiver_email'], "INVALID Paypal IPN @".$domain, $emailtext . "nn" . $req);
    			}  
    		}
    		fclose ($fp);
    	}
    ?>
    

    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.

  2. 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.=’











    Votre nom

    Votre prénom

    Votre date de naissance

    Votre heure de naissance

    Votre lieu de naissance

    Votre email

    Votre numéro de téléphone

    Votre adresse postale complète (pour recevoir le résultat de la voyance)








    ‘;
    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

  3. Une jolie petite amélioration : joinFields.js devient indépendant des champs !

    function joinFields(rand_id){
     var custom = document.getElementById('custom'+rand_id);
     var req = '';
     var form_elements = document.getElementById('fmBuy'+rand_id).elements;
     for(var i = 0; i < form_elements.length; i++){
    		// end by rand_id but not the custom_ field !
    		if (form_elements[i].id.match(RegExp(rand_id+'$')) && form_elements[i].id.localeCompare('custom'+rand_id) ) {		
    			req += form_elements[i].value+'&'
    			}
            } 
    // Remove last & :
    req = req.slice(0, -1)
    custom.value=req;
    }
    

Leave a Reply

Your email address will not be published. Required fields are marked *