Отправка в конечную точку, чтобы получить URL-адрес перенаправления перед покупкой

Я пытаюсь создать собственный драйвер omnipay для локального шлюза, называемого creditguard. Для этого шлюза вам необходимо отправить данные в конечную точку и вернуть URL-адрес перенаправления для формы платежа.

Мой вопрос: как вы отправляете сообщение и получаете ответ перед покупкой?

Edit:

gateway.php

    class Gateway extends AbstractGateway
{
    public function getName()
    {
        return 'Creditguard';
    }

    public function getDefaultParameters()
    {
        return array();

    }

    public function getEndpoint()
    {
        return 'https://verifonetest.creditguard.co.il/xpo/Relay';
    }



    public function purchase(array $parameters = array())
    {
       return $this->createRequest('\Nirz\Creditguard\Message\PurchaseRequest', $parameters);

    }

    public function completePurchase(array $parameters = array())
    {
        return $this->createRequest('\Nirz\Creditguard\Message\CompletePurchaseRequest', $parameters);
    }

}

PurchaseRequest.php

  class PurchaseRequest extends AbstractRequest
{
    protected $liveEndpoint = 'https://verifonetest.creditguard.co.il/xpo/Relay';
    protected $testEndpoint = 'https://verifonetest.creditguard.co.il/xpo/Relay';


    public function getData()
    {
        $this->validate('amount');

        // Either the nodifyUrl or the returnUrl can be provided.
        // The returnUrl is deprecated, as strictly this is a notifyUrl.
        if (!$this->getNotifyUrl()) {
            $this->validate('returnUrl');
        }

        $data = array();
        $data['user'] = 'user';
        $data['password'] = 'password';
        $data['tid'] = '11111111';
        $data['mid'] = '111111';
        $data['amount'] = '20000';
        $data['int_in'] = '<ashrait>
                           <request>
                            <version>1000</version>
                            <language>HEB</language>
                            <dateTime></dateTime>
                            <command>doDeal</command>
                            <doDeal>
                                 <terminalNumber>'.$data['tid'].'</terminalNumber>
                                 <mainTerminalNumber/>
                                 <cardNo>CGMPI</cardNo>
                                 <total>'.$data['amount'].'</total>
                                 <transactionType>Debit</transactionType>
                                 <creditType>RegularCredit</creditType>
                                 <currency>ILS</currency>
                                 <transactionCode>Phone</transactionCode>
                                 <authNumber/>
                                 <numberOfPayments/>
                                 <firstPayment/>
                                 <periodicalPayment/>
                                 <validation>TxnSetup</validation>
                                 <dealerNumber/>
                                 <user>'. $data['user'] .'</user>
                                 <mid>'.$data['mid'].'</mid>
                                 <uniqueid>'.time().rand(100,1000).'</uniqueid>
                                 <mpiValidation>autoComm</mpiValidation>
                                 <email>[email protected]</email>
                                 <clientIP/>
                                 <customerData>
                                  <userData1/>
                                  <userData2/>
                                  <userData3/>
                                  <userData4/>
                                  <userData5/>
                                  <userData6/>
                                  <userData7/>
                                  <userData8/>
                                  <userData9/>
                                  <userData10/>
                                 </customerData>
                            </doDeal>
                           </request>
                          </ashrait>';

        return $data;
    }

    public function sendData($data)
    {
        // $httpResponse = $this->httpClient->post($this->getEndpoint(), null, $data);
        return $this->response = new PurchaseResponse($this, $data);
    }

    public function getEndpoint()
    {
        return $this->getTestMode() ? $this->testEndpoint : $this->liveEndpoint;
    }
}

PurchaseResponse.php

    class PurchaseResponse extends AbstractResponse implements RedirectResponseInterface
{
    public function isSuccessful()
    {
        return false;
    }

    public function isRedirect()
    {
        return true;
    }

    public function getRedirectUrl()
    {
        // return $this->getRequest()->getEndpoint().'?'.http_build_query($this->data);
        return $this->getRequest()->data['mpiHostedPageUrl'];
        // return isset($this->data['mpiHostedPageUrl']) ? $this->data['mpiHostedPageUrl'] : null;
    }

    public function getRedirectMethod()
    {
        return 'GET';
    }

    public function getRedirectData()
    {
        return [];

    }
}

Не уверен, как получить ответ mpiHostedPageUrl, чтобы я мог перенаправить на правильный URL.

Ответ 1

Предполагая, что this является рассматриваемой документацией платежного шлюза.

Вы просто продолжаете и делаете запрос на транзакцию, клиенту не будет предъявлено обвинение, поскольку они должны будут авторизовать его на следующей странице, указав свои платежные реквизиты.

Ответ этого запроса транзакции содержит элемент mpiHostedPageUrl, который вы можете увидеть на странице 13 этого документа, который содержит URL-адрес, который вам нужно получить от ответа, чтобы предоставить перенаправление.

Ответ 2

HATEOAS (Hypermedia как механизм состояния приложения) - это способ организации ответа на заявку REST. В мире HATEOAS ответ JSON может содержать все URL, которые могут понадобиться клиенту. Например, в github API ответ содержит URL-адрес для доступа к репозиторию, пользователя, запроса на перенос...

Итак, я предлагаю вам позвонить шлюзу с первым POST-запросом, а затем, согласно ответу JSON, вызвать предоставленный URL-адрес, который будет представлять собой перенаправление.

Ответ 3

Другим решением может быть использование шлюза ZUUL (в Spring -Boot), который будет выполнять перенаправление для вас.

Вы можете найти описание здесь: https://spring.io/guides/gs/routing-and-filtering/