{"id":28644,"date":"2021-05-29T13:20:00","date_gmt":"2021-05-29T10:20:00","guid":{"rendered":"https:\/\/themewp.inform.click\/?p=28644"},"modified":"2021-10-18T03:39:07","modified_gmt":"2021-10-18T00:39:07","slug":"integracja-paypal-payments-pro-w-laravel","status":"publish","type":"post","link":"https:\/\/themewp.inform.click\/pl\/integracja-paypal-payments-pro-w-laravel\/","title":{"rendered":"Integracja PayPal Payments Pro w Laravel"},"content":{"rendered":"<p>Napisa\u0142em artyku\u0142 <a href=\"https:\/\/themewp.inform.click\/pl\/akceptuj-platnosci-karta-kredytowa-za-pomoca-paypal-payments-pro-w-php\/\" title=\"akceptuj\u0105cy p\u0142atno\u015bci kart\u0105 kredytow\u0105 za pomoc\u0105 PayPal Payments Pro w PHP\" >akceptuj\u0105cy p\u0142atno\u015bci kart\u0105 kredytow\u0105 za pomoc\u0105 PayPal Payments Pro w PHP<\/a>. Jeden z czytelnik\u00f3w zapyta\u0142 mnie, jak wykona\u0107 t\u0119 sam\u0105 integracj\u0119 w Laravelu. Chocia\u017c Laravel jest napisany w PHP, pisz\u0105c kod dla Laravela, musisz przestrzega\u0107 ich standard\u00f3w. Pocz\u0105tkuj\u0105cym cz\u0119sto trudno jest przekonwertowa\u0107 zwyk\u0142y kod PHP w Laravelu.<\/p>\n<p>W tym artykule dowiemy si\u0119, jak zintegrowa\u0107 PayPal Payments Pro i akceptowa\u0107 p\u0142atno\u015bci kart\u0105 kredytow\u0105 w Laravel.<\/p>\n<p>Je\u015bli prowadzisz sklep internetowy, witryn\u0119 cz\u0142onkowsk\u0105 lub co\u015b innego, w kt\u00f3rym chcesz pobiera\u0107 p\u0142atno\u015bci online, PayPal jest bezpieczn\u0105 opcj\u0105. Korzystaj\u0105c z PayPal Payments Pro, mo\u017cesz akceptowa\u0107 p\u0142atno\u015bci kart\u0105 kredytow\u0105 online, kt\u00f3re trafiaj\u0105 bezpo\u015brednio na Twoje konto PayPal.<\/p>\n<p>Zachowaj notatk\u0119 w momencie pisania tego artyku\u0142u, PayPal Payments Pro jest dost\u0119pny dla handlowc\u00f3w w Stanach Zjednoczonych, Wielkiej Brytanii i Kanadzie.<\/p>\n<h3>Pierwsze kroki<\/h3>\n<p>Aby rozpocz\u0105\u0107, musisz uzyska\u0107 po\u015bwiadczenia PayPal API. Dobr\u0105 praktyk\u0105 jest zawsze testowanie p\u0142atno\u015bci w trybie piaskownicy. Je\u015bli wszystko dzia\u0142a zgodnie z oczekiwaniami, dokonaj p\u0142atno\u015bci.<\/p>\n<p>Uzyskaj po\u015bwiadczenia piaskownicy, loguj\u0105c si\u0119 na konto <a href=\"https:\/\/developer.paypal.com\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">programisty PayPal<\/a>. Po zalogowaniu przejd\u017a do <strong>SANDBOX-&gt;Konta<\/strong> z menu po lewej stronie i za\u0142\u00f3\u017c konto firmowe.<\/p>\n<p>Po za\u0142o\u017ceniu konta firmowego zmie\u0144 typ konta na \u201eBusiness-Pro&quot;. Integracja PayPal Payments Pro wymaga konta typu \u201eBusiness-Pro&#8221;. Kliknij \u0142\u0105cze \u201eUaktualnij do wersji Pro&#8221;, a PayPal zmieni typ Twojego konta na \u201eBusiness-Pro&#8221;.<\/p>\n<p><a href=\"https:\/\/themewp.inform.click\/wp-content\/uploads\/2021\/04\/post-20427-6081efe66b74b.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-20427-6081efe66b74b.png\" alt=\"Integracja PayPal Payments Pro w Laravel\" ><\/a><\/p>\n<p>Nast\u0119pnie kliknij kart\u0119 \u201ePo\u015bwiadczenia API&#8221; i skopiuj swoje dane uwierzytelniaj\u0105ce.<\/p>\n<p><a href=\"https:\/\/themewp.inform.click\/wp-content\/uploads\/2021\/04\/post-20427-6081efe6b9358.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-20427-6081efe6b9358.png\" alt=\"Integracja PayPal Payments Pro w Laravel\" ><\/a><\/p>\n<p>Otw\u00f3rz <code>.env<\/code>sw\u00f3j projekt Laravel i dodaj do niego skopiowane dane uwierzytelniaj\u0105ce.<\/p>\n<pre><code>PAYPAL_API_USERNAME=\nPAYPAL_API_PASSWORD=\nPAYPAL_API_SIGNATURE=<\/code><\/pre>\n<p>Dodaj tras\u0119 do kontrolera w <code>web.php<\/code>pliku. W moim przypadku moja trasa wygl\u0105da nast\u0119puj\u0105co.<\/p>\n<pre><code>Route::resource('payment', 'PaymentController');<\/code><\/pre>\n<p>Mam zamiar u\u017cy\u0107 <a href=\"https:\/\/omnipay.thephpleague.com\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">OmniPay<\/a> biblioteki, kt\u00f3ra pozwala w \u0142atwy spos\u00f3b zintegrowa\u0107 sposob\u00f3w p\u0142atno\u015bci. Uruchom poni\u017csze polecenie, kt\u00f3re zainstaluje bibliotek\u0119 Omnipay.<\/p>\n<pre><code>composer require league\/omnipay:^3 omnipay\/paypal<\/code><\/pre>\n<h3>Utw\u00f3rz formularz p\u0142atno\u015bci<\/h3>\n<p>Przyjmuj\u0105c p\u0142atno\u015b\u0107 kart\u0105 kredytow\u0105, musisz udost\u0119pni\u0107 u\u017cytkownikom formularz, w kt\u00f3rym mog\u0105 wprowadzi\u0107 dane swojej karty. Zaprojektujmy formularz p\u0142atno\u015bci, korzystaj\u0105c z tego <a href=\"https:\/\/codepen.io\/hswd\/pen\/JYvgBW\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">przyk\u0142adu codepen<\/a>.<\/p>\n<p>Utw\u00f3rz folder 'css&#8217; i 'js&#8217; w katalogu 'public&#8217; projektu Laravel. Skopiuj kod CSS z codepen i dodaj go w <code>css\/card.css<\/code>.<\/p>\n<pre><code>@import url(https:\/\/fonts.googleapis.com\/css?family=Roboto:400,900,700,500);\n\u00a0\nbody {\n\u00a0\u00a0padding: 60px 0;\n\u00a0\u00a0background-color: rgba(178,209,229,0.7);\n\u00a0\u00a0margin: 0 auto;\n\u00a0\u00a0width: 600px;\n}\n.body-text {\n\u00a0\u00a0padding: 0 20px 30px 20px;\n\u00a0\u00a0font-family: \"Roboto\";\n\u00a0\u00a0font-size: 1em;\n\u00a0\u00a0color: #333;\n\u00a0\u00a0text-align: center;\n\u00a0\u00a0line-height: 1.2em;\n}\n.form-container {\n\u00a0\u00a0flex-direction: column;\n\u00a0\u00a0justify-content: center;\n\u00a0\u00a0align-items: center;\n}\n.card-wrapper {\n\u00a0\u00a0background-color: #6FB7E9;\n\u00a0\u00a0width: 100%;\n\u00a0\u00a0display: flex;\n\u00a0\n}\n.personal-information {\n\u00a0\u00a0background-color: #3C8DC5;\n\u00a0\u00a0color: #fff;\n\u00a0\u00a0padding: 1px 0;\n\u00a0\u00a0text-align: center;\n}\nh1 {\n\u00a0\u00a0font-size: 1.3em;\n\u00a0\u00a0font-family: \"Roboto\"\n}\ninput {\n\u00a0\u00a0margin: 1px 0;\n\u00a0\u00a0padding-left: 3%;\n\u00a0\u00a0font-size: 14px;\n}\ninput[type=\"text\"]{\n\u00a0\u00a0display: block;\n\u00a0\u00a0height: 50px;\n\u00a0\u00a0width: 97%;\n\u00a0\u00a0border: none;\n}\ninput[type=\"email\"]{\n\u00a0\u00a0display: block;\n\u00a0\u00a0height: 50px;\n\u00a0\u00a0width: 97%;\n\u00a0\u00a0border: none;\n}\ninput[type=\"submit\"]{\n\u00a0\u00a0display: block;\n\u00a0\u00a0height: 60px;\n\u00a0\u00a0width: 100%;\n\u00a0\u00a0border: none;\n\u00a0\u00a0background-color: #3C8DC5;\n\u00a0\u00a0color: #fff;\n\u00a0\u00a0margin-top: 2px;\n\u00a0\u00a0curson: pointer;\n\u00a0\u00a0font-size: 0.9em;\n\u00a0\u00a0text-transform: uppercase;\n\u00a0\u00a0font-weight: bold;\n\u00a0\u00a0cursor: pointer;\n}\ninput[type=\"submit\"]:hover{\n\u00a0\u00a0background-color: #6FB7E9;\n\u00a0\u00a0transition: 0.3s ease;\n}\n#column-left {\n\u00a0\u00a0width: 46.8%;\n\u00a0\u00a0float: left;\n\u00a0\u00a0margin-bottom: 2px;\n}\n#column-right {\n\u00a0\u00a0width: 46.8%;\n\u00a0\u00a0float: right;\n}\n\u00a0\n@media only screen and (max-width: 480px){\n\u00a0\u00a0body {\n\u00a0\u00a0\u00a0\u00a0width: 100%;\n\u00a0\u00a0\u00a0\u00a0margin: 0 auto;\n\u00a0\u00a0}\n\u00a0\u00a0.form-container {\n\u00a0\u00a0\u00a0\u00a0margin: 0 2%;\n\u00a0\u00a0}\n\u00a0\u00a0input {\n\u00a0\u00a0\u00a0\u00a0font-size: 1em;\n\u00a0\u00a0}\n\u00a0\u00a0#input-button {\n\u00a0\u00a0\u00a0\u00a0width: 100%;\n\u00a0\u00a0}\n\u00a0\u00a0#input-field {\n\u00a0\u00a0\u00a0\u00a0width: 96.5%;\n\u00a0\u00a0}\n\u00a0\u00a0h1 {\n\u00a0\u00a0\u00a0\u00a0font-size: 1.2em;\n\u00a0\u00a0}\n\u00a0\u00a0input {\n\u00a0\u00a0\u00a0\u00a0margin: 2px 0;\n\u00a0\u00a0}\n\u00a0\u00a0input[type=\"submit\"]{\n\u00a0\u00a0\u00a0\u00a0height: 50px;\n\u00a0\u00a0}\n\u00a0\u00a0#column-left {\n\u00a0\u00a0\u00a0\u00a0width: 96.5%;\n\u00a0\u00a0\u00a0\u00a0display: block;\n\u00a0\u00a0\u00a0\u00a0float: none;\n\u00a0\u00a0}\n\u00a0\u00a0#column-right {\n\u00a0\u00a0\u00a0\u00a0width: 96.5%;\n\u00a0\u00a0\u00a0\u00a0display: block;\n\u00a0\u00a0\u00a0\u00a0float: none;\n\u00a0\u00a0}\n}<\/code><\/pre>\n<p>Podobnie dodaj kod JavaScript z codepen do <code>js\/card.js<\/code>pliku.<\/p>\n<pre><code>$('form').card({\n\u00a0\u00a0\u00a0\u00a0container: '.card-wrapper',\n\u00a0\u00a0\u00a0\u00a0width: 280,\n\u00a0\n\u00a0\u00a0\u00a0\u00a0formSelectors: {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0nameInput: 'input[name=\"first-name\"], input[name=\"last-name\"]'\n\u00a0\u00a0\u00a0\u00a0}\n});<\/code><\/pre>\n<p>Pobierz kopi\u0119 <code>jquery.card.js<\/code>z tego <a href=\"https:\/\/github.com\/jessepollak\/card\/blob\/master\/dist\/jquery.card.js\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">repozytorium GitHub<\/a>. Zapisz ten plik w swoim katalogu 'js&#8217;.<\/p>\n<p>Na koniec w pliku ostrza dodaj poni\u017cszy kod.<\/p>\n<pre><code>&lt;link rel=\"stylesheet\" href=\"{{ asset('css\/card.css') }}\"&gt;\n\u00a0\n&lt;form method=\"POST\" action=\"{{ url('ROUTE_HERE') }}\"&gt;\n\u00a0\u00a0\u00a0\u00a0{{ csrf_field() }}\n\u00a0\u00a0\u00a0\u00a0&lt;div class=\"form-container\"&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;div class=\"personal-information\"&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;h1&gt;Payment Information&lt;\/h1&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;\/div&gt; &lt;!-- end of personal-information --&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;input id=\"column-left\" type=\"text\" name=\"first-name\" placeholder=\"First Name\" required=\"required\" \/&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;input id=\"column-right\" type=\"text\" name=\"last-name\" placeholder=\"Surname\" required=\"required\" \/&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;input id=\"input-field\" type=\"text\" name=\"number\" placeholder=\"Card Number\" required=\"required\" \/&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;input id=\"column-left\" type=\"text\" name=\"expiry\" placeholder=\"MM \/ YY\" required=\"required\" \/&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;input id=\"column-right\" type=\"text\" name=\"cvc\" placeholder=\"CCV\" required=\"required\" \/&gt;\n\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;div class=\"card-wrapper\"&gt;&lt;\/div&gt;\n\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;input id=\"input-field\" type=\"text\" name=\"streetaddress\" required=\"required\" autocomplete=\"on\" maxlength=\"45\" placeholder=\"Streed Address\"\/&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;input id=\"column-left\" type=\"text\" name=\"city\" required=\"required\" autocomplete=\"on\" maxlength=\"20\" placeholder=\"City\"\/&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;input id=\"column-right\" type=\"text\" name=\"zipcode\" required=\"required\" autocomplete=\"on\" pattern=\"[0-9]*\" maxlength=\"5\" placeholder=\"ZIP code\"\/&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;input id=\"input-field\" type=\"email\" name=\"email\" required=\"required\" autocomplete=\"on\" maxlength=\"40\" placeholder=\"Email\"\/&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;input id=\"input-field\" type=\"text\" name=\"amount\" required=\"required\" autocomplete=\"on\" maxlength=\"40\" placeholder=\"Amount\"\/&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;input id=\"input-button\" name=\"submit\" type=\"submit\" value=\"Submit\"\/&gt;\n\u00a0\u00a0\u00a0\u00a0&lt;\/div&gt;\n&lt;\/form&gt;\n&lt;script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/jquery\/3.4.1\/jquery.min.js\"&gt;&lt;\/script&gt;\n&lt;script src=\"{{ asset('js\/jquery.card.js') }}\"&gt;&lt;\/script&gt;\n&lt;script src=\"{{ asset('js\/card.js') }}\"&gt;&lt;\/script&gt;<\/code><\/pre>\n<p>W powy\u017cszym kodzie umie\u015bci\u0142em CSS, JS z odpowiedniego katalogu. Musisz poda\u0107 adres URL swojej trasy do akcji formularza.<\/p>\n<h3>Integracja PayPal Payments Pro w Laravel<\/h3>\n<p>Sko\u0144czyli\u015bmy z konfiguracj\u0105 wymagan\u0105 do akceptowania p\u0142atno\u015bci kart\u0105 kredytow\u0105. Teraz w kontrolerze musimy napisa\u0107 kod zgodnie z instrukcj\u0105 Omnipay. Omnipay u\u0142atwia \u017cycie programistom. Musimy po prostu post\u0119powa\u0107 zgodnie z ich instrukcjami, a oni wykonuj\u0105 ca\u0142\u0105 ci\u0119\u017ck\u0105 prac\u0119 polegaj\u0105c\u0105 na przechwyceniu p\u0142atno\u015bci i zwr\u00f3ceniu ostatecznej odpowiedzi.<\/p>\n<p><strong>PaymentController.php<\/strong><\/p>\n<pre><code>&lt;?php\n\u00a0\nnamespace AppHttpControllers;\n\u00a0\nuse IlluminateHttpRequest;\nuse OmnipayOmnipay;\n\u00a0\nclass PaymentController extends Controller\n{\n\u00a0\n\u00a0\u00a0\u00a0\u00a0public $gateway;\n\u00a0\n\u00a0\u00a0\u00a0\u00a0public function __construct()\n\u00a0\u00a0\u00a0\u00a0{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$this-&gt;gateway = Omnipay::create('PayPal_Pro');\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$this-&gt;gateway-&gt;setUsername(env('PAYPAL_API_USERNAME'));\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$this-&gt;gateway-&gt;setPassword(env('PAYPAL_API_PASSWORD'));\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$this-&gt;gateway-&gt;setSignature(env('PAYPAL_API_SIGNATURE'));\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$this-&gt;gateway-&gt;setTestMode(true); \/\/ here 'true' is for sandbox. Pass 'false' when go live\n\u00a0\u00a0\u00a0\u00a0}\n\u00a0\n\u00a0\u00a0\u00a0\u00a0public function index()\n\u00a0\u00a0\u00a0\u00a0{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return view('payment');\n\u00a0\u00a0\u00a0\u00a0}\n\u00a0\n\u00a0\u00a0\u00a0\u00a0public function store(Request $request)\n\u00a0\u00a0\u00a0\u00a0{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$arr_expiry = explode(\"\/\", $request-&gt;input('expiry'));\n\u00a0\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$formData = array(\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0'firstName' =&gt; $request-&gt;input('first-name'),\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0'lastName' =&gt; $request-&gt;input('last-name'),\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0'number' =&gt; $request-&gt;input('number'),\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0'expiryMonth' =&gt; trim($arr_expiry[0]),\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0'expiryYear' =&gt; trim($arr_expiry[1]),\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0'cvv' =&gt; $request-&gt;input('cvc')\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0);\n\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0try {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/ Send purchase request\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$response = $this-&gt;gateway-&gt;purchase([\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0'amount' =&gt; $request-&gt;input('amount'),\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0'currency' =&gt; 'USD',\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0'card' =&gt; $formData\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0])-&gt;send();\n\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/ Process response\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if ($response-&gt;isSuccessful()) {\n\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/ Payment was successful\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$arr_body = $response-&gt;getData();\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$amount = $arr_body['AMT'];\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$currency = $arr_body['CURRENCYCODE'];\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$transaction_id = $arr_body['TRANSACTIONID'];\n\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0echo \"Payment of $amount $currency is successful. Your Transaction ID is: $transaction_id\";\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0} else {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/ Payment failed\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0echo \"Payment failed. \". $response-&gt;getMessage();\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0} catch(Exception $e) {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0echo $e-&gt;getMessage();\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\n\u00a0\u00a0\u00a0\u00a0}\n}<\/code><\/pre>\n<p>Tutaj w konstruktorze budujemy obiekt i przekazujemy do niego referencje. Gdy u\u017cytkownik przesy\u0142a formularz, kontrola przechodzi do metody \u201estore&#8221;. W tej metodzie Omnipay wywo\u0142uje w tle API PayPal, przetwarza p\u0142atno\u015b\u0107 i daje ostateczn\u0105 odpowied\u017a.<\/p>\n<p>\u015amia\u0142o i spr\u00f3buj. Poniewa\u017c testujemy p\u0142atno\u015b\u0107 w trybie piaskownicy, b\u0119dziesz potrzebowa\u0107 kart testowych. <a href=\"https:\/\/developer.paypal.com\/docs\/classic\/payflow\/payflow-pro\/payflow-pro-testing\/#credit-card-numbers-for-testing\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Kliknij tutaj,<\/a> aby uzyska\u0107 fa\u0142szywe dane karty kredytowej. Po przes\u0142aniu formularza powiniene\u015b zobaczy\u0107 komunikat o powodzeniu wraz z identyfikatorem transakcji.<\/p>\n<h3>Akceptuj p\u0142atno\u015bci na \u017cywo w systemie PayPal Payments Pro<\/h3>\n<p>Gdy Twoje p\u0142atno\u015bci dzia\u0142aj\u0105 pomy\u015blnie w trybie piaskownicy, mo\u017cesz przej\u015b\u0107 do trybu na \u017cywo. W tym celu musisz zast\u0105pi\u0107 po\u015bwiadczenia piaskownicy danymi na \u017cywo w <code>.env<\/code>pliku. Przeka\u017c tak\u017ce warto\u015b\u0107 \u201efalse&#8221; do metody setTestMode() w konstruktorze. Wy\u0142\u0105czy tryb piaskownicy i aktywuje tryb na \u017cywo.<\/p>\n<p>Wszystko sprowadza si\u0119 do akceptowania p\u0142atno\u015bci kart\u0105 kredytow\u0105 w systemie PayPal Payments Pro w Laravel. Chcia\u0142bym us\u0142ysze\u0107 wasze przemy\u015blenia i 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\/integracja-bramki-platnosci-authorize-net-w-laravel\/\" title=\"Integracja bramki p\u0142atno\u015bci Authorize.Net w Laravel\">Integracja bramki p\u0142atno\u015bci Authorize.Net w Laravel<\/a><\/li>\n<li><a href=\"https:\/\/themewp.inform.click\/pl\/integracja-stripe-payment-gateway-w-laravel\/\" title=\"Integracja Stripe Payment Gateway w Laravel\">Integracja Stripe Payment Gateway w Laravel<\/a><\/li>\n<li><a href=\"https:\/\/themewp.inform.click\/pl\/integracja-bramki-platnosci-paypal-w-laravel\/\" title=\"Integracja bramki p\u0142atno\u015bci PayPal w Laravel\">Integracja bramki p\u0142atno\u015bci PayPal w Laravel<\/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>PayPal Payments Pro pozwala nam akceptowa\u0107 p\u0142atno\u015bci kart\u0105 kredytow\u0105 online. W tym artykule poka\u017c\u0119, jak zintegrowa\u0107 PayPal Payments Pro w Lara<\/p>\n","protected":false},"author":1,"featured_media":21668,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[501],"tags":[847],"class_list":["post-28644","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-laravel","tag-affiai-pl"],"_links":{"self":[{"href":"https:\/\/themewp.inform.click\/pl\/wp-json\/wp\/v2\/posts\/28644","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=28644"}],"version-history":[{"count":0,"href":"https:\/\/themewp.inform.click\/pl\/wp-json\/wp\/v2\/posts\/28644\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/themewp.inform.click\/pl\/wp-json\/wp\/v2\/media\/21668"}],"wp:attachment":[{"href":"https:\/\/themewp.inform.click\/pl\/wp-json\/wp\/v2\/media?parent=28644"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/themewp.inform.click\/pl\/wp-json\/wp\/v2\/categories?post=28644"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/themewp.inform.click\/pl\/wp-json\/wp\/v2\/tags?post=28644"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}