{"id":29707,"date":"2021-06-21T10:16:00","date_gmt":"2021-06-21T07:16:00","guid":{"rendered":"https:\/\/themewp.inform.click\/?p=29707"},"modified":"2021-10-18T03:30:41","modified_gmt":"2021-10-18T00:30:41","slug":"integracja-paypal-payment-gateway-w-php-za-pomoca-paypal-rest-api","status":"publish","type":"post","link":"https:\/\/themewp.inform.click\/pl\/integracja-paypal-payment-gateway-w-php-za-pomoca-paypal-rest-api\/","title":{"rendered":"Integracja PayPal Payment Gateway w PHP za pomoc\u0105 PayPal REST API"},"content":{"rendered":"<p>PayPal to jedna z najbardziej zaufanych bramek p\u0142atniczych w Internecie. Jest szeroko stosowany na stronach internetowych do przyjmowania p\u0142atno\u015bci online. Jednak dokumentacja API PayPal nie jest \u0142atwa do zrozumienia. Dla programisty, kt\u00f3ry zamierza zintegrowa\u0107 bramk\u0119 p\u0142atno\u015bci PayPal po raz pierwszy, odniesienie sukcesu zajmie wiele godzin. Sp\u0119dzi\u0142em szalon\u0105 ilo\u015b\u0107 godzin czytaj\u0105c dokumentacj\u0119 API PayPal. A p\u00f3\u017aniej zdaj sobie spraw\u0119, \u017ce nie ma potrzeby szczeg\u00f3\u0142owego czytania dokumentacji Paypal, aby j\u0105 zintegrowa\u0107.<\/p>\n<p>W tym artykule dowiemy si\u0119, jak zintegrowa\u0107 bramk\u0119 p\u0142atno\u015bci PayPal za pomoc\u0105 PayPal REST API. B\u0119dziemy korzysta\u0107 z biblioteki GitHub dostarczonej przez Omnipay. Omnipay zapewnia czysty i \u0142atwy spos\u00f3b na integracj\u0119 r\u00f3\u017cnych bramek p\u0142atno\u015bci w Twojej aplikacji internetowej. Ich struktura kodu jest r\u00f3wnie\u017c przejrzysta i wydajna. Deweloperzy to pokochaj\u0105.<\/p>\n<h3>Uzyskaj identyfikator klienta PayPal i tajny klucz klienta<\/h3>\n<p>Aby zintegrowa\u0107 PayPal z witryn\u0105, musisz najpierw utworzy\u0107 aplikacj\u0119 REST API na koncie programisty PayPal. Po utworzeniu aplikacji otrzymasz identyfikator klienta i tajny klucz klienta, kt\u00f3re b\u0119d\u0105 wymagane w kolejnych krokach.<\/p>\n<p>Aby stworzy\u0107 aplikacj\u0119 REST API, przejd\u017a do swojego <a href=\"https:\/\/developer.paypal.com\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">konta programisty PayPal<\/a> i zaloguj si\u0119 do pulpitu nawigacyjnego.<\/p>\n<p>W panelu programisty kliknij menu \u201eMoje aplikacje i po\u015bwiadczenia&quot;. Kliknij przycisk \u201eUtw\u00f3rz aplikacj\u0119&#8221; w sekcji Aplikacje REST API.<\/p>\n<p>W nast\u0119pnym kroku wype\u0142nij nazw\u0119 aplikacji, a otrzymasz sw\u00f3j identyfikator klienta i klucz klienta. W moim przypadku na poni\u017cszym zrzucie ekranu widz\u0119 po\u015bwiadczenia piaskownicy. W twoim przypadku mog\u0105 to by\u0107 dane uwierzytelniaj\u0105ce na \u017cywo. Mo\u017cesz te\u017c spr\u00f3bowa\u0107 z po\u015bwiadczeniami piaskownicy.<\/p>\n<p><a href=\"https:\/\/themewp.inform.click\/wp-content\/uploads\/2021\/04\/post-20133-6081c0b5d3a93.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/themewp.inform.click\/wp-content\/uploads\/2021\/04\/post-20133-6081c0b5d3a93.png\" alt=\"Integracja PayPal Payment Gateway w PHP za pomoc\u0105 PayPal REST API\" ><\/a><\/p>\n<h3>Instalacja biblioteki i konfiguracja podstawowa<\/h3>\n<p>Jak ju\u017c wspomnia\u0142em, do integracji PayPal REST API u\u017cyjemy <a href=\"https:\/\/github.com\/thephpleague\/omnipay-paypal\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Omnipay<\/a>. Musimy najpierw zainstalowa\u0107 ich biblioteki za pomoc\u0105 Composera. Uruchom poni\u017csze polecenie, aby zainstalowa\u0107 biblioteki.<\/p>\n<pre><code>composer require league\/omnipay omnipay\/paypal<\/code><\/pre>\n<p>Po zainstalowaniu biblioteki utw\u00f3rz plik konfiguracyjny, w kt\u00f3rym przechowujemy nasze po\u015bwiadczenia API, zapisujemy po\u0142\u0105czenie DB i inicjujemy bram\u0119.<\/p>\n<p><strong>config.php<\/strong><\/p>\n<pre><code>&lt;?php\nrequire_once \"vendor\/autoload.php\";\n\u00a0\nuse OmnipayOmnipay;\n\u00a0\ndefine('CLIENT_ID', 'PAYPAL_CLIENT_ID_HERE');\ndefine('CLIENT_SECRET', 'PAYPAL_CLIENT_SECRET_HERE');\n\u00a0\ndefine('PAYPAL_RETURN_URL', 'YOUR_SITE_URL\/success.php');\ndefine('PAYPAL_CANCEL_URL', 'YOUR_SITE_URL\/cancel.php');\ndefine('PAYPAL_CURRENCY', 'USD'); \/\/ set your currency here\n\u00a0\n\/\/ Connect with the database\n$db = new mysqli('localhost', 'MYSQL_DB_USERNAME', 'MYSQL_DB_PASSWORD', 'MYSQL_DB_NAME'); \n\u00a0\nif ($db-&gt;connect_errno) {\n\u00a0\u00a0\u00a0\u00a0die(\"Connect failed: \". $db-&gt;connect_error);\n}\n\u00a0\n$gateway = Omnipay::create('PayPal_Rest');\n$gateway-&gt;setClientId(CLIENT_ID);\n$gateway-&gt;setSecret(CLIENT_SECRET);\n$gateway-&gt;setTestMode(true); \/\/set it to 'false' when go live<\/code><\/pre>\n<p>Tutaj przekaza\u0142em parametr 'Paypal_Rest&#8217; do metody tworzenia Omnipay. Omnipay w tle wywo\u0142uje PayPal REST API podczas dokonywania p\u0142atno\u015bci za jego po\u015brednictwem.<\/p>\n<p>Nast\u0119pnie utw\u00f3rz prosty formularz, w kt\u00f3rym u\u017cytkownik mo\u017ce wprowadzi\u0107 kwot\u0119. Dla cel\u00f3w demonstracyjnych zachowuj\u0119 tylko jedno pole w formularzu. Mo\u017cesz rozszerzy\u0107 formularz zgodnie z wymaganiami.<\/p>\n<p><strong>formularz.html<\/strong><\/p>\n<pre><code>&lt;form action=\"charge.php\" method=\"post\"&gt;\n\u00a0\u00a0\u00a0\u00a0&lt;input type=\"text\" name=\"amount\" value=\"20.00\" \/&gt;\n\u00a0\u00a0\u00a0\u00a0&lt;input type=\"submit\" name=\"submit\" value=\"Pay Now\"&gt;\n&lt;\/form&gt;<\/code><\/pre>\n<p>Po zako\u0144czeniu p\u0142atno\u015bci powinni\u015bmy zapisa\u0107 szczeg\u00f3\u0142y transakcji w tabeli bazy danych. Utw\u00f3rz tabel\u0119 bazy danych, uruchamiaj\u0105c poni\u017csze zapytanie SQL.<\/p>\n<pre><code>CREATE TABLE `payments` (\u00a0`id` int(11) NOT NULL AUTO_INCREMENT,\n\u00a0`payment_id` varchar(255) NOT NULL,\n\u00a0`payer_id` varchar(255) NOT NULL,\n\u00a0`payer_email` varchar(255) NOT NULL,\n\u00a0`amount` float(10,2) NOT NULL,\n\u00a0`currency` varchar(255) NOT NULL,\n\u00a0`payment_status` varchar(255) NOT NULL,\n\u00a0PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=latin1;<\/code><\/pre>\n<p>Ta tabela nie zawiera klucza obcego, poniewa\u017c s\u0142u\u017cy tylko do cel\u00f3w demonstracyjnych. U\u017cytkownik mo\u017ce doda\u0107 kolumn\u0119 user_id w tej tabeli, aby odnie\u015b\u0107 si\u0119 do p\u0142atno\u015bci z u\u017cytkownikiem.<\/p>\n<h3>Integracja PayPal Payment Gateway w PHP za pomoc\u0105 PayPal REST API<\/h3>\n<p>Korzystaj\u0105c z PayPal REST API, u\u017cytkownik przekieruje do PayPal, aby doko\u0144czy\u0107 p\u0142atno\u015b\u0107. Po dokonaniu p\u0142atno\u015bci u\u017cytkownik przekieruje z powrotem do naszej aplikacji na podstawie statusu sukcesu lub niepowodzenia. Zdefiniowali\u015bmy te adresy URL w <code>config.php<\/code>powy\u017cszym pliku.<\/p>\n<p>Gdy u\u017cytkownik przekieruje z powrotem do naszej aplikacji z odpowiedzi\u0105 powodzenia, musimy wykona\u0107 p\u0142atno\u015b\u0107 w naszym pliku PHP, co jest <code>success.php<\/code>w naszym przypadku. Przechowujemy r\u00f3wnie\u017c informacje o p\u0142atno\u015bci po wykonaniu p\u0142atno\u015bci za pomoc\u0105 PayPal REST API. Wi\u0119c nasz kod b\u0119dzie wygl\u0105da\u0142 nast\u0119puj\u0105co.<\/p>\n<p><strong>op\u0142ata.php<\/strong><\/p>\n<pre><code>&lt;?php\nrequire_once 'config.php';\n\u00a0\nif (isset($_POST['submit'])) {\n\u00a0\n\u00a0\u00a0\u00a0\u00a0try {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$response = $gateway-&gt;purchase(array(\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0'amount' =&gt; $_POST['amount'],\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0'currency' =&gt; PAYPAL_CURRENCY,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0'returnUrl' =&gt; PAYPAL_RETURN_URL,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0'cancelUrl' =&gt; PAYPAL_CANCEL_URL,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0))-&gt;send();\n\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if ($response-&gt;isRedirect()) {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$response-&gt;redirect(); \/\/ this will automatically forward the customer\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0} else {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/ not successful\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0echo $response-&gt;getMessage();\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\n\u00a0\u00a0\u00a0\u00a0} catch(Exception $e) {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0echo $e-&gt;getMessage();\n\u00a0\u00a0\u00a0\u00a0}\n}<\/code><\/pre>\n<p><strong>sukces.php<\/strong><\/p>\n<pre><code>&lt;?php\nrequire_once 'config.php';\n\u00a0\n\/\/ Once the transaction has been approved, we need to complete it.\nif (array_key_exists('paymentId', $_GET) &amp;&amp; array_key_exists('PayerID', $_GET)) {\n\u00a0\u00a0\u00a0\u00a0$transaction = $gateway-&gt;completePurchase(array(\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0'payer_id'\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 =&gt; $_GET['PayerID'],\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0'transactionReference' =&gt; $_GET['paymentId'],\n\u00a0\u00a0\u00a0\u00a0));\n\u00a0\u00a0\u00a0\u00a0$response = $transaction-&gt;send();\n\u00a0\n\u00a0\u00a0\u00a0\u00a0if ($response-&gt;isSuccessful()) {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/ The customer has successfully paid.\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$arr_body = $response-&gt;getData();\n\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$payment_id = $arr_body['id'];\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$payer_id = $arr_body['payer']['payer_info']['payer_id'];\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$payer_email = $arr_body['payer']['payer_info']['email'];\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$amount = $arr_body['transactions'][0]['amount']['total'];\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$currency = PAYPAL_CURRENCY;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$payment_status = $arr_body['state'];\n\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/ Insert transaction data into the database\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$isPaymentExist = $db-&gt;query(\"SELECT * FROM payments WHERE payment_id = '\".$payment_id.\"'\");\n\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if($isPaymentExist-&gt;num_rows == 0) {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$insert = $db-&gt;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 .\"')\");\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\n\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0echo \"Payment is successful. Your transaction id is: \". $payment_id;\n\u00a0\u00a0\u00a0\u00a0} else {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0echo $response-&gt;getMessage();\n\u00a0\u00a0\u00a0\u00a0}\n} else {\n\u00a0\u00a0\u00a0\u00a0echo 'Transaction is declined';\n}<\/code><\/pre>\n<p><strong>anuluj.php<\/strong><\/p>\n<pre><code>&lt;h3&gt;User is canceled the payment.&lt;\/h3&gt;<\/code><\/pre>\n<h3>Wy\u015blij informacje o produkcie do PayPal<\/h3>\n<p>W powy\u017cszym kodzie wysy\u0142amy kwot\u0119 do zap\u0142aty na PayPal. Mo\u017cesz r\u00f3wnie\u017c wys\u0142a\u0107 informacje o produkcie. Twoi klienci mog\u0105 zobaczy\u0107 te szczeg\u00f3\u0142y produktu na stronie p\u0142atno\u015bci przed dokonaniem p\u0142atno\u015bci.<\/p>\n<p>Aby wys\u0142a\u0107 informacje o produkcie, musisz przekaza\u0107 tablic\u0119 'items&#8217; do <code>purchase<\/code>\u00a0metody w nast\u0119puj\u0105cy spos\u00f3b.<\/p>\n<pre><code>$response = $gateway-&gt;purchase(array(\n\u00a0\u00a0\u00a0\u00a0'amount' =&gt; $_POST['amount'],\n\u00a0\u00a0\u00a0\u00a0'items' =&gt; array(\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0array(\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0'name' =&gt; 'Course Subscription',\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0'price' =&gt; $_POST['amount'],\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0'description' =&gt; 'Get access to premium courses.',\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0'quantity' =&gt; 1\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0),\n\u00a0\u00a0\u00a0\u00a0),\n\u00a0\u00a0\u00a0\u00a0'currency' =&gt; PAYPAL_CURRENCY,\n\u00a0\u00a0\u00a0\u00a0'returnUrl' =&gt; PAYPAL_RETURN_URL,\n\u00a0\u00a0\u00a0\u00a0'cancelUrl' =&gt; PAYPAL_CANCEL_URL,\n))-&gt;send();<\/code><\/pre>\n<p>Tutaj przekaza\u0142em dane produktu statycznie. Powiniene\u015b nada\u0107 mu dynamik\u0119 w zale\u017cno\u015bci od produktu.<\/p>\n<p>Mam nadziej\u0119, \u017ce wiesz ju\u017c o integracji PayPal Payment Gateway w PHP. Chcia\u0142bym us\u0142ysze\u0107 Twoje przemy\u015blenia lub sugestie w sekcji komentarzy poni\u017cej.<\/p>\n<h4>Powi\u0105zane artyku\u0142y<\/h4>\n<ul>\n<li><a href=\"https:\/\/themewp.inform.click\/pl\/akceptuj-platnosci-karta-kredytowa-za-pomoca-paypal-payments-pro-w-php\/\" title=\"Akceptuj p\u0142atno\u015bci kart\u0105 kredytow\u0105 za pomoc\u0105 PayPal Payments Pro w PHP\">Akceptuj p\u0142atno\u015bci kart\u0105 kredytow\u0105 za pomoc\u0105 PayPal Payments Pro w PHP<\/a><\/li>\n<li><a href=\"https:\/\/themewp.inform.click\/pl\/akceptuj-platnosci-karta-kredytowa-za-pomoca-bramki-platnosci-authorize-net-w-php\/\" title=\"Akceptuj p\u0142atno\u015bci kart\u0105 kredytow\u0105 za pomoc\u0105 bramki p\u0142atno\u015bci Authorize.net w PHP\">Akceptuj p\u0142atno\u015bci kart\u0105 kredytow\u0105 za pomoc\u0105 bramki p\u0142atno\u015bci Authorize.net w PHP<\/a><\/li>\n<li><a href=\"https:\/\/themewp.inform.click\/pl\/przewodnik-po-integracji-stripe-w-witrynie-z-php\/\" title=\"Przewodnik po integracji Stripe w witrynie z PHP\">Przewodnik po integracji Stripe w witrynie z PHP<\/a><\/li>\n<\/ul>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">\u0179r\u00f3d\u0142o nagrywania:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/artisansweb.net\" class=\"external external_icon\">artisansweb.net<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>W tym po\u015bcie pokazujemy, jak zintegrowa\u0107 bramk\u0119 p\u0142atno\u015bci PayPal w PHP za pomoc\u0105 PayPal REST API. Korzystaj\u0105c z PayPal, mo\u017cesz przyjmowa\u0107 p\u0142atno\u015bci online od swoich klient\u00f3w<\/p>\n","protected":false},"author":1,"featured_media":20134,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[277],"tags":[847],"class_list":["post-29707","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-php-8","tag-affiai-pl"],"_links":{"self":[{"href":"https:\/\/themewp.inform.click\/pl\/wp-json\/wp\/v2\/posts\/29707","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/themewp.inform.click\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/themewp.inform.click\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/themewp.inform.click\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/themewp.inform.click\/pl\/wp-json\/wp\/v2\/comments?post=29707"}],"version-history":[{"count":0,"href":"https:\/\/themewp.inform.click\/pl\/wp-json\/wp\/v2\/posts\/29707\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/themewp.inform.click\/pl\/wp-json\/wp\/v2\/media\/20134"}],"wp:attachment":[{"href":"https:\/\/themewp.inform.click\/pl\/wp-json\/wp\/v2\/media?parent=29707"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/themewp.inform.click\/pl\/wp-json\/wp\/v2\/categories?post=29707"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/themewp.inform.click\/pl\/wp-json\/wp\/v2\/tags?post=29707"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}