58 votes

Comment ajouter une passerelle de paiement personnalisée à Social Engine

J'ai besoin d'intégrer une nouvelle passerelle de paiement de notre site web d'entreprise, qui est fondée sur le Moteur. Il y a une extension pour cette CMS appelé Advanced Passerelles de Paiement qui permet l'intégration de nouvelles passerelles. En fait, il devient de votre nom de passerelle et génère un squelette de la structure zippée dans un fichier de sorte que vous pouvez décompresser et de télécharger à votre serveur et donc de fusionner avec le répertoire de l'application.

Je vais vous expliquer comment je mettre en œuvre ma passerelle sans Moteur, et j'espère que quelqu'un peut me dire comment je peux l'intégrer dans Sociale du Moteur.

  1. J'ai d'abord se connecter à mon PSP service:

    $client = new nusoap_client('https://example.com/pgwchannel/services/pgw?wsdl');
    
  2. Je prépare les paramètres suivants dans un tableau à envoyer à l' 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 la demande de paiement est accepté, le résultat est une chaîne séparée par des virgules, avec le premier élément à 0.
    Ensuite, nous pouvons envoyer le deuxième élément (id de référence) pour le paiement passerelle comme suit via POST méthode:

    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://example.com/pgwchannel/startpay");         
            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. La passerelle sera de retour les paramètres suivants via POST méthode pour le retour d'appel URL que nous avons fournis dans la demande de paiement:
    RefId (référence id de produit dans les étapes précédentes)
    ResCode (Résultat de paiement: 0 dénote succès)
    saleOrderId (numéro de commande, tel qu'adopté lors de la demande de paiement)
    SaleReferenceId (vente code de référence est donnée par la PSP pour le marchand)

  5. Si ResCode dans l'étape précédente a été de 0, alors que nous aurions besoin de passer l'appel bpVerifyRequest avec les paramètres suivants afin de vérifier le paiement, sinon le paiement sera annulé.

     $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. Dans le cas où le résultat de l' bpVerifyRequest est égal à zéro, le paiement est certain, et le marchand doit fournir des biens ou des services achetés. Toutefois, il existe une méthode facultative bpSettleRequest, qui est utilisé pour la demande de règlement. Il est appelé comme suit:

    $parameters = array(
        'terminalId' => $terminalId,
        'userName' => $userName,
        'userPassword' => $userPassword,
        'orderId' => $orderId,
        'saleOrderId' => $settleSaleOrderId,
        'saleReferenceId' => $settleSaleReferenceId);

    // Call the SOAP method
    $result = $client->call('bpSettleRequest', $parameters, $namespace);

Je m'embrouille en regardant les passerelles par défaut dans les Passerelles de Paiement plugin par exemple PayPal, Stripe, 2Checkout, etc. Comment suis-je intégrer cette logique de code dans le nouvellement créé passerelle squelette? (la structure est représentée ci-dessous):
enter image description here

Vous pouvez consulter le code source complet ici:
default.php
callback.php

2voto

codezombie Points 765

J'ai résolu ce problème en ajoutant le code de paiement à l'intérieur de l' Engine_Payment_Gateway_MyGateway classe:

Une fois que l'utilisateur confirme sur le SocialEngine page qu'ils veulent payer, la méthode processTransaction() à l'intérieur de la catégorie est appelée et l'utilisateur est redirigé vers la PSP de paiement sécurisé de la page. Une fois qu'ils sont fait avec le paiement, c'est à dire payée avec succès ou de l'échec ou de l'annulation de la transaction, ils PSP page redirige vers la page que nous avait transmis plus tôt comme un paramètre appelé callBackUrl. Là, vous recevrez PSP-paramètres spécifiques qui vous aide à décider si le paiement a été un succès et de demander à la PSP avec un autre SAVON appeler pour confirmer le paiement et, éventuellement, de lui demander de s'installer (déposer de l'argent le plus tôt possible dans le compte du vendeur):

Ajouter à 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>";
                } 
            }
        }

Ajouter à votre rappel de l'action:

    $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>";

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X