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