Integracja PayPal Payment Gateway w PHP za pomocą PayPal REST API
PayPal to jedna z najbardziej zaufanych bramek płatniczych w Internecie. Jest szeroko stosowany na stronach internetowych do przyjmowania płatności online. Jednak dokumentacja API PayPal nie jest łatwa do zrozumienia. Dla programisty, który zamierza zintegrować bramkę płatności PayPal po raz pierwszy, odniesienie sukcesu zajmie wiele godzin. Spędziłem szaloną ilość godzin czytając dokumentację API PayPal. A później zdaj sobie sprawę, że nie ma potrzeby szczegółowego czytania dokumentacji Paypal, aby ją zintegrować.
W tym artykule dowiemy się, jak zintegrować bramkę płatności PayPal za pomocą PayPal REST API. Będziemy korzystać z biblioteki GitHub dostarczonej przez Omnipay. Omnipay zapewnia czysty i łatwy sposób na integrację różnych bramek płatności w Twojej aplikacji internetowej. Ich struktura kodu jest również przejrzysta i wydajna. Deweloperzy to pokochają.
Uzyskaj identyfikator klienta PayPal i tajny klucz klienta
Aby zintegrować PayPal z witryną, musisz najpierw utworzyć aplikację REST API na koncie programisty PayPal. Po utworzeniu aplikacji otrzymasz identyfikator klienta i tajny klucz klienta, które będą wymagane w kolejnych krokach.
Aby stworzyć aplikację REST API, przejdź do swojego konta programisty PayPal i zaloguj się do pulpitu nawigacyjnego.
W panelu programisty kliknij menu „Moje aplikacje i poświadczenia". Kliknij przycisk „Utwórz aplikację” w sekcji Aplikacje REST API.
W następnym kroku wypełnij nazwę aplikacji, a otrzymasz swój identyfikator klienta i klucz klienta. W moim przypadku na poniższym zrzucie ekranu widzę poświadczenia piaskownicy. W twoim przypadku mogą to być dane uwierzytelniające na żywo. Możesz też spróbować z poświadczeniami piaskownicy.
Instalacja biblioteki i konfiguracja podstawowa
Jak już wspomniałem, do integracji PayPal REST API użyjemy Omnipay. Musimy najpierw zainstalować ich biblioteki za pomocą Composera. Uruchom poniższe polecenie, aby zainstalować biblioteki.
composer require league/omnipay omnipay/paypal
Po zainstalowaniu biblioteki utwórz plik konfiguracyjny, w którym przechowujemy nasze poświadczenia API, zapisujemy połączenie DB i inicjujemy bramę.
config.php
<?php
require_once "vendor/autoload.php";
use OmnipayOmnipay;
define('CLIENT_ID', 'PAYPAL_CLIENT_ID_HERE');
define('CLIENT_SECRET', 'PAYPAL_CLIENT_SECRET_HERE');
define('PAYPAL_RETURN_URL', 'YOUR_SITE_URL/success.php');
define('PAYPAL_CANCEL_URL', 'YOUR_SITE_URL/cancel.php');
define('PAYPAL_CURRENCY', 'USD'); // set your currency here
// Connect with the database
$db = new mysqli('localhost', 'MYSQL_DB_USERNAME', 'MYSQL_DB_PASSWORD', 'MYSQL_DB_NAME');
if ($db->connect_errno) {
die("Connect failed: ". $db->connect_error);
}
$gateway = Omnipay::create('PayPal_Rest');
$gateway->setClientId(CLIENT_ID);
$gateway->setSecret(CLIENT_SECRET);
$gateway->setTestMode(true); //set it to 'false' when go live
Tutaj przekazałem parametr ‘Paypal_Rest’ do metody tworzenia Omnipay. Omnipay w tle wywołuje PayPal REST API podczas dokonywania płatności za jego pośrednictwem.
Następnie utwórz prosty formularz, w którym użytkownik może wprowadzić kwotę. Dla celów demonstracyjnych zachowuję tylko jedno pole w formularzu. Możesz rozszerzyć formularz zgodnie z wymaganiami.
formularz.html
<form action="charge.php" method="post">
<input type="text" name="amount" value="20.00" />
<input type="submit" name="submit" value="Pay Now">
</form>
Po zakończeniu płatności powinniśmy zapisać szczegóły transakcji w tabeli bazy danych. Utwórz tabelę bazy danych, uruchamiając poniższe zapytanie SQL.
CREATE TABLE `payments` ( `id` int(11) NOT NULL AUTO_INCREMENT,
`payment_id` varchar(255) NOT NULL,
`payer_id` varchar(255) NOT NULL,
`payer_email` varchar(255) NOT NULL,
`amount` float(10,2) NOT NULL,
`currency` varchar(255) NOT NULL,
`payment_status` varchar(255) NOT NULL,
PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Ta tabela nie zawiera klucza obcego, ponieważ służy tylko do celów demonstracyjnych. Użytkownik może dodać kolumnę user_id w tej tabeli, aby odnieść się do płatności z użytkownikiem.
Integracja PayPal Payment Gateway w PHP za pomocą PayPal REST API
Korzystając z PayPal REST API, użytkownik przekieruje do PayPal, aby dokończyć płatność. Po dokonaniu płatności użytkownik przekieruje z powrotem do naszej aplikacji na podstawie statusu sukcesu lub niepowodzenia. Zdefiniowaliśmy te adresy URL w config.php
powyższym pliku.
Gdy użytkownik przekieruje z powrotem do naszej aplikacji z odpowiedzią powodzenia, musimy wykonać płatność w naszym pliku PHP, co jest success.php
w naszym przypadku. Przechowujemy również informacje o płatności po wykonaniu płatności za pomocą PayPal REST API. Więc nasz kod będzie wyglądał następująco.
opłata.php
<?php
require_once 'config.php';
if (isset($_POST['submit'])) {
try {
$response = $gateway->purchase(array(
'amount' => $_POST['amount'],
'currency' => PAYPAL_CURRENCY,
'returnUrl' => PAYPAL_RETURN_URL,
'cancelUrl' => PAYPAL_CANCEL_URL,
))->send();
if ($response->isRedirect()) {
$response->redirect(); // this will automatically forward the customer
} else {
// not successful
echo $response->getMessage();
}
} catch(Exception $e) {
echo $e->getMessage();
}
}
sukces.php
<?php
require_once 'config.php';
// Once the transaction has been approved, we need to complete it.
if (array_key_exists('paymentId', $_GET) && array_key_exists('PayerID', $_GET)) {
$transaction = $gateway->completePurchase(array(
'payer_id' => $_GET['PayerID'],
'transactionReference' => $_GET['paymentId'],
));
$response = $transaction->send();
if ($response->isSuccessful()) {
// The customer has successfully paid.
$arr_body = $response->getData();
$payment_id = $arr_body['id'];
$payer_id = $arr_body['payer']['payer_info']['payer_id'];
$payer_email = $arr_body['payer']['payer_info']['email'];
$amount = $arr_body['transactions'][0]['amount']['total'];
$currency = PAYPAL_CURRENCY;
$payment_status = $arr_body['state'];
// Insert transaction data into the database
$isPaymentExist = $db->query("SELECT * FROM payments WHERE payment_id = '".$payment_id."'");
if($isPaymentExist->num_rows == 0) {
$insert = $db->query("INSERT INTO payments(payment_id, payer_id, payer_email, amount, currency, payment_status) VALUES('". $payment_id ."', '". $payer_id ."', '". $payer_email ."', '". $amount ."', '". $currency ."', '". $payment_status ."')");
}
echo "Payment is successful. Your transaction id is: ". $payment_id;
} else {
echo $response->getMessage();
}
} else {
echo 'Transaction is declined';
}
anuluj.php
<h3>User is canceled the payment.</h3>
Wyślij informacje o produkcie do PayPal
W powyższym kodzie wysyłamy kwotę do zapłaty na PayPal. Możesz również wysłać informacje o produkcie. Twoi klienci mogą zobaczyć te szczegóły produktu na stronie płatności przed dokonaniem płatności.
Aby wysłać informacje o produkcie, musisz przekazać tablicę ‘items’ do purchase
metody w następujący sposób.
$response = $gateway->purchase(array(
'amount' => $_POST['amount'],
'items' => array(
array(
'name' => 'Course Subscription',
'price' => $_POST['amount'],
'description' => 'Get access to premium courses.',
'quantity' => 1
),
),
'currency' => PAYPAL_CURRENCY,
'returnUrl' => PAYPAL_RETURN_URL,
'cancelUrl' => PAYPAL_CANCEL_URL,
))->send();
Tutaj przekazałem dane produktu statycznie. Powinieneś nadać mu dynamikę w zależności od produktu.
Mam nadzieję, że wiesz już o integracji PayPal Payment Gateway w PHP. Chciałbym usłyszeć Twoje przemyślenia lub sugestie w sekcji komentarzy poniżej.
Powiązane artykuły
- Akceptuj płatności kartą kredytową za pomocą PayPal Payments Pro w PHP
- Akceptuj płatności kartą kredytową za pomocą bramki płatności Authorize.net w PHP
- Przewodnik po integracji Stripe w witrynie z PHP