267 lines
5.8 KiB
PHP
267 lines
5.8 KiB
PHP
|
|
<?php
|
||
|
|
/**
|
||
|
|
* Abstract Response
|
||
|
|
*/
|
||
|
|
|
||
|
|
namespace Omnipay\Common\Message;
|
||
|
|
|
||
|
|
use Omnipay\Common\Exception\RuntimeException;
|
||
|
|
use Symfony\Component\HttpFoundation\RedirectResponse as HttpRedirectResponse;
|
||
|
|
use Symfony\Component\HttpFoundation\Response as HttpResponse;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Abstract Response
|
||
|
|
*
|
||
|
|
* This abstract class implements ResponseInterface and defines a basic
|
||
|
|
* set of functions that all Omnipay Requests are intended to include.
|
||
|
|
*
|
||
|
|
* Objects of this class or a subclass are usually created in the Request
|
||
|
|
* object (subclass of AbstractRequest) as the return parameters from the
|
||
|
|
* send() function.
|
||
|
|
*
|
||
|
|
* Example -- validating and sending a request:
|
||
|
|
*
|
||
|
|
* <code>
|
||
|
|
* $myResponse = $myRequest->send();
|
||
|
|
* // now do something with the $myResponse object, test for success, etc.
|
||
|
|
* </code>
|
||
|
|
*
|
||
|
|
*/
|
||
|
|
abstract class AbstractResponse implements ResponseInterface
|
||
|
|
{
|
||
|
|
|
||
|
|
/**
|
||
|
|
* The embodied request object.
|
||
|
|
*
|
||
|
|
* @var RequestInterface
|
||
|
|
*/
|
||
|
|
protected $request;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* The data contained in the response.
|
||
|
|
*
|
||
|
|
* @var mixed
|
||
|
|
*/
|
||
|
|
protected $data;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Constructor
|
||
|
|
*
|
||
|
|
* @param RequestInterface $request the initiating request.
|
||
|
|
* @param mixed $data
|
||
|
|
*/
|
||
|
|
public function __construct(RequestInterface $request, $data)
|
||
|
|
{
|
||
|
|
$this->request = $request;
|
||
|
|
$this->data = $data;
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Get the initiating request object.
|
||
|
|
*
|
||
|
|
* @return RequestInterface
|
||
|
|
*/
|
||
|
|
public function getRequest()
|
||
|
|
{
|
||
|
|
return $this->request;
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Is the response successful?
|
||
|
|
*
|
||
|
|
* @return boolean
|
||
|
|
*/
|
||
|
|
public function isPending()
|
||
|
|
{
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Does the response require a redirect?
|
||
|
|
*
|
||
|
|
* @return boolean
|
||
|
|
*/
|
||
|
|
public function isRedirect()
|
||
|
|
{
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Is the response a transparent redirect?
|
||
|
|
*
|
||
|
|
* @return boolean
|
||
|
|
*/
|
||
|
|
public function isTransparentRedirect()
|
||
|
|
{
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Is the transaction cancelled by the user?
|
||
|
|
*
|
||
|
|
* @return boolean
|
||
|
|
*/
|
||
|
|
public function isCancelled()
|
||
|
|
{
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Get the response data.
|
||
|
|
*
|
||
|
|
* @return mixed
|
||
|
|
*/
|
||
|
|
public function getData()
|
||
|
|
{
|
||
|
|
return $this->data;
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Response Message
|
||
|
|
*
|
||
|
|
* @return null|string A response message from the payment gateway
|
||
|
|
*/
|
||
|
|
public function getMessage()
|
||
|
|
{
|
||
|
|
return null;
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Response code
|
||
|
|
*
|
||
|
|
* @return null|string A response code from the payment gateway
|
||
|
|
*/
|
||
|
|
public function getCode()
|
||
|
|
{
|
||
|
|
return null;
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Gateway Reference
|
||
|
|
*
|
||
|
|
* @return null|string A reference provided by the gateway to represent this transaction
|
||
|
|
*/
|
||
|
|
public function getTransactionReference()
|
||
|
|
{
|
||
|
|
return null;
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Get the transaction ID as generated by the merchant website.
|
||
|
|
*
|
||
|
|
* @return string
|
||
|
|
*/
|
||
|
|
public function getTransactionId()
|
||
|
|
{
|
||
|
|
return null;
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Gets the redirect target url.
|
||
|
|
*
|
||
|
|
* @return string
|
||
|
|
*/
|
||
|
|
public function getRedirectUrl()
|
||
|
|
{
|
||
|
|
return null;
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Get the required redirect method (either GET or POST).
|
||
|
|
*
|
||
|
|
* @return string
|
||
|
|
*/
|
||
|
|
public function getRedirectMethod()
|
||
|
|
{
|
||
|
|
return 'GET';
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Gets the redirect form data array, if the redirect method is POST.
|
||
|
|
*
|
||
|
|
* @return array
|
||
|
|
*/
|
||
|
|
public function getRedirectData()
|
||
|
|
{
|
||
|
|
return [];
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Automatically perform any required redirect
|
||
|
|
*
|
||
|
|
* This method is meant to be a helper for simple scenarios. If you want to customize the
|
||
|
|
* redirection page, just call the getRedirectUrl() and getRedirectData() methods directly.
|
||
|
|
*
|
||
|
|
* @return void
|
||
|
|
*/
|
||
|
|
public function redirect()
|
||
|
|
{
|
||
|
|
$this->getRedirectResponse()->send();
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @return HttpRedirectResponse|HttpResponse
|
||
|
|
*/
|
||
|
|
public function getRedirectResponse()
|
||
|
|
{
|
||
|
|
$this->validateRedirect();
|
||
|
|
|
||
|
|
if ('GET' === $this->getRedirectMethod()) {
|
||
|
|
return new HttpRedirectResponse($this->getRedirectUrl());
|
||
|
|
}
|
||
|
|
|
||
|
|
$hiddenFields = '';
|
||
|
|
foreach ($this->getRedirectData() as $key => $value) {
|
||
|
|
$hiddenFields .= sprintf(
|
||
|
|
'<input type="hidden" name="%1$s" value="%2$s" />',
|
||
|
|
htmlentities($key, ENT_QUOTES, 'UTF-8', false),
|
||
|
|
htmlentities((string) $value, ENT_QUOTES, 'UTF-8', false)
|
||
|
|
)."\n";
|
||
|
|
}
|
||
|
|
|
||
|
|
$output = '<!DOCTYPE html>
|
||
|
|
<html>
|
||
|
|
<head>
|
||
|
|
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
||
|
|
<title>Redirecting...</title>
|
||
|
|
</head>
|
||
|
|
<body onload="document.forms[0].submit();">
|
||
|
|
<form action="%1$s" method="post">
|
||
|
|
<p>Redirecting to payment page...</p>
|
||
|
|
<p>
|
||
|
|
%2$s
|
||
|
|
<input type="submit" value="Continue" />
|
||
|
|
</p>
|
||
|
|
</form>
|
||
|
|
</body>
|
||
|
|
</html>';
|
||
|
|
$output = sprintf(
|
||
|
|
$output,
|
||
|
|
htmlentities($this->getRedirectUrl(), ENT_QUOTES, 'UTF-8', false),
|
||
|
|
$hiddenFields
|
||
|
|
);
|
||
|
|
|
||
|
|
return new HttpResponse($output);
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Validate that the current Response is a valid redirect.
|
||
|
|
*
|
||
|
|
* @return void
|
||
|
|
*/
|
||
|
|
protected function validateRedirect()
|
||
|
|
{
|
||
|
|
if (!$this instanceof RedirectResponseInterface || !$this->isRedirect()) {
|
||
|
|
throw new RuntimeException('This response does not support redirection.');
|
||
|
|
}
|
||
|
|
|
||
|
|
if (empty($this->getRedirectUrl())) {
|
||
|
|
throw new RuntimeException('The given redirectUrl cannot be empty.');
|
||
|
|
}
|
||
|
|
|
||
|
|
if (!in_array($this->getRedirectMethod(), ['GET', 'POST'])) {
|
||
|
|
throw new RuntimeException('Invalid redirect method "'.$this->getRedirectMethod().'".');
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|