Skip to content

Commit

Permalink
Merge pull request #177 from ampeco/master
Browse files Browse the repository at this point in the history
Setup Intent implementation & off_session payments for Payment Intent
  • Loading branch information
barryvdh authored May 29, 2020
2 parents 56c5735 + 2c88b82 commit a91faeb
Show file tree
Hide file tree
Showing 6 changed files with 350 additions and 2 deletions.
22 changes: 22 additions & 0 deletions src/Message/PaymentIntents/AuthorizeRequest.php
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,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 @@ -401,6 +421,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);
}
}

0 comments on commit a91faeb

Please sign in to comment.