Skip to content

Commit 6d1c0be

Browse files
committed
Add alternative payment methods support (like Google Pay)
1 parent d7da5d7 commit 6d1c0be

35 files changed

+219
-37
lines changed

.github/workflows/php.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ jobs:
88
strategy:
99
matrix:
1010
operating-system: [ubuntu-latest]
11-
php-versions: ['7.2', '7.3', '7.4', '8.0', '8.1', '8.2', '8.3']
11+
php-versions: ['7.2', '7.3', '7.4', '8.0', '8.1', '8.2', '8.3', '8.4']
1212
name: PHP ${{ matrix.php-versions }} Test on ${{ matrix.operating-system }}
1313

1414
steps:

README.md

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,34 @@ if (
243243
}
244244
```
245245

246+
### Using alternative payment methods
247+
248+
To use an alternative payment method (like Google Pay), send a received token AS-IS or data from a decrypted token.
249+
250+
```php
251+
<?php
252+
253+
use TransactPro\Gateway\DataSets\Command;
254+
255+
// set a corresponding flag that indicates a token provider
256+
$operation->command()->setPaymentMethodType(Command::PAYMENT_METHOD_TYPE_GOOGLE_PAY);
257+
258+
// option 1: send received token AS-IS
259+
$operation->paymentMethod()->setToken('<token>');
260+
261+
// option 2: send data from decrypted token
262+
$operation->paymentMethod()
263+
->setPAN('<card number>')
264+
->setExpire('<card expiry>')
265+
->setCardHolderName('<cardholder name>') // if available
266+
->setExternalTokenCryptogram('<cryptogram from token>') // if available
267+
->setExternalTokenECI('<ECI from token>') // if available
268+
->setExternalTokenTransStatus('<transStatus from token>') // available for Click to Pay
269+
->setExternalTokenDsTransId('<dsTransId from token>') // available for Click to Pay
270+
->setExternalTokenAcsTransId('<acsTransId from token>') // available for Click to Pay
271+
->setExternalTokenCardHolderAuthenticated($decryptedToken['paymentMethodDetails']['assuranceDetails']['cardHolderAuthenticated']); // for Google Pay
272+
```
273+
246274
### Callback validation
247275

248276
```php

src/Gateway/DataSets/Command.php

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,11 @@ class Command extends DataSet implements DataSetInterface
3131
const DATA_SOURCE_USE_GATEWAY_SAVED_MERCHANT_INITIATED = 5;
3232
const DATA_SOURCE_USE_MERCHANT_SAVED_MERCHANT_INITIATED = 6;
3333

34+
const PAYMENT_METHOD_TYPE_CARD = 'cc';
35+
const PAYMENT_METHOD_TYPE_GOOGLE_PAY = 'google_pay';
36+
const PAYMENT_METHOD_TYPE_APPLE_PAY = 'apple_pay';
37+
const PAYMENT_METHOD_TYPE_CLICK2PAY = 'click2pay';
38+
3439
/**
3540
* @param string $gatewayTransactionID
3641
* @return Command
@@ -96,4 +101,15 @@ public function setPaymentMethodDataToken(string $paymentMethodDataToken): self
96101

97102
return $this;
98103
}
104+
105+
/**
106+
* @param string $paymentMethodType
107+
* @return Command
108+
*/
109+
public function setPaymentMethodType(string $paymentMethodType): self
110+
{
111+
$this->data[ self::COMMAND_DATA_PAYMENT_METHOD_TYPE ] = $paymentMethodType;
112+
113+
return $this;
114+
}
99115
}

src/Gateway/DataSets/DataSet.php

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ abstract class DataSet
2828
const COMMAND_DATA_CARD_VERIFICATION = 'data.command-data.card-verification';
2929
const COMMAND_DATA_PAYMENT_METHOD_DATA_SOURCE = 'data.command-data.payment-method-data-source';
3030
const COMMAND_DATA_PAYMENT_METHOD_DATA_TOKEN = 'data.command-data.payment-method-data-token';
31+
const COMMAND_DATA_PAYMENT_METHOD_TYPE = 'data.command-data.payment-method-type';
3132

3233
// customer data
3334
const GENERAL_DATA_CUSTOMER_DATA_EMAIL = 'data.general-data.customer-data.email';
@@ -69,12 +70,20 @@ abstract class DataSet
6970
const PAYMENT_METHOD_DATA_EXPIRE = 'data.payment-method-data.exp-mm-yy';
7071
const PAYMENT_METHOD_DATA_CVV = 'data.payment-method-data.cvv';
7172
const PAYMENT_METHOD_DATA_CARDHOLDER_NAME = 'data.payment-method-data.cardholder-name';
73+
const PAYMENT_METHOD_DATA_TOKEN = 'data.payment-method-data.token';
7274
const PAYMENT_METHOD_DATA_EXTERNAL_MPI_DATA = 'data.payment-method-data.external-mpi-data';
7375
const PAYMENT_METHOD_DATA_EXTERNAL_MPI_PROTOCOL = 'data.payment-method-data.external-mpi-data.protocolVersion';
7476
const PAYMENT_METHOD_DATA_EXTERNAL_MPI_DS_TRANS_ID = 'data.payment-method-data.external-mpi-data.dsTransID';
7577
const PAYMENT_METHOD_DATA_EXTERNAL_MPI_XID = 'data.payment-method-data.external-mpi-data.xid';
7678
const PAYMENT_METHOD_DATA_EXTERNAL_MPI_CAVV = 'data.payment-method-data.external-mpi-data.cavv';
7779
const PAYMENT_METHOD_DATA_EXTERNAL_MPI_TRANS_STATUS = 'data.payment-method-data.external-mpi-data.transStatus';
80+
const PAYMENT_METHOD_DATA_EXTERNAL_TOKEN_DATA = 'data.payment-method-data.external-token-data';
81+
const PAYMENT_METHOD_DATA_EXTERNAL_TOKEN_CRYPTOGRAM = 'data.payment-method-data.external-token-data.cryptogram';
82+
const PAYMENT_METHOD_DATA_EXTERNAL_TOKEN_ECI = 'data.payment-method-data.external-token-data.eci';
83+
const PAYMENT_METHOD_DATA_EXTERNAL_TOKEN_TRANS_STATUS = 'data.payment-method-data.external-token-data.transStatus';
84+
const PAYMENT_METHOD_DATA_EXTERNAL_TOKEN_DS_TRANS_ID = 'data.payment-method-data.external-token-data.dsTransID';
85+
const PAYMENT_METHOD_DATA_EXTERNAL_TOKEN_ACS_TRANS_ID = 'data.payment-method-data.external-token-data.acsTransID';
86+
const PAYMENT_METHOD_DATA_EXTERNAL_TOKEN_AUTHENTICATED = 'data.payment-method-data.external-token-data.cardHolderAuthenticated';
7887

7988
// money data
8089
const MONEY_DATA_AMOUNT = 'data.money-data.amount';

src/Gateway/DataSets/PaymentMethod.php

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,17 @@ public function setCardHolderName(string $cardHolderName): self
6464
return $this;
6565
}
6666

67+
/**
68+
* @param string $token
69+
* @return PaymentMethod
70+
*/
71+
public function setToken(string $token): self
72+
{
73+
$this->data[self::PAYMENT_METHOD_DATA_TOKEN] = $token;
74+
75+
return $this;
76+
}
77+
6778
/**
6879
* @param string $protocolVersion
6980
* @return PaymentMethod
@@ -118,4 +129,70 @@ public function setExternalMpiTransStatus(string $transStatus): self
118129

119130
return $this;
120131
}
132+
133+
/**
134+
* @param string $cryptogram
135+
* @return PaymentMethod
136+
*/
137+
public function setExternalTokenCryptogram(string $cryptogram): self
138+
{
139+
$this->data[self::PAYMENT_METHOD_DATA_EXTERNAL_TOKEN_CRYPTOGRAM] = $cryptogram;
140+
141+
return $this;
142+
}
143+
144+
/**
145+
* @param string $eci
146+
* @return PaymentMethod
147+
*/
148+
public function setExternalTokenECI(string $eci): self
149+
{
150+
$this->data[self::PAYMENT_METHOD_DATA_EXTERNAL_TOKEN_ECI] = $eci;
151+
152+
return $this;
153+
}
154+
155+
/**
156+
* @param string $transStatus
157+
* @return PaymentMethod
158+
*/
159+
public function setExternalTokenTransStatus(string $transStatus): self
160+
{
161+
$this->data[self::PAYMENT_METHOD_DATA_EXTERNAL_TOKEN_TRANS_STATUS] = $transStatus;
162+
163+
return $this;
164+
}
165+
166+
/**
167+
* @param string $dsTransId
168+
* @return PaymentMethod
169+
*/
170+
public function setExternalTokenDsTransId(string $dsTransId): self
171+
{
172+
$this->data[self::PAYMENT_METHOD_DATA_EXTERNAL_TOKEN_DS_TRANS_ID] = $dsTransId;
173+
174+
return $this;
175+
}
176+
177+
/**
178+
* @param string $acsTransId
179+
* @return PaymentMethod
180+
*/
181+
public function setExternalTokenAcsTransId(string $acsTransId): self
182+
{
183+
$this->data[self::PAYMENT_METHOD_DATA_EXTERNAL_TOKEN_ACS_TRANS_ID] = $acsTransId;
184+
185+
return $this;
186+
}
187+
188+
/**
189+
* @param bool $value
190+
* @return PaymentMethod
191+
*/
192+
public function setExternalTokenCardHolderAuthenticated(bool $value): self
193+
{
194+
$this->data[self::PAYMENT_METHOD_DATA_EXTERNAL_TOKEN_AUTHENTICATED] = $value;
195+
196+
return $this;
197+
}
121198
}

src/Gateway/Exceptions/DigestMismatchException.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
*/
2222
class DigestMismatchException extends ResponseException
2323
{
24-
public function __construct($message = "Digest mismatch", $code = 0, Throwable $previous = null)
24+
public function __construct($message = "Digest mismatch", $code = 0, ?Throwable $previous = null)
2525
{
2626
parent::__construct($message, $code, $previous);
2727
}

src/Gateway/Exceptions/DigestMissingException.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
*/
2121
class DigestMissingException extends ResponseException
2222
{
23-
public function __construct($message = "Digest is missing", $code = 0, Throwable $previous = null)
23+
public function __construct($message = "Digest is missing", $code = 0, ?Throwable $previous = null)
2424
{
2525
parent::__construct($message, $code, $previous);
2626
}

src/Gateway/Http/Crypto/ResponseDigest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ class ResponseDigest extends Digest
2828
* @throws DigestMissingException
2929
* @throws DigestMismatchException
3030
*/
31-
public function __construct(string $authorizationHeader = null)
31+
public function __construct(?string $authorizationHeader = null)
3232
{
3333
if (empty($authorizationHeader)) {
3434
throw new DigestMissingException();

src/Gateway/Http/Response.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ public function getDigest()
169169
/**
170170
* @param ResponseDigest|null $digest
171171
*/
172-
public function setDigest(ResponseDigest $digest = null)
172+
public function setDigest(?ResponseDigest $digest = null)
173173
{
174174
$this->digest = $digest;
175175
}

src/Gateway/Responses/CallbackResult.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313

1414
class CallbackResult extends PaymentResponse
1515
{
16-
public function __construct(array $rawDecoded = null)
16+
public function __construct(?array $rawDecoded = null)
1717
{
1818
parent::__construct($rawDecoded['result-data'] ?? null);
1919
}

0 commit comments

Comments
 (0)