Skip to content

Commit 4953d3d

Browse files
committed
XOL-2799 support for card present transactions
1 parent 9b1a225 commit 4953d3d

File tree

4 files changed

+83
-4
lines changed

4 files changed

+83
-4
lines changed

composer.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
"psr-4": { "Omnipay\\AuthorizeNet\\" : "src/" }
3535
},
3636
"require": {
37-
"omnipay/common": "~2.4.2"
37+
"omnipay/common": "~2.4.3"
3838
},
3939
"require-dev": {
4040
"omnipay/tests": "~2.0"

src/Message/AIMAuthorizeRequest.php

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ public function getData()
1919
$this->addPayment($data);
2020
$this->addCustomerIP($data);
2121
$this->addBillingData($data);
22+
$this->addRetail($data);
2223
$this->addTestModeSetting($data);
2324
$this->addExtraOptions($data);
2425

@@ -31,9 +32,19 @@ protected function addPayment(\SimpleXMLElement $data)
3132
/** @var CreditCard $card */
3233
$card = $this->getCard();
3334
$card->validate();
34-
$data->transactionRequest->payment->creditCard->cardNumber = $card->getNumber();
35-
$data->transactionRequest->payment->creditCard->expirationDate = $card->getExpiryDate('my');
36-
$data->transactionRequest->payment->creditCard->cardCode = $card->getCvv();
35+
if ($card->getTracks()) {
36+
// Card present
37+
if ($track1 = $card->getTrack1()) {
38+
$data->transactionRequest->payment->trackData->track1 = $track1;
39+
} elseif ($track2 = $card->getTrack2()) {
40+
$data->transactionRequest->payment->trackData->track2 = $track2;
41+
}
42+
} else {
43+
// Card not present
44+
$data->transactionRequest->payment->creditCard->cardNumber = $card->getNumber();
45+
$data->transactionRequest->payment->creditCard->expirationDate = $card->getExpiryDate('my');
46+
$data->transactionRequest->payment->creditCard->cardCode = $card->getCvv();
47+
}
3748
}
3849

3950
protected function addCustomerIP(\SimpleXMLElement $data)
@@ -43,4 +54,13 @@ protected function addCustomerIP(\SimpleXMLElement $data)
4354
$data->transactionRequest->customerIP = $ip;
4455
}
4556
}
57+
58+
protected function addRetail(\SimpleXMLElement $data)
59+
{
60+
if ($this->getCard()->getTracks()) {
61+
// Retail element is required for card present transactions
62+
$data->transactionRequest->retail->marketType = 2;
63+
$data->transactionRequest->retail->deviceType = 1;
64+
}
65+
}
4666
}

tests/AIMGatewayIntegrationTest.php

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,4 +93,21 @@ public function testPurchaseRefundAutoVoid()
9393
$response = $request->send();
9494
$this->assertTrue($response->isSuccessful(), 'Automatic void should succeed');
9595
}
96+
97+
public function testPurchaseCardPresent()
98+
{
99+
$amount = rand(10, 100) . '.' . rand(0, 99);
100+
$card = array(
101+
'number' => '4242424242424242',
102+
'expiryMonth' => rand(1, 12),
103+
'expiryYear' => gmdate('Y') + rand(1, 5),
104+
'tracks' => '%B4242424242424242^SMITH/JOHN ^2511126100000000000000444000000?;4242424242424242=25111269999944401?'
105+
);
106+
$request = $this->gateway->purchase(array(
107+
'amount' => $amount,
108+
'card' => $card
109+
));
110+
$response = $request->send();
111+
$this->assertTrue($response->isSuccessful());
112+
}
96113
}

tests/Message/AIMAuthorizeRequestTest.php

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ public function testGetData()
3434
$setting = $data->transactionRequest->transactionSettings->setting[0];
3535
$this->assertEquals('testRequest', $setting->settingName);
3636
$this->assertEquals('false', $setting->settingValue);
37+
$this->assertObjectNotHasAttribute('trackData', $data->transactionRequest->payment);
38+
$this->assertObjectNotHasAttribute('retail', $data->transactionRequest);
3739
}
3840

3941
public function testGetDataTestMode()
@@ -52,4 +54,44 @@ public function testShouldReturnExtraOptionsToDisableDuplicateWindowPeriod()
5254
$data = $this->request->getData();
5355
$this->assertEquals('x_duplicate_window=0', strip_tags($data->extraOptions));
5456
}
57+
58+
public function testGetDataCardPresentTrack1()
59+
{
60+
$card = $this->getValidCard();
61+
$card['tracks'] = '%B4242424242424242^SMITH/JOHN ^2511126100000000000000444000000?;4242424242424242=25111269999944401?';
62+
$this->request->initialize(array(
63+
'amount' => '12.12',
64+
'card' => $card
65+
));
66+
67+
$data = $this->request->getData();
68+
69+
$this->assertEquals('12.12', $data->transactionRequest->amount);
70+
$this->assertEquals(
71+
'%B4242424242424242^SMITH/JOHN ^2511126100000000000000444000000?',
72+
$data->transactionRequest->payment->trackData->track1);
73+
$this->assertObjectNotHasAttribute('creditCard', $data->transactionRequest->payment);
74+
$this->assertEquals('2', $data->transactionRequest->retail->marketType);
75+
$this->assertEquals('1', $data->transactionRequest->retail->deviceType);
76+
}
77+
78+
public function testGetDataCardPresentTrack2()
79+
{
80+
$card = $this->getValidCard();
81+
$card['tracks'] = ';4242424242424242=25111269999944401?';
82+
$this->request->initialize(array(
83+
'amount' => '12.12',
84+
'card' => $card
85+
));
86+
87+
$data = $this->request->getData();
88+
89+
$this->assertEquals('12.12', $data->transactionRequest->amount);
90+
$this->assertEquals(
91+
';4242424242424242=25111269999944401?',
92+
$data->transactionRequest->payment->trackData->track2);
93+
$this->assertObjectNotHasAttribute('creditCard', $data->transactionRequest->payment);
94+
$this->assertEquals('2', $data->transactionRequest->retail->marketType);
95+
$this->assertEquals('1', $data->transactionRequest->retail->deviceType);
96+
}
5597
}

0 commit comments

Comments
 (0)