IT Share you

Social Engine에 사용자 지정 결제 게이트웨이를 추가하는 방법

shareyou 2020. 12. 5. 10:58
반응형

Social Engine에 사용자 지정 결제 게이트웨이를 추가하는 방법


Social Engine을 기반으로하는 회사 웹 사이트에 새로운 결제 게이트웨이를 통합해야합니다. CMS새로운 게이트웨이를 통합 할 수있는 고급 결제 게이트웨이라는 확장이 있습니다. 실제로 게이트웨이 이름을 가져 와서 파일로 압축 된 스켈레톤 구조를 생성하므로 압축을 풀고 서버에 업로드하여 애플리케이션 디렉토리와 병합 할 수 있습니다.

저는 Social Engine없이 게이트웨이를 구현하는 방법을 설명 할 것이며, 누군가가이를 Social Engine에 통합 할 수있는 방법을 알려줄 수 있기를 바랍니다.

  1. 먼저 내 PSP서비스에 연결합니다 .

    $client = new nusoap_client('https://example.com/pgwchannel/services/pgw?wsdl');
    
  2. 보낼 배열에 다음 매개 변수를 준비합니다 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. 결제 요청이 수락되면 결과는 쉼표로 구분 된 문자열이며 첫 번째 요소는 0 입니다.
    그런 다음 두 번째 요소 (참조 ID)를 다음과 같이 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://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. 게이트웨이는 결제 요청에서 제공 POST한 콜백에 메서드를 통해 다음 매개 변수를 반환합니다 URL.
    RefId(이전 단계에서 생성 된 참조 ID)
    ResCode(결제 결과 : 0은 성공을 나타냄)
    saleOrderId(결제 요청 중 전달 된 주문 ID)
    SaleReferenceId(판매 참조 코드는 PSP가 판매자에게 제공합니다)

  5. 경우 ResCode이전 단계에 있었다 0 , 우리는 호출 전달해야 할 것 bpVerifyRequest그렇지 않으면 지급이 취소됩니다 지불을 확인하려면 다음 매개 변수를.

     $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. 결과 bpVerifyRequest가 0 인 경우 결제는 확실하며 가맹점은 구매 한 상품이나 서비스를 제공해야합니다. 그러나 bpSettleRequest정산을 요청하는 데 사용되는 선택적 방법 이 있습니다. 다음과 같이 호출됩니다.

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

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

PayPal, Stripe, 2Checkout 등과 같은 Payment Gateways 플러그인의 기본 게이트웨이를 보면 혼란스러워집니다.이 코드 로직을 새로 생성 된 게이트웨이 스켈레톤에 어떻게 통합합니까? (구조는 아래와 같습니다) :
enter image description here

여기에서 전체 소스 코드를 확인할 수 있습니다.
default.php
callback.php


Engine_Payment_Gateway_MyGateway클래스 내부에 결제 코드를 추가하여이 문제를 해결했습니다 .

사용자가 SocialEngine 페이지에서 지불을 원하는 것을 확인 processTransaction()하면 언급 된 클래스 내의 메소드 가 호출되고 사용자는 PSP의 지불 보안 페이지로 리디렉션됩니다. 결제가 완료되면 (예 : 결제 성공 또는 실패 또는 거래 취소) PSP의 페이지는 이전에 callBackUrl이라는 매개 변수로 전송 한 페이지로 리디렉션합니다. 거기에서 지불이 성공했는지 여부를 결정하고 다른 SOAP 호출로 PSP에 지불을 확인하도록 요청한 다음 선택적으로 결제를 요청하는 데 도움이되는 PSP 관련 매개 변수를 받게됩니다 (판매자의 계정에 최대한 빨리 돈을 입금).

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

콜백 액션에 추가 :

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

참고URL : https://stackoverflow.com/questions/46011754/how-to-add-a-custom-payment-gateway-to-social-engine

반응형