发布到端点以在购买前获取重定向网址

时间:2017-08-31 10:23:50

标签: php guzzle omnipay guzzlehttp

我正在尝试为名为creditguard的本地网关创建自定义的omnipay驱动程序。 对于此网关,您需要将数据发布到端点并返回付款表单的重定向网址。

我的问题是如何在购买之前发布并获得回复?

编辑:

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>someone@creditguard.co.il</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,以便我可以重定向到正确的网址。

3 个答案:

答案 0 :(得分:2)

假设this是相关的支付网关文档。

您只需继续进行交易请求,客户将不会被收取费用,因为他们必须通过输入付款详细信息在下一页上对其进行授权。

该交易请求的响应包含一个元素mpiHostedPageUrl,您可以在该文档的第13页上看到该元素,其中包含您需要从响应中获取的URL以提供重定向。

答案 1 :(得分:-1)

HATEOAS(超媒体作为应用程序状态的引擎)是一种组织REST应用程序响应的方法。 在HATEOAS世界中,响应JSON可能包含客户端可能需要的所有URL。例如,在github API中,响应包含用于访问存储库,用户,拉取请求的URL ...

因此,我建议您使用第一个POST请求调用网关,然后根据JSON响应调用提供的URL来表示重定向。

答案 2 :(得分:-1)

另一种解决方案可能是使用ZUUL网关(在Spring-Boot中),它将为您执行重定向。

您可以在此处找到说明:https://spring.io/guides/gs/routing-and-filtering/