Mise en place d'un paiement Paypal sur site marchand.

Créer un compte de developer.

Il faut dans un premier temps créer un compte développer sur Paypal, afin de simuler des comptes vendeur et acheteur. - Rendez-vous sur https://developer.paypal.com cliquez sur « signup » et remplissez le formulaire. Une fois le formulaire complété vous recevrez un mail de confirmation dans lequel il faudra cliquer sur un lien pour terminer votre inscription.

Votre compte developer est maintenant créé, il faut désormais ouvrir des comptes fictifs pour le vendeur et les acheteurs.

Connectez-vous à https://developer.paypal.com en utilisant le login et le mot de passe que vous avez indiqués précédemment. Cliquez sur le lien « enter sandbox » situé en haut à droite. Vous allez vous retrouver sur l'accueil de la « sandbox paypal ». Son aspect est identique à la page Paypal classique à l'exception d'un bandeau bleu en haut, vous indiquant que vous êtes connecté avec votre login (celui du compte developer.paypal).

Créer le compte vendeur, de test.

Nous allons commencer par créer le compte vendeur. Cliquez sur « ouvrez un compte » Sélectionnez votre langue et votre pays, puis cliquez sur « compte business ». Vous aurez ensuite un formulaire à compléter, vous demandant d'entrer des informations concernant votre société. Remplissez-le avec des informations fictives (mais cohérentes cela vous permettra de ne pas vous mélanger entre vos comptes acheteur et vendeur).

Il faudra ensuite compléter le formulaire concernant le compte Paypal du vendeur. Indiquez une adresse email (je vous conseille une adresse simple à retenir et indiquant bien que c'est le login du compte vendeur par exemple vendeur@domaine.com ) ainsi qu'un mot de passe. Terminez de compléter le formulaire et validez.

Vous verrez s'afficher une page vous indiquant qu'un email comportant un lien de validation vous a été envoyé. Inutile de vous précipiter sur votre boîte mail (surtout que vous n'avez pas forcément dû indiquer une adresse mail vous appartenant). Il faut retourner sur le « Paypal developer central » ( https://developer.paypal.com ) se connecter et cliquer sur « test Email ». Vous verrez apparaître le mail de confirmation envoyé par paypal ouvrez-le et copiez collez l'url indiquée dans votre navigateur. Entrez le mot de passe du compte vendeur et voilà vous venez de créer votre compte vendeur, de test.

Créer le compte acheteur, de test.

La démarche est la même que précédemment à part qu'il faut choisir un compte personnel. Je rappelle qu'il est intéressant d'indiquer comme email une adresse éloquente du type « acheteur@domaine.com »

Enregistrer une carte bancaire fictive

Connectez-vous à votre compte acheteur et cliquez sur « enregistrer une carte bancaire ». Un formulaire pré-rempli s'affichera, si le type de carte n'est pas indiqué choisissez « visa » et modifiez la date d'expiration pour qu'elle ne soit pas déjà dépassée, puis cliquez sur enregistrer.

Réglage du compte vendeur.

Nous allons ici, modifier quelques réglages du compte vendeur afin d'améliorer le confort et la sécurité tant des acheteurs que du vendeur.

Connectez-vous à votre compte vendeur , puis rendez-vous sur l'onglet « mon compte » ⇒ « préférences ». Cliquez sur « Préférences de réception de paiements » , dans la page qui s'affiche vérifiez que le bouton radio « Oui, bloquer les paiements multiples pour un numéro de demande de paiement unique » est bien coché, sinon cochez-le. Cette option permet d'éviter à vos clients de payer deux fois une facture à cause d'une mauvaise manipulation de leur part.

Retournez dans l'onglet « préférences » mais cette fois cliquez sur « préférences de réception de paiements sur le site ». Pour les options, « bloquer les paiements sur site marchand non cryptés » et « compte Paypal facultatif », cochez la case oui. La première option aura pour effet de refuser les paiements provenant de boutons Paypal non cryptés, ce qui vous protégera contre les fraudes. La seconde donnera la possibilité aux acheteurs d'utiliser soit leur compte Paypal soit leur carte bleue pour payer.

Voilà, vous avez désormais un compte acheteur capable de simuler des paiements en ligne et un compte vendeur capable de les recevoir.

Les certificats SSL.

Pour empêcher les personnes mal intentionnées de modifier les valeurs de vos commandes (et notamment le prix) il est nécessaire de crypter votre bouton « acheter maintenant ». Je vous passe les explications concernant le fonctionnement des clef ou des certificats, sachez simplement qu'il s'agit d'un système de cryptographie asymétrique. Vous trouverez plus d'explications sur wikipédia.

Créer votre clé privée et votre certificat public.

Paypal n'accepte que les certificats publics de type X.509. Pour créer votre clef et votre certificat, vous avez la possibilité d'utiliser OpenSSL ou d'aller sur ce site qui vous les fournira en quelques instants, en vous proposant de remplir un formulaire (évitez de donner la même adresse email que celle de votre compte vendeur pour ne pas prendre de risque).

Envoyer votre certificat à Paypal et récupérer le leur.

Une fois votre clef privée et votre certificat public récupérés, connectez-vous à votre compte vendeur. Aller dans « mon compte » ⇒ « préférences » ⇒ « Certificats de paiements sur site marchand ». Cette page vous montre les différents certificats publics que vous avez déjà envoyés à Paypal (pour l'instant à priori il n'y en a aucun). Cliquez sur « ajouter » puis sélectionnez votre certificat public (attention ! ne pas confondre avec la clef privée) et envoyez-le. Une fois l'upload terminé, Paypal vous affichera un ID de certificat correspondant au fichier que vous venez d'envoyer, notez-le quelque part nous en aurons besoin par la suite.

Toujours sur la même page vous verrez un bouton « télécharger », cliquez dessus pour récupérer le certificat public de Paypal.

Création du bouton crypté Paypal « payer maintenant ».

php
<?php
#Scrypt traduit et modifie par maniT4c
#Retrouvez le scrypt d'origine sur http://www.stellarwebsolutions.com/en/articles/paypal_button_encryption_php.php
 
#Defini le chemin de la racine pour OpenSSL
putenv("HOME=~");
 
# chemin vers la clef privee
$MY_KEY_FILE = "/mon_chemin/ma_clef.pem";
 
# chemin vers le certificat public
$MY_CERT_FILE = "/mon_chemin/mon_certificat.pem";
 
# chemin vers le certificat public de paypal
$PAYPAL_CERT_FILE = "/mon_chemin/paypal_cert_pem.txt";
 
# chemin vers openssl sur votre serveur
# pensez a verifier que openssl est active sur votre serveur avec la commande phpinfo()
$OPENSSL = "/usr/bin/openssl";
 
$form = array('cmd' => '_xclick',//indique a paypal qu'il s'agit d'un bouton payer maintenant
		'business' => 'vendeur@domaine.com',//adresse du vendeur (qui doit recevoir le paiement)
		'item_name' => '5 kilo de mandarine',  //nom de la commande
		'item_number' => '1', //numero de la commande
		'currency_code' => 'EUR', //Devise
		'amount' => '10', //montant a payer
		'lc' => 'FR', //langue de l'interface paypal
        'cert_id' => '72B3ENUM3MZGC', //identifiant de certificat donné par paypal
        'custom' => 'mes valeurs utiles pour le traitement',//variable permettant de recevoir diverses informations sur la page de retour
        'invoice' => '1',//valeur unique empechant les paiements accidentels (doit être differente pour chaque paiement)
        'charset' => 'utf-8',//Definit le charset utilisez
        'no_shipping' => '1', //Le client n'est pas invite a rentrer son adresse
        'cpp_header_image' => 'http://www.domaine.com/logo.jpg',//Adresse de l'image se trouvant en haut de la page de paiement (750x90px maxi) dans l'ideal cette image soit se trouver sur un serveur securisé pour eviter d'avoir un message indiquant que certaine parti de la page ne sont pas écurisée.
		'return' => 'http://www.domaine.com/boutique.php',//Adresse de retour lorsque l'utilisateur clique sur retouner a la boutique
		'cancel_return' => 'html://www.domaine.com/anul.php',//Adresse de retour pour les annulations
		'no_note' => '1',//Empeche l'utilisateur de rajouter des commentaires a son paiement.
		'notify_url' => 'http://www.manit4c.com/global/panier/ipn.php'//Url appelee par paypal lors du paiement, cette page permettra le traitement des commandes payees.
	);
	//on enregistre le formulaire crypte dans une variable
	$encrypted = paypal_encrypt($form);
 
//Cette fonction encrypte le formulaire il n'est pas necessaire de comprendre son fonctionnement
function paypal_encrypt($hash){
 
	global $MY_KEY_FILE;
	global $MY_CERT_FILE;
	global $PAYPAL_CERT_FILE;
	global $OPENSSL;
 
	if (!file_exists($MY_KEY_FILE)) {
		echo "ERROR: MY_KEY_FILE $MY_KEY_FILE not found\n";
	}
	if (!file_exists($MY_CERT_FILE)) {
		echo "ERROR: MY_CERT_FILE $MY_CERT_FILE not found\n";
	}
	if (!file_exists($PAYPAL_CERT_FILE)) {
		echo "ERROR: PAYPAL_CERT_FILE $PAYPAL_CERT_FILE not found\n";
	}
	if (!file_exists($OPENSSL)) {
		echo "ERROR: OPENSSL $OPENSSL not found\n";
	}
 
	//Assign Build Notation for PayPal Support
	$hash['bn']= 'StellarWebSolutions.PHP_EWP';
 
	$openssl_cmd = "$OPENSSL smime -sign -signer $MY_CERT_FILE -inkey $MY_KEY_FILE " .
                "-outform der -nodetach -binary | $OPENSSL smime -encrypt " .
                "-des3 -binary -outform pem $PAYPAL_CERT_FILE";
 
	$descriptors = array(
        	0 => array("pipe", "r"),
		1 => array("pipe", "w"),
	);
 
	$process = proc_open($openssl_cmd, $descriptors, $pipes);
 
	if (is_resource($process)) {
		foreach ($hash as $key => $value) {
			if ($value != "") {
				//echo "Adding to blob: $key=$value\n<br />";
				fwrite($pipes[0], "$key=$value\n");
			}
		}
		fflush($pipes[0]);
        	fclose($pipes[0]);
 
		$output = "";
		while (!feof($pipes[1])) {
			$output .= fgets($pipes[1]);
		}
		//echo "outpout=".$output;
		fclose($pipes[1]); 
		$return_value = proc_close($process);
		return $output;
	}
	return "ERROR";
};
?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
<head>
  <title>Paiement Paypal</title>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <meta http-equiv="Content-Language" content="fr" />
</head>
<body>
<!-- l'attribut action du formulaire doit rediriger vers www.sandbox.paypal.com pour la phase de test et vers www.paypal.com pour le réel -->
<form target="paypal" action="https://www.sandbox.paypal.com/fr/cgi-bin/webscr" method="post">
<input type="hidden" name="cmd" value="_s-xclick">
<!-- on affiche le formulaire crypté -->
<input type="hidden" name="encrypted" value="
<?php echo $encrypted; ?>">
<!-- Indique la source de l'image du bouton payer maintenant -->
<input type="image" src="http://images.paypal.com/images/x-click-but01.gif"
name="submit" alt="Effectuez vos paiements via PayPal : une solution rapide, gratuite
et sécurisée">
</form>
</body>
</html>

Création de la page de réception des données (IPN).

php
<?php
//email pour prévenir le vendeur
$mailTo="Moi <votreemail@domaine.com>";
 
//permet de traiter le retour ipn de paypal
// lire la publication du système PayPal et ajouter 'cmd'
$req = 'cmd=_notify-validate';
 
foreach ($_POST as $key => $value) {
$value = urlencode(stripslashes($value));
$req .= "&$key=$value";
}
 
// renvoyer au système PayPal pour validation
$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";
 
//www.sandbox.paypal.com pour la phase de test
//www.paypal.com pour la phase réel.
$fp = fsockopen ('www.sandbox.paypal.com', 80, $errno, $errstr, 30);
 
// affecter les variables publiées aux variables locales
$item_name = $_POST['item_name'];
$item_number = $_POST['item_number'];
$payment_status = $_POST['payment_status'];
$payment_amount = $_POST['mc_gross'];
$payment_currency = $_POST['mc_currency'];
$txn_id = $_POST['txn_id'];
$receiver_email = $_POST['receiver_email'];
$payer_email = $_POST['payer_email'];
 
$headerMail= "Content-Type:text/html;charset=iso-8859-1\n";//permet d'envoyer les message au format html
$headerMail.= "Content-Transfer-Encoding: 8bit\n";//permet d'envoyer les message au format html
$headerMail.="From: me";//pour répondre au message
 
//on prépare le texte de l'email
$textMail="
	<strong>Détail de la commande</strong><br />
	Commande numéro:".$item_number."<br />
	prix: ".$payment_amount." &euro;
";
 
if (!$fp) {
// ERREUR HTTP
} 
else {
	fputs ($fp, $header . $req);
	while (!feof($fp)) {
		$res = fgets ($fp, 1024);
		if (strcmp ($res, "VERIFIED") == 0) {
                        //on envoi un email pour prévenir qu'une commande a ete passee
			mail($mailTo,"Une nouvelle commande à été réglée",$textMail,$headerMail);
 
                        // C'est ici que vous devrez traiter la commande (enregistrement bdd etc..)
			// vérifier que payment_status est Terminé
			// vérifier que txn_id n'a pas été précédemment traité
			// vérifier que receiver_email est votre adresse email PayPal principale
			// vérifier que payment_amount et payment_currency sont corrects
			// traiter le paiement			
		}
		else if (strcmp ($res, "INVALIDE") == 0) {
			// consigner pour étude manuelle
		}
	}
	fclose ($fp);
}
?>

Test

Il ne vous reste plus qu'à afficher la page contenant le bouton Paypal, effectuer un paiement, et consulter votre messagerie pour voir si vous avez bien reçus l'email. Une foi que votre système sera totalement opérationnel il suffira de refaire la même chose mais cette foi en mode réel. Bon courage.

Ouvrir un compte paypal

Ouvrez un compte PayPal et acceptez dès aujourd'hui les paiements en ligne.

Générer rapidement des numéro de carte bancaire

La sandbox paypal a la facheuse tendance à ramer et à ne pas toujours vous générer automatiquement un numéro de carte bancaire. Voici une solution pour pallier à ce problème. Il suffit de créer une page html et à y copier le code suivant.

html4strict
<html>
<!--
générateur de numéros de cartes Visa à 16 chiffres
 
basé sur un code GPL de Graham King :
http://www.darkcoding.net/projects/credit-card-generator/
-->
<head>
<script type="text/javascript">
var visaPrefixList = new Array
( 
  "4539",
  "4556",
  "4916",
  "4532",
  "4929",
  "40240071",
  "4485",
  "4716",
  "4" 
);
 
function strrev(str)
{
  if (!str) return '';
  var revstr='';
  for (i = str.length-1; i>=0; i--)
    revstr+=str.charAt(i)
  return revstr;
}
 
function completed_number(prefix)
{
  var ccnumber = prefix;
 
  // generate digits
  while ( ccnumber.length < 15 )
    ccnumber += Math.floor(Math.random()*10);
 
  // reverse number and convert to int 
 
  var reversedCCnumberString = strrev( ccnumber );
 
  var reversedCCnumber = new Array();
 
  for ( var i=0; i < reversedCCnumberString.length; i++ )
    reversedCCnumber[i] = parseInt( reversedCCnumberString.charAt(i) );   
 
  // calculate sum    
 
  var sum = 0;
  var pos = 0;
 
  while ( pos < 15 )
  {
    odd = reversedCCnumber[ pos ] * 2;
 
    if ( odd > 9 )
      odd -= 9;
 
    sum += odd;
 
    if ( pos != 14 )
      sum += reversedCCnumber[ pos +1 ];
 
    pos += 2;
  }
 
  // calculate check digit
 
  var checkdigit = (( Math.floor(sum/10) + 1) * 10 - sum) % 10;
  ccnumber += checkdigit;
 
  return ccnumber;
}
 
function credit_card_number (prefixList)
{
  var randomArrayIndex = Math.floor (Math.random() * prefixList.length); 
  var randomPrefix = prefixList[ randomArrayIndex ];
 
  return completed_number (randomPrefix);
}
 
</script>
</head>
<body>
 
<h3>35 pseudo-cartes VISA :</h3>
 
<script type="text/javascript">
 
for (var n = 0; n < 35; n++)
{
  var visa = credit_card_number (visaPrefixList); 
  document.write ( visa + '<br/>');
}
 
document.write ( '<br/><h3>faire \'reload\' ...</h3><br/>');
 
</script>
 
</body>
</html>

Il vous suffira ensuite d'ouvrir cette page en local puis de copier l'un des code de CB proposez et de le coller dans le formulaire de paiement. PEnsez à rentrer une date d'expiration dans le futur et à mettre 000 comme cryptogramme visuel. Ps: j'ai trouvé ca sur le forum de paypal merci à l'auteur dont je n'ai plus le nom (dsl). Ps2: utilisez ces codes pour autre choses que la sandbox paypal ne vous ménera pas bien loin à part peut être en prison :)

Je viens de voir que IE6 n'aimait pas les commentaire dans le formulaire qui créé le bouton paypal. Donc je vous conseille de les supprimer sinon paypal risque de vous dire qu'il y à une erreur.