Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Setup Intent implementation & off_session payments for Payment Intent #177

Merged
merged 4 commits into from
May 29, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 22 additions & 0 deletions src/Message/PaymentIntents/AuthorizeRequest.php
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,26 @@ public function getConfirm()
return $this->getParameter('confirm');
}

/**
* Set the confirm parameter.
*
* @param $value
*/
public function setOffSession($value)
{
$this->setParameter('offSession', $value);
}

/**
* Get the confirm parameter.
*
* @return mixed
*/
public function getOffSession()
{
return $this->getParameter('offSession');
}

/**
* @return mixed
*/
Expand Down Expand Up @@ -352,6 +372,8 @@ public function getData()
$this->validate('returnUrl');
$data['return_url'] = $this->getReturnUrl();
}
$data['off_session'] = $this->getOffSession() ? 'true' : 'false';


return $data;
}
Expand Down
38 changes: 38 additions & 0 deletions src/Message/SetupIntents/AbstractRequest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
<?php

/**
* Stripe Abstract Request.
*/

namespace Omnipay\Stripe\Message\SetupIntents;

/**
* Stripe Payment Intent Abstract Request.
*
* This is the parent class for all Stripe payment intent requests.
* It adds just a getter and setter.
*
* @see \Omnipay\Stripe\PaymentIntentsGateway
* @see \Omnipay\Stripe\Message\AbstractRequest
* @link https://stripe.com/docs/api/payment_intents
*/
abstract class AbstractRequest extends \Omnipay\Stripe\Message\AbstractRequest
{
/**
* @param string $value
*
* @return AbstractRequest provides a fluent interface.
*/
public function setSetupIntentReference($value)
{
return $this->setParameter('setupIntentReference', $value);
}

/**
* @return mixed
*/
public function getSetupIntentReference()
{
return $this->getParameter('setupIntentReference');
}
}
67 changes: 67 additions & 0 deletions src/Message/SetupIntents/CreateSetupIntentRequest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
<?php

/**
* Stripe Create Payment Method Request.
*/

namespace Omnipay\Stripe\Message\SetupIntents;

/**
* Stripe create setup intent
*
* ### Example
*
* <code>
*
* </code>
*
* @see \Omnipay\Stripe\Message\PaymentIntents\AttachPaymentMethodRequest
* @see \Omnipay\Stripe\Message\PaymentIntents\DetachPaymentMethodRequest
* @see \Omnipay\Stripe\Message\PaymentIntents\UpdatePaymentMethodRequest
* @link https://stripe.com/docs/api/setup_intents/create
*/
class CreateSetupIntentRequest extends AbstractRequest
{
/**
* @inheritdoc
*/
public function getData()
{
$data = [];

if ($this->getCustomerReference()) {
$data['customer'] = $this->getCustomerReference();
}
if ($this->getDescription()) {
$data['description'] = $this->getDescription();
}

if ($this->getMetadata()) {
$this['metadata'] = $this->getMetadata();
}
if ($this->getPaymentMethod()) {
$this['payment_method'] = $this->getPaymentMethod();
}

$data['usage'] = 'off_session';
$data['payment_method_types'][] = 'card';

return $data;
}

/**
* @inheritdoc
*/
public function getEndpoint()
{
return $this->endpoint . '/setup_intents';
}

/**
* @inheritdoc
*/
protected function createResponse($data, $headers = [])
{
return $this->response = new Response($this, $data, $headers);
}
}
145 changes: 145 additions & 0 deletions src/Message/SetupIntents/Response.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,145 @@
<?php

/**
* Stripe Payment Intents Response.
*/

namespace Omnipay\Stripe\Message\SetupIntents;

use Omnipay\Common\Message\ResponseInterface;
use Omnipay\Stripe\Message\Response as BaseResponse;

/**
* Stripe Payment Intents Response.
*
* This is the response class for all payment intents related responses.
*
* @see \Omnipay\Stripe\PaymentIntentsGateway
*/
class Response extends BaseResponse implements ResponseInterface
{
/**
* Get the status of a payment intents response.
*
* @return string|null
*/
public function getStatus()
{
if (isset($this->data['object']) && 'setup_intent' === $this->data['object']) {
return $this->data['status'];
}

return null;
}

/**
* Return true if the payment intent requires confirmation.
*
* @return bool
*/
public function requiresConfirmation()
{
return $this->getStatus() === 'requires_confirmation';
}

/**
* @inheritdoc
*/
public function getClientSecret()
{
if (isset($this->data['object']) && 'setup_intent' === $this->data['object']) {
if (!empty($this->data['client_secret'])) {
return $this->data['client_secret'];
}
}
}

/**
* @inheritdoc
*/
public function getCustomerReference()
{

if (isset($this->data['object']) && 'setup_intent' === $this->data['object']) {
if (!empty($this->data['customer'])) {
return $this->data['customer'];
}
}

return parent::getCustomerReference();
}

/**
* @inheritdoc
*/
public function isSuccessful()
{
if (isset($this->data['object']) && 'setup_intent' === $this->data['object']) {
return in_array($this->getStatus(), ['succeeded', 'requires_payment_method']);
}

return parent::isSuccessful();
}

/**
* @inheritdoc
*/
public function isCancelled()
{
if (isset($this->data['object']) && 'setup_intent' === $this->data['object']) {
return $this->getStatus() === 'canceled';
}

return parent::isCancelled();
}

/**
* @inheritdoc
*/
public function isRedirect()
{
if ($this->getStatus() === 'requires_action' || $this->getStatus() === 'requires_source_action') {
// Currently this gateway supports only manual confirmation, so any other
// next action types pretty much mean a failed transaction for us.
return (!empty($this->data['next_action']) && $this->data['next_action']['type'] === 'redirect_to_url');
}

return parent::isRedirect();
}

/**
* @inheritdoc
*/
public function getRedirectUrl()
{
return $this->isRedirect() ? $this->data['next_action']['redirect_to_url']['url'] : parent::getRedirectUrl();
}

/**
* Get the payment intent reference.
*
* @return string|null
*/
public function getSetupIntentReference()
{
if (isset($this->data['object']) && 'setup_intent' === $this->data['object']) {
return $this->data['id'];
}

return null;
}

/**
* Get the payment intent reference.
*
* @return string|null
*/
public function getPaymentMethod()
{
if (isset($this->data['object']) && 'setup_intent' === $this->data['object']) {
return $this->data['payment_method'];
}

return null;
}
}
55 changes: 55 additions & 0 deletions src/Message/SetupIntents/RetrieveSetupIntentRequest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
<?php

/**
* Stripe Create Payment Method Request.
*/

namespace Omnipay\Stripe\Message\SetupIntents;

/**
* Stripe create setup intent
*
* ### Example
*
* <code>
*
* </code>
*
* @see \Omnipay\Stripe\Message\PaymentIntents\AttachPaymentMethodRequest
* @see \Omnipay\Stripe\Message\PaymentIntents\DetachPaymentMethodRequest
* @see \Omnipay\Stripe\Message\PaymentIntents\UpdatePaymentMethodRequest
* @link https://stripe.com/docs/api/setup_intents/create
*/
class RetrieveSetupIntentRequest extends AbstractRequest
{
/**
* @inheritdoc
*/
public function getData()
{
$this->validate('setupIntentReference');

return [];
}

/**
* @inheritdoc
*/
public function getEndpoint()
{
return $this->endpoint . '/setup_intents/' . $this->getSetupIntentReference();
}

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

/**
* @inheritdoc
*/
protected function createResponse($data, $headers = [])
{
return $this->response = new Response($this, $data, $headers);
}
}
25 changes: 23 additions & 2 deletions src/PaymentIntentsGateway.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,8 @@
/**
* Stripe Payment Intents Gateway.
*/
namespace Omnipay\Stripe;

use Omnipay\Stripe\Message\PaymentIntents\Response;
namespace Omnipay\Stripe;

/**
* Stripe Payment Intents Gateway.
Expand Down Expand Up @@ -166,4 +165,26 @@ public function deleteCard(array $parameters = array())
{
return $this->createRequest('\Omnipay\Stripe\Message\PaymentIntents\DetachPaymentMethodRequest', $parameters);
}

// Setup Intent

/**
* @inheritdoc
*
* @return \Omnipay\Stripe\Message\SetupIntents\CreateSetupIntentRequest
*/
public function createSetupIntent(array $parameters = array())
{
return $this->createRequest('\Omnipay\Stripe\Message\SetupIntents\CreateSetupIntentRequest', $parameters);
}

/**
* @inheritdoc
*
* @return \Omnipay\Stripe\Message\SetupIntents\CreateSetupIntentRequest
*/
public function retrieveSetupIntent(array $parameters = array())
{
return $this->createRequest('\Omnipay\Stripe\Message\SetupIntents\RetrieveSetupIntentRequest', $parameters);
}
}