{"id":29677,"date":"2021-06-21T10:56:00","date_gmt":"2021-06-21T07:56:00","guid":{"rendered":"https:\/\/themewp.inform.click\/?p=29677"},"modified":"2021-10-17T16:14:42","modified_gmt":"2021-10-17T13:14:42","slug":"integracion-de-la-pasarela-de-pago-de-paypal-en-php-mediante-la-api-rest-de-paypal","status":"publish","type":"post","link":"https:\/\/themewp.inform.click\/es\/integracion-de-la-pasarela-de-pago-de-paypal-en-php-mediante-la-api-rest-de-paypal\/","title":{"rendered":"Integraci\u00f3n de la pasarela de pago de PayPal en PHP mediante la API REST de PayPal"},"content":{"rendered":"<p>PayPal es una de las pasarelas de pago m\u00e1s confiables de Internet. Se usa ampliamente en sitios web para aceptar pagos en l\u00ednea. Sin embargo, la documentaci\u00f3n de la API de PayPal no es f\u00e1cil de comprender. Para un desarrollador que va a integrar la pasarela de pago de PayPal por primera vez, le tomar\u00e1 muchas horas tener \u00e9xito en ella. Pas\u00e9 una gran cantidad de horas leyendo la documentaci\u00f3n de la API de PayPal. Y luego darse cuenta de que no es necesario leer la documentaci\u00f3n de Paypal en profundidad para integrarla.<\/p>\n<p>En este art\u00edculo, estudiamos c\u00f3mo integrar una pasarela de pago de PayPal utilizando la API REST de PayPal. Vamos a utilizar la biblioteca de GitHub proporcionada por Omnipay. Omnipay proporciona una forma limpia y f\u00e1cil de integrar diferentes pasarelas de pago en su aplicaci\u00f3n web. Su estructura de c\u00f3digo tambi\u00e9n es limpia y eficiente. A los desarrolladores les encantar\u00eda.<\/p>\n<h3>Obtenga el ID de cliente y el secreto del cliente de PayPal<\/h3>\n<p>Para la integraci\u00f3n de PayPal en el sitio web, primero debe crear una aplicaci\u00f3n API REST en una cuenta de desarrollador de PayPal. Una vez que haya creado la aplicaci\u00f3n, obtendr\u00e1 la identificaci\u00f3n del cliente y el secreto del cliente que requerir\u00e1 en los siguientes pasos.<\/p>\n<p>Para crear la aplicaci\u00f3n REST API, vaya a su <a href=\"https:\/\/developer.paypal.com\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">cuenta de desarrollador de PayPal<\/a> e inicie sesi\u00f3n en el panel de control.<\/p>\n<p>En el panel del desarrollador, haga clic en el men\u00fa &#8216;Mis aplicaciones y credenciales&#8217;. Haga clic en el bot\u00f3n &#8216;Crear aplicaci\u00f3n&#8217; en la secci\u00f3n de aplicaciones de la API REST.<\/p>\n<p>En el siguiente paso, complete el nombre de la aplicaci\u00f3n y obtendr\u00e1 su identificaci\u00f3n de cliente y su secreto de cliente. En mi caso, en la siguiente captura de pantalla puedo ver las credenciales de la zona de pruebas. Pueden ser credenciales en vivo en su caso. O tambi\u00e9n puede probar con sus credenciales de sandbox.<\/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=\"Integraci\u00f3n de la pasarela de pago de PayPal en PHP mediante la API REST de PayPal\" ><\/a><\/p>\n<h3>Instalaci\u00f3n de la biblioteca y configuraci\u00f3n b\u00e1sica<\/h3>\n<p>Como dije, usaremos <a href=\"https:\/\/github.com\/thephpleague\/omnipay-paypal\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Omnipay<\/a> para la integraci\u00f3n de la API REST de PayPal. Primero debemos instalar sus bibliotecas usando Composer. Ejecute el siguiente comando para instalar las bibliotecas.<\/p>\n<pre><code>composer require league\/omnipay omnipay\/paypal<\/code><\/pre>\n<p>Despu\u00e9s de instalar la biblioteca, creamos un archivo de configuraci\u00f3n donde almacenamos nuestras credenciales API, escribimos la conexi\u00f3n DB e inicializamos la puerta de enlace.<\/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>Aqu\u00ed, pas\u00e9 el par\u00e1metro &#8216;Paypal_Rest&#8217; al m\u00e9todo de creaci\u00f3n de Omnipay. Omnipay en segundo plano llama a la API REST de PayPal mientras realiza el pago a trav\u00e9s de ella.<\/p>\n<p>A continuaci\u00f3n, cree un formulario simple donde un usuario puede ingresar la cantidad. Para prop\u00f3sitos de demostraci\u00f3n, solo mantengo un campo en el formulario. Puede ampliar el formulario seg\u00fan sus necesidades.<\/p>\n<p><strong>form.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>Cuando se complete el pago, debemos guardar los detalles de la transacci\u00f3n en la tabla de la base de datos. Cree una tabla de base de datos ejecutando la siguiente consulta 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>Esta tabla no contiene ninguna clave externa, ya que es solo para fines de demostraci\u00f3n. El usuario puede agregar una columna user_id en esta tabla para hacer referencia al pago con el usuario.<\/p>\n<h3>Integraci\u00f3n de la pasarela de pago de PayPal en PHP mediante la API REST de PayPal<\/h3>\n<p>Al utilizar la API REST de PayPal, el usuario lo redireccionar\u00e1 a PayPal para completar el pago. Despu\u00e9s de realizar el pago, el usuario lo redirigir\u00e1 a nuestra aplicaci\u00f3n en funci\u00f3n del estado de \u00e9xito o fracaso. Definimos estas URL en el <code>config.php<\/code>archivo anterior.<\/p>\n<p>Una vez que el usuario vuelve a redirigir a nuestra aplicaci\u00f3n con una respuesta exitosa, debemos ejecutar el pago en nuestro archivo PHP, que es <code>success.php<\/code>en nuestro caso. Tambi\u00e9n almacenamos la informaci\u00f3n de pago despu\u00e9s de ejecutar el pago mediante la API REST de PayPal. Entonces nuestro c\u00f3digo ser\u00e1 el siguiente.<\/p>\n<p><strong>charge.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>success.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>cancel.php<\/strong><\/p>\n<pre><code>&lt;h3&gt;User is canceled the payment.&lt;\/h3&gt;<\/code><\/pre>\n<h3>Enviar informaci\u00f3n del producto a PayPal<\/h3>\n<p>En el c\u00f3digo anterior, estamos enviando la cantidad a pagar en PayPal. Es posible que tambi\u00e9n desee enviar informaci\u00f3n sobre el producto. Sus clientes pueden ver los detalles de estos productos en la p\u00e1gina de pago antes de realizar un pago.<\/p>\n<p>Para enviar la informaci\u00f3n del producto, debe pasar la matriz &#8216;elementos&#8217; al <code>purchase<\/code>\u00a0m\u00e9todo de la siguiente manera.<\/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>Aqu\u00ed he pasado los detalles del producto de forma est\u00e1tica. Debes dinamizarlo dependiendo de tu producto.<\/p>\n<p>Espero que conozca la integraci\u00f3n de la pasarela de pago de PayPal en PHP. Me gustar\u00eda escuchar sus pensamientos o sugerencias en la secci\u00f3n de comentarios a continuaci\u00f3n.<\/p>\n<h4>Art\u00edculos relacionados<\/h4>\n<ul>\n<li><a href=\"https:\/\/themewp.inform.click\/es\/acepte-pagos-con-tarjeta-de-credito-usando-paypal-payments-pro-en-php\/\" title=\"Acepte pagos con tarjeta de cr\u00e9dito usando PayPal Payments Pro en PHP\">Acepte pagos con tarjeta de cr\u00e9dito usando PayPal Payments Pro en PHP<\/a><\/li>\n<li><a href=\"https:\/\/themewp.inform.click\/es\/acepte-el-pago-con-tarjeta-de-credito-utilizando-authorize-net-payment-gateway-en-php\/\" title=\"Acepte el pago con tarjeta de cr\u00e9dito utilizando la pasarela de pago Authorize.net en PHP\">Acepte el pago con tarjeta de cr\u00e9dito utilizando la pasarela de pago Authorize.net en PHP<\/a><\/li>\n<li><a href=\"https:\/\/themewp.inform.click\/es\/una-guia-para-la-integracion-de-stripe-en-un-sitio-web-con-php\/\" title=\"Una gu\u00eda para la integraci\u00f3n de Stripe en un sitio web con PHP\">Una gu\u00eda para la integraci\u00f3n de Stripe en un sitio web con PHP<\/a><\/li>\n<\/ul>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fuente de grabaci\u00f3n:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/artisansweb.net\" class=\"external external_icon\">artisansweb.net<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>En esta publicaci\u00f3n, mostramos c\u00f3mo integrar la pasarela de pago de PayPal en PHP utilizando la API REST de PayPal. Con PayPal, puede aceptar pagos en l\u00ednea de sus clientes<\/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":[271],"tags":[849],"class_list":["post-29677","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-php-2","tag-affiai-es"],"_links":{"self":[{"href":"https:\/\/themewp.inform.click\/es\/wp-json\/wp\/v2\/posts\/29677","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/themewp.inform.click\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/themewp.inform.click\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/themewp.inform.click\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/themewp.inform.click\/es\/wp-json\/wp\/v2\/comments?post=29677"}],"version-history":[{"count":0,"href":"https:\/\/themewp.inform.click\/es\/wp-json\/wp\/v2\/posts\/29677\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/themewp.inform.click\/es\/wp-json\/wp\/v2\/media\/20134"}],"wp:attachment":[{"href":"https:\/\/themewp.inform.click\/es\/wp-json\/wp\/v2\/media?parent=29677"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/themewp.inform.click\/es\/wp-json\/wp\/v2\/categories?post=29677"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/themewp.inform.click\/es\/wp-json\/wp\/v2\/tags?post=29677"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}