una tpv tarjeta sitio sistema plataformas plataforma pasarelas pasarela pagos pago online latinoamerica implementar hacer con como php customization payment-gateway socialengine

php - tpv - plataformas de pago online



Cómo agregar una pasarela de pago personalizada a Social Engine (1)

Engine_Payment_Gateway_MyGateway esto agregando el código de pago dentro de la clase Engine_Payment_Gateway_MyGateway :

Una vez que el usuario confirma en la página de SocialEngine que desea pagar, se processTransaction() al método processTransaction() dentro de la clase mencionada y se redirige al usuario a la página de pago seguro de PSP. Una vez que hayan terminado con el pago, es decir, hayan pagado con éxito o hayan fallado o cancelado la transacción, la página de PSP los redirige a la página que le habíamos enviado anteriormente como un parámetro llamado callBackUrl. Allí, recibirá parámetros específicos de PSP que lo ayudarán a decidir si el pago fue exitoso y solicitarle al PSP con otra llamada SOAP que confirme el pago y luego opcionalmente solicite que se liquide (deposite dinero lo antes posible en la cuenta del vendedor):

Añadir a processTransaction () :

$data = array(); $rawData = $transaction->getRawData(); //Save order ID for later $this->_orderId = $rawData[''vendor_order_id'']; $this->_grandTotal = $rawData[''AMT'']; $client = new nusoap_client(''https://example.com/pgwchannel/services/pgw?wsdl''); $namespace = ''http://interfaces.core.sw.example.com/''; // Check for an error $err = $client->getError(); if ($err) { echo ''<h2>Constructor error</h2><pre>'' . $err . ''</pre>''; die(); } /* Set variables */ //Get price from SEAO //$order_ids = Engine_Api::_()->getDbTable(''orders'',''sitestoreproduct'')->getOrderIds($this->parent_id); //$price = Engine_Api::_()->getDbTable(''orders'',''sitestoreproduct'')->getGrandTotal($this->parent_id); $terminalId = ''1111111''; $userName = ''username''; $userPassword = ''1111111''; $orderId = $rawData[''vendor_order_id'']; $amount = $rawData[''AMT'']; $localDate = date("Y") . date("m") . date("d"); $localTime = date("h") . date("i") . date("s"); $additionalData = $rawData[''return_url'']; $callBackUrl = ''https://example.com/pgateway/pay/callback''; $payerId = ''0''; /* Define parameters array */ $parameters = array( ''terminalId'' => $terminalId, ''userName'' => $userName, ''userPassword'' => $userPassword, ''orderId'' => $orderId, ''amount'' => $amount, ''localDate'' => $localDate, ''localTime'' => $localTime, ''additionalData'' => $additionalData, ''callBackUrl'' => $callBackUrl, ''payerId'' => $payerId ); $result = $client->call(''bpPayRequest'', $parameters, $namespace); if ($client->fault) { echo ''<h2>Fault</h2><pre>''; print_r($result); echo ''</pre>''; die(); } else { //Check for errors $error = $client->getError(); if ($error) { echo "An error occurred: "; print_r($error); die(); } else { //break the code $resultSegmts = explode('','', $result); $ResCode = $resultSegmts [0]; if ($ResCode == "0") { //Notify admin of the order echo ''<h3>Redirecting you to the payment page. Please wait...</h3><br/>''; echo ''<script language="javascript" type="text/javascript"> postRefId("'' . $resultSegmts[1] . ''"); </script>''; } elseif ($ResCode == "25") { echo "<h3>Purchase successful</h3>"; } else { echo "<h3>PSP response is: $ResCode</h3>"; } } }

Agregue a su acción callBack :

$this->view->message = ''This is callback action for PayController''; $RefId = $_POST[''RefId'']; $ResCode = $_POST[''ResCode'']; $saleOrderId = $_POST[''SaleOrderId'']; $saleReferenceId = $_POST[''SaleReferenceId'']; $this->_orderId = $saleOrderId; $this->view->RefId = $RefId; $this->view->saleOlderId = $saleOrderId; $this->view->saleReferenceId = $saleReferenceId; } if ($ResCode == "0") { try { $client = new nusoap_client(''https://example.com/pgwchannel/services/pgw?wsdl''); } catch (Exception $e) { die($e->getMessage()); } $namespace = ''http://interfaces.core.sw.example.com/''; $terminalId = "111111"; $userName = "username"; $userPassword = "11111111"; $parameters = array( ''terminalId'' => $terminalId, ''userName'' => $userName, ''userPassword'' => $userPassword, ''orderId'' => $saleOrderId, ''saleOrderId'' => $saleOrderId, ''saleReferenceId'' => $saleReferenceId ); $resVerify = $client->call(''bpVerifyRequest'', $parameters, $namespace); if ($resVerify->fault) { //Check for fault echo "<h1>Fault: </h1>"; print_r($result); die(); } else { //No fault: check for errors now $err = $client->getError(); if ($err) { echo "<h1>Error: " . $err . " </h1>"; } else { if ($resVerify == "0") {//Check verification response: if 0, then purchase was successful. echo "<div class=''center content green''>Payment successful. Thank you for your order.</div>"; $this->view->message = $this->_translate(''Thanks for your purchase.''); $this->dbSave(); //update database table } else echo "<script language=''javascript'' type=''text/javascript''>alert( ''Verification Response: " . $resVerify . "'');</script>"; } } //Note that we need to send bpSettleRequest to PSP service to request settlement once we have verified the payment if ($resVerify == "0") { // Update table, Save RefId //Create parameters array for settle $this->sendEmail(); $this->sendSms(); $resSettle = $client->call(''bpSettleRequest'', $parameters, $namespace); //Check for fault if ($resSettle->fault) { echo "<h1>Fault: </h1><br/><pre>"; print_r($resSettle); echo "</pre>"; die(); } else { //No fault in bpSettleRequest result $err = $client->getError(); if ($err) { echo "<h1>Error: </h1><pre>" . $err . "</pre>"; die(); } else { if ($resSettle == "0" || $resSettle == "45") {//Settle request successful // echo "<script language=''javascript'' type=''text/javascript''>alert(''Payment successful'');</script>"; } } } } } else { echo "<div class=''center content error''>Payment failed. Please try again later.</div> "; // log error in app // Update table, log the error // Show proper message to user } $returnUrl = ''https://example.com/stores/products''; //Go to store home for now. Later I''ll set this to the last page echo "<div class=''center''>"; echo "<form action=$returnUrl method=''POST''>"; echo "<input class=''center'' id=''returnstore'' type=''submit'' value=''Return to store''/>"; echo "</form>"; echo "</div>";

Necesito integrar una nueva pasarela de pago a nuestro sitio web corporativo, que se basa en Social Engine. Hay una extensión para este CMS llamada Pasarelas de pago avanzadas que permite la integración de nuevas pasarelas. De hecho, obtiene el nombre de su puerta de enlace y genera una estructura de esqueleto comprimida como un archivo para que pueda descomprimir y cargar en su servidor y así fusionarse con el directorio de la aplicación.

Voy a explicar cómo implemento mi puerta de enlace sin Social Engine, y espero que alguien pueda decirme cómo puedo incorporar eso en Social Engine.

  1. Primero me conecto a mi servicio de PSP :

    $client = new nusoap_client(''https://bpm.shaparak.ir/pgwchannel/services/pgw?wsdl'');

  2. bpPayRequest los siguientes parámetros en una matriz para enviar a bpPayRequest :

    $parameters = array( ''terminalId'' => $terminalId, ''userName'' => $userName, ''userPassword'' => $userPassword, ''orderId'' => $orderId, ''amount'' => $amount, ''localDate'' => $localDate, ''localTime'' => $localTime, ''additionalData'' => $additionalData, ''callBackUrl'' => $callBackUrl, ''payerId'' => $payerId); // Call the SOAP method $result = $client->call(''bpPayRequest'', $parameters, $namespace);

  3. Si se acepta la solicitud de pago, el resultado es una cadena separada por comas, con el primer elemento en 0 .
    Luego podemos enviar el segundo elemento (id de referencia) a la pasarela de pago de la siguiente manera a través del método POST :

    echo "<script language=''javascript'' type=''text/javascript''>postRefId(''" . $res[1] . "'');</script>"; <script language="javascript" type="text/javascript"> function postRefId (refIdValue) { var form = document.createElement("form"); form.setAttribute("method", "POST"); form.setAttribute("action", "https://bpm.shaparak.ir/pgwchannel/startpay.mellat"); form.setAttribute("target", "_self"); var hiddenField = document.createElement("input"); hiddenField.setAttribute("name", "RefId"); hiddenField.setAttribute("value", refIdValue); form.appendChild(hiddenField); document.body.appendChild(form); form.submit(); document.body.removeChild(form); } </script>

  4. El portal devolverá los siguientes parámetros a través del método POST a la URL devolución de llamada que proporcionamos en la solicitud de pago:
    RefId (ID de referencia como se produjo en los pasos anteriores)
    ResCode (Resultado del pago: 0 denota éxito)
    saleOrderId (ID del pedido tal como se aprobó durante la solicitud de pago)
    SaleReferenceId (PSP proporciona el código de referencia de venta al comerciante)

  5. Si ResCode en el paso anterior fue 0 , entonces tendríamos que pasar la llamada bpVerifyRequest con los siguientes parámetros para verificar el pago; de lo contrario, el pago se cancelará.

    $parameters = array( ''terminalId'' => $terminalId, ''userName'' => $userName, ''userPassword'' => $userPassword, ''orderId'' => $orderId, ''saleOrderId'' => $verifySaleOrderId, ''saleReferenceId'' => $verifySaleReferenceId); // Call the SOAP method $result = $client->call(''bpVerifyRequest'', $parameters, $namespace);

  6. En caso de que el resultado de bpVerifyRequest sea ​​cero, el pago es seguro y el comerciante debe proporcionar los bienes o servicios adquiridos. Sin embargo, existe un método opcional bpSettleRequest , que se utiliza para solicitar una liquidación. Se llama de la siguiente manera:

$parameters = array( ''terminalId'' => $terminalId, ''userName'' => $userName, ''userPassword'' => $userPassword, ''orderId'' => $orderId, ''saleOrderId'' => $settleSaleOrderId, ''saleReferenceId'' => $settleSaleReferenceId); // Call the SOAP method $result = $client->call(''bpSettleRequest'', $parameters, $namespace);

Me confundo mirando las puertas de enlace predeterminadas en el complemento de Pasarelas de pago, por ejemplo, PayPal, Stripe, 2Checkout, etc. ¿Cómo incorporo esta lógica de código en el esqueleto de puerta de enlace recién creado? (la estructura se muestra a continuación):

Puede consultar el código fuente completo aquí:
default.php
callback.php