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.
-
Primero me conecto a mi servicio de
PSP
:$client = new nusoap_client(''https://bpm.shaparak.ir/pgwchannel/services/pgw?wsdl'');
-
bpPayRequest
los siguientes parámetros en una matriz para enviar abpPayRequest
:$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);
-
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étodoPOST
: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>
-
El portal devolverá los siguientes parámetros a través del método
POST
a laURL
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) -
Si
ResCode
en el paso anterior fue 0 , entonces tendríamos que pasar la llamadabpVerifyRequest
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);
-
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 opcionalbpSettleRequest
, 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