Thanks to visit codestin.com
Credit goes to github.com

Skip to content
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
96 changes: 52 additions & 44 deletions lib/Shift4/Shift4Gateway.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
use Shift4\Connection\CurlConnection;
use Shift4\Exception\Shift4Exception;
use Shift4\Util\ObjectSerializer;
use Shift4\Util\RequestOptions;

class Shift4Gateway
{
Expand Down Expand Up @@ -40,18 +41,18 @@ public function __construct($privateKey = null, Connection $connection = null)
* @param \Shift4\Request\ChargeRequest $request
* @return \Shift4\Response\Charge
*/
public function createCharge($request)
public function createCharge($request, RequestOptions $requestOptions = null)
{
return $this->post('/charges', $request, '\Shift4\Response\Charge');
return $this->post('/charges', $request, '\Shift4\Response\Charge', $requestOptions);
}

/**
* @param \Shift4\Request\CaptureRequest $request
* @return \Shift4\Response\Charge
*/
public function captureCharge($request)
public function captureCharge($request, RequestOptions $requestOptions = null)
{
return $this->post('/charges/{chargeId}/capture', $request, '\Shift4\Response\Charge');
return $this->post('/charges/{chargeId}/capture', $request, '\Shift4\Response\Charge', $requestOptions);
}

/**
Expand All @@ -67,9 +68,9 @@ public function retrieveCharge($chargeId)
* @param \Shift4\Request\ChargeUpdateRequest $request
* @return \Shift4\Response\Charge
*/
public function updateCharge($request)
public function updateCharge($request, RequestOptions $requestOptions = null)
{
return $this->post('/charges/{chargeId}', $request, '\Shift4\Response\Charge');
return $this->post('/charges/{chargeId}', $request, '\Shift4\Response\Charge', $requestOptions);
}

/**
Expand All @@ -78,9 +79,9 @@ public function updateCharge($request)
*
* @deprecated For backward compatibility only. Use "createRefund($request)".
*/
public function refundCharge($request)
public function refundCharge($request, RequestOptions $requestOptions = null)
{
return $this->createRefund($request);
return $this->createRefund($request, $requestOptions);
}

/**
Expand All @@ -96,9 +97,9 @@ public function listCharges($request = null)
* @param \Shift4\Request\CustomerRequest $request
* @return \Shift4\Response\Customer
*/
public function createCustomer($request)
public function createCustomer($request, RequestOptions $requestOptions = null)
{
return $this->post('/customers', $request, '\Shift4\Response\Customer');
return $this->post('/customers', $request, '\Shift4\Response\Customer', $requestOptions);
}

/**
Expand All @@ -114,9 +115,9 @@ public function retrieveCustomer($customerId)
* @param \Shift4\Request\CustomerUpdateRequest $request
* @return \Shift4\Response\Customer
*/
public function updateCustomer($request)
public function updateCustomer($request, RequestOptions $requestOptions = null)
{
return $this->post('/customers/{customerId}', $request, '\Shift4\Response\Customer');
return $this->post('/customers/{customerId}', $request, '\Shift4\Response\Customer', $requestOptions);
}

/**
Expand All @@ -141,9 +142,9 @@ public function listCustomers($request = null)
* @param \Shift4\Request\CardRequest $request
* @return \Shift4\Response\Card
*/
public function createCard($request)
public function createCard($request, RequestOptions $requestOptions = null)
{
return $this->post('/customers/{customerId}/cards', $request, '\Shift4\Response\Card');
return $this->post('/customers/{customerId}/cards', $request, '\Shift4\Response\Card', $requestOptions);
}

/**
Expand All @@ -160,9 +161,9 @@ public function retrieveCard($customerId, $cardId)
* @param \Shift4\Request\CardUpdateRequest $request
* @return \Shift4\Response\Card
*/
public function updateCard($request)
public function updateCard($request, RequestOptions $requestOptions = null)
{
return $this->post('/customers/{customerId}/cards/{cardId}', $request, '\Shift4\Response\Card');
return $this->post('/customers/{customerId}/cards/{cardId}', $request, '\Shift4\Response\Card', $requestOptions);
}

/**
Expand Down Expand Up @@ -197,9 +198,9 @@ public function retrievePaymentMethod($paymentMethodId)
* @param \Shift4\Request\PaymentMethodRequest $request
* @return \Shift4\Response\PaymentMethod
*/
public function createPaymentMethod($request)
public function createPaymentMethod($request, RequestOptions $requestOptions = null)
{
return $this->post("/payment-methods", $request, '\Shift4\Response\PaymentMethod');
return $this->post("/payment-methods", $request, '\Shift4\Response\PaymentMethod', $requestOptions);
}

/**
Expand All @@ -224,9 +225,9 @@ public function listPaymentMethods($request)
* @param \Shift4\Request\SubscriptionRequest $request
* @return \Shift4\Response\Subscription
*/
public function createSubscription($request)
public function createSubscription($request, RequestOptions $requestOptions = null)
{
return $this->post('/customers/{customerId}/subscriptions', $request, '\Shift4\Response\Subscription');
return $this->post('/customers/{customerId}/subscriptions', $request, '\Shift4\Response\Subscription', $requestOptions);
}

/**
Expand All @@ -243,9 +244,9 @@ public function retrieveSubscription($customerId, $subscriptionId)
* @param \Shift4\Request\SubscriptionUpdateRequest $request
* @return \Shift4\Response\Subscription
*/
public function updateSubscription($request)
public function updateSubscription($request, RequestOptions $requestOptions = null)
{
return $this->post('/customers/{customerId}/subscriptions/{subscriptionId}', $request, '\Shift4\Response\Subscription');
return $this->post('/customers/{customerId}/subscriptions/{subscriptionId}', $request, '\Shift4\Response\Subscription', $requestOptions);
}

/**
Expand All @@ -270,9 +271,9 @@ public function listSubscriptions($request)
* @param \Shift4\Request\PlanRequest $request
* @return \Shift4\Response\Plan
*/
public function createPlan($request)
public function createPlan($request, RequestOptions $requestOptions = null)
{
return $this->post('/plans', $request, '\Shift4\Response\Plan');
return $this->post('/plans', $request, '\Shift4\Response\Plan', $requestOptions);
}

/**
Expand All @@ -288,9 +289,9 @@ public function retrievePlan($planId)
* @param \Shift4\Request\PlanUpdateRequest $request
* @return \Shift4\Response\Plan
*/
public function updatePlan($request)
public function updatePlan($request, RequestOptions $requestOptions = null)
{
return $this->post('/plans/{planId}', $request, '\Shift4\Response\Plan');
return $this->post('/plans/{planId}', $request, '\Shift4\Response\Plan', $requestOptions);
}

/**
Expand Down Expand Up @@ -351,9 +352,9 @@ public function retrieveToken($tokenId)
* @param \Shift4\Request\BlacklistRuleRequest $request
* @return \Shift4\Response\BlacklistRule
*/
public function createBlacklistRule($request)
public function createBlacklistRule($request, RequestOptions $requestOptions = null)
{
return $this->post('/blacklist', $request, '\Shift4\Response\BlacklistRule');
return $this->post('/blacklist', $request, '\Shift4\Response\BlacklistRule', $requestOptions);
}

/**
Expand Down Expand Up @@ -387,9 +388,9 @@ public function listBlacklistRules($request = null)
* @param \Shift4\Request\CreditRequest $request
* @return \Shift4\Response\Credit
*/
public function createCredit($request)
public function createCredit($request, RequestOptions $requestOptions = null)
{
return $this->post('/credits', $request, '\Shift4\Response\Credit');
return $this->post('/credits', $request, '\Shift4\Response\Credit', $requestOptions);
}

/**
Expand All @@ -405,9 +406,9 @@ public function retrieveCredit($creditId)
* @param \Shift4\Request\CreditUpdateRequest $request
* @return \Shift4\Response\Credit
*/
public function updateCredit($request)
public function updateCredit($request, RequestOptions $requestOptions = null)
{
return $this->post('/credits/{creditId}', $request, '\Shift4\Response\Credit');
return $this->post('/credits/{creditId}', $request, '\Shift4\Response\Credit', $requestOptions);
}

/**
Expand Down Expand Up @@ -463,18 +464,18 @@ public function retrieveDispute($disputeId)
* @param \Shift4\Request\DisputeUpdateRequest $request
* @return \Shift4\Response\Dispute
*/
public function updateDispute($request)
public function updateDispute($request, RequestOptions $requestOptions = null)
{
return $this->post('/disputes/{disputeId}', $request, '\Shift4\Response\Dispute');
return $this->post('/disputes/{disputeId}', $request, '\Shift4\Response\Dispute', $requestOptions);
}

/**
* @param string $disputeId
* @return \Shift4\Response\Dispute
*/
public function closeDispute($disputeId)
public function closeDispute($disputeId, RequestOptions $requestOptions = null)
{
return $this->post("/disputes/{$disputeId}/close", null, '\Shift4\Response\Dispute');
return $this->post("/disputes/{$disputeId}/close", null, '\Shift4\Response\Dispute', $requestOptions);
}

/**
Expand Down Expand Up @@ -517,9 +518,9 @@ public function retrieveRefund($refundId)
* @param \Shift4\Request\RefundRequest $request
* @return \Shift4\Response\Refund
*/
public function createRefund($request)
public function createRefund($request, RequestOptions $requestOptions = null)
{
return $this->post('/refunds', $request, '\Shift4\Response\Refund');
return $this->post('/refunds', $request, '\Shift4\Response\Refund', $requestOptions);
}

/**
Expand All @@ -543,9 +544,9 @@ public function retrievePayout($payoutId)
/**
* @return \Shift4\Response\Payout
*/
public function createPayout()
public function createPayout($requestOptions = null)
{
return $this->post('/payouts', null, '\Shift4\Response\Payout');
return $this->post('/payouts', null, '\Shift4\Response\Payout', $requestOptions);
}

/**
Expand Down Expand Up @@ -592,10 +593,10 @@ private function getFromEndpoint($endpoint, $path, $responseClass)
return $this->objectSerializer->deserialize($response['body'], $responseClass);
}

private function post($path, $request, $responseClass)
private function post($path, $request, $responseClass, RequestOptions $requestOptions = null)
{
$requestBody = $this->objectSerializer->serialize($request, $path);
$response = $this->connection->post($this->endpoint . $path, $requestBody, $this->buildHeaders());
$response = $this->connection->post($this->endpoint . $path, $requestBody, $this->buildHeaders($requestOptions));
$this->ensureSuccess($response);
return $this->objectSerializer->deserialize($response['body'], $responseClass);
}
Expand Down Expand Up @@ -647,13 +648,20 @@ private function buildQueryString($path, $request)
return $path . $queryString;
}

private function buildHeaders()
private function buildHeaders(RequestOptions $requestOptions = null)
{
return [
$headers = [
'Authorization' => 'Basic ' . base64_encode($this->privateKey . ':'),
'Content-Type' => 'application/json',
'User-Agent' => ($this->userAgent ? $this->userAgent . ' ' : '') . 'Shift4-PHP/' . self::VERSION . ' (PHP/' . phpversion() . ')'
];

if ($requestOptions !== null && $requestOptions->hasIdempotencyKey())
{
$headers['Idempotency-Key'] = $requestOptions->getIdempotencyKey();
}

return $headers;
}

public function setPrivateKey($privateKey)
Expand Down
25 changes: 25 additions & 0 deletions lib/Shift4/Util/RequestOptions.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
<?php

namespace Shift4\Util;


class RequestOptions
{
private $idempotencyKey = null;

public function __construct()
{
}

public function idempotencyKey($idempotencyKey) {
$this->idempotencyKey = $idempotencyKey;
}

public function hasIdempotencyKey() {
return $this->idempotencyKey !== null;
}

public function getIdempotencyKey() {
return $this->idempotencyKey;
}
}
44 changes: 39 additions & 5 deletions tests/BlacklistRuleTest.php
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
<?php
require_once 'bootstrap.php';

use Shift4\Request\BlacklistRuleRequest;
use Shift4\Request\BlacklistRuleListRequest;
use Shift4\Request\CreatedFilter;
use Shift4\Util\RequestOptions;

class BlacklistRuleTest extends AbstractGatewayTestBase
{

public function testCreateBlacklistRule()
function testCreateBlacklistRule()
{
// given
$request = Data::blacklistRuleFingerprintRequest();
Expand All @@ -20,7 +20,7 @@ public function testCreateBlacklistRule()
Assert::assertBlacklistRule($request, $blacklistRule);
}

public function testRetrieveBlacklistRule() {
function testRetrieveBlacklistRule() {
// given
$request = Data::blacklistRuleFingerprintRequest();
$blacklistRule = $this->gateway->createBlacklistRule($request);
Expand All @@ -32,7 +32,7 @@ public function testRetrieveBlacklistRule() {
Assert::assertBlacklistRule($request, $blacklistRule);
}

public function testDeleteBlacklistRule() {
function testDeleteBlacklistRule() {
// given
$blacklistRule = $this->gateway->createBlacklistRule(Data::blacklistRuleFingerprintRequest());

Expand All @@ -44,7 +44,7 @@ public function testDeleteBlacklistRule() {
Assert::assertTrue($blacklistRule->getDeleted());
}

public function testListBlacklistRules() {
function testListBlacklistRules() {
// given
$rule = $this->gateway->createBlacklistRule(Data::blacklistRuleFingerprintRequest());
$this->gateway->createBlacklistRule(Data::blacklistRuleFingerprintRequest());
Expand All @@ -65,4 +65,38 @@ public function testListBlacklistRules() {
self::assertNotNull($rule->getId());
}
}

function testWillNotCreateDuplicateIfSameIdempotencyKeyIsUsed()
{
// given
$request = Data::blacklistRuleFingerprintRequest();
$requestOptions = new RequestOptions();
$requestOptions->idempotencyKey(uniqid());

// when
$first_call_response = $this->gateway->createBlacklistRule($request, $requestOptions);
$second_call_response = $this->gateway->createBlacklistRule($request, $requestOptions);

// then
Assert::assertEquals($first_call_response->getId(), $second_call_response->getId());
}

function testWillThrowExceptionIfSameIdempotencyKeyIsUsedForTwoDifferentCreateRequests()
{
// given
$request = Data::blacklistRuleFingerprintRequest();
$requestOptions = new RequestOptions();
$requestOptions->idempotencyKey(uniqid());

// when
$this->gateway->createBlacklistRule($request, $requestOptions);
$request->email("[email protected]");

$exception = Assert::catchShift4Exception(function () use ($request, $requestOptions) {
$this->gateway->createBlacklistRule($request, $requestOptions);
});

// then
Assert::assertSame('Idempotent key used for request with different parameters.', $exception->getMessage());
}
}
Loading