Comment intégrer PayPal avec PHP et MySQL

 



Dans ce didacticiel, nous allons intégrer PayPal dans notre système de panier d'achat existant, nous allons créer la passerelle de paiement avec PHP et stocker les transactions PayPal dans notre base de données MySQL.

Je vous recommande de suivre le didacticiel du système de panier d'achat , car nous l'utiliserons dans ce didacticiel.

PayPal est l'une des passerelles de paiement les plus populaires pour les achats en ligne, alors pourquoi ne pas l'utiliser ? Vous pouvez désormais effectuer des paiements sécurisés par carte de débit et de crédit sans créer de compte PayPal.

L'intégration vous permettra de payer avec plusieurs produits avec PayPal, pour que cela fonctionne correctement, vous aurez besoin d'une adresse distante (URL).

Contenu

  1. Commencer
  2. Création de la base de données et configuration des tables
  3. Intégration de PayPal avec PHP
  4. Création de l'IPN PayPal (Instant Payment Notification)

1. Mise en route

Si vous avez suivi le didacticiel sur le système de panier d'achat, vous n'aurez aucun problème à configurer la base de données MySQL et l'environnement du serveur, mais si ce n'est pas le cas, vous devez :

  • Installez un environnement de serveur Web, je recommande XAMPP .
  • Si vous avez votre propre serveur Web, vous devez installer PHP, Apache, MySQL, cURL et phpMyAdmin.
  • Assurez-vous que l'extension PHP cURL est activée, car elle sera utilisée pour l'IPN PayPal.

2. Création de la base de données et configuration des tables

Maintenant, nous devons créer la base de données et créer la table des transactions que nous allons utiliser, nous pouvons le faire avec phpMyAdmin.

Accédez à phpMyAdmin (par exemple http://localhost/phpmyadmin/) dans votre navigateur, si vous avez déjà la base de données "shoppingcart", vous pouvez simplement continuer et cliquer dessus, mais si ce n'est pas le cas, vous devez :

  • Cliquez sur l' onglet Bases de données en haut
  • Sous Créer une base de données , saisissez panier dans la zone de texte
  • Sélectionnez utf8_general_ci comme classement (UTF-8 est l'encodage par défaut dans HTML5)
  • Cliquez sur Créer

Lorsque la base de données est sélectionnée, cliquez sur l'onglet SQL et exécutez l'instruction suivante :

SQLCopie
CREATE TABLE `transactions` (
	`id` int(11) NOT NULL AUTO_INCREMENT,
	`txn_id` varchar(255) NOT NULL,
	`payment_amount` decimal(7,2) NOT NULL,
	`payment_status` varchar(30) NOT NULL,
	`item_id` varchar(255) NOT NULL,
	`item_quantity` varchar(255) NOT NULL,
	`item_mc_gross` varchar(255) NOT NULL,
	`created` datetime NOT NULL,
	`payer_email` varchar(255) NOT NULL,
	`first_name` varchar(100) NOT NULL,
	`last_name` varchar(100) NOT NULL DEFAULT '',
	`address_street` varchar(255) NOT NULL,
	`address_city` varchar(255) NOT NULL,
	`address_state` varchar(255) NOT NULL,
	`address_zip` varchar(255) NOT NULL,
	`address_country` varchar(255) NOT NULL,
	PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

ALTER TABLE `transactions` ADD UNIQUE KEY `txn_id` (`txn_id`);

Cela créera la table des transactions avec les colonnes suivantes :

  • id — L'identifiant unique de la transaction.
  • txn_id — L'identifiant de la transaction PayPal.
  • payment_amount — Le montant total pour tous les produits.
  • payment_status — Le statut du paiement, il sera mis à jour via l'IPN de PayPal.
  • item_id — L'ID du produit, s'il y a plusieurs éléments, ce sera une liste séparée par des virgules.
  • item_quantity — La quantité de produit, s'il y a plusieurs articles, ce sera une liste séparée par des virgules.
  • item_mc_gross — Le montant total de chaque produit (liste séparée par des virgules).
  • créé — La date à laquelle l'achat a été créé.
  • payeur_email — L'e-mail du client.
  • first_name — Le prénom du client.
  • last_name — Le nom de famille du client.
  • address_street — La rue du client.
  • address_city — La ville du client.
  • address_state — L'état du client.
  • address_zip — Le code postal/postal du client.
  • address_country — Le pays du client.

Sur phpMyAdmin, cela devrait ressembler à :

http://localhost/phpmyadmin/
Tableau des transactions du panier d'achat MySQL

3. Intégration de PayPal avec PHP

Maintenant que nous avons configuré notre base de données et nos tables, nous pouvons commencer à implémenter PayPal dans notre système de panier d'achat.

Si vous avez suivi le système de panier d'achat, vous pouvez continuer et modifier le fichier cart.php , sinon vous pouvez ajouter le code à votre page de panier.

Modifiez cart.php et trouvez :

HTMLCopie
<div class="buttons">
    <input type="submit" value="Update" name="update">
    <input type="submit" value="Place Order" name="placeorder">
</div>

Ajouter après :

HTMLCopie
<div class="paypal">
    <button type="submit" name="paypal"><img src="https://www.paypalobjects.com/webstatic/mktg/Logo/pp-logo-100px.png" border="0" alt="PayPal Logo"></button>
</div>

Ajoutez le CSS à votre fichier de feuille de style (style.css) :

CSSCopie
.paypal {
	text-align: right;
	padding-bottom: 40px;
}
.paypal button {
	display: inline-block;
	padding: 10px 20px 7px 20px;
	background-color: #FFC439;
	border-radius: 5px;
	border: none;
	cursor: pointer;
	width: 215px;
}
.paypal button:hover {
	background-color: #f3bb37;
}

Cela créera le bouton PayPal que nous utiliserons pour effectuer des paiements sur notre page de panier, il devrait ressembler à ceci (le bouton jaune) :

http://localhost/shoppingcart/index.php?page=cart
Bouton PayPal du panier d'achat

Si vous utilisez votre propre système de panier, vous devrez inclure le formulaire :

HTMLCopie
<form action="your php cart file" method="post">
	<div class="paypal">
		<button type="submit" name="paypal"><img src="https://www.paypalobjects.com/webstatic/mktg/Logo/pp-logo-100px.png" border="0" alt="PayPal Logo"></button>
	</div>
</form>

Nous devons maintenant ajouter le code PHP qui validera et redirigera vers PayPal.

Avant la balise de fermeture PHP dans cart.php, ajoutez :

PHPCopie
// For testing purposes set this to true, if set to true it will use paypal sandbox
$testmode = true;
$paypalurl = $testmode ? 'https://www.sandbox.paypal.com/cgi-bin/webscr' : 'https://www.paypal.com/cgi-bin/webscr';
// If the user clicks the PayPal checkout button...
if (isset($_POST['paypal']) && $products_in_cart && !empty($products_in_cart)) {
    // Variables we need to pass to paypal
    // Make sure you have a business account and set the "business" variable to your paypal business account email
    $data = array(
        'cmd'			=> '_cart',
        'upload'        => '1',
        'lc'			=> 'EN',
        'business' 		=> 'payments@yourwebsite.com',
        'cancel_return'	=> 'https://yourwebsite.com/index.php?page=cart',
        'notify_url'	=> 'https://yourwebsite.com/index.php?page=cart&ipn_listener=paypal',
        'currency_code'	=> 'USD',
        'return'        => 'https://yourwebsite.com/index.php?page=placeorder'
    );
    // Add all the products that are in the shopping cart to the data array variable
    for ($i = 0; $i < count($products); $i++) {
        $data['item_number_' . ($i+1)] = $products[$i]['id'];
        $data['item_name_' . ($i+1)] = $products[$i]['name'];
        $data['quantity_' . ($i+1)] = $products_in_cart[$products[$i]['id']];
        $data['amount_' . ($i+1)] = $products[$i]['price'];
    }
    // Send the user to the paypal checkout screen
    header('location:' . $paypalurl . '?' . http_build_query($data));
    // End the script don't need to execute anything else
    exit;
}

Le code ci-dessus s'exécutera si l'utilisateur clique sur le bouton PayPal (requête POST), assurez-vous de mettre à jour les variables dans le$donnéestableau de variables, remplacez "votredomaine.com" par votre propre nom de domaine, si vous voulez changer la devise, vous devrez changer la valeur "currency_code".

Si vous souhaitez ajouter d'autres variables de données, vous pouvez consulter la liste ici .

Vous devrez également créer un compte professionnel sur PayPal, vous pouvez en créer un sur leur site Web , vous pouvez également créer un compte sur leur site Web sandbox que vous pourrez utiliser à des fins de test.

Si vous n'avez pas suivi le didacticiel du système de panier d'achat, vous devrez créer le$products_in_cart et le $produits variables, elles doivent contenir des données au format suivant :

PHPCopie
// Below the key is the product ID and the value is the quantity
$products_in_cart = array(
	1 => 2, // Product with the ID 1 has a quantity of 2
	2 => 2
);
// Products should look like the following, you can execute a SQL query to get products from your database
$products = array(
	array(
		'id' => 1, 
		'name' => 'Smart Watch',
		'price' => 15.00
	),
	array(
		'id' => 2,
		'name' => 'Headphones',
		'price' => 10.00
	)	
);

Si tout est vérifié, l'utilisateur sera redirigé vers PayPal, mais uniquement s'il y a des produits dans son panier.

4. Création de l'écouteur PayPal IPN (Instant Payment Notification)

L'écouteur de notification de paiement instantané insérera/mettra à jour les transactions dans notre base de données, chaque fois qu'un utilisateur effectuera un achat, PayPal en informera notre fichier PHP, puis notre code PHP validera la transaction, puis insérera/mettra à jour une transaction dans notre base de données MySQL .

Ajoutez après le code PHP que nous avons ajouté précédemment :

PHPCopie
// Below is the listener for paypal, make sure to set the IPN URL (e.g. http://example.com/cart.php?ipn_listener=paypal) in your paypal account, this will not work on a local server
if (isset($_GET['ipn_listener']) && $_GET['ipn_listener'] == 'paypal') {
    // Get all input variables and convert them all to URL string variables
    $raw_post_data = file_get_contents('php://input');
    $raw_post_array = explode('&', $raw_post_data);
    $myPost = array();
    foreach ($raw_post_array as $keyval) {
        $keyval = explode ('=', $keyval);
        if (count($keyval) == 2) $myPost[$keyval[0]] = urldecode($keyval[1]);
    }
    $req = 'cmd=_notify-validate';
    $get_magic_quotes_exists = function_exists('get_magic_quotes_gpc') ? true : false;
    foreach ($myPost as $key => $value) {
        if ($get_magic_quotes_exists == true && get_magic_quotes_gpc() == 1) {
            $value = urlencode(stripslashes($value));
        } else {
            $value = urlencode($value);
        }
        $req .= "&$key=$value";
    }
    // Below will verify the transaction, it will make sure the input data is correct
    $ch = curl_init($paypalurl);
    curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $req);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
    curl_setopt($ch, CURLOPT_FORBID_REUSE, 1);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Connection: Close'));
    $res = curl_exec($ch);
    curl_close($ch);
    if (strcmp($res, 'VERIFIED') == 0) {
        // Transaction is verified and successful...
        $item_id = array();
        $item_quantity = array();
        $item_mc_gross = array();
        // Add all the item numbers, quantities and prices to the above array variables
        for ($i = 1; $i < ($_POST['num_cart_items']+1); $i++) {
            array_push($item_id, $_POST['item_number' . $i]);
            array_push($item_quantity, $_POST['quantity' . $i]);
            array_push($item_mc_gross, $_POST['mc_gross_' . $i]);
        }
        // Insert the transaction into our transactions table, as the payment status changes the query will execute again and update it, make sure the "txn_id" column is unique
        $stmt = $pdo->prepare('INSERT INTO transactions VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) ON DUPLICATE KEY UPDATE payment_status = VALUES(payment_status)');
        $stmt->execute([
            NULL,
            $_POST['txn_id'],
            $_POST['mc_gross'],
            $_POST['payment_status'],
            implode(',', $item_id),
            implode(',', $item_quantity),
            implode(',', $item_mc_gross),
            date('Y-m-d H:i:s'),
            $_POST['payer_email'],
            $_POST['first_name'],
            $_POST['last_name'],
            $_POST['address_street'],
            $_POST['address_city'],
            $_POST['address_state'],
            $_POST['address_zip'],
            $_POST['address_country']
        ]);
    }
    exit;
}

Fondamentalement, ce qui se passe ici, c'est que chaque fois que le statut de la transaction PayPal change, le code ci-dessus s'exécute, mais pour que cela fonctionne correctement, nous devons ajouter l'URL IPN à notre compte professionnel PayPal, suivez ces instructions :

  • Accédez au site PayPal et connectez-vous à votre compte professionnel
  • Allez dans Paramètres
  • Cliquez sur Notifications
  • À côté de Notifications de paiement instantanées, cliquez sur Mettre à jour
  • Changez l'URL en : https://votresiteweb.com/index.php?page=cart&ipn_listener=paypal
  • Assurez-vous de changer yourwebsite.com en votre propre site Web, localhost ne fonctionnera pas, vous avez besoin d'une adresse distante.
  • Enregistrez les paramètres et activez-le.

Je vous recommande de l'essayer d'abord sur le site Web du bac à sable PayPal pour vous assurer qu'il fonctionne correctement pour vous, le site Web du bac à sable est utilisé pour tester les paiements.

La requête curl dans l'extrait ci-dessus vérifiera la transaction, nous ne voulons pas que quiconque essaie de modifier ces valeurs POST, la validation est donc indispensable.

Si vous utilisez votre propre système de panier d'achat, vous devrez modifier l'URL IPN et vous assurer de vous connecter à la base de données MySQL à l'aide de PDO.

Conclusion

C'est essentiellement tout ce que vous avez à faire pour intégrer PayPal à votre site Web, je vous recommande fortement de suivre le didacticiel du système de panier d'achat si vous ne l'avez pas déjà fait, il sera beaucoup plus facile à mettre en œuvre si vous le faites.

N'hésitez pas à partager l'article en cliquant sur les liens sociaux ci-dessous, cela nous aidera à créer de nouveaux tutoriels et à améliorer les actuels.

Profitez du codage !

Enregistrer un commentaire

Post a Comment (0)

Plus récente Plus ancienne