Hps_Securesubmit - Version 1.4.0

Version Notes

Add: Consumer authentication (3DSecure)

Download this release

Release Info

Developer Heartland Payment Systems
Extension Hps_Securesubmit
Version 1.4.0
Comparing to
See all releases


Code changes from version 1.3.0 to 1.4.0

Files changed (52) hide show
  1. app/code/community/Hps/Securesubmit/Block/Form.php +48 -0
  2. app/code/community/Hps/Securesubmit/Helper/Jwt.php +160 -0
  3. app/code/community/Hps/Securesubmit/Model/Payment.php +91 -37
  4. app/code/community/Hps/Securesubmit/etc/config.xml +1 -1
  5. app/code/community/Hps/Securesubmit/etc/system.xml +38 -0
  6. app/design/frontend/base/default/template/securesubmit/form.phtml +25 -2
  7. js/securesubmit/checkout-form.js +103 -42
  8. lib/SecureSubmit/Hps.php +9 -0
  9. lib/SecureSubmit/src/Abstractions/HpsAltPaymentServiceInterface.php +6 -6
  10. lib/SecureSubmit/src/Abstractions/HpsConfigInterface.php +1 -1
  11. lib/SecureSubmit/src/Abstractions/HpsGatewayServiceAbstract.php +25 -1
  12. lib/SecureSubmit/src/Abstractions/HpsGatewayServiceInterface.php +1 -1
  13. lib/SecureSubmit/src/Abstractions/HpsLoggerInterface.php +6 -0
  14. lib/SecureSubmit/src/Abstractions/HpsPayPlanResourceAbstract.php +4 -4
  15. lib/SecureSubmit/src/Entities/AltPayment/HpsAltPaymentSessionInfo.php +20 -22
  16. lib/SecureSubmit/src/Entities/Attachment/HpsAttachment.php +117 -0
  17. lib/SecureSubmit/src/Entities/Credit/HpsManageTokensResponse.php +22 -0
  18. lib/SecureSubmit/src/Entities/Credit/HpsReportTransactionDetails.php +2 -3
  19. lib/SecureSubmit/src/Entities/Credit/HpsSecureEcommerce.php +10 -0
  20. lib/SecureSubmit/src/Entities/HpsAddress.php +5 -6
  21. lib/SecureSubmit/src/Entities/HpsTokenData.php +3 -0
  22. lib/SecureSubmit/src/Entities/HpsTransaction.php +5 -1
  23. lib/SecureSubmit/src/Entities/PayPlan/HpsPayPlanSchedule.php +29 -13
  24. lib/SecureSubmit/src/Infrastructure/Enums/HpsAttachmentType.php +22 -0
  25. lib/SecureSubmit/src/Infrastructure/Enums/HpsExceptionCodes.php +2 -0
  26. lib/SecureSubmit/src/Infrastructure/HpsAuthenticationException.php +1 -1
  27. lib/SecureSubmit/src/Infrastructure/HpsCheckException.php +1 -1
  28. lib/SecureSubmit/src/Infrastructure/HpsEmptyLogger.php +9 -0
  29. lib/SecureSubmit/src/Infrastructure/HpsException.php +19 -3
  30. lib/SecureSubmit/src/Infrastructure/HpsGatewayException.php +1 -1
  31. lib/SecureSubmit/src/Infrastructure/HpsInvalidRequestException.php +1 -1
  32. lib/SecureSubmit/src/Infrastructure/HpsLogger.php +30 -0
  33. lib/SecureSubmit/src/Infrastructure/Validation/HpsGatewayResponseValidation.php +3 -1
  34. lib/SecureSubmit/src/Infrastructure/Validation/HpsInputValidation.php +6 -1
  35. lib/SecureSubmit/src/Infrastructure/Validation/HpsIssuerResponseValidation.php +2 -1
  36. lib/SecureSubmit/src/Services/Fluent/Gateway/Credit/HpsCreditServiceAuthorizeBuilder.php +6 -0
  37. lib/SecureSubmit/src/Services/Fluent/Gateway/Credit/HpsCreditServiceChargeBuilder.php +3 -3
  38. lib/SecureSubmit/src/Services/Fluent/Gateway/Credit/HpsCreditServicePrepaidAddValueBuilder.php +1 -3
  39. lib/SecureSubmit/src/Services/Fluent/Gateway/Credit/HpsCreditServicePrepaidBalanceInquiryBuilder.php +1 -3
  40. lib/SecureSubmit/src/Services/Fluent/Gateway/Credit/HpsCreditServiceRecurringBuilder.php +4 -6
  41. lib/SecureSubmit/src/Services/Fluent/Gateway/Credit/HpsCreditServiceUpdateTokenExpirationBuilder.php +96 -0
  42. lib/SecureSubmit/src/Services/Fluent/Gateway/HpsFluentCreditService.php +10 -0
  43. lib/SecureSubmit/src/Services/Gateway/AltPayment/HpsAltPaymentService.php +11 -26
  44. lib/SecureSubmit/src/Services/Gateway/AltPayment/HpsMasterPassService.php +40 -21
  45. lib/SecureSubmit/src/Services/Gateway/HpsAttachmentService.php +148 -0
  46. lib/SecureSubmit/src/Services/Gateway/HpsCreditService.php +62 -50
  47. lib/SecureSubmit/src/Services/Gateway/HpsRestGatewayService.php +1 -1
  48. lib/SecureSubmit/src/Services/Gateway/HpsSoapGatewayService.php +33 -8
  49. lib/SecureSubmit/src/Services/Gateway/PayPlan/HpsPayPlanScheduleService.php +3 -7
  50. lib/SecureSubmit/src/Services/HpsCentinelConfig.php +2 -1
  51. lib/SecureSubmit/src/Services/HpsServicesConfig.php +3 -2
  52. package.xml +7 -7
app/code/community/Hps/Securesubmit/Block/Form.php CHANGED
@@ -8,9 +8,57 @@
8
 
9
  class Hps_SecureSubmit_Block_Form extends Mage_Payment_Block_Form_Ccsave
10
  {
 
 
11
  protected function _construct()
12
  {
13
  parent::_construct();
14
  $this->setTemplate('securesubmit/form.phtml');
15
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
16
  }
8
 
9
  class Hps_SecureSubmit_Block_Form extends Mage_Payment_Block_Form_Ccsave
10
  {
11
+ protected $cca;
12
+
13
  protected function _construct()
14
  {
15
  parent::_construct();
16
  $this->setTemplate('securesubmit/form.phtml');
17
  }
18
+
19
+ public function getCca()
20
+ {
21
+ if (!$this->getConfig('enable_threedsecure')) {
22
+ return false;
23
+ }
24
+
25
+ if (null !== $this->cca) {
26
+ return $this->cca;
27
+ }
28
+
29
+ $helper = Mage::helper('hps_securesubmit/jwt');
30
+ $orderNumber = str_shuffle('abcdefghijklmnopqrstuvwxyz');
31
+ $data = array(
32
+ 'jti' => str_shuffle('abcdefghijklmnopqrstuvwxyz'),
33
+ 'iat' => time(),
34
+ 'iss' => $this->getConfig('threedsecure_api_identifier'),
35
+ 'OrgUnitId' => $this->getConfig('threedsecure_org_unit_id'),
36
+ 'Payload' => array(
37
+ 'OrderDetails' => array(
38
+ 'OrderNumber' => $orderNumber,
39
+ // Centinel requires amounts in pennies
40
+ 'Amount' => 100 * Mage::getSingleton('checkout/cart')
41
+ ->getQuote()
42
+ ->getGrandTotal(),
43
+ 'CurrencyCode' => '840',
44
+ ),
45
+ ),
46
+ );
47
+ error_log(print_r($data, true));
48
+ $jwt = $helper::encode(
49
+ $this->getConfig('threedsecure_api_key'),
50
+ $data
51
+ );
52
+ $this->cca = array(
53
+ 'jwt' => $jwt,
54
+ 'orderNumber' => $orderNumber,
55
+ );
56
+
57
+ return $this->cca;
58
+ }
59
+
60
+ protected function getConfig($key)
61
+ {
62
+ return Mage::getStoreConfig(sprintf('payment/hps_securesubmit/%s', $key));
63
+ }
64
  }
app/code/community/Hps/Securesubmit/Helper/Jwt.php ADDED
@@ -0,0 +1,160 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * JWT encoding
5
+ *
6
+ * PHP Version 5.2+
7
+ *
8
+ * @category Authentication
9
+ * @package HPS
10
+ * @author Heartland Payment Systems <entapp_devportal@e-hps.com>
11
+ * @license Custom https://github.com/hps/heartland-php/blob/master/LICENSE.txt
12
+ * @link https://developer.heartlandpaymentsystems.com
13
+ */
14
+
15
+ /**
16
+ * JWT encoding
17
+ *
18
+ * PHP Version 5.2+
19
+ *
20
+ * @category Authentication
21
+ * @package HPS
22
+ * @author Heartland Payment Systems <entapp_devportal@e-hps.com>
23
+ * @license Custom https://github.com/hps/heartland-php/blob/master/LICENSE.txt
24
+ * @link https://developer.heartlandpaymentsystems.com
25
+ */
26
+ class Hps_Securesubmit_Helper_Jwt extends Mage_Core_Helper_Abstract
27
+ {
28
+ /**
29
+ * Encodes a JWT with a `$key` and a `$payload`
30
+ *
31
+ * @param string $key key used to sign the JWT
32
+ * @param mixed $payload payload to be included
33
+ *
34
+ * @return string
35
+ */
36
+ public static function encode($key = '', $payload = array())
37
+ {
38
+ $header = array('typ' => 'JWT', 'alg' => 'HS256');
39
+
40
+ $parts = array(
41
+ self::urlsafeBase64Encode(json_encode($header)),
42
+ self::urlsafeBase64Encode(json_encode($payload)),
43
+ );
44
+ $signingData = implode('.', $parts);
45
+ $signature = self::sign($key, $signingData);
46
+ $parts[] = self::urlsafeBase64Encode($signature);
47
+
48
+ return implode('.', $parts);
49
+ }
50
+
51
+ /**
52
+ * Signs a set of `$signingData` with a given `$key`
53
+ *
54
+ * @param string $key key used to sign the JWT
55
+ * @param string $signingData data to be signed
56
+ *
57
+ * @return string
58
+ */
59
+ public static function sign($key, $signingData)
60
+ {
61
+ return hash_hmac('sha256', $signingData, $key, true);
62
+ }
63
+
64
+ /**
65
+ * Verify a JWT
66
+ *
67
+ * @param string $jwt JWT to be verified
68
+ * @param string $key signing key
69
+ *
70
+ * @return boolean
71
+ */
72
+ public static function verify($jwt, $key)
73
+ {
74
+ $parts = explode('.', $jwt);
75
+
76
+ if (count($parts) !== 3) {
77
+ return false;
78
+ }
79
+
80
+ list($header, $payload, $signature) = $parts;
81
+ $signingData = sprintf('%s.%s', $header, $payload);
82
+ $hash = hash_hmac('sha256', $signingData, $key, true);
83
+ $signature = self::urlsafeBase64Dencode($signature);
84
+
85
+ return self::hashEquals($signature, $hash);
86
+ }
87
+
88
+ /**
89
+ * Creates a url-safe base64 encoded value
90
+ *
91
+ * @param string $data data to be encoded
92
+ *
93
+ * @return string
94
+ */
95
+ protected static function urlsafeBase64Encode($data)
96
+ {
97
+ return str_replace('=', '', strtr(base64_encode($data), '+/', '-_'));
98
+ }
99
+
100
+ /**
101
+ * Decodes a url-safe base64 encoded value
102
+ *
103
+ * @param string $data base64 encoded value
104
+ *
105
+ * @return string
106
+ */
107
+ protected static function urlsafeBase64Dencode($data)
108
+ {
109
+ $remainder = strlen($data) % 4;
110
+ if ($remainder) {
111
+ $padlen = 4 - $remainder;
112
+ $data .= str_repeat('=', $padlen);
113
+ }
114
+ return base64_decode(strtr($data, '-_', '+/'));
115
+ }
116
+
117
+ /**
118
+ * Compares two hashes for equality
119
+ *
120
+ * @param string $signature previous value
121
+ * @param string $hash calculated value
122
+ *
123
+ * @return boolean
124
+ */
125
+ protected static function hashEquals($signature, $hash)
126
+ {
127
+ if (function_exists('hash_equals')) {
128
+ return hash_equals($signature, $hash);
129
+ }
130
+
131
+ if (self::safeStrLength($signature) !== self::safeStrLength($hash)) {
132
+ return false;
133
+ }
134
+
135
+ $xor = $signature ^ $hash;
136
+ $result = 0;
137
+
138
+ for ($i = self::safeStrLength($xor) - 1; 0 <= $i; $i--) {
139
+ $result |= ord($xor[$i]);
140
+ }
141
+
142
+ return (0 === $result);
143
+ }
144
+
145
+ /**
146
+ * Gets string length
147
+ *
148
+ * @param string $string value to check
149
+ *
150
+ * @return number
151
+ */
152
+ protected static function safeStrLength($string)
153
+ {
154
+ if (function_exists('mb_strlen')) {
155
+ return mb_strlen($string);
156
+ }
157
+
158
+ return strlen($string);
159
+ }
160
+ }
app/code/community/Hps/Securesubmit/Model/Payment.php CHANGED
@@ -101,6 +101,7 @@ class Hps_Securesubmit_Model_Payment extends Mage_Payment_Model_Method_Cc
101
  $giftService = $this->_getGiftService();
102
  $giftCardNumber = $additionalData->getGiftcardNumber();
103
  $giftCardPin = filter_var($additionalData->getGiftcardPin(),FILTER_VALIDATE_INT, ARRAY('default' => FILTER_NULL_ON_FAILURE));
 
104
 
105
  if ($giftCardNumber) {
106
  // 1. check balance
@@ -165,13 +166,13 @@ class Hps_Securesubmit_Model_Payment extends Mage_Payment_Model_Method_Cc
165
  }
166
  }
167
 
 
168
  if ($saveCreditCard) {
169
  $multiToken = true;
170
  $cardData = new HpsCreditCard();
171
  $cardData->number = $payment->getCcLast4();
172
  $cardData->expYear = $payment->getCcExpYear();
173
  $cardData->expMonth = $payment->getCcExpMonth();
174
- $cardType = $payment->getCcType();
175
  }
176
 
177
  $chargeService = $this->_getChargeService();
@@ -179,37 +180,42 @@ class Hps_Securesubmit_Model_Payment extends Mage_Payment_Model_Method_Cc
179
  $details = $this->_getTxnDetailsData($order);
180
  $cardOrToken = new HpsTokenData();
181
  $cardOrToken->tokenValue = $secureToken;
 
182
 
183
  try {
184
  $this->checkVelocity();
185
 
 
186
  if ($capture) {
187
  if ($payment->getCcTransId()) {
188
- $response = $chargeService->capture(
189
- $payment->getCcTransId(),
190
- $amount
191
- );
192
  } else {
193
- $response = $chargeService->charge(
194
- $amount,
195
- strtolower($order->getBaseCurrencyCode()),
196
- $cardOrToken,
197
- $cardHolder,
198
- $multiToken,
199
- $details
200
- );
201
  }
202
  } else {
203
- $response = $chargeService->authorize(
204
- $amount,
205
- strtolower($order->getBaseCurrencyCode()),
206
- $cardOrToken,
207
- $cardHolder,
208
- $multiToken,
209
- $details
210
- );
 
 
 
211
  }
212
 
 
 
213
  $this->_debugChargeService($chargeService);
214
  // \Hps_Securesubmit_Model_Payment::closeTransaction
215
  $this->closeTransaction($payment, $amount, $response);
@@ -328,6 +334,48 @@ class Hps_Securesubmit_Model_Payment extends Mage_Payment_Model_Method_Cc
328
  }
329
  }
330
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
331
  protected function _formatAmount($amount)
332
  {
333
  return Mage::helper('core')->currency($amount, true, false);
@@ -541,7 +589,9 @@ class Hps_Securesubmit_Model_Payment extends Mage_Payment_Model_Method_Cc
541
  $chargeService = $this->_getChargeService();
542
 
543
  try {
544
- $voidResponse = $chargeService->void($transactionId);
 
 
545
  $payment
546
  ->setTransactionId($voidResponse->transactionId)
547
  ->setParentTransactionId($transactionId)
@@ -573,13 +623,13 @@ class Hps_Securesubmit_Model_Payment extends Mage_Payment_Model_Method_Cc
573
  $details = $this->_getTxnDetailsData($order);
574
 
575
  try {
576
- $refundResponse = $chargeService->refund(
577
- $amount,
578
- strtolower($order->getBaseCurrencyCode()),
579
- $transactionId,
580
- $cardHolder,
581
- $details
582
- );
583
  $payment
584
  ->setTransactionId($refundResponse->transactionId)
585
  ->setParentTransactionId($transactionId)
@@ -620,13 +670,13 @@ class Hps_Securesubmit_Model_Payment extends Mage_Payment_Model_Method_Cc
620
  $chargeService = $this->_getChargeService();
621
  $details = $this->_getTxnDetailsData($order);
622
  try {
623
- $reverseResponse = $chargeService->reverse(
624
- $transactionId,
625
- $transactionDetails->authorizedAmount,
626
- strtolower($order->getBaseCurrencyCode()),
627
- $details,
628
- $newAuthAmount
629
- );
630
  $payment
631
  ->setTransactionId($reverseResponse->transactionId)
632
  ->setParentTransactionId($transactionId)
@@ -710,6 +760,10 @@ class Hps_Securesubmit_Model_Payment extends Mage_Payment_Model_Method_Cc
710
  $details['customer_id'] = $data->getData('customer_id');
711
  }
712
 
 
 
 
 
713
  if (!empty($details)) {
714
  $this->getInfoInstance()->setAdditionalData(serialize($details));
715
  }
@@ -766,7 +820,7 @@ class Hps_Securesubmit_Model_Payment extends Mage_Payment_Model_Method_Cc
766
  $config->versionNumber = '1573';
767
  $config->developerId = '002914';
768
 
769
- return new HpsCreditService($config);
770
  }
771
 
772
  protected function _getGiftService()
101
  $giftService = $this->_getGiftService();
102
  $giftCardNumber = $additionalData->getGiftcardNumber();
103
  $giftCardPin = filter_var($additionalData->getGiftcardPin(),FILTER_VALIDATE_INT, ARRAY('default' => FILTER_NULL_ON_FAILURE));
104
+ $ccaData = $additionalData->getCcaData();
105
 
106
  if ($giftCardNumber) {
107
  // 1. check balance
166
  }
167
  }
168
 
169
+ $cardType = $payment->getCcType();
170
  if ($saveCreditCard) {
171
  $multiToken = true;
172
  $cardData = new HpsCreditCard();
173
  $cardData->number = $payment->getCcLast4();
174
  $cardData->expYear = $payment->getCcExpYear();
175
  $cardData->expMonth = $payment->getCcExpMonth();
 
176
  }
177
 
178
  $chargeService = $this->_getChargeService();
180
  $details = $this->_getTxnDetailsData($order);
181
  $cardOrToken = new HpsTokenData();
182
  $cardOrToken->tokenValue = $secureToken;
183
+ $secureEcommerce = $this->getSecureEcommerce($ccaData, $cardType);
184
 
185
  try {
186
  $this->checkVelocity();
187
 
188
+ $builder = null;
189
  if ($capture) {
190
  if ($payment->getCcTransId()) {
191
+ $builder = $chargeService->capture()
192
+ ->withTransactionId($payment->getCcTransId())
193
+ ->withAmount();
 
194
  } else {
195
+ $builder = $chargeService->charge()
196
+ ->withAmount($amount)
197
+ ->withCurrency(strtolower($order->getBaseCurrencyCode()))
198
+ ->withToken($cardOrToken)
199
+ ->withCardHolder($cardHolder)
200
+ ->withRequestMultiUseToken($multiToken)
201
+ ->withDetails($details);
 
202
  }
203
  } else {
204
+ $builder = $chargeService->authorize()
205
+ ->withAmount($amount)
206
+ ->withCurrency(strtolower($order->getBaseCurrencyCode()))
207
+ ->withToken($cardOrToken)
208
+ ->withCardHolder($cardHolder)
209
+ ->withRequestMultiUseToken($multiToken)
210
+ ->withDetails($details);
211
+ }
212
+
213
+ if (null !== $secureEcommerce) {
214
+ $builder = $builder->withSecureEcommerce($secureEcommerce);
215
  }
216
 
217
+ $response = $builder->execute();
218
+
219
  $this->_debugChargeService($chargeService);
220
  // \Hps_Securesubmit_Model_Payment::closeTransaction
221
  $this->closeTransaction($payment, $amount, $response);
334
  }
335
  }
336
 
337
+ protected function getSecureEcommerce($ccaData, $cardType)
338
+ {
339
+ if ($this->getConfigData('enable_threedsecure')
340
+ && false !== ($data = json_decode($ccaData))
341
+ && isset($data) && isset($data->ActionCode)
342
+ && 'SUCCESS' === $data->ActionCode
343
+ ) {
344
+ $dataSource = '';
345
+ switch ($cardType) {
346
+ case 'visa':
347
+ $dataSource = 'Visa 3DSecure';
348
+ break;
349
+ case 'mastercard':
350
+ $dataSource = 'MasterCard 3DSecure';
351
+ break;
352
+ case 'discover':
353
+ $dataSource = 'Discover 3DSecure';
354
+ break;
355
+ case 'amex':
356
+ $dataSource = 'AMEX 3DSecure';
357
+ break;
358
+ }
359
+ $cavv = isset($data->Payment->ExtendedData->CAVV)
360
+ ? $data->Payment->ExtendedData->CAVV
361
+ : '';
362
+ $eciFlag = isset($data->Payment->ExtendedData->ECIFlag)
363
+ ? substr($data->Payment->ExtendedData->ECIFlag, 1)
364
+ : '';
365
+ $xid = isset($data->Payment->ExtendedData->XID)
366
+ ? $data->Payment->ExtendedData->XID
367
+ : '';
368
+ $secureEcommerce = new HpsSecureEcommerce();
369
+ $secureEcommerce->type = '3DSecure';
370
+ $secureEcommerce->dataSource = $dataSource;
371
+ $secureEcommerce->data = $cavv;
372
+ $secureEcommerce->eciFlag = $eciFlag;
373
+ $secureEcommerce->xid = $xid;
374
+ return $secureEcommerce;
375
+ }
376
+
377
+ return false;
378
+ }
379
  protected function _formatAmount($amount)
380
  {
381
  return Mage::helper('core')->currency($amount, true, false);
589
  $chargeService = $this->_getChargeService();
590
 
591
  try {
592
+ $voidResponse = $chargeService->void()
593
+ ->withTransactionId($transactionId)
594
+ ->execute();
595
  $payment
596
  ->setTransactionId($voidResponse->transactionId)
597
  ->setParentTransactionId($transactionId)
623
  $details = $this->_getTxnDetailsData($order);
624
 
625
  try {
626
+ $refundResponse = $chargeService->refund()
627
+ ->withAmount($amount)
628
+ ->withCurrency(strtolower($order->getBaseCurrencyCode()))
629
+ ->withTransactionId($transactionId)
630
+ ->withCardHolder($cardHolder)
631
+ ->withDetails($details)
632
+ ->execute();
633
  $payment
634
  ->setTransactionId($refundResponse->transactionId)
635
  ->setParentTransactionId($transactionId)
670
  $chargeService = $this->_getChargeService();
671
  $details = $this->_getTxnDetailsData($order);
672
  try {
673
+ $reverseResponse = $chargeService->reverse()
674
+ ->withTransactionId($transactionId)
675
+ ->withAmount($transactionDetails->authorizedAmount)
676
+ ->withCurrency(strtolower($order->getBaseCurrencyCode()))
677
+ ->withDetails($details)
678
+ ->withAuthAmount($newAuthAmount)
679
+ ->execute();
680
  $payment
681
  ->setTransactionId($reverseResponse->transactionId)
682
  ->setParentTransactionId($transactionId)
760
  $details['customer_id'] = $data->getData('customer_id');
761
  }
762
 
763
+ if ($data->getData('cca_data')) {
764
+ $details['cca_data'] = $data->getData('cca_data');
765
+ }
766
+
767
  if (!empty($details)) {
768
  $this->getInfoInstance()->setAdditionalData(serialize($details));
769
  }
820
  $config->versionNumber = '1573';
821
  $config->developerId = '002914';
822
 
823
+ return new HpsFluentCreditService($config);
824
  }
825
 
826
  protected function _getGiftService()
app/code/community/Hps/Securesubmit/etc/config.xml CHANGED
@@ -2,7 +2,7 @@
2
  <config>
3
  <modules>
4
  <Hps_Securesubmit>
5
- <version>1.3.0</version>
6
  </Hps_Securesubmit>
7
  </modules>
8
  <global>
2
  <config>
3
  <modules>
4
  <Hps_Securesubmit>
5
+ <version>1.4.0</version>
6
  </Hps_Securesubmit>
7
  </modules>
8
  <global>
app/code/community/Hps/Securesubmit/etc/system.xml CHANGED
@@ -99,6 +99,44 @@
99
  <show_in_store>1</show_in_store>
100
  <comment><![CDATA[Note: The customer will remain on your site throughout the checkout process, and there will be no redirect. This option only helps reduce your PCI scope.]]></comment>
101
  </use_iframes>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
102
  <!-- Gift -->
103
  <allow_heartland_gift translate="label">
104
  <label>Allow Heartland Gift Cards</label>
99
  <show_in_store>1</show_in_store>
100
  <comment><![CDATA[Note: The customer will remain on your site throughout the checkout process, and there will be no redirect. This option only helps reduce your PCI scope.]]></comment>
101
  </use_iframes>
102
+ <!-- 3DSecure -->
103
+ <enable_threedsecure translate="label">
104
+ <label>Enable Cardholder Authentication</label>
105
+ <frontend_type>select</frontend_type>
106
+ <source_model>adminhtml/system_config_source_yesno</source_model>
107
+ <sort_order>35</sort_order>
108
+ <show_in_default>1</show_in_default>
109
+ <show_in_website>1</show_in_website>
110
+ <show_in_store>1</show_in_store>
111
+ <comment><![CDATA[Note: This requires additional setup on your merchant account. Please contact your Heartland representative for assistance.]]></comment>
112
+ </enable_threedsecure>
113
+ <threedsecure_api_identifier translate="label">
114
+ <label>Cardholder Authentication API Identifier</label>
115
+ <frontend_type>text</frontend_type>
116
+ <sort_order>36</sort_order>
117
+ <show_in_default>1</show_in_default>
118
+ <show_in_website>1</show_in_website>
119
+ <show_in_store>1</show_in_store>
120
+ <depends><enable_threedsecure>1</enable_threedsecure></depends>
121
+ </threedsecure_api_identifier>
122
+ <threedsecure_org_unit_id translate="label">
123
+ <label>Cardholder Authentication Org Unit ID</label>
124
+ <frontend_type>text</frontend_type>
125
+ <sort_order>37</sort_order>
126
+ <show_in_default>1</show_in_default>
127
+ <show_in_website>1</show_in_website>
128
+ <show_in_store>1</show_in_store>
129
+ <depends><enable_threedsecure>1</enable_threedsecure></depends>
130
+ </threedsecure_org_unit_id>
131
+ <threedsecure_api_key translate="label">
132
+ <label>Cardholder Authentication API Key</label>
133
+ <frontend_type>text</frontend_type>
134
+ <sort_order>38</sort_order>
135
+ <show_in_default>1</show_in_default>
136
+ <show_in_website>1</show_in_website>
137
+ <show_in_store>1</show_in_store>
138
+ <depends><enable_threedsecure>1</enable_threedsecure></depends>
139
+ </threedsecure_api_key>
140
  <!-- Gift -->
141
  <allow_heartland_gift translate="label">
142
  <label>Allow Heartland Gift Cards</label>
app/design/frontend/base/default/template/securesubmit/form.phtml CHANGED
@@ -6,6 +6,7 @@ $token_data_url = Mage::getUrl('securesubmit/storedcard/getTokenData', array('_s
6
  $allow_card_saving = Mage::getModel('hps_securesubmit/payment')->getConfigData('allow_card_saving');
7
  $allow_heartland_gift = Mage::getModel('hps_securesubmit/payment')->getConfigData('allow_heartland_gift');
8
  $use_iframes = !!Mage::getModel('hps_securesubmit/payment')->getConfigData('use_iframes');
 
9
 
10
  if ($_loggedIn && $allow_card_saving) {
11
  $customerStoredCards = Mage::helper('hps_securesubmit')->getStoredCards( Mage::getSingleton('customer/session')->getCustomerId());
@@ -113,6 +114,22 @@ if ($_loggedIn && $allow_card_saving) {
113
  <?php endif ?>
114
  </div>
115
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
116
  <script type="text/javascript">
117
  //<![CDATA[
118
  SecureSubmitMagento.init({
@@ -123,14 +140,20 @@ SecureSubmitMagento.init({
123
  tokenDataUrl: '<?= $token_data_url ?>',
124
  allowGift: <?= $allow_heartland_gift ? 'true' : 'false' ?>,
125
  giftBalanceUrl: '<?= Mage::getUrl('securesubmit/giftcard/getBalance', array('_secure' => true)) ?>',
126
- useIframes: <?= $use_iframes ? 'true' : 'false' ?>,
127
  <?php if ($use_iframes): ?>
128
- iframeTargets: {
129
  cardNumber: '<?= $_code ?>_cc_number_iframe',
130
  cardExpiration: '<?= $_code ?>_cc_exp_iframe',
131
  cardCvv: '<?= $_code ?>_cc_cvv_iframe'
132
  }
133
  <?php endif ?>
 
 
 
 
 
 
134
  });
135
  //]]>
136
  </script>
6
  $allow_card_saving = Mage::getModel('hps_securesubmit/payment')->getConfigData('allow_card_saving');
7
  $allow_heartland_gift = Mage::getModel('hps_securesubmit/payment')->getConfigData('allow_heartland_gift');
8
  $use_iframes = !!Mage::getModel('hps_securesubmit/payment')->getConfigData('use_iframes');
9
+ $cca = $this->getCca();
10
 
11
  if ($_loggedIn && $allow_card_saving) {
12
  $customerStoredCards = Mage::helper('hps_securesubmit')->getStoredCards( Mage::getSingleton('customer/session')->getCustomerId());
114
  <?php endif ?>
115
  </div>
116
 
117
+ <?php if ($cca) : ?>
118
+ <?php
119
+ $url = -1 !== strpos($publicKey, '_cert_')
120
+ ? 'https://includestest.ccdc02.com/cardinalcruise/v1/songbird.js'
121
+ : 'https://includes.ccdc02.com/cardinalcruise/v1/songbird.js';
122
+ ?>
123
+ <script type="text/javascript">
124
+ (function () {
125
+ var el = document.createElement('script');
126
+ el.type = 'text/javascript';
127
+ el.src = '<?= $url ?>';
128
+ document.body.appendChild(el);
129
+ }());
130
+ </script>
131
+ <?php endif; ?>
132
+
133
  <script type="text/javascript">
134
  //<![CDATA[
135
  SecureSubmitMagento.init({
140
  tokenDataUrl: '<?= $token_data_url ?>',
141
  allowGift: <?= $allow_heartland_gift ? 'true' : 'false' ?>,
142
  giftBalanceUrl: '<?= Mage::getUrl('securesubmit/giftcard/getBalance', array('_secure' => true)) ?>',
143
+ useIframes: <?= $use_iframes ? 'true' : 'false' ?>
144
  <?php if ($use_iframes): ?>
145
+ ,iframeTargets: {
146
  cardNumber: '<?= $_code ?>_cc_number_iframe',
147
  cardExpiration: '<?= $_code ?>_cc_exp_iframe',
148
  cardCvv: '<?= $_code ?>_cc_cvv_iframe'
149
  }
150
  <?php endif ?>
151
+ <?php if ($cca) : ?>
152
+ ,cca: {
153
+ jwt: '<?= $cca['jwt'] ?>',
154
+ orderNumber: '<?= $cca['orderNumber'] ?>'
155
+ }
156
+ <?php endif; ?>
157
  });
158
  //]]>
159
  </script>
js/securesubmit/checkout-form.js CHANGED
@@ -44,7 +44,7 @@ function securesubmitMultishipping(multiForm) {
44
  SecureSubmitMagento.hps.Messages.post({
45
  accumulateData: true,
46
  action: 'tokenize',
47
- message: SecureSubmitMagento.options.publicKey
48
  }, 'cardNumber');
49
  } else {
50
  var validator = new Validation(multiForm);
@@ -164,7 +164,7 @@ document.observe('dom:loaded', function () {
164
  SecureSubmitMagento.hps.Messages.post({
165
  accumulateData: true,
166
  action: 'tokenize',
167
- message: SecureSubmitMagento.options.publicKey
168
  }, 'cardNumber');
169
  } else {
170
  var validator = new Validation(this.form);
@@ -221,14 +221,16 @@ document.observe('dom:loaded', function () {
221
  lastFourField.value = response.card.number.substr(-4);
222
  typeField.value = response.card_type;
223
 
224
- // Continue Magento checkout steps
225
- new Ajax.Request(this.saveUrl, {
226
- method:'post',
227
- onComplete: this.onComplete,
228
- onSuccess: this.onSave,
229
- onFailure: checkout.ajaxFailure.bind(checkout),
230
- parameters: Form.serialize(this.form)
231
- });
 
 
232
  } else {
233
  alert('Unexpected error.');
234
  }
@@ -251,7 +253,7 @@ document.observe('dom:loaded', function () {
251
  SecureSubmitMagento.hps.Messages.post({
252
  accumulateData: true,
253
  action: 'tokenize',
254
- message: SecureSubmitMagento.options.publicKey
255
  }, 'cardNumber');
256
  } else {
257
  if ($('hps_securesubmit_exp_date') && $('hps_securesubmit_exp_date').value) {
@@ -393,14 +395,9 @@ document.observe('dom:loaded', function () {
393
  SecureSubmitMagento.hps.Messages.post({
394
  accumulateData: true,
395
  action: 'tokenize',
396
- message: SecureSubmitMagento.options.publicKey
397
  }, 'cardNumber');
398
  } else {
399
- if ($('hps_securesubmit_exp_date') && $('hps_securesubmit_exp_date').value) {
400
- var date = $('hps_securesubmit_exp_date').value.split('/');
401
- $('hps_securesubmit_cc_exp_month').value = date[0].trim();
402
- $('hps_securesubmit_cc_exp_year').value = date[1].trim();
403
- }
404
  (new Heartland.HPS({
405
  publicKey: window.payment.secureSubmitPublicKeyOSC,
406
  cardNumber: $('hps_securesubmit_cc_number').value,
@@ -422,8 +419,6 @@ document.observe('dom:loaded', function () {
422
  secureSubmitUseStoredCardAOSC = function () {
423
  var newRadio = $('hps_securesubmit_stored_card_select_new');
424
  return !newRadio.checked;
425
- var storedCheckbox = $('hps_securesubmit_stored_card_checkbox');
426
- return storedCheckbox && storedCheckbox.checked;
427
  };
428
 
429
  secureSubmitResponseHandlerAOSC = function (response, btn) {
@@ -510,7 +505,7 @@ document.observe('dom:loaded', function () {
510
  SecureSubmitMagento.hps.Messages.post({
511
  accumulateData: true,
512
  action: 'tokenize',
513
- message: SecureSubmitMagento.options.publicKey
514
  }, 'cardNumber');
515
  } else {
516
  if ($('hps_securesubmit_exp_date') && $('hps_securesubmit_exp_date').value) {
@@ -588,8 +583,8 @@ document.observe('dom:loaded', function () {
588
  // IWD OPC
589
  if (typeof IWD !== 'undefined' && typeof IWD.OPC !== 'undefined') {
590
  if (typeof IWD.OPC._secureSubmitOldSavePayment === 'undefined') {
591
- var oldOPC = Object.clone(IWD.OPC);
592
- IWD.OPC._secureSubmitOldSavePayment = oldOPC.savePayment;
593
  }
594
  Object.extend(IWD.OPC, {
595
  savePayment: function() {
@@ -606,7 +601,7 @@ document.observe('dom:loaded', function () {
606
  SecureSubmitMagento.hps.Messages.post({
607
  accumulateData: true,
608
  action: 'tokenize',
609
- message: SecureSubmitMagento.options.publicKey
610
  }, 'cardNumber');
611
  } else {
612
  if ($('hps_securesubmit_exp_date') && $('hps_securesubmit_exp_date').value) {
@@ -745,8 +740,8 @@ document.observe('dom:loaded', function () {
745
  $j.ajax({
746
  url: THIS.options.giftBalanceUrl,
747
  type: 'GET',
748
- data: "giftcard_number=" + $j('#' + THIS.options.code + '_giftcard_number').val()
749
- + "&giftcard_pin=" + $j('#' + THIS.options.code + '_giftcard_pin').val(),
750
  success: function(data) {
751
  if (data.error) {
752
  alert('Error adding gift card: ' + data.message);
@@ -792,7 +787,7 @@ document.observe('dom:loaded', function () {
792
  },
793
  setupFields: function () {
794
  if (THIS.options.useIframes) {
795
- THIS.hps = new Heartland.HPS({
796
  publicKey: THIS.options.publicKey,
797
  type: 'iframe',
798
  fields: {
@@ -828,13 +823,23 @@ document.observe('dom:loaded', function () {
828
  }
829
  },
830
  onTokenSuccess: function (resp) {
831
- $(THIS.options.code + '_token').value = resp.token_value;
832
- $(THIS.options.code + '_cc_last_four').value = resp.card.number.substr(-4);
833
- $(THIS.options.code + '_cc_type').value = resp.card_type;
834
- $(THIS.options.code + '_cc_exp_month').value = resp.exp_month.trim();
835
- $(THIS.options.code + '_cc_exp_year').value = resp.exp_year.trim();
 
 
 
 
 
 
 
 
 
 
836
 
837
- THIS.completeCheckout();
838
  },
839
  onTokenError: function (response) {
840
  if (THIS.skipCreditCard) {
@@ -854,7 +859,14 @@ document.observe('dom:loaded', function () {
854
  checkout.setLoadWaiting(false);
855
  }
856
  }
857
- });
 
 
 
 
 
 
 
858
 
859
  if (document.getElementById('amscheckout-onepage')) {
860
 
@@ -885,18 +897,16 @@ document.observe('dom:loaded', function () {
885
  completeCheckout: function () {
886
  if (typeof OPC !== 'undefined') {
887
  checkout.setLoadWaiting(true);
888
- var params = Form.serialize(checkout.form);
889
- var request = new Ajax.Request(checkout.saveUrl, {
890
  method: 'post',
891
- parameters: params,
892
  onSuccess: checkout.setResponse.bind(checkout),
893
  onFailure: checkout.ajaxFailure.bind(checkout)
894
  });
895
  } else if (typeof IWD !== 'undefined' && typeof IWD.OPC !== 'undefined') {
896
- var form = $j_opc('#co-payment-form').serializeArray();
897
  IWD.OPC.Checkout.xhr = $j_opc.post(
898
  IWD.OPC.Checkout.config.baseUrl + 'onepage/json/savePayment',
899
- form,
900
  IWD.OPC.preparePaymentResponse,
901
  'json'
902
  );
@@ -908,10 +918,9 @@ document.observe('dom:loaded', function () {
908
  $('onestepcheckout-button-place-order').addClassName('place-order-loader');
909
  oscPlaceOrderOriginal(btn);
910
  } else if (typeof Payment !== 'undefined') {
911
- var params = Form.serialize(payment.form);
912
- var request = new Ajax.Request(payment.saveUrl, {
913
  method: 'post',
914
- parameters: params,
915
  onComplete: payment.onComplete,
916
  onSuccess: payment.onSave,
917
  onFailure: checkout.ajaxFailure.bind(checkout)
@@ -920,7 +929,59 @@ document.observe('dom:loaded', function () {
920
  document.getElementById('payment-continue').enable();
921
  document.getElementById('multishipping-billing-form').submit();
922
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
923
  }
924
  };
925
  window.SecureSubmitMagento = THIS;
926
- }(window, window.document));
44
  SecureSubmitMagento.hps.Messages.post({
45
  accumulateData: true,
46
  action: 'tokenize',
47
+ data: SecureSubmitMagento.tokenizeOptions
48
  }, 'cardNumber');
49
  } else {
50
  var validator = new Validation(multiForm);
164
  SecureSubmitMagento.hps.Messages.post({
165
  accumulateData: true,
166
  action: 'tokenize',
167
+ data: SecureSubmitMagento.tokenizeOptions
168
  }, 'cardNumber');
169
  } else {
170
  var validator = new Validation(this.form);
221
  lastFourField.value = response.card.number.substr(-4);
222
  typeField.value = response.card_type;
223
 
224
+ SecureSubmitMagento.initializeCCA((function () {
225
+ // Continue Magento checkout steps
226
+ new Ajax.Request(this.saveUrl, {
227
+ method:'post',
228
+ onComplete: this.onComplete,
229
+ onSuccess: this.onSave,
230
+ onFailure: checkout.ajaxFailure.bind(checkout),
231
+ parameters: Form.serialize(this.form)
232
+ });
233
+ }).bind(this));
234
  } else {
235
  alert('Unexpected error.');
236
  }
253
  SecureSubmitMagento.hps.Messages.post({
254
  accumulateData: true,
255
  action: 'tokenize',
256
+ data: SecureSubmitMagento.tokenizeOptions
257
  }, 'cardNumber');
258
  } else {
259
  if ($('hps_securesubmit_exp_date') && $('hps_securesubmit_exp_date').value) {
395
  SecureSubmitMagento.hps.Messages.post({
396
  accumulateData: true,
397
  action: 'tokenize',
398
+ data: SecureSubmitMagento.tokenizeOptions
399
  }, 'cardNumber');
400
  } else {
 
 
 
 
 
401
  (new Heartland.HPS({
402
  publicKey: window.payment.secureSubmitPublicKeyOSC,
403
  cardNumber: $('hps_securesubmit_cc_number').value,
419
  secureSubmitUseStoredCardAOSC = function () {
420
  var newRadio = $('hps_securesubmit_stored_card_select_new');
421
  return !newRadio.checked;
 
 
422
  };
423
 
424
  secureSubmitResponseHandlerAOSC = function (response, btn) {
505
  SecureSubmitMagento.hps.Messages.post({
506
  accumulateData: true,
507
  action: 'tokenize',
508
+ data: SecureSubmitMagento.tokenizeOptions
509
  }, 'cardNumber');
510
  } else {
511
  if ($('hps_securesubmit_exp_date') && $('hps_securesubmit_exp_date').value) {
583
  // IWD OPC
584
  if (typeof IWD !== 'undefined' && typeof IWD.OPC !== 'undefined') {
585
  if (typeof IWD.OPC._secureSubmitOldSavePayment === 'undefined') {
586
+ var oldIWDOPC = Object.clone(IWD.OPC);
587
+ IWD.OPC._secureSubmitOldSavePayment = oldIWDOPC.savePayment;
588
  }
589
  Object.extend(IWD.OPC, {
590
  savePayment: function() {
601
  SecureSubmitMagento.hps.Messages.post({
602
  accumulateData: true,
603
  action: 'tokenize',
604
+ data: SecureSubmitMagento.tokenizeOptions
605
  }, 'cardNumber');
606
  } else {
607
  if ($('hps_securesubmit_exp_date') && $('hps_securesubmit_exp_date').value) {
740
  $j.ajax({
741
  url: THIS.options.giftBalanceUrl,
742
  type: 'GET',
743
+ data: "giftcard_number=" + $j('#' + THIS.options.code + '_giftcard_number').val() +
744
+ "&giftcard_pin=" + $j('#' + THIS.options.code + '_giftcard_pin').val(),
745
  success: function(data) {
746
  if (data.error) {
747
  alert('Error adding gift card: ' + data.message);
787
  },
788
  setupFields: function () {
789
  if (THIS.options.useIframes) {
790
+ var options = {
791
  publicKey: THIS.options.publicKey,
792
  type: 'iframe',
793
  fields: {
823
  }
824
  },
825
  onTokenSuccess: function (resp) {
826
+ var heartland = resp.heartland || resp;
827
+ $(THIS.options.code + '_token').value = heartland.token_value;
828
+ $(THIS.options.code + '_cc_last_four').value = heartland.card.number.substr(-4);
829
+ $(THIS.options.code + '_cc_type').value = heartland.card_type;
830
+ $(THIS.options.code + '_cc_exp_month').value = heartland.exp_month.trim();
831
+ $(THIS.options.code + '_cc_exp_year').value = heartland.exp_year.trim();
832
+
833
+ if (resp.cardinal) {
834
+ var el = document.createElement('input');
835
+ el.value = resp.cardinal.token_value;
836
+ el.type = 'hidden';
837
+ el.name = 'payment[cardinal_token]';
838
+ el.id = THIS.options.code + '_cardinal_token';
839
+ $('payment_form_' + THIS.options.code).appendChild(el);
840
+ }
841
 
842
+ THIS.initializeCCA(THIS.completeCheckout);
843
  },
844
  onTokenError: function (response) {
845
  if (THIS.skipCreditCard) {
859
  checkout.setLoadWaiting(false);
860
  }
861
  }
862
+ };
863
+
864
+ if (THIS.options.cca) {
865
+ options.cca = THIS.options.cca;
866
+ }
867
+
868
+ THIS.tokenizeOptions = options;
869
+ THIS.hps = new Heartland.HPS(options);
870
 
871
  if (document.getElementById('amscheckout-onepage')) {
872
 
897
  completeCheckout: function () {
898
  if (typeof OPC !== 'undefined') {
899
  checkout.setLoadWaiting(true);
900
+ new Ajax.Request(checkout.saveUrl, {
 
901
  method: 'post',
902
+ parameters: Form.serialize(checkout.form),
903
  onSuccess: checkout.setResponse.bind(checkout),
904
  onFailure: checkout.ajaxFailure.bind(checkout)
905
  });
906
  } else if (typeof IWD !== 'undefined' && typeof IWD.OPC !== 'undefined') {
 
907
  IWD.OPC.Checkout.xhr = $j_opc.post(
908
  IWD.OPC.Checkout.config.baseUrl + 'onepage/json/savePayment',
909
+ $j_opc('#co-payment-form').serializeArray(),
910
  IWD.OPC.preparePaymentResponse,
911
  'json'
912
  );
918
  $('onestepcheckout-button-place-order').addClassName('place-order-loader');
919
  oscPlaceOrderOriginal(btn);
920
  } else if (typeof Payment !== 'undefined') {
921
+ new Ajax.Request(payment.saveUrl, {
 
922
  method: 'post',
923
+ parameters: Form.serialize(payment.form),
924
  onComplete: payment.onComplete,
925
  onSuccess: payment.onSave,
926
  onFailure: checkout.ajaxFailure.bind(checkout)
929
  document.getElementById('payment-continue').enable();
930
  document.getElementById('multishipping-billing-form').submit();
931
  }
932
+ },
933
+ initializeCCA: function (callback) {
934
+ if (!THIS.options.cca) {
935
+ callback();
936
+ return;
937
+ }
938
+
939
+ Cardinal.__secureSubmitInitFrame = Cardinal.__secureSubmitInitFrame || false;
940
+ if (!Cardinal.__secureSubmitInitFrame) {
941
+ Cardinal.setup('init', {
942
+ jwt: THIS.options.cca.jwt
943
+ });
944
+ Cardinal.on('payments.validated', function (data, jwt) {
945
+ var el = document.createElement('input');
946
+ data.jwt = jwt;
947
+ el.value = Object.toJSON(data);
948
+ el.type = 'hidden';
949
+ el.name = 'payment[cca_data]';
950
+ $('payment_form_' + THIS.options.code).appendChild(el);
951
+ if (callback) {
952
+ callback();
953
+ }
954
+ });
955
+ Cardinal.__secureSubmitInitFrame = true;
956
+ }
957
+
958
+ Cardinal.trigger('jwt.update', THIS.options.cca.jwt);
959
+
960
+ var payload = {
961
+ OrderDetails: {
962
+ OrderNumber: THIS.options.cca.orderNumber + 'cca'
963
+ }
964
+ };
965
+
966
+ if (THIS.options.useIframes) {
967
+ payload.Token = {
968
+ Token: $(THIS.options.code + '_cardinal_token').value,
969
+ ExpirationMonth: $('hps_securesubmit_cc_exp_month').value.replace(/\D/g, ''),
970
+ ExpirationYear: $('hps_securesubmit_cc_exp_year').value.replace(/\D/g, '')
971
+ };
972
+ } else {
973
+ payload.Consumer = {
974
+ Account: {
975
+ AccountNumber: $('hps_securesubmit_cc_number').value.replace(/\D/g, ''),
976
+ CardCode: $('hps_securesubmit_cvv_number').value.replace(/\D/g, ''),
977
+ ExpirationMonth: $('hps_securesubmit_cc_exp_month').value.replace(/\D/g, ''),
978
+ ExpirationYear: $('hps_securesubmit_cc_exp_year').value.replace(/\D/g, '')
979
+ }
980
+ };
981
+ }
982
+
983
+ Cardinal.start('cca', payload);
984
  }
985
  };
986
  window.SecureSubmitMagento = THIS;
987
+ }(window, window.document));
lib/SecureSubmit/Hps.php CHANGED
@@ -22,6 +22,7 @@ if (!defined('HPS_SDK_LOADED')) {
22
  require_once 'Abstractions/HpsGatewayServiceInterface.php';
23
  require_once 'Abstractions/HpsPayPlanResourceInterface.php';
24
  require_once 'Abstractions/HpsPayPlanResourceAbstract.php';
 
25
 
26
  // Infrastructure
27
  require_once 'Infrastructure/HpsConfiguration.php';
@@ -37,6 +38,8 @@ if (!defined('HPS_SDK_LOADED')) {
37
  require_once 'Infrastructure/HpsProcessorError.php';
38
  require_once 'Infrastructure/HpsProcessorException.php';
39
  require_once 'Infrastructure/HpsProcessorExceptionDetails.php';
 
 
40
  require_once 'Infrastructure/Enums/HpsAccountType.php';
41
  require_once 'Infrastructure/Enums/HpsCheckType.php';
42
  require_once 'Infrastructure/Enums/HpsDataEntryMode.php';
@@ -57,6 +60,7 @@ if (!defined('HPS_SDK_LOADED')) {
57
  require_once 'Infrastructure/Enums/HpsPayPlanScheduleFrequency.php';
58
  require_once 'Infrastructure/Enums/HpsPayPlanScheduleStatus.php';
59
  require_once 'Infrastructure/Enums/HpsCentinelCheckoutType.php';
 
60
  require_once 'Infrastructure/Validation/HpsGatewayResponseValidation.php';
61
  require_once 'Infrastructure/Validation/HpsInputValidation.php';
62
  require_once 'Infrastructure/Validation/HpsIssuerResponseValidation.php';
@@ -73,6 +77,7 @@ if (!defined('HPS_SDK_LOADED')) {
73
  require_once 'Entities/HpsTransactionDetails.php';
74
  require_once 'Entities/HpsTransactionHeader.php';
75
  require_once 'Entities/HpsTransactionStatus.php';
 
76
  require_once 'Entities/Batch/HpsBatch.php';
77
  require_once 'Entities/Check/HpsCheck.php';
78
  require_once 'Entities/Check/HpsCheckHolder.php';
@@ -90,9 +95,11 @@ if (!defined('HPS_SDK_LOADED')) {
90
  require_once 'Entities/Credit/HpsReportTransactionDetails.php';
91
  require_once 'Entities/Credit/HpsReportTransactionSummary.php';
92
  require_once 'Entities/Credit/HpsReversal.php';
 
93
  require_once 'Entities/Credit/HpsCPCData.php';
94
  require_once 'Entities/Credit/HpsCPCEdit.php';
95
  require_once 'Entities/Credit/HpsVoid.php';
 
96
  require_once 'Entities/Debit/HpsDebitAddValue.php';
97
  require_once 'Entities/Debit/HpsDebitReturn.php';
98
  require_once 'Entities/Debit/HpsDebitReversal.php';
@@ -151,6 +158,7 @@ if (!defined('HPS_SDK_LOADED')) {
151
  require_once 'Services/Gateway/HpsGiftCardService.php';
152
  require_once 'Services/Gateway/HpsPayPlanService.php';
153
  require_once 'Services/Gateway/HpsTokenService.php';
 
154
  require_once 'Services/Gateway/AltPayment/HpsAltPaymentService.php';
155
  require_once 'Services/Gateway/AltPayment/HpsPayPalService.php';
156
  require_once 'Services/Gateway/AltPayment/HpsMasterPassService.php';
@@ -192,6 +200,7 @@ if (!defined('HPS_SDK_LOADED')) {
192
  require_once 'Services/Fluent/Gateway/GiftCard/HpsGiftCardServiceRewardBuilder.php';
193
  require_once 'Services/Fluent/Gateway/GiftCard/HpsGiftCardServiceSaleBuilder.php';
194
  require_once 'Services/Fluent/Gateway/GiftCard/HpsGiftCardServiceVoidBuilder.php';
 
195
  require_once 'Services/Fluent/Gateway/HpsFluentCheckService.php';
196
  require_once 'Services/Fluent/Gateway/HpsFluentCreditService.php';
197
  require_once 'Services/Fluent/Gateway/HpsFluentDebitService.php';
22
  require_once 'Abstractions/HpsGatewayServiceInterface.php';
23
  require_once 'Abstractions/HpsPayPlanResourceInterface.php';
24
  require_once 'Abstractions/HpsPayPlanResourceAbstract.php';
25
+ require_once 'Abstractions/HpsLoggerInterface.php';
26
 
27
  // Infrastructure
28
  require_once 'Infrastructure/HpsConfiguration.php';
38
  require_once 'Infrastructure/HpsProcessorError.php';
39
  require_once 'Infrastructure/HpsProcessorException.php';
40
  require_once 'Infrastructure/HpsProcessorExceptionDetails.php';
41
+ require_once 'Infrastructure/HpsEmptyLogger.php';
42
+ require_once 'Infrastructure/HpsLogger.php';
43
  require_once 'Infrastructure/Enums/HpsAccountType.php';
44
  require_once 'Infrastructure/Enums/HpsCheckType.php';
45
  require_once 'Infrastructure/Enums/HpsDataEntryMode.php';
60
  require_once 'Infrastructure/Enums/HpsPayPlanScheduleFrequency.php';
61
  require_once 'Infrastructure/Enums/HpsPayPlanScheduleStatus.php';
62
  require_once 'Infrastructure/Enums/HpsCentinelCheckoutType.php';
63
+ require_once 'Infrastructure/Enums/HpsAttachmentType.php';
64
  require_once 'Infrastructure/Validation/HpsGatewayResponseValidation.php';
65
  require_once 'Infrastructure/Validation/HpsInputValidation.php';
66
  require_once 'Infrastructure/Validation/HpsIssuerResponseValidation.php';
77
  require_once 'Entities/HpsTransactionDetails.php';
78
  require_once 'Entities/HpsTransactionHeader.php';
79
  require_once 'Entities/HpsTransactionStatus.php';
80
+ require_once 'Entities/Attachment/HpsAttachment.php';
81
  require_once 'Entities/Batch/HpsBatch.php';
82
  require_once 'Entities/Check/HpsCheck.php';
83
  require_once 'Entities/Check/HpsCheckHolder.php';
95
  require_once 'Entities/Credit/HpsReportTransactionDetails.php';
96
  require_once 'Entities/Credit/HpsReportTransactionSummary.php';
97
  require_once 'Entities/Credit/HpsReversal.php';
98
+ require_once 'Entities/Credit/HpsSecureEcommerce.php';
99
  require_once 'Entities/Credit/HpsCPCData.php';
100
  require_once 'Entities/Credit/HpsCPCEdit.php';
101
  require_once 'Entities/Credit/HpsVoid.php';
102
+ require_once 'Entities/Credit/HpsManageTokensResponse.php';
103
  require_once 'Entities/Debit/HpsDebitAddValue.php';
104
  require_once 'Entities/Debit/HpsDebitReturn.php';
105
  require_once 'Entities/Debit/HpsDebitReversal.php';
158
  require_once 'Services/Gateway/HpsGiftCardService.php';
159
  require_once 'Services/Gateway/HpsPayPlanService.php';
160
  require_once 'Services/Gateway/HpsTokenService.php';
161
+ require_once 'Services/Gateway/HpsAttachmentService.php';
162
  require_once 'Services/Gateway/AltPayment/HpsAltPaymentService.php';
163
  require_once 'Services/Gateway/AltPayment/HpsPayPalService.php';
164
  require_once 'Services/Gateway/AltPayment/HpsMasterPassService.php';
200
  require_once 'Services/Fluent/Gateway/GiftCard/HpsGiftCardServiceRewardBuilder.php';
201
  require_once 'Services/Fluent/Gateway/GiftCard/HpsGiftCardServiceSaleBuilder.php';
202
  require_once 'Services/Fluent/Gateway/GiftCard/HpsGiftCardServiceVoidBuilder.php';
203
+ require_once 'Services/Fluent/Gateway/Credit/HpsCreditServiceUpdateTokenExpirationBuilder.php';
204
  require_once 'Services/Fluent/Gateway/HpsFluentCheckService.php';
205
  require_once 'Services/Fluent/Gateway/HpsFluentCreditService.php';
206
  require_once 'Services/Fluent/Gateway/HpsFluentDebitService.php';
lib/SecureSubmit/src/Abstractions/HpsAltPaymentServiceInterface.php CHANGED
@@ -41,8 +41,8 @@ interface HpsAltPaymentServiceInterface
41
  $orderId,
42
  $amount,
43
  $currency,
44
- HpsBuyerData $buyer,
45
- HpsPaymentData $payment,
46
  HpsShippingInfo $shippingAddress = null,
47
  $lineItems = null,
48
  HpsOrderData $orderData = null
@@ -80,8 +80,8 @@ interface HpsAltPaymentServiceInterface
80
  public function createSession(
81
  $amount,
82
  $currency,
83
- HpsBuyerData $buyer,
84
- HpsPaymentData $payment,
85
  HpsShippingInfo $shippingAddress = null,
86
  $lineItems = null,
87
  HpsOrderData $orderData = null
@@ -123,8 +123,8 @@ interface HpsAltPaymentServiceInterface
123
  $orderId,
124
  $amount,
125
  $currency,
126
- HpsBuyerData $buyer,
127
- HpsPaymentData $payment,
128
  HpsShippingInfo $shippingAddress = null,
129
  $lineItems = null,
130
  HpsOrderData $orderData = null
41
  $orderId,
42
  $amount,
43
  $currency,
44
+ HpsBuyerData $buyer = null,
45
+ HpsPaymentData $payment = null,
46
  HpsShippingInfo $shippingAddress = null,
47
  $lineItems = null,
48
  HpsOrderData $orderData = null
80
  public function createSession(
81
  $amount,
82
  $currency,
83
+ HpsBuyerData $buyer = null,
84
+ HpsPaymentData $payment = null,
85
  HpsShippingInfo $shippingAddress = null,
86
  $lineItems = null,
87
  HpsOrderData $orderData = null
123
  $orderId,
124
  $amount,
125
  $currency,
126
+ HpsBuyerData $buyer = null,
127
+ HpsPaymentData $payment = null,
128
  HpsShippingInfo $shippingAddress = null,
129
  $lineItems = null,
130
  HpsOrderData $orderData = null
lib/SecureSubmit/src/Abstractions/HpsConfigInterface.php CHANGED
@@ -6,6 +6,6 @@ interface HpsConfigInterface
6
  const KEY_TYPE_PUBLIC = 'public';
7
  const KEY_TYPE_UNKNOWN = 'unknown';
8
  public function serviceUri();
9
- public function setServiceUri(string $value);
10
  public function validate($keyType);
11
  }
6
  const KEY_TYPE_PUBLIC = 'public';
7
  const KEY_TYPE_UNKNOWN = 'unknown';
8
  public function serviceUri();
9
+ public function setServiceUri($value);
10
  public function validate($keyType);
11
  }
lib/SecureSubmit/src/Abstractions/HpsGatewayServiceAbstract.php CHANGED
@@ -8,6 +8,7 @@ abstract class HpsGatewayServiceAbstract
8
  protected $_amount = null;
9
  protected $_currency = null;
10
  protected $_filterBy = null;
 
11
 
12
  public function __construct(HpsConfigInterface $config = null)
13
  {
@@ -51,6 +52,8 @@ abstract class HpsGatewayServiceAbstract
51
  );
52
  }
53
 
 
 
54
  try {
55
  $request = curl_init();
56
  curl_setopt($request, CURLOPT_URL, $url);
@@ -60,9 +63,11 @@ abstract class HpsGatewayServiceAbstract
60
  curl_setopt($request, CURLOPT_SSL_VERIFYPEER, false);
61
  curl_setopt($request, CURLOPT_SSL_VERIFYHOST, false);
62
  if ($data != null) {
 
63
  curl_setopt($request, CURLOPT_CUSTOMREQUEST, $httpVerb);
64
  curl_setopt($request, CURLOPT_POSTFIELDS, $data);
65
  }
 
66
  curl_setopt($request, CURLOPT_HTTPHEADER, $headers);
67
  curl_setopt($request, CURLOPT_PROTOCOLS, CURLPROTO_HTTPS);
68
 
@@ -70,14 +75,33 @@ abstract class HpsGatewayServiceAbstract
70
  curl_setopt($request, CURLOPT_PROXY, $this->_config->proxyOptions['proxy_host']);
71
  curl_setopt($request, CURLOPT_PROXYPORT, $this->_config->proxyOptions['proxy_port']);
72
  }
 
 
 
 
 
 
 
 
73
  $curlResponse = curl_exec($request);
74
  $curlInfo = curl_getinfo($request);
75
  $curlError = curl_errno($request);
76
 
77
- if ($curlError == 28) {
 
 
 
 
78
  throw new HpsException("gateway_time-out");
79
  }
80
 
 
 
 
 
 
 
 
81
  return $this->processResponse($curlResponse, $curlInfo, $curlError);
82
  } catch (Exception $e) {
83
  throw new HpsGatewayException(
8
  protected $_amount = null;
9
  protected $_currency = null;
10
  protected $_filterBy = null;
11
+ const MIN_OPENSSL_VER = 268439615; //OPENSSL_VERSION_NUMBER openSSL 1.0.1c
12
 
13
  public function __construct(HpsConfigInterface $config = null)
14
  {
52
  );
53
  }
54
 
55
+ $logger = HpsLogger::getInstance();
56
+
57
  try {
58
  $request = curl_init();
59
  curl_setopt($request, CURLOPT_URL, $url);
63
  curl_setopt($request, CURLOPT_SSL_VERIFYPEER, false);
64
  curl_setopt($request, CURLOPT_SSL_VERIFYHOST, false);
65
  if ($data != null) {
66
+ $logger->log('Request data', $data);
67
  curl_setopt($request, CURLOPT_CUSTOMREQUEST, $httpVerb);
68
  curl_setopt($request, CURLOPT_POSTFIELDS, $data);
69
  }
70
+ $logger->log('Request headers', $headers);
71
  curl_setopt($request, CURLOPT_HTTPHEADER, $headers);
72
  curl_setopt($request, CURLOPT_PROTOCOLS, CURLPROTO_HTTPS);
73
 
75
  curl_setopt($request, CURLOPT_PROXY, $this->_config->proxyOptions['proxy_host']);
76
  curl_setopt($request, CURLOPT_PROXYPORT, $this->_config->proxyOptions['proxy_port']);
77
  }
78
+
79
+ if (
80
+ $this->_config->curlOptions != null
81
+ && !empty($this->_config->curlOptions)
82
+ ) {
83
+ curl_setopt_array($request, $this->_config->curlOptions);
84
+ }
85
+
86
  $curlResponse = curl_exec($request);
87
  $curlInfo = curl_getinfo($request);
88
  $curlError = curl_errno($request);
89
 
90
+ $logger->log('Response data', $curlResponse);
91
+ $logger->log('Curl info', $curlInfo);
92
+ $logger->log('Curl error', $curlError);
93
+
94
+ if ($curlError == 28) { //CURLE_OPERATION_TIMEOUTED
95
  throw new HpsException("gateway_time-out");
96
  }
97
 
98
+ if ($curlError == 35) { //CURLE_SSL_CONNECT_ERROR
99
+ $err_msg = 'PHP-SDK cURL TLS 1.2 handshake failed. If you have any questions, please contact Specialty Products Team at 866.802.9753.';
100
+ if ( extension_loaded('openssl') && OPENSSL_VERSION_NUMBER < self::MIN_OPENSSL_VER ) { // then you don't have openSSL 1.0.1c or greater
101
+ $err_msg .= 'Your current version of OpenSSL is ' . OPENSSL_VERSION_TEXT . 'You do not have the minimum version of OpenSSL 1.0.1c which is required for curl to use TLS 1.2 handshake.';
102
+ }
103
+ throw new HpsGatewayException($curlError,$err_msg);
104
+ }
105
  return $this->processResponse($curlResponse, $curlInfo, $curlError);
106
  } catch (Exception $e) {
107
  throw new HpsGatewayException(
lib/SecureSubmit/src/Abstractions/HpsGatewayServiceInterface.php CHANGED
@@ -2,6 +2,6 @@
2
 
3
  interface HpsGatewayServiceInterface
4
  {
5
- public function doRequest($data, $options);
6
  public function processResponse($curlResponse, $curlInfo, $curlError);
7
  }
2
 
3
  interface HpsGatewayServiceInterface
4
  {
5
+ public function doRequest($data, $options = array());
6
  public function processResponse($curlResponse, $curlInfo, $curlError);
7
  }
lib/SecureSubmit/src/Abstractions/HpsLoggerInterface.php ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
1
+ <?php
2
+
3
+ interface HpsLoggerInterface
4
+ {
5
+ public function log($message, $object = null);
6
+ }
lib/SecureSubmit/src/Abstractions/HpsPayPlanResourceAbstract.php CHANGED
@@ -11,17 +11,17 @@ abstract class HpsPayPlanResourceAbstract implements HpsPayPlanResourceInterface
11
  /** @var string|null */
12
  public $lastChangeDate = null;
13
 
14
- protected function isNotNull($value)
15
  {
16
- return $value !== null;
17
  }
18
 
19
  public function getEditableFieldsWithValues($class, $params = array())
20
  {
21
  $array = array_intersect_key(
22
  get_object_vars($this),
23
- array_flip(call_user_func_array($class.'::getEditableFields', $params))
24
  );
25
- return array_filter($array, array($this, 'isNotNull'));
26
  }
27
  }
11
  /** @var string|null */
12
  public $lastChangeDate = null;
13
 
14
+ protected function isNotNullOrEmpty($value)
15
  {
16
+ return $value !== null && !empty($value);
17
  }
18
 
19
  public function getEditableFieldsWithValues($class, $params = array())
20
  {
21
  $array = array_intersect_key(
22
  get_object_vars($this),
23
+ array_flip(call_user_func($class.'::getEditableFields', $params))
24
  );
25
+ return array_filter($array, array($this, 'isNotNullOrEmpty'));
26
  }
27
  }
lib/SecureSubmit/src/Entities/AltPayment/HpsAltPaymentSessionInfo.php CHANGED
@@ -29,36 +29,34 @@ class HpsAltPaymentSessionInfo extends HpsAltPaymentResponse
29
  $session->status = isset($sessionInfo->Status) ? (string)$sessionInfo->Status : null;
30
 
31
  $session->buyer = new HpsBuyerData();
32
- $session->buyer->emailAddress = isset($buyer['EmailAddress']) ? (string)$buyer['EmailAddress'] : null;
33
- $session->buyer->payerId = isset($buyer['BuyerId']) ? (string)$buyer['BuyerId'] : null;
34
- $session->buyer->status = isset($buyer['Status']) ? (string)$buyer['Status'] : null;
35
- $session->buyer->countryCode = isset($buyer['CountryCode']) ? (string)$buyer['CountryCode'] : null;
36
- $session->buyer->firstName = isset($buyer['FirstName']) ? (string)$buyer['FirstName'] : null;
37
- $session->buyer->lastName = isset($buyer['LastName']) ? (string)$buyer['LastName'] : null;
38
- $session->buyer->phoneNumber = isset($buyer['PhoneNumber']) ? (string)$buyer['PhoneNumber'] : null;
39
 
40
  $session->shipping = new HpsShippingInfo();
41
- $session->shipping->name = isset($shipping['ShipName']) ? (string)$shipping['ShipName'] : null;
42
  $session->shipping->address = new HpsAddress();
43
- $session->shipping->address->address = isset($shipping['ShipAddress']) ? (string)$shipping['ShipAddress'] : null;
44
- $session->shipping->address->address2 = isset($shipping['ShipAddress2']) ? (string)$shipping['ShipAddress2'] : null;
45
- $session->shipping->address->city = isset($shipping['ShipCity']) ? (string)$shipping['ShipCity'] : null;
46
- $session->shipping->address->state = isset($shipping['ShipState']) ? (string)$shipping['ShipState'] : null;
47
- $session->shipping->address->zip = isset($shipping['ShipZip']) ? (string)$shipping['ShipZip'] : null;
48
- $session->shipping->address->country = isset($shipping['ShipCountryCode']) ? (string)$shipping['ShipCountryCode'] : null;
49
 
50
  $session->payment = new HpsPaymentData();
51
- $session->payment->subtotal = isset($payment['ItemAmount']) ? (string)$payment['ItemAmount'] : null;
52
- $session->payment->shippingAmount = isset($payment['ShippingAmount']) ? (string)$payment['ShippingAmount'] : null;
53
- $session->payment->taxAmount = isset($payment['TaxAmount']) ? (string)$payment['TaxAmount'] : null;
54
 
55
  $session->lineItems = array();
56
  $lineItem = new HpsLineitem();
57
- $lineItem->name = isset($lineItems['Name']) ? (string)$lineItems['Name'] : null;
58
- $lineItem->amount = isset($lineItems['Amount']) ? (string)$lineItems['Amount'] : null;
59
- $lineItem->number = isset($lineItems['Number']) ? (string)$lineItems['Number'] : null;
60
- $lineItem->quantity = isset($lineItems['Quantity']) ? (string)$lineItems['Quantity'] : null;
61
- $lineItem->taxAmount = isset($lineItems['TaxAmount']) ? (string)$lineItems['TaxAmount'] : null;
62
 
63
  return $session;
64
  }
29
  $session->status = isset($sessionInfo->Status) ? (string)$sessionInfo->Status : null;
30
 
31
  $session->buyer = new HpsBuyerData();
32
+ $session->buyer->emailAddress = isset($buyer['EmailAddress']) ? $buyer['EmailAddress'] : null;
33
+ $session->buyer->payerId = isset($buyer['BuyerId']) ? $buyer['BuyerId'] : null;
34
+ $session->buyer->status = isset($buyer['Status']) ? $buyer['Status'] : null;
35
+ $session->buyer->countryCode = isset($buyer['CountryCode']) ? $buyer['CountryCode'] : null;
36
+ $session->buyer->firstName = isset($buyer['FirstName']) ? $buyer['FirstName'] : null;
37
+ $session->buyer->lastName = isset($buyer['LastName']) ? $buyer['LastName'] : null;
 
38
 
39
  $session->shipping = new HpsShippingInfo();
40
+ $session->shipping->name = isset($shipping['ShipName']) ? $shipping['ShipName'] : null;
41
  $session->shipping->address = new HpsAddress();
42
+ $session->shipping->address->address = isset($shipping['ShipAddress']) ? $shipping['ShipAddress'] : null;
43
+ $session->shipping->address->city = isset($shipping['ShipCity']) ? $shipping['ShipCity'] : null;
44
+ $session->shipping->address->state = isset($shipping['ShipState']) ? $shipping['ShipState'] : null;
45
+ $session->shipping->address->zip = isset($shipping['ShipZip']) ? $shipping['ShipZip'] : null;
46
+ $session->shipping->address->country = isset($shipping['ShipCountryCode']) ? $shipping['ShipCountryCode'] : null;
 
47
 
48
  $session->payment = new HpsPaymentData();
49
+ $session->payment->subtotal = isset($payment['ItemAmount']) ? $payment['ItemAmount'] : null;
50
+ $session->payment->shippingAmount = isset($payment['ShippingAmount']) ? $payment['ShippingAmount'] : null;
51
+ $session->payment->taxAmount = isset($payment['TaxAmount']) ? $payment['TaxAmount'] : null;
52
 
53
  $session->lineItems = array();
54
  $lineItem = new HpsLineitem();
55
+ $lineItem->name = isset($lineItems['Name']) ? $lineItems['Name'] : null;
56
+ $lineItem->amount = isset($lineItems['Amount']) ? $lineItems['Amount'] : null;
57
+ $lineItem->number = isset($lineItems['Number']) ? $lineItems['Number'] : null;
58
+ $lineItem->quantity = isset($lineItems['Quantity']) ? $lineItems['Quantity'] : null;
59
+ $lineItem->taxAmount = isset($lineItems['TaxAmount']) ? $lineItems['TaxAmount'] : null;
60
 
61
  return $session;
62
  }
lib/SecureSubmit/src/Entities/Attachment/HpsAttachment.php ADDED
@@ -0,0 +1,117 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Class HpsAttachment
4
+ * implements AttachmentRspDataType Complex Type
5
+ * @link https://posgateway.cert.secureexchange.net/Gateway/PorticoSOAPSchema/build/Default/webframe.html#Portico%20Schema_xsd~c-PosGetAttachmentsRspType~e-Details.html
6
+ * @package PHP-SDK/src/Entities/Attachment/HpsAttachment.php
7
+ * show off @property
8
+ *
9
+ * @property string $attachmentType
10
+ * @property string $attachmentData
11
+ * @property string $attachmentFormat
12
+ * @property int $height
13
+ * @property int $width
14
+ * @property string $attachmentName
15
+ * @property int $attachmentDataId
16
+ */
17
+ class HpsAttachment extends HpsTransaction
18
+ {
19
+ // https://posgateway.cert.secureexchange.net/Gateway/PorticoSOAPSchema/build/Default/webframe.html#Portico%20Schema_xsd~s-attachmentTypeType.html
20
+ /**
21
+ * @var string
22
+ */
23
+ private $attachmentType = ''; // string
24
+ /**
25
+ * @var string
26
+ */
27
+ private $attachmentData = ''; // string Base64 encoded attachment data
28
+ /*https://posgateway.cert.secureexchange.net/Gateway/PorticoSOAPSchema/build/Default/webframe.html#Portico%20Schema_xsd~s-attachmentFormatType.html*/
29
+ /**
30
+ * @var string
31
+ */
32
+ private $attachmentFormat = ''; // string
33
+ /**
34
+ * @var int
35
+ */
36
+ private $height = 0; // int
37
+ /**
38
+ * @var int
39
+ */
40
+ private $width = 0; // int
41
+ /*A merchant-assigned name for the associated attachment */
42
+ /**
43
+ * @var string
44
+ */
45
+ private $attachmentName = ''; // string
46
+ /*Gateway-generated attachment identifier */
47
+ /**
48
+ * @var int
49
+ */
50
+ private $attachmentDataId = 0; // int
51
+
52
+ /**
53
+ * @param \SimpleXMLElement $rsp
54
+ * @param null $txnType
55
+ * @param string $returnType
56
+ *
57
+ * @return HpsAttachment
58
+ */
59
+ public static function fromDict($rsp, $txnType, $returnType = 'HpsAttachment')
60
+ {
61
+ $attResponse = $rsp->Transaction->$txnType->Details;
62
+ $transaction = parent::fromDict($rsp, $txnType, $returnType);
63
+ foreach (get_object_vars($attResponse) as $key => $prop) {
64
+ if (property_exists($transaction, lcfirst($key))) {
65
+ $transaction->__set(lcfirst($key), $prop);
66
+ }
67
+ }
68
+ return $transaction;
69
+ }
70
+
71
+ /**
72
+ * @param string $name
73
+ * @param float|string|int $value Never a Bool
74
+ * @throws HpsArgumentException
75
+ */
76
+ public function __set($name, $value)
77
+ {
78
+ if (!$value instanceof stdClass) {
79
+ if (!property_exists(__CLASS__, $name)) {
80
+ $value = null;
81
+ }
82
+ switch ($name) {
83
+ case 'height':
84
+ case 'width':
85
+ case 'attachmentDataId':
86
+ $validator = FILTER_SANITIZE_NUMBER_INT;
87
+ break;
88
+ default:
89
+ $validator = FILTER_SANITIZE_STRING;
90
+ }
91
+ $value = filter_var($value, $validator);
92
+
93
+ if ($name === 'attachmentFormat' && preg_match(HpsAttachmentType::VALID_ATTACHMENT_FORMAT, $value) !== 1) {
94
+ throw new \HpsArgumentException('attachmentFormat not a valid enum', 1);
95
+ }
96
+
97
+ if ($value === false) {
98
+ throw new \HpsArgumentException('invalid parameter for {' . __CLASS__ . '}', 1);
99
+ } //
100
+ $this->{$name} = $value;
101
+ }
102
+
103
+ }
104
+
105
+ /**
106
+ * @param string $name
107
+ * @return float|string|int null
108
+ */
109
+ public function __get($name)
110
+ {
111
+ $value = null;
112
+ if (property_exists(__CLASS__, $name)) {
113
+ $value = $this->{$name};
114
+ }
115
+ return $value;
116
+ }
117
+ }
lib/SecureSubmit/src/Entities/Credit/HpsManageTokensResponse.php ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Class HpsManageTokensResponse
5
+ */
6
+ class HpsManageTokensResponse extends HpsTransaction
7
+ {
8
+ /**
9
+ * @param \SimpleXMLElement $rsp
10
+ * @param null $txnType
11
+ * @param string $returnType
12
+ *
13
+ * @return HpsManageTokensResponse
14
+ */
15
+ public static function fromDict($rsp, $txnType = null, $returnType = 'HpsManageTokensResponse')
16
+ {
17
+ $transaction = parent::fromDict($rsp, $txnType, $returnType);
18
+ $transaction->responseCode = '00';
19
+ $transaction->responseText = '';
20
+ return $transaction;
21
+ }
22
+ }
lib/SecureSubmit/src/Entities/Credit/HpsReportTransactionDetails.php CHANGED
@@ -37,7 +37,6 @@ class HpsReportTransactionDetails extends HpsAuthorization
37
  $details->responseCode = (isset($reportResponse->Data->RspCode) ? (string)$reportResponse->Data->RspCode : null);
38
  $details->responseText = (isset($reportResponse->Data->RspText) ? (string)$reportResponse->Data->RspText : null);
39
  $details->transactionStatus = (isset($reportResponse->Data->TxnStatus) ? (string)$reportResponse->Data->TxnStatus : null);
40
- $details->settlementAmt = (isset($reportResponse->Data->SettlementAmt) ? (string)$reportResponse->Data->SettlementAmt : null);
41
 
42
  if (isset($reportResponse->Data->TokenizationMsg)) {
43
  $details->tokenData = new HpsTokenData();
@@ -45,10 +44,10 @@ class HpsReportTransactionDetails extends HpsAuthorization
45
  }
46
 
47
  if (isset($reportResponse->Data->AdditionalTxnFields)) {
48
- $additionalTxnFields = $reportResponse->Data->additionalTxnFields;
49
  $details->memo = (isset($additionalTxnFields->Description) ? (string)$additionalTxnFields->Description : null);
50
  $details->invoiceNumber = (isset($additionalTxnFields->InvoiceNbr) ? (string)$additionalTxnFields->InvoiceNbr : null);
51
- $details->customerId = (isset($additionalTxnFields->CustomerId) ? (string)$additionalTxnFields->CustomerId : null);
52
  }
53
 
54
  if ((string)$reportResponse->Data->RspCode != '00') {
37
  $details->responseCode = (isset($reportResponse->Data->RspCode) ? (string)$reportResponse->Data->RspCode : null);
38
  $details->responseText = (isset($reportResponse->Data->RspText) ? (string)$reportResponse->Data->RspText : null);
39
  $details->transactionStatus = (isset($reportResponse->Data->TxnStatus) ? (string)$reportResponse->Data->TxnStatus : null);
 
40
 
41
  if (isset($reportResponse->Data->TokenizationMsg)) {
42
  $details->tokenData = new HpsTokenData();
44
  }
45
 
46
  if (isset($reportResponse->Data->AdditionalTxnFields)) {
47
+ $additionalTxnFields = $reportResponse->Data->AdditionalTxnFields;
48
  $details->memo = (isset($additionalTxnFields->Description) ? (string)$additionalTxnFields->Description : null);
49
  $details->invoiceNumber = (isset($additionalTxnFields->InvoiceNbr) ? (string)$additionalTxnFields->InvoiceNbr : null);
50
+ $details->customerId = (isset($additionalTxnFields->CustomerID) ? (string)$additionalTxnFields->CustomerID : null);
51
  }
52
 
53
  if ((string)$reportResponse->Data->RspCode != '00') {
lib/SecureSubmit/src/Entities/Credit/HpsSecureEcommerce.php ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class HpsSecureEcommerce
4
+ {
5
+ public $dataSource = null;
6
+ public $type = null;
7
+ public $data = null;
8
+ public $eciFlag = null;
9
+ public $xid = null;
10
+ }
lib/SecureSubmit/src/Entities/HpsAddress.php CHANGED
@@ -2,10 +2,9 @@
2
 
3
  class HpsAddress
4
  {
5
- public $address = null;
6
- public $address2 = null;
7
- public $city = null;
8
- public $state = null;
9
- public $zip = null;
10
- public $country = null;
11
  }
2
 
3
  class HpsAddress
4
  {
5
+ public $address = null;
6
+ public $city = null;
7
+ public $state = null;
8
+ public $zip = null;
9
+ public $country = null;
 
10
  }
lib/SecureSubmit/src/Entities/HpsTokenData.php CHANGED
@@ -3,6 +3,9 @@
3
  class HpsTokenData
4
  {
5
  public $tokenValue = null;
 
 
 
6
  public $responseCode = null;
7
  public $responseMessage = null;
8
 
3
  class HpsTokenData
4
  {
5
  public $tokenValue = null;
6
+ public $expMonth = null;
7
+ public $expYear = null;
8
+ public $cvv = null;
9
  public $responseCode = null;
10
  public $responseMessage = null;
11
 
lib/SecureSubmit/src/Entities/HpsTransaction.php CHANGED
@@ -26,7 +26,11 @@ class HpsTransaction
26
  }
27
 
28
  // Hydrate the body
29
- $item = $rsp->Transaction->$txnType;
 
 
 
 
30
  if ($item != null) {
31
  $transaction->responseCode = (isset($item->RspCode) ? (string)$item->RspCode : null);
32
  $transaction->responseText = (isset($item->RspText) ? (string)$item->RspText : null);
26
  }
27
 
28
  // Hydrate the body
29
+ if (!isset($rsp->Transaction) || !isset($rsp->Transaction->{$txnType})) {
30
+ return $transaction;
31
+ }
32
+ // Hydrate the body
33
+ $item = $rsp->Transaction->{$txnType};
34
  if ($item != null) {
35
  $transaction->responseCode = (isset($item->RspCode) ? (string)$item->RspCode : null);
36
  $transaction->responseText = (isset($item->RspText) ? (string)$item->RspText : null);
lib/SecureSubmit/src/Entities/PayPlan/HpsPayPlanSchedule.php CHANGED
@@ -83,14 +83,20 @@ class HpsPayPlanSchedule extends HpsPayPlanResourceAbstract
83
  /** @var string|null */
84
  public $scheduleStarted = null;
85
 
 
 
 
 
 
 
86
  public function __construct() {
87
  $this->emailReceipt = 'Never';
88
  $this->emailAdvanceNotice = 'No';
89
  }
90
 
91
- public static function getEditableFields()
92
  {
93
- return array(
94
  'scheduleName',
95
  'scheduleStatus',
96
  'deviceId',
@@ -99,19 +105,25 @@ class HpsPayPlanSchedule extends HpsPayPlanResourceAbstract
99
  'taxAmount',
100
  'numberOfPaymentsRemaining',
101
  'endDate',
102
- 'cancellationDate',
103
  'reprocessingCount',
104
  'emailReceipt',
105
  'emailAdvanceNotice',
106
  'processingDateInfo',
107
- // Only editable when scheduleStarted = false
108
- 'scheduleIdentifier',
109
- 'startDate',
110
- 'frequency',
111
- 'duration',
112
- // Only editable when scheduleStarted = true
113
- 'nextProcessingDate',
114
  );
 
 
 
 
 
 
 
 
 
 
 
 
115
  }
116
 
117
  public static function getSearchableFields()
@@ -172,12 +184,16 @@ class HpsPayPlanSchedule extends HpsPayPlanResourceAbstract
172
  $ret->creationDate = property_exists($obj, 'creationDate') ? $obj->creationDate : null;
173
  $ret->lastChangeDate = property_exists($obj, 'lastChangeDate') ? $obj->lastChangeDate : null;
174
  $ret->statusSetDate = property_exists($obj, 'statusSetDate') ? $obj->statusSetDate : null;
 
 
175
  return $ret;
176
  }
177
 
178
  // Needs to be implemented to get name of child class
179
- public function getEditableFieldsWithValues($class = '', $params = array())
180
- {
181
- return parent::getEditableFieldsWithValues(get_class(), $params);
 
 
182
  }
183
  }
83
  /** @var string|null */
84
  public $scheduleStarted = null;
85
 
86
+ /** @var string|null */
87
+ public $invoiceNbr = null;
88
+
89
+ /** @var string|null */
90
+ public $description = null;
91
+
92
  public function __construct() {
93
  $this->emailReceipt = 'Never';
94
  $this->emailAdvanceNotice = 'No';
95
  }
96
 
97
+ public static function getEditableFields( HpsPayPlanSchedule $schedule = null )
98
  {
99
+ $editableFields = array(
100
  'scheduleName',
101
  'scheduleStatus',
102
  'deviceId',
105
  'taxAmount',
106
  'numberOfPaymentsRemaining',
107
  'endDate',
 
108
  'reprocessingCount',
109
  'emailReceipt',
110
  'emailAdvanceNotice',
111
  'processingDateInfo',
112
+ 'invoiceNbr',
113
+ 'description',
 
 
 
 
 
114
  );
115
+ if ($schedule->scheduleStarted === 'true'){
116
+ $editableFields[] = 'cancellationDate';
117
+ $editableFields[] = 'nextProcessingDate';
118
+ }
119
+ // Only editable when scheduleStarted = false
120
+ else{
121
+ $editableFields[] = 'scheduleIdentifier';
122
+ $editableFields[] = 'startDate';
123
+ $editableFields[] = 'frequency';
124
+ $editableFields[] = 'duration';
125
+ }
126
+ return $editableFields;
127
  }
128
 
129
  public static function getSearchableFields()
184
  $ret->creationDate = property_exists($obj, 'creationDate') ? $obj->creationDate : null;
185
  $ret->lastChangeDate = property_exists($obj, 'lastChangeDate') ? $obj->lastChangeDate : null;
186
  $ret->statusSetDate = property_exists($obj, 'statusSetDate') ? $obj->statusSetDate : null;
187
+ $ret->description = property_exists($obj, 'description') ? $obj->description : null;
188
+ $ret->invoiceNbr = property_exists($obj, 'invoiceNbr') ? $obj->invoiceNbr : null;
189
  return $ret;
190
  }
191
 
192
  // Needs to be implemented to get name of child class
193
+ public function getEditableFieldsWithValues($params = null,$class = 'HpsPayPlanSchedule'){
194
+ if ($params===null){
195
+ $params=$this;
196
+ }
197
+ return parent::getEditableFieldsWithValues($class, $params);
198
  }
199
  }
lib/SecureSubmit/src/Infrastructure/Enums/HpsAttachmentType.php ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Created by PhpStorm.
5
+ * User: charles.simmons
6
+ * Date: 7/15/2016
7
+ * Time: 3:23 PM
8
+ */
9
+ class HpsAttachmentType
10
+ {
11
+ const SIGNATURE = 'SIGNATURE_IMAGE';
12
+ const RECEIPT = 'RECEIPT_IMAGE';
13
+ const CUSTOMER = 'CUSTOMER_IMAGE';
14
+ const PRODUCT = 'PRODUCT_IMAGE';
15
+ const DOCUMENT = 'DOCUMENT';
16
+
17
+
18
+ // validation regex for AttachmentFormat
19
+ const VALID_ATTACHMENT_FORMAT = '/^(PNG|JPG|TIF|BMP|PDF|DOCX|DOC|TXT|XLS|XLSX)$/';
20
+ // validation regex for AttachmentType
21
+ const VALID_ATTACHMENT_TYPE = '/^(SIGNATURE_IMAGE|RECEIPT_IMAGE|CUSTOMER_IMAGE|PRODUCT_IMAGE|DOCUMENT)$/';
22
+ }
lib/SecureSubmit/src/Infrastructure/Enums/HpsExceptionCodes.php CHANGED
@@ -23,6 +23,8 @@ abstract class HpsExceptionCodes
23
  const GATEWAY_TIMEOUT = 12;
24
  const UNEXPECTED_GATEWAY_RESPONSE = 13;
25
  const GATEWAY_TIMEOUT_REVERSAL_ERROR = 14;
 
 
26
 
27
  // credit issuer codes
28
  const INCORRECT_NUMBER = 15;
23
  const GATEWAY_TIMEOUT = 12;
24
  const UNEXPECTED_GATEWAY_RESPONSE = 13;
25
  const GATEWAY_TIMEOUT_REVERSAL_ERROR = 14;
26
+ const GATEWAY_ERROR = 31;
27
+ const UNEXPECTED_GATEWAY_ERROR = 32;
28
 
29
  // credit issuer codes
30
  const INCORRECT_NUMBER = 15;
lib/SecureSubmit/src/Infrastructure/HpsAuthenticationException.php CHANGED
@@ -5,6 +5,6 @@ class HpsAuthenticationException extends HpsException
5
  public function __construct($code, $message)
6
  {
7
  $this->code = $code;
8
- $this->message = $message;
9
  }
10
  }
5
  public function __construct($code, $message)
6
  {
7
  $this->code = $code;
8
+ $this->message = (string) $message;
9
  }
10
  }
lib/SecureSubmit/src/Infrastructure/HpsCheckException.php CHANGED
@@ -11,6 +11,6 @@ class HpsCheckException extends HpsException
11
  $this->transactionId = $transactionId;
12
  $this->details = $details;
13
  $this->code = $code;
14
- $this->message = $message;
15
  }
16
  }
11
  $this->transactionId = $transactionId;
12
  $this->details = $details;
13
  $this->code = $code;
14
+ $this->message = (string) $message;
15
  }
16
  }
lib/SecureSubmit/src/Infrastructure/HpsEmptyLogger.php ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class HpsEmptyLogger implements HpsLoggerInterface
4
+ {
5
+ public function log($message, $object = null)
6
+ {
7
+ return;
8
+ }
9
+ }
lib/SecureSubmit/src/Infrastructure/HpsException.php CHANGED
@@ -1,18 +1,34 @@
1
  <?php
2
 
 
 
 
3
  class HpsException extends Exception
4
  {
 
 
 
5
  public $code = null;
 
 
 
6
  public $innerException = null;
7
 
8
- public function __construct($message, $code = null, $innerException = null)
 
 
 
 
 
 
 
9
  {
10
- $this->message = $message;
11
  if ($code != null) {
12
  $this->code = $code;
13
  }
14
  if ($innerException != null) {
15
- $this->innerException = $innerException;
16
  }
17
  }
18
  }
1
  <?php
2
 
3
+ /**
4
+ * Class HpsException
5
+ */
6
  class HpsException extends Exception
7
  {
8
+ /**
9
+ * @var int|null
10
+ */
11
  public $code = null;
12
+ /**
13
+ * @var null
14
+ */
15
  public $innerException = null;
16
 
17
+ /**
18
+ * HpsException constructor.
19
+ *
20
+ * @param string $message [optional] The Exception message to throw.
21
+ * @param $code [optional] The Exception code.
22
+ * @param Exception $innerException [optional] The previous exception used for the exception chaining. Since 5.3.0
23
+ */
24
+ public function __construct($message = "", $code = null, $innerException = null)
25
  {
26
+ $this->message = (string) $message;
27
  if ($code != null) {
28
  $this->code = $code;
29
  }
30
  if ($innerException != null) {
31
+ $this->innerException = $innerException;
32
  }
33
  }
34
  }
lib/SecureSubmit/src/Infrastructure/HpsGatewayException.php CHANGED
@@ -8,7 +8,7 @@ class HpsGatewayException extends HpsException
8
  public function __construct($code, $message, $gatewayResponseCode = null, $gatewayResponseMessage = null, $innerException = null)
9
  {
10
  $this->code = $code;
11
- $this->message = $message;
12
 
13
  if ($gatewayResponseCode != null || $gatewayResponseMessage != null) {
14
  $this->details = new HpsGatewayExceptionDetails();
8
  public function __construct($code, $message, $gatewayResponseCode = null, $gatewayResponseMessage = null, $innerException = null)
9
  {
10
  $this->code = $code;
11
+ $this->message = (string) $message;
12
 
13
  if ($gatewayResponseCode != null || $gatewayResponseMessage != null) {
14
  $this->details = new HpsGatewayExceptionDetails();
lib/SecureSubmit/src/Infrastructure/HpsInvalidRequestException.php CHANGED
@@ -8,7 +8,7 @@ class HpsInvalidRequestException extends HpsException
8
  public function __construct($code, $message, $paramName = null)
9
  {
10
  $this->param = $paramName;
11
- $this->message = $message;
12
  $this->code = $code;
13
  parent::__construct($message);
14
  }
8
  public function __construct($code, $message, $paramName = null)
9
  {
10
  $this->param = $paramName;
11
+ $this->message = (string) $message;
12
  $this->code = $code;
13
  parent::__construct($message);
14
  }
lib/SecureSubmit/src/Infrastructure/HpsLogger.php ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class HpsLogger
4
+ {
5
+ private static $_instance = null;
6
+ private $_logger = null;
7
+
8
+ public function __construct()
9
+ {
10
+ $this->_logger = new HpsEmptyLogger();
11
+ }
12
+
13
+ public static function getInstance()
14
+ {
15
+ if (null === self::$_instance) {
16
+ self::$_instance = new HpsLogger();
17
+ }
18
+ return self::$_instance;
19
+ }
20
+
21
+ public function useLogger(HpsLoggerInterface $logger)
22
+ {
23
+ $this->_logger = $logger;
24
+ }
25
+
26
+ public function log($message, $object = null)
27
+ {
28
+ $this->_logger->log($message, $object);
29
+ }
30
+ }
lib/SecureSubmit/src/Infrastructure/Validation/HpsGatewayResponseValidation.php CHANGED
@@ -11,7 +11,6 @@ class HpsGatewayResponseValidation
11
  if ($e != null) {
12
  throw $e;
13
  }
14
-
15
  if (!isset($response->Transaction) || !isset($response->Transaction->$expectedType)) {
16
  throw new HpsGatewayException(
17
  HpsExceptionCodes::UNEXPECTED_GATEWAY_ERROR,
@@ -57,6 +56,9 @@ class HpsGatewayResponseValidation
57
  $responseText
58
  );
59
  break;
 
 
 
60
  case '13':
61
  $e = new HpsGatewayException(
62
  HpsExceptionCodes::INVALID_CARD_DATA,
11
  if ($e != null) {
12
  throw $e;
13
  }
 
14
  if (!isset($response->Transaction) || !isset($response->Transaction->$expectedType)) {
15
  throw new HpsGatewayException(
16
  HpsExceptionCodes::UNEXPECTED_GATEWAY_ERROR,
56
  $responseText
57
  );
58
  break;
59
+ case '27':
60
+ case '34':
61
+ case '26':
62
  case '13':
63
  $e = new HpsGatewayException(
64
  HpsExceptionCodes::INVALID_CARD_DATA,
lib/SecureSubmit/src/Infrastructure/Validation/HpsInputValidation.php CHANGED
@@ -6,7 +6,7 @@ class HpsInputValidation
6
 
7
  public static function checkAmount($amount)
8
  {
9
- if ($amount < 0 || $amount == null) {
10
  throw new HpsInvalidRequestException(
11
  HpsExceptionCodes::INVALID_AMOUNT,
12
  'Must be greater than or equal to 0.',
@@ -60,4 +60,9 @@ class HpsInputValidation
60
  );
61
  }
62
  }
 
 
 
 
 
63
  }
6
 
7
  public static function checkAmount($amount)
8
  {
9
+ if ($amount < 0 || $amount === null) {
10
  throw new HpsInvalidRequestException(
11
  HpsExceptionCodes::INVALID_AMOUNT,
12
  'Must be greater than or equal to 0.',
60
  );
61
  }
62
  }
63
+
64
+ public static function cleanAscii($text)
65
+ {
66
+ return preg_replace('/[\x00-\x1F\x80-\xFF]/', '', $text);
67
+ }
68
  }
lib/SecureSubmit/src/Infrastructure/Validation/HpsIssuerResponseValidation.php CHANGED
@@ -57,6 +57,7 @@ class HpsIssuerResponseValidation
57
  '10' => HpsExceptionCodes::PROCESSING_ERROR,
58
  '9' => HpsExceptionCodes::INVALID_AMOUNT,
59
  '13' => HpsExceptionCodes::PARTIAL_APPROVAL,
 
60
  );
61
 
62
  public static $_creditExceptionCodeToMessage = array(
@@ -64,7 +65,7 @@ class HpsIssuerResponseValidation
64
  HpsExceptionCodes::PROCESSING_ERROR => "An error occurred while processing the card.",
65
  HpsExceptionCodes::INVALID_AMOUNT => "Must be greater than or equal 0.",
66
  HpsExceptionCodes::EXPIRED_CARD => "The card has expired.",
67
- HpsExceptionCodes::INVALID_PIN => "The 4-digit pin is invalid.",
68
  HpsExceptionCodes::PIN_ENTRIES_EXCEEDED => "Maximum number of pin retries exceeded.",
69
  HpsExceptionCodes::INVALID_EXPIRY => "Card expiration date is invalid.",
70
  HpsExceptionCodes::PIN_VERIFICATION => "Can't verify card pin number.",
57
  '10' => HpsExceptionCodes::PROCESSING_ERROR,
58
  '9' => HpsExceptionCodes::INVALID_AMOUNT,
59
  '13' => HpsExceptionCodes::PARTIAL_APPROVAL,
60
+ '14' => HpsExceptionCodes::INVALID_PIN,
61
  );
62
 
63
  public static $_creditExceptionCodeToMessage = array(
65
  HpsExceptionCodes::PROCESSING_ERROR => "An error occurred while processing the card.",
66
  HpsExceptionCodes::INVALID_AMOUNT => "Must be greater than or equal 0.",
67
  HpsExceptionCodes::EXPIRED_CARD => "The card has expired.",
68
+ HpsExceptionCodes::INVALID_PIN => "The pin is invalid.",
69
  HpsExceptionCodes::PIN_ENTRIES_EXCEEDED => "Maximum number of pin retries exceeded.",
70
  HpsExceptionCodes::INVALID_EXPIRY => "Card expiration date is invalid.",
71
  HpsExceptionCodes::PIN_VERIFICATION => "Can't verify card pin number.",
lib/SecureSubmit/src/Services/Fluent/Gateway/Credit/HpsCreditServiceAuthorizeBuilder.php CHANGED
@@ -83,6 +83,8 @@ class HpsCreditServiceAuthorizeBuilder extends HpsBuilderAbstract
83
  /** @var HpsDirectMarketData|null */
84
  protected $directMarketData = null;
85
 
 
 
86
  /**
87
  * Instatiates a new HpsCreditServiceAuthorizeBuilder
88
  *
@@ -184,6 +186,10 @@ class HpsCreditServiceAuthorizeBuilder extends HpsBuilderAbstract
184
  $hpsBlock1->appendChild($refElement);
185
  }
186
 
 
 
 
 
187
  $hpsCreditAuth->appendChild($hpsBlock1);
188
  $hpsTransaction->appendChild($hpsCreditAuth);
189
 
83
  /** @var HpsDirectMarketData|null */
84
  protected $directMarketData = null;
85
 
86
+ protected $secureEcommerce = null;
87
+
88
  /**
89
  * Instatiates a new HpsCreditServiceAuthorizeBuilder
90
  *
186
  $hpsBlock1->appendChild($refElement);
187
  }
188
 
189
+ if ($this->secureEcommerce != null) {
190
+ $hpsBlock1->appendChild($this->service->_hydrateSecureEcommerce($this->secureEcommerce, $xml));
191
+ }
192
+
193
  $hpsCreditAuth->appendChild($hpsBlock1);
194
  $hpsTransaction->appendChild($hpsCreditAuth);
195
 
lib/SecureSubmit/src/Services/Fluent/Gateway/Credit/HpsCreditServiceChargeBuilder.php CHANGED
@@ -66,7 +66,7 @@ class HpsCreditServiceChargeBuilder extends HpsBuilderAbstract
66
  protected $readerPresent = false;
67
 
68
  protected $originalTxnReferenceData = null;
69
- protected $paymentData = null;
70
 
71
  /**
72
  * Instatiates a new HpsCreditServiceChargeBuilder
@@ -168,8 +168,8 @@ class HpsCreditServiceChargeBuilder extends HpsBuilderAbstract
168
 
169
  $hpsBlock1->appendChild($cardData);
170
 
171
- if ($this->paymentData != null) {
172
- $hpsBlock1->appendChild($this->service->_hydrateSecureEcommerce($this->paymentData->paymentData, $xml));
173
  }
174
 
175
  $hpsCreditSale->appendChild($hpsBlock1);
66
  protected $readerPresent = false;
67
 
68
  protected $originalTxnReferenceData = null;
69
+ protected $secureEcommerce = null;
70
 
71
  /**
72
  * Instatiates a new HpsCreditServiceChargeBuilder
168
 
169
  $hpsBlock1->appendChild($cardData);
170
 
171
+ if ($this->secureEcommerce != null) {
172
+ $hpsBlock1->appendChild($this->service->_hydrateSecureEcommerce($this->secureEcommerce, $xml));
173
  }
174
 
175
  $hpsCreditSale->appendChild($hpsBlock1);
lib/SecureSubmit/src/Services/Fluent/Gateway/Credit/HpsCreditServicePrepaidAddValueBuilder.php CHANGED
@@ -63,9 +63,7 @@ class HpsCreditServicePrepaidAddValueBuilder extends HpsBuilderAbstract
63
  } else if ($this->trackData != null) {
64
  $cardData->appendChild($this->service->_hydrateTrackData($this->trackData, $xml));
65
  } else if ($this->token != null) {
66
- $tokenData = $xml->createElement('hps:TokenData');
67
- $tokenData->appendChild($xml->createElement('hps:TokenValue', $this->token->tokenValue));
68
- $cardData->appendChild($tokenData);
69
  }
70
 
71
  $hpsBlock1->appendChild($cardData);
63
  } else if ($this->trackData != null) {
64
  $cardData->appendChild($this->service->_hydrateTrackData($this->trackData, $xml));
65
  } else if ($this->token != null) {
66
+ $cardData->appendChild($this->service->_hydrateTokenData($this->token, $xm));
 
 
67
  }
68
 
69
  $hpsBlock1->appendChild($cardData);
lib/SecureSubmit/src/Services/Fluent/Gateway/Credit/HpsCreditServicePrepaidBalanceInquiryBuilder.php CHANGED
@@ -52,9 +52,7 @@ class HpsCreditServicePrepaidBalanceInquiryBuilder extends HpsBuilderAbstract
52
  } else if ($this->trackData != null) {
53
  $cardData->appendChild($this->service->_hydrateTrackData($this->trackData, $xml));
54
  } else if ($this->token != null) {
55
- $tokenData = $xml->createElement('hps:TokenData');
56
- $tokenData->appendChild($xml->createElement('hps:TokenValue', $this->token->tokenValue));
57
- $cardData->appendChild($tokenData);
58
  }
59
  $hpsBlock1->appendChild($cardData);
60
 
52
  } else if ($this->trackData != null) {
53
  $cardData->appendChild($this->service->_hydrateTrackData($this->trackData, $xml));
54
  } else if ($this->token != null) {
55
+ $cardData->appendChild($this->service->_hydrateTokenData($this->token, $xml));
 
 
56
  }
57
  $hpsBlock1->appendChild($cardData);
58
 
lib/SecureSubmit/src/Services/Fluent/Gateway/Credit/HpsCreditServiceRecurringBuilder.php CHANGED
@@ -71,21 +71,19 @@ class HpsCreditServiceRecurringBuilder extends HpsBuilderAbstract
71
  $hpsBlock1->appendChild($xml->createElement('hps:AllowDup', 'Y'));
72
  $hpsBlock1->appendChild($xml->createElement('hps:Amt', $this->amount));
73
  if ($this->cardHolder != null) {
74
- $hpsBlock1->appendChild($this->_hydrateCardHolderData($this->cardHolder, $xml));
75
  }
76
  if ($this->details != null) {
77
- $hpsBlock1->appendChild($this->_hydrateAdditionalTxnFields($this->details, $xml));
78
  }
79
 
80
  if ($this->card != null) {
81
  $cardData = $xml->createElement('hps:CardData');
82
- $cardData->appendChild($this->_hydrateManualEntry($this->card, $xml));
83
  $hpsBlock1->appendChild($cardData);
84
  } else if ($this->token != null) {
85
  $cardData = $xml->createElement('hps:CardData');
86
- $tokenData = $xml->createElement('hps:TokenData');
87
- $tokenData->appendChild($xml->createElement('hps:TokenValue', $this->token->tokenValue));
88
- $cardData->appendChild($tokenData);
89
  $hpsBlock1->appendChild($cardData);
90
  } else if ($this->paymentMethodKey != null) {
91
  $hpsBlock1->appendChild($xml->createElement('hps:PaymentMethodKey', $this->paymentMethodKey));
71
  $hpsBlock1->appendChild($xml->createElement('hps:AllowDup', 'Y'));
72
  $hpsBlock1->appendChild($xml->createElement('hps:Amt', $this->amount));
73
  if ($this->cardHolder != null) {
74
+ $hpsBlock1->appendChild($this->service->_hydrateCardHolderData($this->cardHolder, $xml));
75
  }
76
  if ($this->details != null) {
77
+ $hpsBlock1->appendChild($this->service->_hydrateAdditionalTxnFields($this->details, $xml));
78
  }
79
 
80
  if ($this->card != null) {
81
  $cardData = $xml->createElement('hps:CardData');
82
+ $cardData->appendChild($this->service->_hydrateManualEntry($this->card, $xml));
83
  $hpsBlock1->appendChild($cardData);
84
  } else if ($this->token != null) {
85
  $cardData = $xml->createElement('hps:CardData');
86
+ $cardData->appendChild($this->service->_hydrateTokenData($this->token, $xml));
 
 
87
  $hpsBlock1->appendChild($cardData);
88
  } else if ($this->paymentMethodKey != null) {
89
  $hpsBlock1->appendChild($xml->createElement('hps:PaymentMethodKey', $this->paymentMethodKey));
lib/SecureSubmit/src/Services/Fluent/Gateway/Credit/HpsCreditServiceUpdateTokenExpirationBuilder.php ADDED
@@ -0,0 +1,96 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * @method HpsCreditServiceChargeBuilder withToken( $token)
5
+ * @method HpsCreditServiceUpdateTokenExpirationBuilder withExpMonth(string $transactionId)
6
+ * @method HpsCreditServiceUpdateTokenExpirationBuilder withExpYear(string $transactionId)
7
+ */
8
+ class HpsCreditServiceUpdateTokenExpirationBuilder extends HpsBuilderAbstract
9
+ {
10
+
11
+
12
+ /** @var HpsTokenData|null */
13
+ protected $token = null;
14
+ /**
15
+ * @var int
16
+ */
17
+ protected $expMonth = 0;
18
+ /**
19
+ * @var int
20
+ */
21
+ protected $expYear = 0;
22
+ /**
23
+ * Instatiates a new HpsCreditServiceEditBuilder
24
+ *
25
+ * @param HpsSoapGatewayService $service
26
+ */
27
+ public function __construct(HpsSoapGatewayService $service)
28
+ {
29
+ parent::__construct($service);
30
+ $this->setUpValidations();
31
+ }
32
+
33
+ /**
34
+ * Creates an edit transaction through the HpsCreditService
35
+ */
36
+ public function execute()
37
+ {
38
+ parent::execute();
39
+ $xml = new DOMDocument();
40
+ $hpsTransaction = $xml->createElement('hps:Transaction');
41
+ $hpsManageTokens = $xml->createElement('hps:ManageTokens');
42
+
43
+ $hpsManageTokens->appendChild($xml->createElement('hps:TokenValue', trim((string)$this->token)));
44
+
45
+ $hpsTokenActions = $xml->createElement('hps:TokenActions');
46
+ $hpsSet = $xml->createElement('hps:Set');
47
+ $hpsAttribute = $xml->createElement('hps:Attribute');
48
+
49
+ $hpsAttribute->appendChild($xml->createElement('hps:Name', 'ExpMonth'));
50
+ $hpsAttribute->appendChild($xml->createElement('hps:Value', (string)sprintf("%'.02d", (int)$this->expMonth)));
51
+
52
+ $hpsSet->appendChild($hpsAttribute);
53
+
54
+ $hpsAttribute = $xml->createElement('hps:Attribute');
55
+
56
+ $hpsAttribute->appendChild($xml->createElement('hps:Name', 'ExpYear'));
57
+ $hpsAttribute->appendChild($xml->createElement('hps:Value', (string)$this->expYear));
58
+
59
+ $hpsSet->appendChild($hpsAttribute);
60
+
61
+ $hpsTokenActions->appendChild($hpsSet);
62
+
63
+ $hpsManageTokens->appendChild($hpsTokenActions);
64
+
65
+ $hpsTransaction->appendChild($hpsManageTokens);
66
+ $trans = $this->service->_submitTransaction($hpsTransaction, 'ManageTokens', null);
67
+
68
+ $trans->responseCode = '00';
69
+ $trans->responseText = '';
70
+
71
+ return $trans;
72
+ }
73
+
74
+ /**
75
+ * Setups up validations for building edits.
76
+ *
77
+ * @return null
78
+ */
79
+ private function setUpValidations()
80
+ {
81
+ $this
82
+ ->addValidation(array($this, 'tokenNotNull'), 'HpsArgumentException', 'Edit needs a multi use token value');
83
+ }
84
+
85
+ /**
86
+ * Ensures a token has been set.
87
+ *
88
+ * @param array $actionCounts
89
+ *
90
+ * @return bool
91
+ */
92
+ protected function tokenNotNull($actionCounts)
93
+ {
94
+ return isset($actionCounts['token']);
95
+ }
96
+ }
lib/SecureSubmit/src/Services/Fluent/Gateway/HpsFluentCreditService.php CHANGED
@@ -48,6 +48,13 @@ class HpsFluentCreditService extends HpsSoapGatewayService
48
  return new HpsCreditServiceEditBuilder($this);
49
  }
50
 
 
 
 
 
 
 
 
51
  public function get($transactionId = null)
52
  {
53
  $builder = new HpsCreditServiceGetBuilder($this);
@@ -256,6 +263,9 @@ class HpsFluentCreditService extends HpsSoapGatewayService
256
  case 'CreditOfflineAuth':
257
  $rvalue = HpsOfflineAuthorization::fromDict($response, $txnType);
258
  break;
 
 
 
259
  default:
260
  break;
261
  }
48
  return new HpsCreditServiceEditBuilder($this);
49
  }
50
 
51
+ public function updateTokenExpiration()
52
+ {
53
+ $builder = new HpsCreditServiceUpdateTokenExpirationBuilder($this);
54
+ //print_r($builder);
55
+ return $builder;
56
+ }
57
+
58
  public function get($transactionId = null)
59
  {
60
  $builder = new HpsCreditServiceGetBuilder($this);
263
  case 'CreditOfflineAuth':
264
  $rvalue = HpsOfflineAuthorization::fromDict($response, $txnType);
265
  break;
266
+ case 'ManageTokens':
267
+ $rvalue = HpsManageTokensResponse::fromDict($response, $txnType);
268
+ break;
269
  default:
270
  break;
271
  }
lib/SecureSubmit/src/Services/Gateway/AltPayment/HpsAltPaymentService.php CHANGED
@@ -5,7 +5,7 @@ class HpsAltPaymentService extends HpsSoapGatewayService
5
  /** @var string|null */
6
  protected $_transactionType = null;
7
 
8
- public function authorize($sessionId, $amount, $currency, HpsBuyerData $buyer, HpsPaymentData $payment, HpsShippingInfo $shippingAddress = null, $lineItems = null)
9
  {
10
  HpsInputValidation::checkAmount($amount);
11
  HpsInputValidation::checkCurrency($currency);
@@ -53,7 +53,7 @@ class HpsAltPaymentService extends HpsSoapGatewayService
53
  return $this->_submitTransaction($transaction, 'AltPaymentCapture');
54
  }
55
 
56
- public function createSession($amount, $currency, HpsBuyerData $buyer, HpsPaymentData $payment, HpsShippingInfo $shippingAddress = null, $lineItems = null)
57
  {
58
  HpsInputValidation::checkAmount($amount);
59
  HpsInputValidation::checkCurrency($currency);
@@ -101,7 +101,7 @@ class HpsAltPaymentService extends HpsSoapGatewayService
101
  return $this->_submitTransaction($transaction, 'AltPaymentReturn');
102
  }
103
 
104
- public function sale($sessionId, $amount, $currency, HpsBuyerData $buyer, HpsPaymentData $payment, HpsShippingInfo $shippingAddress = null, $lineItems = null)
105
  {
106
  HpsInputValidation::checkAmount($amount);
107
  HpsInputValidation::checkCurrency($currency);
@@ -226,7 +226,7 @@ class HpsAltPaymentService extends HpsSoapGatewayService
226
  {
227
  $nvp = $xml->createElement('hps:NameValuePair');
228
  $nvp->appendChild($xml->createElement('hps:Name', $name));
229
- $nvp->appendChild($xml->createElement('hps:Value', $value));
230
  return $nvp;
231
  }
232
 
@@ -254,27 +254,12 @@ class HpsAltPaymentService extends HpsSoapGatewayService
254
  $shipping = $xml->createElement('hps:Shipping');
255
  $address = $xml->createElement('hps:Address');
256
  $address->appendChild($this->hydrateNameValuePair('AllowAddressOverride', 'false', $xml));
257
- if (isset($info->name)) {
258
- $address->appendChild($this->hydrateNameValuePair('ShipName', $info->name, $xml));
259
- }
260
- if (isset($info->address->address)) {
261
- $address->appendChild($this->hydrateNameValuePair('ShipAddress', $info->address->address, $xml));
262
- }
263
- if (isset($info->address->address2)) {
264
- $address->appendChild($this->hydrateNameValuePair('ShipAddress2', $info->address->address2, $xml));
265
- }
266
- if (isset($info->address->city)) {
267
- $address->appendChild($this->hydrateNameValuePair('ShipCity', $info->address->city, $xml));
268
- }
269
- if (isset($info->address->state)) {
270
- $address->appendChild($this->hydrateNameValuePair('ShipState', $info->address->state, $xml));
271
- }
272
- if (isset($info->address->zip)) {
273
- $address->appendChild($this->hydrateNameValuePair('ShipZip', $info->address->zip, $xml));
274
- }
275
- if (isset($info->address->country)) {
276
- $address->appendChild($this->hydrateNameValuePair('ShipCountryCode', $info->address->country, $xml));
277
- }
278
  $shipping->appendChild($address);
279
  return $shipping;
280
  }
@@ -290,7 +275,7 @@ class HpsAltPaymentService extends HpsSoapGatewayService
290
 
291
  if ($gatewayRspCode == '30') {
292
  try {
293
- $this->reverse($transactionId, $this->_amount, $this->_currency);
294
  } catch (Exception $e) {
295
  throw new HpsGatewayException(
296
  HpsExceptionCodes::GATEWAY_TIMEOUT_REVERSAL_ERROR,
5
  /** @var string|null */
6
  protected $_transactionType = null;
7
 
8
+ public function authorize($sessionId, $amount, $currency, HpsBuyerData $buyer = null, HpsPaymentData $payment = null, HpsShippingInfo $shippingAddress = null, $lineItems = null)
9
  {
10
  HpsInputValidation::checkAmount($amount);
11
  HpsInputValidation::checkCurrency($currency);
53
  return $this->_submitTransaction($transaction, 'AltPaymentCapture');
54
  }
55
 
56
+ public function createSession($amount, $currency, HpsBuyerData $buyer = null, HpsPaymentData $payment = null, HpsShippingInfo $shippingAddress = null, $lineItems = null)
57
  {
58
  HpsInputValidation::checkAmount($amount);
59
  HpsInputValidation::checkCurrency($currency);
101
  return $this->_submitTransaction($transaction, 'AltPaymentReturn');
102
  }
103
 
104
+ public function sale($sessionId, $amount, $currency, HpsBuyerData $buyer = null, HpsPaymentData $payment = null, HpsShippingInfo $shippingAddress = null, $lineItems = null)
105
  {
106
  HpsInputValidation::checkAmount($amount);
107
  HpsInputValidation::checkCurrency($currency);
226
  {
227
  $nvp = $xml->createElement('hps:NameValuePair');
228
  $nvp->appendChild($xml->createElement('hps:Name', $name));
229
+ $nvp->appendChild($xml->createElement('hps:Value', HpsInputValidation::cleanAscii($value)));
230
  return $nvp;
231
  }
232
 
254
  $shipping = $xml->createElement('hps:Shipping');
255
  $address = $xml->createElement('hps:Address');
256
  $address->appendChild($this->hydrateNameValuePair('AllowAddressOverride', 'false', $xml));
257
+ $address->appendChild($this->hydrateNameValuePair('ShipName', $info->name, $xml));
258
+ $address->appendChild($this->hydrateNameValuePair('ShipAddress', $info->address->address, $xml));
259
+ $address->appendChild($this->hydrateNameValuePair('ShipCity', $info->address->city, $xml));
260
+ $address->appendChild($this->hydrateNameValuePair('ShipState', $info->address->state, $xml));
261
+ $address->appendChild($this->hydrateNameValuePair('ShipZip', $info->address->zip, $xml));
262
+ $address->appendChild($this->hydrateNameValuePair('ShipCountryCode', $info->address->country, $xml));
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
263
  $shipping->appendChild($address);
264
  return $shipping;
265
  }
275
 
276
  if ($gatewayRspCode == '30') {
277
  try {
278
+ $this->void($transactionId);
279
  } catch (Exception $e) {
280
  throw new HpsGatewayException(
281
  HpsExceptionCodes::GATEWAY_TIMEOUT_REVERSAL_ERROR,
lib/SecureSubmit/src/Services/Gateway/AltPayment/HpsMasterPassService.php CHANGED
@@ -36,6 +36,8 @@ class HpsMasterPassService
36
  *
37
  * @param string $orderId order id from Cardinal
38
  * @param HpsOrderData $orderData Cardinal/MasterPass specific data
 
 
39
  */
40
  public function addOrderNumber(
41
  $orderId,
@@ -84,16 +86,16 @@ class HpsMasterPassService
84
  'TransactionType' => 'WT',
85
  );
86
 
87
- if ($orderData->checkoutType === HpsCentinelCheckoutType::PAIRING ||
88
- $orderData->checkoutType === HpsCentinelCheckoutType::PAIRING_CHECKOUT
89
  ) {
90
  $data['PairingToken'] = $orderData->pairingToken;
91
  $data['PairingVerifier'] = $orderData->pairingVerifier;
92
  }
93
 
94
- if ($orderData->checkoutType === null ||
95
- $orderData->checkoutType === HpsCentinelCheckoutType::LIGHTBOX ||
96
- $orderData->checkoutType === HpsCentinelCheckoutType::PAIRING_CHECKOUT
97
  ) {
98
  $data['CheckoutResourceUrl'] = $resourceUrl;
99
  $data['OAuthToken'] = $oauthToken;
@@ -147,7 +149,10 @@ class HpsMasterPassService
147
  $payload = array_merge($payload, $this->hydratePaymentData($payment));
148
  }
149
  if ($shippingAddress !== null) {
150
- $payload = array_merge($payload, $this->hydrateShippingInfo($shippingAddress));
 
 
 
151
  }
152
  if ($lineItems !== null) {
153
  $payload = array_merge($payload, $this->hydrateLineItems($lineItems));
@@ -174,7 +179,9 @@ class HpsMasterPassService
174
  ) {
175
  $payload = array(
176
  'Amount' => $this->formatAmount($amount),
177
- 'CurrencyCode' => $this->currencyStringToNumeric($orderData->currencyCode),
 
 
178
  'OrderId' => $orderId,
179
  'OrderNumber' => $orderData->orderNumber,
180
  'TransactionType' => 'WT',
@@ -208,8 +215,8 @@ class HpsMasterPassService
208
  public function createSession(
209
  $amount,
210
  $currency,
211
- HpsBuyerData $buyer,
212
- HpsPaymentData $payment,
213
  HpsShippingInfo $shippingAddress = null,
214
  $lineItems = null,
215
  HpsOrderData $orderData = null
@@ -239,7 +246,10 @@ class HpsMasterPassService
239
  $payload = array_merge($payload, $this->hydratePaymentData($payment));
240
  }
241
  if ($shippingAddress !== null) {
242
- $payload = array_merge($payload, $this->hydrateShippingInfo($shippingAddress));
 
 
 
243
  }
244
  if ($lineItems !== null) {
245
  $payload = array_merge($payload, $this->hydrateLineItems($lineItems));
@@ -273,10 +283,10 @@ class HpsMasterPassService
273
  * settlement amount. Multiple refunds can be processed against the original
274
  * capture transaction.
275
  *
276
- * @param string $orderId order id from Cardinal
277
- * @param boolean $isPartial flag for partial refund
278
- * @param string $partialAmount partial amount to be refunded
279
- * @param HpsOrderData $orderData Cardinal/MasterPass specific data
280
  *
281
  * @return object
282
  */
@@ -288,7 +298,9 @@ class HpsMasterPassService
288
  ) {
289
  $payload = array(
290
  'Amount' => $this->formatAmount($amount),
291
- 'CurrencyCode' => $this->currencyStringToNumeric($orderData->currencyCode),
 
 
292
  'OrderId' => $orderId,
293
  'TransactionType' => 'WT',
294
  );
@@ -320,8 +332,8 @@ class HpsMasterPassService
320
  $orderId,
321
  $amount,
322
  $currency,
323
- HpsBuyerData $buyer,
324
- HpsPaymentData $payment,
325
  HpsShippingInfo $shippingAddress = null,
326
  $lineItems = null,
327
  HpsOrderData $orderData = null
@@ -384,9 +396,18 @@ class HpsMasterPassService
384
  ) {
385
  }
386
 
 
 
 
 
 
 
 
387
  protected function getCheckoutType(HpsOrderData $orderData)
388
  {
389
- return isset($orderData->checkoutType) ? $orderData->checkoutType : 'lightbox';
 
 
390
  }
391
 
392
  /**
@@ -419,7 +440,6 @@ class HpsMasterPassService
419
  {
420
  return array(
421
  'BillingAddress1' => $buyer->address->address,
422
- 'BillingAddress2' => $buyer->address->address2,
423
  'BillingCity' => $buyer->address->city,
424
  'BillingCountryCode' => $buyer->countryCode,
425
  'BillingFirstName' => $buyer->firstName,
@@ -487,7 +507,6 @@ class HpsMasterPassService
487
  {
488
  return array(
489
  'ShippingAddress1' => $shipping->address->address,
490
- 'ShippingAddress2' => $shipping->address->address2,
491
  'ShippingCity' => $shipping->address->city,
492
  'ShippingCountryCode' => $shipping->countryCode,
493
  'ShippingFirstName' => $shipping->firstName,
@@ -502,7 +521,7 @@ class HpsMasterPassService
502
  /**
503
  * Formats the amount in form of cents
504
  *
505
- * @param mixed $amount
506
  *
507
  * @return string
508
  */
36
  *
37
  * @param string $orderId order id from Cardinal
38
  * @param HpsOrderData $orderData Cardinal/MasterPass specific data
39
+ *
40
+ * @return object
41
  */
42
  public function addOrderNumber(
43
  $orderId,
86
  'TransactionType' => 'WT',
87
  );
88
 
89
+ if ($orderData->checkoutType === HpsCentinelCheckoutType::PAIRING
90
+ || $orderData->checkoutType === HpsCentinelCheckoutType::PAIRING_CHECKOUT
91
  ) {
92
  $data['PairingToken'] = $orderData->pairingToken;
93
  $data['PairingVerifier'] = $orderData->pairingVerifier;
94
  }
95
 
96
+ if ($orderData->checkoutType === null
97
+ || $orderData->checkoutType === HpsCentinelCheckoutType::LIGHTBOX
98
+ || $orderData->checkoutType === HpsCentinelCheckoutType::PAIRING_CHECKOUT
99
  ) {
100
  $data['CheckoutResourceUrl'] = $resourceUrl;
101
  $data['OAuthToken'] = $oauthToken;
149
  $payload = array_merge($payload, $this->hydratePaymentData($payment));
150
  }
151
  if ($shippingAddress !== null) {
152
+ $payload = array_merge(
153
+ $payload,
154
+ $this->hydrateShippingInfo($shippingAddress)
155
+ );
156
  }
157
  if ($lineItems !== null) {
158
  $payload = array_merge($payload, $this->hydrateLineItems($lineItems));
179
  ) {
180
  $payload = array(
181
  'Amount' => $this->formatAmount($amount),
182
+ 'CurrencyCode' => $this->currencyStringToNumeric(
183
+ $orderData->currencyCode
184
+ ),
185
  'OrderId' => $orderId,
186
  'OrderNumber' => $orderData->orderNumber,
187
  'TransactionType' => 'WT',
215
  public function createSession(
216
  $amount,
217
  $currency,
218
+ HpsBuyerData $buyer = null,
219
+ HpsPaymentData $payment = null,
220
  HpsShippingInfo $shippingAddress = null,
221
  $lineItems = null,
222
  HpsOrderData $orderData = null
246
  $payload = array_merge($payload, $this->hydratePaymentData($payment));
247
  }
248
  if ($shippingAddress !== null) {
249
+ $payload = array_merge(
250
+ $payload,
251
+ $this->hydrateShippingInfo($shippingAddress)
252
+ );
253
  }
254
  if ($lineItems !== null) {
255
  $payload = array_merge($payload, $this->hydrateLineItems($lineItems));
283
  * settlement amount. Multiple refunds can be processed against the original
284
  * capture transaction.
285
  *
286
+ * @param string $orderId order id from Cardinal
287
+ * @param boolean $isPartial flag for partial refund
288
+ * @param string $amount amount to be refunded
289
+ * @param HpsOrderData $orderData Cardinal/MasterPass specific data
290
  *
291
  * @return object
292
  */
298
  ) {
299
  $payload = array(
300
  'Amount' => $this->formatAmount($amount),
301
+ 'CurrencyCode' => $this->currencyStringToNumeric(
302
+ $orderData->currencyCode
303
+ ),
304
  'OrderId' => $orderId,
305
  'TransactionType' => 'WT',
306
  );
332
  $orderId,
333
  $amount,
334
  $currency,
335
+ HpsBuyerData $buyer = null,
336
+ HpsPaymentData $payment = null,
337
  HpsShippingInfo $shippingAddress = null,
338
  $lineItems = null,
339
  HpsOrderData $orderData = null
396
  ) {
397
  }
398
 
399
+ /**
400
+ * Gets checkout type from `$orderData` or `lightbox` if not set
401
+ *
402
+ * @param HpsOrderData $orderData the order data
403
+ *
404
+ * @return string
405
+ */
406
  protected function getCheckoutType(HpsOrderData $orderData)
407
  {
408
+ return isset($orderData->checkoutType)
409
+ ? $orderData->checkoutType
410
+ : 'lightbox';
411
  }
412
 
413
  /**
440
  {
441
  return array(
442
  'BillingAddress1' => $buyer->address->address,
 
443
  'BillingCity' => $buyer->address->city,
444
  'BillingCountryCode' => $buyer->countryCode,
445
  'BillingFirstName' => $buyer->firstName,
507
  {
508
  return array(
509
  'ShippingAddress1' => $shipping->address->address,
 
510
  'ShippingCity' => $shipping->address->city,
511
  'ShippingCountryCode' => $shipping->countryCode,
512
  'ShippingFirstName' => $shipping->firstName,
521
  /**
522
  * Formats the amount in form of cents
523
  *
524
+ * @param mixed $amount amount to be formatted
525
  *
526
  * @return string
527
  */
lib/SecureSubmit/src/Services/Gateway/HpsAttachmentService.php ADDED
@@ -0,0 +1,148 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * https://posgateway.cert.secureexchange.net/Gateway/PorticoSOAPSchema/build/Default/webframe.html#Portico%20Schema_xsd~e-PosRequest~e-Ver1.0~e-Transaction~e-AddAttachment.html
4
+ * Valid if the origional transaction ID is from
5
+ CreditAuth
6
+ CreditOfflineAuth
7
+ CreditSale
8
+ CreditOfflineSale
9
+ CreditReturn
10
+ DebitSale
11
+ GiftCardSale
12
+ GiftCardAddValue
13
+ PrePaidAddValue
14
+ CheckSale
15
+ OverrideFraudDecline
16
+ */
17
+
18
+
19
+ /**
20
+ * Class HpsAttachmentService
21
+ */
22
+ class HpsAttachmentService extends HpsSoapGatewayService
23
+ {
24
+
25
+
26
+ /**
27
+ * HpsAttachmentService constructor.
28
+ * @param HpsServicesConfig $config
29
+ */
30
+ public function __construct($config = null)
31
+ {
32
+ parent::__construct($config);
33
+ }
34
+
35
+ /*
36
+ public function AddAttachment(){
37
+ throw new Exception('Not implemented');
38
+ return null; // not implemented stub
39
+ }
40
+ */
41
+
42
+ /**
43
+ * @param float $GatewayTxnId this is actually a long but php handles long with float
44
+ * @param HpsAttachmentType $AttachmentType SIGNATURE_IMAGE|RECEIPT_IMAGE|CUSTOMER_IMAGE|PRODUCT_IMAGE|DOCUMENT
45
+ * @param bool $ReturnAttachmentTypesOnly
46
+ * @param null|int $AttachmentDataId
47
+ * @return HpsAttachment
48
+ * @throws HpsArgumentException
49
+ * @throws HpsException
50
+ */
51
+ public function getAttachments($GatewayTxnId, $AttachmentType = 'all', $ReturnAttachmentTypesOnly = false, $AttachmentDataId = null)
52
+ {
53
+ $GatewayTxnId = filter_var($GatewayTxnId, FILTER_SANITIZE_NUMBER_FLOAT);
54
+ if (!$GatewayTxnId) {
55
+ throw new HpsArgumentException('Gateway Transaction ID required', HpsExceptionCodes::INVALID_NUMBER);
56
+ }
57
+
58
+ $AttachmentTypeProvided = preg_match(HpsAttachmentType::VALID_ATTACHMENT_TYPE, $AttachmentType) === 1;
59
+ $AttachmentDataId = filter_var($AttachmentDataId, FILTER_SANITIZE_NUMBER_INT);
60
+ // this is a limitation of the gateway and we want to inform the user
61
+ if ($AttachmentTypeProvided && $AttachmentDataId) {
62
+ throw new HpsGatewayException(HpsExceptionCodes::GATEWAY_ERROR, "Since the AttachmentDataId was provided the AttachmentType was ignored by the server");
63
+ trigger_error("Since the AttachmentDataId was provided the AttachmentType was ignored by the server", E_USER_NOTICE);
64
+ }
65
+ $xml = new DOMDocument();
66
+ $hpsTransaction = $xml->createElement('hps:Transaction');
67
+
68
+ $hpsGetAttachments = $hpsTransaction
69
+ ->appendChild($xml->createElement('hps:GetAttachments'));
70
+
71
+ $hpsGetAttachments->appendChild($xml->createElement('hps:GatewayTxnId', $GatewayTxnId));
72
+
73
+ if ($AttachmentTypeProvided) {
74
+ $hpsGetAttachments->appendChild($xml->createElement('hps:AttachmentType', $AttachmentType));
75
+ }
76
+
77
+ if ($ReturnAttachmentTypesOnly === true) {
78
+ $hpsGetAttachments->appendChild($xml->createElement('hps:ReturnAttachmentTypesOnly', 'true'));
79
+ }
80
+
81
+ if ($AttachmentDataId) {
82
+ $hpsGetAttachments->appendChild($xml->createElement('hps:AttachmentDataId', $AttachmentDataId));
83
+ }
84
+
85
+ return $this->_submitTransaction($hpsTransaction, 'GetAttachments');
86
+
87
+ }
88
+
89
+ /**
90
+ * @param \DOMElement $transaction
91
+ * @param string $txnType
92
+ *
93
+ * @return array|null
94
+ * @throws \HpsException
95
+ * @throws \HpsGatewayException
96
+ */
97
+ private function _submitTransaction($transaction, $txnType)
98
+ {
99
+
100
+ try {
101
+ $response = $this->doRequest($transaction);
102
+ } catch (HpsException $e) {
103
+ if ($e->innerException != null && $e->innerException->getMessage() == 'gateway_time-out') {
104
+ throw new HpsException('An error occurred and the gateway has timed out', 'gateway_timeout', $e, 'gateway_timeout');
105
+ }
106
+ throw $e;
107
+ }
108
+
109
+ $this->_processGatewayResponse($response, $txnType);
110
+
111
+ $rvalue = null;
112
+ switch ($txnType) {
113
+ case 'GetAttachments':
114
+ $rvalue = HpsAttachment::fromDict($response, $txnType);
115
+ break;
116
+ default:
117
+ break;
118
+ }
119
+
120
+ return $rvalue;
121
+ }
122
+
123
+ /**
124
+ * @param SimpleXMLElement $response raw XML response
125
+ * @param string $expectedType
126
+ * @throws HpsAuthenticationException
127
+ * @throws HpsGatewayException
128
+ * @throws null
129
+ */
130
+ private function _processGatewayResponse($response, $expectedType)
131
+ {
132
+ $gatewayRspCode = (isset($response->Header->GatewayRspCode) ? $response->Header->GatewayRspCode : null);
133
+ $transactionId = (isset($response->Header->GatewayTxnId) ? (float)$response->Header->GatewayTxnId : null);
134
+
135
+ if ($gatewayRspCode == '0') {
136
+ return;
137
+ }
138
+
139
+ if ($gatewayRspCode == '3') {
140
+ throw new HpsGatewayException(
141
+ HpsExceptionCodes::GATEWAY_ERROR,
142
+ 'Image could not be retrieved for ' . $transactionId
143
+ );
144
+ }
145
+
146
+ HpsGatewayResponseValidation::checkResponse($response, $expectedType);
147
+ }
148
+ }
lib/SecureSubmit/src/Services/Gateway/HpsCreditService.php CHANGED
@@ -35,9 +35,7 @@ class HpsCreditService extends HpsSoapGatewayService
35
  if ($cardOrToken instanceof HpsCreditCard) {
36
  $cardData->appendChild($this->_hydrateManualEntry($cardOrToken, $xml));
37
  } else {
38
- $tokenData = $xml->createElement('hps:TokenData');
39
- $tokenData->appendChild($xml->createElement('hps:TokenValue', $cardOrToken->tokenValue));
40
- $cardData->appendChild($tokenData);
41
  }
42
  $cardData->appendChild($xml->createElement('hps:TokenRequest', ($requestMultiUseToken) ? 'Y' : 'N'));
43
  if ($cpcReq) {
@@ -109,9 +107,7 @@ class HpsCreditService extends HpsSoapGatewayService
109
  if ($cardOrToken instanceof HpsCreditCard) {
110
  $cardData->appendChild($this->_hydrateManualEntry($cardOrToken, $xml));
111
  } else {
112
- $tokenData = $xml->createElement('hps:TokenData');
113
- $tokenData->appendChild($xml->createElement('hps:TokenValue', $cardOrToken->tokenValue));
114
- $cardData->appendChild($tokenData);
115
  }
116
  if ($cpcReq) {
117
  $hpsBlock1->appendChild($xml->createElement('hps:CPCReq', 'Y'));
@@ -153,9 +149,7 @@ class HpsCreditService extends HpsSoapGatewayService
153
  $hpsBlock1->appendChild($cardData);
154
  } else if ($cardOrTokenOrPMKey instanceof HpsTokenData) {
155
  $cardData = $xml->createElement('hps:CardData');
156
- $tokenData = $xml->createElement('hps:TokenData');
157
- $tokenData->appendChild($xml->createElement('hps:TokenValue', $cardOrTokenOrPMKey->tokenValue));
158
- $cardData->appendChild($tokenData);
159
  $hpsBlock1->appendChild($cardData);
160
  } else {
161
  $hpsBlock1->appendChild($xml->createElement('hps:PaymentMethodKey', $cardOrTokenOrPMKey));
@@ -212,6 +206,48 @@ class HpsCreditService extends HpsSoapGatewayService
212
  return $trans;
213
  }
214
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
215
  public function get($transactionId)
216
  {
217
  if ($transactionId <= 0) {
@@ -267,9 +303,7 @@ class HpsCreditService extends HpsSoapGatewayService
267
  $hpsBlock1->appendChild($cardDataElement);
268
  } else if ($cardData instanceof HpsTokenData) {
269
  $cardDataElement = $xml->createElement('hps:CardData');
270
- $tokenData = $xml->createElement('hps:TokenData');
271
- $tokenData->appendChild($xml->createElement('hps:TokenValue', $cardData->tokenValue));
272
- $cardDataElement->appendChild($tokenData);
273
  $hpsBlock1->appendChild($cardDataElement);
274
  } else {
275
  $hpsBlock1->appendChild($xml->createElement('hps:GatewayTxnId', $cardData));
@@ -286,7 +320,7 @@ class HpsCreditService extends HpsSoapGatewayService
286
 
287
  return $this->_submitTransaction($hpsTransaction, 'CreditReturn', (isset($details->clientTransactionId) ? $details->clientTransationId : null));
288
  }
289
- /**
290
  * @param HpsCreditCard|HpsTokenData|int $cardData GatewayTxnId
291
  * @param float $amount
292
  * @param USD $currency
@@ -312,16 +346,13 @@ class HpsCreditService extends HpsSoapGatewayService
312
  if ($authAmount !== null){
313
  $hpsBlock1->appendChild($xml->createElement('hps:AuthAmt', HpsInputValidation::checkAmount($authAmount)));
314
  }
315
-
316
  $cardDataElement = null;
317
  if ($cardData instanceof HpsCreditCard) {
318
  $cardDataElement = $xml->createElement('hps:CardData');
319
  $cardDataElement->appendChild($this->_hydrateManualEntry($cardData, $xml));
320
  } else if ($cardData instanceof HpsTokenData) {
321
  $cardDataElement = $xml->createElement('hps:CardData');
322
- $tokenData = $xml->createElement('hps:TokenData');
323
- $tokenData->appendChild($xml->createElement('hps:TokenValue', $cardData->tokenValue));
324
- $cardDataElement->appendChild($tokenData);
325
  } else {
326
  $cardDataElement = $xml->createElement('hps:GatewayTxnId', $cardData);
327
  }
@@ -332,36 +363,8 @@ class HpsCreditService extends HpsSoapGatewayService
332
 
333
  $hpsCreditReversal->appendChild($hpsBlock1);
334
  $hpsTransaction->appendChild($hpsCreditReversal);
335
- return $this->_submitTransaction($hpsTransaction, 'CreditReversal', (isset($details->clientTransactionId) ? $details->clientTransactionId : null));
336
- }
337
-
338
-
339
- public function updateTokenExpiration($multiUseToken, $newExpMonth, $newExpYear)
340
- {
341
- $xml = new DOMDocument();
342
- $transaction = $xml->createElement('hps:Transaction');
343
-
344
- $manageTokens = $xml->createElement('hps:ManageTokens');
345
- $manageTokens->appendChild($xml->createElement('hps:TokenValue', $multiUseToken));
346
 
347
- $tokenActions = $xml->createElement('hps:TokenActions');
348
- $setAction = $xml->createElement('hps:Set');
349
-
350
- $expMonth = $xml->createElement('hps:Attribute');
351
- $expMonth->appendChild($xml->createElement('hps:Name', 'ExpMonth'));
352
- $expMonth->appendChild($xml->createElement('hps:Value', $newExpMonth));
353
- $setAction->appendChild($expMonth);
354
-
355
- $expYear = $xml->createElement('hps:Attribute');
356
- $expYear->appendChild($xml->createElement('hps:Name', 'ExpYear'));
357
- $expYear->appendChild($xml->createElement('hps:Value', $newExpYear));
358
- $setAction->appendChild($expYear);
359
-
360
- $tokenActions->appendChild($setAction);
361
- $manageTokens->appendChild($tokenActions);
362
- $transaction->appendChild($manageTokens);
363
-
364
- return $this->_submitTransaction($transaction, 'ManageTokens');
365
  }
366
 
367
  public function verify($cardOrToken, $cardHolder = null, $requestMultiUseToken = false, $clientTransactionId = null)
@@ -379,9 +382,7 @@ class HpsCreditService extends HpsSoapGatewayService
379
  if ($cardOrToken instanceof HpsCreditCard) {
380
  $cardData->appendChild($this->_hydrateManualEntry($cardOrToken, $xml));
381
  } else {
382
- $tokenData = $xml->createElement('hps:TokenData');
383
- $tokenData->appendChild($xml->createElement('hps:TokenValue', $cardOrToken->tokenValue));
384
- $cardData->appendChild($tokenData);
385
  }
386
  $cardData->appendChild($xml->createElement('hps:TokenRequest', ($requestMultiUseToken) ? 'Y' : 'N'));
387
 
@@ -466,6 +467,17 @@ class HpsCreditService extends HpsSoapGatewayService
466
  }
467
  }
468
 
 
 
 
 
 
 
 
 
 
 
 
469
  private function _submitTransaction($transaction, $txnType, $clientTxnId = null, $cardData = null)
470
  {
471
  $options = array();
@@ -528,7 +540,7 @@ class HpsCreditService extends HpsSoapGatewayService
528
  $rvalue = HpsRecurringBilling::fromDict($response, $txnType);
529
  break;
530
  case 'ManageTokens':
531
- $rvalue = HpsTransaction::fromDict($response, $txnType);
532
  break;
533
  default:
534
  break;
35
  if ($cardOrToken instanceof HpsCreditCard) {
36
  $cardData->appendChild($this->_hydrateManualEntry($cardOrToken, $xml));
37
  } else {
38
+ $cardData->appendChild($this->_hydrateTokenData($cardOrToken, $xml));
 
 
39
  }
40
  $cardData->appendChild($xml->createElement('hps:TokenRequest', ($requestMultiUseToken) ? 'Y' : 'N'));
41
  if ($cpcReq) {
107
  if ($cardOrToken instanceof HpsCreditCard) {
108
  $cardData->appendChild($this->_hydrateManualEntry($cardOrToken, $xml));
109
  } else {
110
+ $cardData->appendChild($this->_hydrateTokenData($cardOrToken, $xml));
 
 
111
  }
112
  if ($cpcReq) {
113
  $hpsBlock1->appendChild($xml->createElement('hps:CPCReq', 'Y'));
149
  $hpsBlock1->appendChild($cardData);
150
  } else if ($cardOrTokenOrPMKey instanceof HpsTokenData) {
151
  $cardData = $xml->createElement('hps:CardData');
152
+ $cardData->appendChild($this->_hydrateTokenData($cardOrTokenOrPMKey, $xml));
 
 
153
  $hpsBlock1->appendChild($cardData);
154
  } else {
155
  $hpsBlock1->appendChild($xml->createElement('hps:PaymentMethodKey', $cardOrTokenOrPMKey));
206
  return $trans;
207
  }
208
 
209
+ /** builds soap transaction for Portico so that expiration dates can be updated for expired cards with a new current issuance
210
+ * @param string $tokenValue
211
+ * @param int $expMonth 1-12 padding will be handled automatically
212
+ * @param int $expYear must be 4 digits.
213
+ *
214
+ * @return \HpsManageTokensResponse
215
+ * @throws \HpsException
216
+ * @throws \HpsGatewayException
217
+ */
218
+ public function updateTokenExpiration($tokenValue, $expMonth, $expYear) {
219
+ // new DOM
220
+ $xml = new DOMDocument();
221
+ $hpsTransaction = $xml->createElement('hps:Transaction');
222
+ $hpsManageTokens = $xml->createElement('hps:ManageTokens');
223
+
224
+ $hpsManageTokens->appendChild($xml->createElement('hps:TokenValue', trim((string)$tokenValue)));
225
+
226
+ $hpsTokenActions = $xml->createElement('hps:TokenActions');
227
+ $hpsSet = $xml->createElement('hps:Set');
228
+ $hpsAttribute = $xml->createElement('hps:Attribute');
229
+
230
+ $hpsAttribute->appendChild($xml->createElement('hps:Name', 'ExpMonth'));
231
+ $hpsAttribute->appendChild($xml->createElement('hps:Value', (string)sprintf("%'.02d", (int)$expMonth)));
232
+
233
+ $hpsSet->appendChild($hpsAttribute);
234
+
235
+ $hpsAttribute = $xml->createElement('hps:Attribute');
236
+
237
+ $hpsAttribute->appendChild($xml->createElement('hps:Name', 'ExpYear'));
238
+ $hpsAttribute->appendChild($xml->createElement('hps:Value', (string)$expYear));
239
+
240
+ $hpsSet->appendChild($hpsAttribute);
241
+
242
+ $hpsTokenActions->appendChild($hpsSet);
243
+
244
+ $hpsManageTokens->appendChild($hpsTokenActions);
245
+
246
+ $hpsTransaction->appendChild($hpsManageTokens);
247
+
248
+ return $this->_submitTransaction($hpsTransaction, 'ManageTokens');
249
+ }
250
+
251
  public function get($transactionId)
252
  {
253
  if ($transactionId <= 0) {
303
  $hpsBlock1->appendChild($cardDataElement);
304
  } else if ($cardData instanceof HpsTokenData) {
305
  $cardDataElement = $xml->createElement('hps:CardData');
306
+ $cardDataElement->appendChild($this->_hydrateTokenData($cardData, $xml));
 
 
307
  $hpsBlock1->appendChild($cardDataElement);
308
  } else {
309
  $hpsBlock1->appendChild($xml->createElement('hps:GatewayTxnId', $cardData));
320
 
321
  return $this->_submitTransaction($hpsTransaction, 'CreditReturn', (isset($details->clientTransactionId) ? $details->clientTransationId : null));
322
  }
323
+ /**
324
  * @param HpsCreditCard|HpsTokenData|int $cardData GatewayTxnId
325
  * @param float $amount
326
  * @param USD $currency
346
  if ($authAmount !== null){
347
  $hpsBlock1->appendChild($xml->createElement('hps:AuthAmt', HpsInputValidation::checkAmount($authAmount)));
348
  }
 
349
  $cardDataElement = null;
350
  if ($cardData instanceof HpsCreditCard) {
351
  $cardDataElement = $xml->createElement('hps:CardData');
352
  $cardDataElement->appendChild($this->_hydrateManualEntry($cardData, $xml));
353
  } else if ($cardData instanceof HpsTokenData) {
354
  $cardDataElement = $xml->createElement('hps:CardData');
355
+ $cardDataElement->appendChild($this->_hydrateTokenData($cardData, $xml));
 
 
356
  } else {
357
  $cardDataElement = $xml->createElement('hps:GatewayTxnId', $cardData);
358
  }
363
 
364
  $hpsCreditReversal->appendChild($hpsBlock1);
365
  $hpsTransaction->appendChild($hpsCreditReversal);
 
 
 
 
 
 
 
 
 
 
 
366
 
367
+ return $this->_submitTransaction($hpsTransaction, 'CreditReversal', (isset($details->clientTransactionId) ? $details->clientTransactionId : null));
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
368
  }
369
 
370
  public function verify($cardOrToken, $cardHolder = null, $requestMultiUseToken = false, $clientTransactionId = null)
382
  if ($cardOrToken instanceof HpsCreditCard) {
383
  $cardData->appendChild($this->_hydrateManualEntry($cardOrToken, $xml));
384
  } else {
385
+ $cardData->appendChild($this->_hydrateTokenData($cardOrToken, $xml));
 
 
386
  }
387
  $cardData->appendChild($xml->createElement('hps:TokenRequest', ($requestMultiUseToken) ? 'Y' : 'N'));
388
 
467
  }
468
  }
469
 
470
+ /**
471
+ * @param $transaction
472
+ * @param $txnType
473
+ * @param null $clientTxnId
474
+ * @param null $cardData
475
+ *
476
+ * @return array|null
477
+ * @throws \HpsCreditException
478
+ * @throws \HpsException
479
+ * @throws \HpsGatewayException
480
+ */
481
  private function _submitTransaction($transaction, $txnType, $clientTxnId = null, $cardData = null)
482
  {
483
  $options = array();
540
  $rvalue = HpsRecurringBilling::fromDict($response, $txnType);
541
  break;
542
  case 'ManageTokens':
543
+ $rvalue = HpsManageTokensResponse::fromDict($response);
544
  break;
545
  default:
546
  break;
lib/SecureSubmit/src/Services/Gateway/HpsRestGatewayService.php CHANGED
@@ -3,7 +3,7 @@
3
  class HpsRestGatewayService extends HpsGatewayServiceAbstract
4
  {
5
  const CERT_URL = 'https://cert.api2.heartlandportico.com/Portico.PayPlan.v2';
6
- const PROD_URL = 'https://api2.heartlandportico.com/payplan.v2';
7
  const UAT_URL = 'https://api-uat.heartlandportico.com/payplan.v2';
8
  protected $limit = null;
9
  protected $offset = null;
3
  class HpsRestGatewayService extends HpsGatewayServiceAbstract
4
  {
5
  const CERT_URL = 'https://cert.api2.heartlandportico.com/Portico.PayPlan.v2';
6
+ const PROD_URL = 'https://api.heartlandportico.com/payplan.v2';
7
  const UAT_URL = 'https://api-uat.heartlandportico.com/payplan.v2';
8
  protected $limit = null;
9
  protected $offset = null;
lib/SecureSubmit/src/Services/Gateway/HpsSoapGatewayService.php CHANGED
@@ -16,7 +16,7 @@ class HpsSoapGatewayService extends HpsGatewayServiceAbstract implements HpsGate
16
  $hpsHeader = $xml->createElement('hps:Header');
17
 
18
  if ($this->_config->secretApiKey != null && $this->_config->secretApiKey != "") {
19
- $hpsHeader->appendChild($xml->createElement('hps:SecretAPIKey', $this->_config->secretApiKey));
20
  } else {
21
  $hpsHeader->appendChild($xml->createElement('hps:SiteId', $this->_config->siteId));
22
  $hpsHeader->appendChild($xml->createElement('hps:DeviceId', $this->_config->deviceId));
@@ -280,32 +280,57 @@ class HpsSoapGatewayService extends HpsGatewayServiceAbstract implements HpsGate
280
  return $manualEntry;
281
  }
282
 
283
- public function _hydrateSecureEcommerce($paymentData, $xml)
284
  {
285
  $secureEcommerce = $xml->createElement('hps:SecureECommerce');
286
- $secureEcommerce->appendChild($xml->createElement('hps:TypeOfPaymentData', $paymentData->secure3d));
 
287
 
288
- $paymentDataElement = $xml->createElement('hps:PaymentData', $paymentData->onlinePaymentCryptogram);
289
  $paymentDataElementEncoding = $xml->createAttribute('encoding');
290
  $paymentDataElementEncoding->value = 'base64';
291
  $paymentDataElement->appendChild($paymentDataElementEncoding);
 
292
 
293
- if ($paymentData->eciIndicator != null && $paymentData->eciIndicator != '') {
294
- $secureEcommerce->appendChild($xml->createElement('hps:ECommerceIndicator', $paymentData->eciIndicator));
295
  }
296
 
 
 
 
 
 
 
297
  return $secureEcommerce;
298
  }
299
-
 
 
 
300
  public function _hydrateTokenData($token, DOMDocument $xml, $cardPresent = false, $readerPresent = false)
301
  {
302
  if (!$token instanceof HpsTokenData) {
 
303
  $token = new HpsTokenData();
304
- $token->tokenValue = $token;
305
  }
306
 
307
  $tokenData = $xml->createElement('hps:TokenData');
308
  $tokenData->appendChild($xml->createElement('hps:TokenValue', $token->tokenValue));
 
 
 
 
 
 
 
 
 
 
 
 
 
309
  $tokenData->appendChild($xml->createElement('hps:CardPresent', ($cardPresent ? 'Y' : 'N')));
310
  $tokenData->appendChild($xml->createElement('hps:ReaderPresent', ($readerPresent ? 'Y' : 'N')));
311
  return $tokenData;
16
  $hpsHeader = $xml->createElement('hps:Header');
17
 
18
  if ($this->_config->secretApiKey != null && $this->_config->secretApiKey != "") {
19
+ $hpsHeader->appendChild($xml->createElement('hps:SecretAPIKey', trim($this->_config->secretApiKey)));
20
  } else {
21
  $hpsHeader->appendChild($xml->createElement('hps:SiteId', $this->_config->siteId));
22
  $hpsHeader->appendChild($xml->createElement('hps:DeviceId', $this->_config->deviceId));
280
  return $manualEntry;
281
  }
282
 
283
+ public function _hydrateSecureEcommerce($data, $xml)
284
  {
285
  $secureEcommerce = $xml->createElement('hps:SecureECommerce');
286
+ $secureEcommerce->appendChild($xml->createElement('hps:PaymentDataSource', $data->dataSource));
287
+ $secureEcommerce->appendChild($xml->createElement('hps:TypeOfPaymentData', $data->type));
288
 
289
+ $paymentDataElement = $xml->createElement('hps:PaymentData', $data->data);
290
  $paymentDataElementEncoding = $xml->createAttribute('encoding');
291
  $paymentDataElementEncoding->value = 'base64';
292
  $paymentDataElement->appendChild($paymentDataElementEncoding);
293
+ $secureEcommerce->appendChild($paymentDataElement);
294
 
295
+ if ($data->eciFlag != null && $data->eciFlag != '') {
296
+ $secureEcommerce->appendChild($xml->createElement('hps:ECommerceIndicator', $data->eciFlag));
297
  }
298
 
299
+ $xidElement = $xml->createElement('hps:XID', $data->xid);
300
+ $xidElementEncoding = $xml->createAttribute('encoding');
301
+ $xidElementEncoding->value = 'base64';
302
+ $xidElement->appendChild($xidElementEncoding);
303
+ $secureEcommerce->appendChild($xidElement);
304
+
305
  return $secureEcommerce;
306
  }
307
+ /*
308
+ * @link https://github.com/hps/heartland-php/pull/21
309
+ * @description resolves a recursion issue identified in the link above
310
+ */
311
  public function _hydrateTokenData($token, DOMDocument $xml, $cardPresent = false, $readerPresent = false)
312
  {
313
  if (!$token instanceof HpsTokenData) {
314
+ $tokenValue = $token;
315
  $token = new HpsTokenData();
316
+ $token->tokenValue = $tokenValue;
317
  }
318
 
319
  $tokenData = $xml->createElement('hps:TokenData');
320
  $tokenData->appendChild($xml->createElement('hps:TokenValue', $token->tokenValue));
321
+
322
+ if (isset($token->expMonth)) {
323
+ $tokenData->appendChild($xml->createElement('hps:ExpMonth', $token->expMonth));
324
+ }
325
+
326
+ if (isset($token->expYear)) {
327
+ $tokenData->appendChild($xml->createElement('hps:ExpYear', $token->expYear));
328
+ }
329
+
330
+ if (isset($token->cvv)) {
331
+ $tokenData->appendChild($xml->createElement('hps:CVV2', $token->cvv));
332
+ }
333
+
334
  $tokenData->appendChild($xml->createElement('hps:CardPresent', ($cardPresent ? 'Y' : 'N')));
335
  $tokenData->appendChild($xml->createElement('hps:ReaderPresent', ($readerPresent ? 'Y' : 'N')));
336
  return $tokenData;
lib/SecureSubmit/src/Services/Gateway/PayPlan/HpsPayPlanScheduleService.php CHANGED
@@ -2,6 +2,7 @@
2
 
3
  class HpsPayPlanScheduleService extends HpsRestGatewayService
4
  {
 
5
  public function add(HpsPayPlanSchedule $schedule)
6
  {
7
  $data = $schedule->getEditableFieldsWithValues();
@@ -13,10 +14,9 @@ class HpsPayPlanScheduleService extends HpsRestGatewayService
13
  ));
14
  return $this->hydrateObject($result, 'HpsPayPlanSchedule');
15
  }
16
-
17
  public function edit(HpsPayPlanSchedule $schedule)
18
  {
19
- $data = $schedule->getEditableFieldsWithValues();
20
  $result = $this->doRequest($data, array(
21
  'verb' => 'PUT',
22
  'endpoint' => 'schedules/'.$schedule->scheduleKey,
@@ -34,10 +34,8 @@ class HpsPayPlanScheduleService extends HpsRestGatewayService
34
  'verb' => 'POST',
35
  'endpoint' => 'searchSchedules',
36
  ));
37
-
38
  return $this->hydrateSearchResults($results, 'HpsPayPlanSchedule');
39
  }
40
-
41
  public function get($schedule)
42
  {
43
  $id = null;
@@ -52,7 +50,6 @@ class HpsPayPlanScheduleService extends HpsRestGatewayService
52
  ));
53
  return $this->hydrateObject($result, 'HpsPayPlanSchedule');
54
  }
55
-
56
  public function delete($schedule, $forceDelete = false)
57
  {
58
  $id = null;
@@ -61,7 +58,6 @@ class HpsPayPlanScheduleService extends HpsRestGatewayService
61
  } else {
62
  $id = $schedule;
63
  }
64
-
65
  $data = array(
66
  'forceDelete' => $forceDelete,
67
  );
@@ -70,4 +66,4 @@ class HpsPayPlanScheduleService extends HpsRestGatewayService
70
  'endpoint' => 'schedules/'.$id,
71
  ));
72
  }
73
- }
2
 
3
  class HpsPayPlanScheduleService extends HpsRestGatewayService
4
  {
5
+
6
  public function add(HpsPayPlanSchedule $schedule)
7
  {
8
  $data = $schedule->getEditableFieldsWithValues();
14
  ));
15
  return $this->hydrateObject($result, 'HpsPayPlanSchedule');
16
  }
 
17
  public function edit(HpsPayPlanSchedule $schedule)
18
  {
19
+ $data = $schedule->getEditableFieldsWithValues( $schedule );
20
  $result = $this->doRequest($data, array(
21
  'verb' => 'PUT',
22
  'endpoint' => 'schedules/'.$schedule->scheduleKey,
34
  'verb' => 'POST',
35
  'endpoint' => 'searchSchedules',
36
  ));
 
37
  return $this->hydrateSearchResults($results, 'HpsPayPlanSchedule');
38
  }
 
39
  public function get($schedule)
40
  {
41
  $id = null;
50
  ));
51
  return $this->hydrateObject($result, 'HpsPayPlanSchedule');
52
  }
 
53
  public function delete($schedule, $forceDelete = false)
54
  {
55
  $id = null;
58
  } else {
59
  $id = $schedule;
60
  }
 
61
  $data = array(
62
  'forceDelete' => $forceDelete,
63
  );
66
  'endpoint' => 'schedules/'.$id,
67
  ));
68
  }
69
+ }
lib/SecureSubmit/src/Services/HpsCentinelConfig.php CHANGED
@@ -9,13 +9,14 @@ class HpsCentinelConfig implements HpsConfigInterface
9
  public $useProxy = false;
10
  public $proxyOptions = null;
11
  public $serviceUri = 'https://centineltest.cardinalcommerce.com/maps/txns.asp';
 
12
 
13
  public function serviceUri()
14
  {
15
  return $this->serviceUri;
16
  }
17
 
18
- public function setServiceUri(string $value)
19
  {
20
  $this->serviceUri = $value;
21
  }
9
  public $useProxy = false;
10
  public $proxyOptions = null;
11
  public $serviceUri = 'https://centineltest.cardinalcommerce.com/maps/txns.asp';
12
+ public $curlOptions = null;
13
 
14
  public function serviceUri()
15
  {
16
  return $this->serviceUri;
17
  }
18
 
19
+ public function setServiceUri($value)
20
  {
21
  $this->serviceUri = $value;
22
  }
lib/SecureSubmit/src/Services/HpsServicesConfig.php CHANGED
@@ -17,13 +17,14 @@ class HpsServicesConfig implements HpsConfigInterface
17
  public $proxyOptions = null;
18
  public $soapServiceUri = "https://cert.api2.heartlandportico.com/Hps.Exchange.PosGateway/PosGatewayService.asmx";
19
  public $payPlanBaseUri = null;
 
20
 
21
  public function serviceUri()
22
  {
23
  return $this->soapServiceUri;
24
  }
25
 
26
- public function setServiceUri(string $value)
27
  {
28
  $this->soapServiceUri = $value;
29
  }
@@ -36,7 +37,7 @@ class HpsServicesConfig implements HpsConfigInterface
36
 
37
  public function getKeyType($keyType)
38
  {
39
- $key = $keyType == self::KEY_TYPE_SECRET ? $this->secretApiKey : $this->publicApiKey;
40
  switch (true) {
41
  case substr($key, 0, 6) == 'skapi_':
42
  return self::KEY_TYPE_SECRET;
17
  public $proxyOptions = null;
18
  public $soapServiceUri = "https://cert.api2.heartlandportico.com/Hps.Exchange.PosGateway/PosGatewayService.asmx";
19
  public $payPlanBaseUri = null;
20
+ public $curlOptions = null;
21
 
22
  public function serviceUri()
23
  {
24
  return $this->soapServiceUri;
25
  }
26
 
27
+ public function setServiceUri($value)
28
  {
29
  $this->soapServiceUri = $value;
30
  }
37
 
38
  public function getKeyType($keyType)
39
  {
40
+ $key = trim($keyType == self::KEY_TYPE_SECRET ? $this->secretApiKey : $this->publicApiKey);
41
  switch (true) {
42
  case substr($key, 0, 6) == 'skapi_':
43
  return self::KEY_TYPE_SECRET;
package.xml CHANGED
@@ -1,20 +1,20 @@
1
  <?xml version="1.0"?>
2
  <package>
3
  <name>Hps_Securesubmit</name>
4
- <version>1.3.0</version>
5
  <stability>stable</stability>
6
- <license uri="https://github.com/SecureSubmit/heartland-magento-extension/blob/master/LICENSE">Custom</license>
7
  <channel>community</channel>
8
  <extends/>
9
  <summary>Take credit card payments and store cards in a PCI friendly way.</summary>
10
  <description>Use Heartland Payment Systems SecureSubmit platform to charge, authorize, void, refund and partial refund credit cards.&#xD;
11
  &#xD;
12
- Allow customers to store their cards for reduced friction at next checkout using our multi-use card tokenization process which helps reduce PCI scope.</description>
13
- <notes>Added compatibility with AMASTY One Page Checkout</notes>
14
  <authors><author><name>Heartland Payment Systems</name><user>markhagan</user><email>EntApp_DevPortal@e-hps.com</email></author></authors>
15
- <date>2016-11-08</date>
16
- <time>15:04:00</time>
17
- <contents><target name="magecommunity"><dir name="Hps"><dir name="Securesubmit"><dir name="Block"><dir name="Adminhtml"><file name="Form.php" hash="ab296bcf9018c73690bb0f5ab381381d"/><dir name="Paypal"><dir name="Settlement"><dir name="Report"><dir name="Form"><file name="Form.php" hash="da5a943526a729a4e78def46c63d0109"/></dir><file name="Form.php" hash="ecc3101a2a399dc71ae544bbe7bb9595"/><file name="Grid.php" hash="35b62c9ab2fe5b5e9a9394e11167f50c"/></dir><file name="Report.php" hash="19171fb1fad872b0ebff9692de1415fd"/></dir></dir></dir><file name="Form.php" hash="031741c6abad215430305c3758b3a362"/><file name="Info.php" hash="f733311f2a666fdd481fb26f57f50b63"/><dir name="Masterpass"><dir name="Client"><file name="Js.php" hash="ed427387b93d2753d8e8ada51c0d8f37"/></dir><file name="Connect.php" hash="b5e362f21c219ec61c4df7dff561ace6"/><file name="Form.php" hash="6abc4c67143380fad13efec247a18af4"/><file name="Info.php" hash="b8f714200c8f74cd8a0a9547fafc3637"/><dir name="Review"><file name="Billing.php" hash="c5bc2f64c2dc30e8ca1458cd286a16ee"/><file name="Details.php" hash="c324f315b2dfda8263151612ec73f513"/><file name="Shipping.php" hash="aeb5f38aa185e9d3acbb7ce5d4c4b841"/></dir><file name="Review.php" hash="b6e4dbd308c44215e50fa94dd22a32b0"/></dir><dir name="Paypal"><dir name="Credit"><file name="Form.php" hash="68fc4811e8f2d9a1b502454533fe5bca"/></dir><file name="Form.php" hash="776d2aab11db7d212061ca9a30936af1"/><dir name="Incontext"><file name="Js.php" hash="d09bf9157c0b7c5f6dba16d8cdac557d"/></dir><file name="Info.php" hash="9c1948c538383376b1dc1b4c76c31e95"/><dir name="Review"><file name="Billing.php" hash="62a22e1f5bd65c4d9369b5794779ffe9"/><file name="Details.php" hash="57d97c8a2c3b7ddac7dc4cda43e4363f"/><file name="Shipping.php" hash="694374b68714b6d58d9af8b9fb15d502"/></dir><file name="Review.php" hash="87c8f3bf319799b33170bec9f42e2544"/><file name="Shortcut.php" hash="26f13ae7afac41ce88fb1cd4042b61b5"/></dir></dir><dir name="Helper"><dir name="Altpayment"><file name="Abstract.php" hash="5fc29e9d6355660415934426d0ee624e"/></dir><file name="Data.php" hash="35a26dab0e14154f2ee80a498f788d7c"/><file name="Masterpass.php" hash="69489b7cae8b99fe216f522b19f3d448"/><file name="Paypal.php" hash="74d1d0885349c432016bd04f3211c4c2"/></dir><dir name="Model"><dir name="Altpayment"><file name="Cart.php" hash="1dc83b97c44463e954efc8ee1c9e62b8"/></dir><file name="Masterpass.php" hash="063acd12e22bdc26d7591cbabf7e3005"/><file name="Payment.php" hash="3b39f69c6826960fe99215f086148090"/><dir name="Paypal"><file name="Credit.php" hash="3548d6c4308df9d377cc1dd0d40f0f4d"/></dir><file name="Paypal.php" hash="c3eb2058ff6860e85a9310944c989301"/><file name="Report.php" hash="7f5e5bf0c652b37cf8c42eb553c8b3e0"/><dir name="Resource"><dir name="Report"><file name="Collection.php" hash="5870728a842922bbbff9c50173a90bd4"/></dir><file name="Report.php" hash="59598e2958a864119925c6e847b66121"/><file name="Setup.php" hash="8bdfbde89d786809d8aa2637efb1d2ae"/><dir name="Storedcard"><file name="Collection.php" hash="756c3c2d6dd5384f37847a028ac12fee"/></dir><file name="Storedcard.php" hash="d43320b704eb1e37c77a5ac20401c557"/></dir><file name="Session.php" hash="136b4146cea2f596847f0b838ec3f532"/><dir name="Source"><file name="Cctype.php" hash="d2dfff6147dc5c2748c7e9767b1fd1cb"/><file name="PaymentAction.php" hash="3c900b82e9af73a372d9f5f36bc1c264"/></dir><file name="Storedcard.php" hash="50897a56669c5938d4613579b603df93"/><dir name="System"><dir name="Config"><dir name="Backend"><file name="Proxy.php" hash="29ea9cb11927cd1e43055a42101eea36"/></dir></dir></dir></dir><dir name="controllers"><dir name="Adminhtml"><dir name="Hps"><dir name="Paypal"><file name="ReportsController.php" hash="914711bc008ec9e240918be7e77d1d54"/></dir></dir><file name="StoredcardController.php" hash="1e968134bf3b60a5f49544ddd1df8f03"/></dir><file name="GiftcardController.php" hash="dd15a7709121a3149fb30f77c385b18f"/><file name="MasterpassController.php" hash="2fb95214db3d3d017dd022743636ec50"/><file name="PaypalController.php" hash="962ce3dc3e738689d6ec6b122ed46001"/><file name="StoredcardController.php" hash="57116e86203df6f24a12fcd93186b534"/></dir><dir name="etc"><file name="adminhtml.xml" hash="8dc53c22d22cd633ebd6c06e7262c741"/><file name="config.xml" hash="0a91fa84cbaa63d4d9669784697a4911"/><file name="system.xml" hash="2b4c4f26b48cb72f408c1c97ec3e4c21"/></dir><dir name="sql"><dir name="hps_securesubmit_setup"><file name="install-1.0.0.php" hash="d424731dcb784aad59dad0bcce431375"/><file name="mysql4-upgrade-1.0.0-1.0.1.php" hash="510826261ea81ea6a09d4ea84c59d41d"/><file name="mysql4-upgrade-1.0.1-1.1.0.php" hash="01e948ea2939f9b0b69bb6748adc53f2"/><file name="mysql4-upgrade-1.1.0-1.2.0.php" hash="84cf1a359fc5a5600e1d98ba0089d911"/></dir></dir></dir></dir></target><target name="mageweb"><dir name="js"><dir name="securesubmit"><file name="admin-checkout.js" hash="14d970828f50bb463dc3f7cdaca97e1d"/><file name="checkout-form.js" hash="62d38a7cbcc240293500e1f105281d0b"/><dir name="masterpass"><file name="lightbox.js" hash="b534647c7c06b5ce90caf4cdd6166f91"/></dir><dir name="paypal"><file name="incontext.js" hash="e3810f12033fa9822db756a22622f799"/></dir><file name="secure.submit-1.0.1.js" hash="988d59dadbc272b869bc9e56cbd7518e"/></dir></dir></target><target name="magelib"><dir name="SecureSubmit"><file name="Hps.php" hash="aeeb39dae09306051eec2cf455fcb6a8"/><file name="LICENSE.txt" hash="de081f847a769f89be5a1f80862005ba"/><file name="PRIVACY.txt" hash="58cdc5fbbff24a84a838b0174b254f70"/><file name="README.md" hash="8320a396aa5544e61fe2e8f2adb09505"/><file name="index.php" hash="feabe5cc691b088d6ade3e04d6b120fc"/><dir name="src"><dir name="Abstractions"><file name="HpsAltPaymentServiceInterface.php" hash="bbbacdf42b798458ca46921b3ddb9eaf"/><file name="HpsBuilderAbstract.php" hash="6498e7b7e00716574a9dd238d1d7da5e"/><file name="HpsConfigInterface.php" hash="6541819ca5724269db6e1a9ed456d52e"/><file name="HpsGatewayServiceAbstract.php" hash="6e6631e0cfea0001a6fff4bf57d13068"/><file name="HpsGatewayServiceInterface.php" hash="c2b49802b328648d8510433b5c82f71f"/><file name="HpsPayPlanResourceAbstract.php" hash="df262df6345c4932626e60afecdeb478"/><file name="HpsPayPlanResourceInterface.php" hash="22dd33e354f46218d2872eab956d57c1"/></dir><dir name="Entities"><dir name="AltPayment"><file name="HpsAltPaymentAddToBatch.php" hash="1684714c0cd14d6d33288a44f43c9dd6"/><file name="HpsAltPaymentAuth.php" hash="4f2748e2b95cffed6bd0e62f75af71eb"/><file name="HpsAltPaymentCapture.php" hash="51a86062c15c6f8de15147b5b53f89a4"/><file name="HpsAltPaymentCreateSession.php" hash="4e83acd11a03e7dfcf904f2421d858b3"/><file name="HpsAltPaymentResponse.php" hash="860336d2015560f889c41773574b97ab"/><file name="HpsAltPaymentReturn.php" hash="0b9d8cb0f67ddf113b99ca64ab6019a3"/><file name="HpsAltPaymentSale.php" hash="f390a9a4af50f7a8a863c607f7e3357f"/><file name="HpsAltPaymentSessionInfo.php" hash="a5fdaea50db9f15eb762f4ca3512cae4"/><file name="HpsAltPaymentVoid.php" hash="429f0fbec31ae4842c494b0a8af47ddb"/><file name="HpsBuyerData.php" hash="4fd94d96a547378d2974fa386c89223f"/><file name="HpsCardinalMPIAddOrderNumberResponse.php" hash="a2f2c09eb9e7020e7af97819fe065dc3"/><file name="HpsCardinalMPIAuthenticateResponse.php" hash="6868b0bc55d8e3409684e795d1db92fc"/><file name="HpsCardinalMPIAuthorizeResponse.php" hash="566a64988246220b00da62078ae32068"/><file name="HpsCardinalMPIAuthresponseResponse.php" hash="a53fb4863feb909ccb0d2f2cc254562f"/><file name="HpsCardinalMPICaptureResponse.php" hash="29de876ce9bc632016fceab91dca22ac"/><file name="HpsCardinalMPILookupResponse.php" hash="7171aff90865b67db79559f7b2f579ba"/><file name="HpsCardinalMPIPreapprovalResponse.php" hash="e9408b385ca4f32de5f1adf96a36c42d"/><file name="HpsCardinalMPIRefundResponse.php" hash="71dbbff6f6383a19b0feb91f8771dbe5"/><file name="HpsCardinalMPIResponse.php" hash="d3729129967b1da049287e200e4d46e2"/><file name="HpsCardinalMPIVoidResponse.php" hash="2796de53634fccca806a4a4143779f81"/><file name="HpsLineItem.php" hash="4ff06a280975312365cf10a730636682"/><file name="HpsOrderData.php" hash="5d3ae0110d44f4786d4398861735a259"/><file name="HpsPaymentData.php" hash="2bd9ddc10ecdaebdbb5bf0e3cf71f642"/><file name="HpsShippingInfo.php" hash="63b621ebba4ae1711aca57073b0abec7"/></dir><dir name="Batch"><file name="HpsBatch.php" hash="d9af4664e64172cb8edaeaa1ea7c7337"/></dir><dir name="Check"><file name="HpsCheck.php" hash="8fb85bd4d608e72a9690285ec46fa6d2"/><file name="HpsCheckHolder.php" hash="58f865b34faf2790fef26066de775a15"/><file name="HpsCheckResponse.php" hash="ff3c752bc85554424e62ed7efbc053f2"/><file name="HpsCheckResponseDetails.php" hash="28928ceb2dea574603a376aed1691a90"/></dir><dir name="Credit"><file name="HpsAccountVerify.php" hash="527a69e5a39153b764e6c14e0d98bf34"/><file name="HpsAuthorization.php" hash="7ec1bbfa6efa5bc48432b5de81eda314"/><file name="HpsCPCData.php" hash="f246c4aa1eec482ba84966c563aeb970"/><file name="HpsCPCEdit.php" hash="f04b0089485ba9e7eacba8e15815ec97"/><file name="HpsCardHolder.php" hash="ffee4609a3ffa886a386a12dea3f4508"/><file name="HpsCharge.php" hash="512fb9e459b336a9e256d8f1e08e36b9"/><file name="HpsChargeExceptions.php" hash="c7df102696a205a4c5689c48878ac5f3"/><file name="HpsCreditCard.php" hash="6aa3d449b0648997c4c532c1e3603cbb"/><file name="HpsOfflineAuthorization.php" hash="6f11736d36cfde0d9d79c94e92f60c8b"/><file name="HpsRecurringBilling.php" hash="9da8f9b16179729b77615f04993b05bf"/><file name="HpsRefund.php" hash="aa4664916ebb94b8f2066fd7c17b0fd4"/><file name="HpsReportTransactionDetails.php" hash="f5bcb8f1532c9282760bb9b733107fac"/><file name="HpsReportTransactionSummary.php" hash="441b01c652db42213264980e6f693b40"/><file name="HpsReversal.php" hash="350191a2d38189ef8e098ed1f922c1d3"/><file name="HpsVoid.php" hash="bf6216cea2f130789a045fc226c54cd0"/></dir><dir name="Debit"><file name="HpsDebitAddValue.php" hash="9053c701093889f864dd36af208f4f71"/><file name="HpsDebitReturn.php" hash="519cb73c6fc4ce716453d5ff94f437a0"/><file name="HpsDebitReversal.php" hash="223f6db72f0219ef25eb0f0adec4e9be"/><file name="HpsDebitSale.php" hash="74fa1e1425cfe6294146c879a4049aa8"/></dir><dir name="Fluent"><file name="HpsBuilderAction.php" hash="8649cc2c53fd961f350070193fedb5c6"/><file name="HpsUnknownPropertyException.php" hash="d019e8645fae6f984ad7b7ea3cebb546"/></dir><dir name="Gift"><file name="HpsGiftCard.php" hash="c8bad2a5336689e3192ea223a97760bf"/><file name="HpsGiftCardActivate.php" hash="097ac7c36cae11b8c40a3f1414518e49"/><file name="HpsGiftCardAddValue.php" hash="131a9d7cbc711a4e3e85c66049028f30"/><file name="HpsGiftCardAlias.php" hash="133d2d4701c5aa88fa0eece6ee69de06"/><file name="HpsGiftCardBalance.php" hash="9b9fe395d218c79c55faf28fd736b431"/><file name="HpsGiftCardDeactivate.php" hash="323ca5a67c6ff0169925192952881db5"/><file name="HpsGiftCardReplace.php" hash="f122a7d924a56fcc406bc8b1c82ac2b2"/><file name="HpsGiftCardReversal.php" hash="88ba755e52f41311206add4fa8ee5e09"/><file name="HpsGiftCardReward.php" hash="f758e8c5462d336236ae0d257789cdaf"/><file name="HpsGiftCardSale.php" hash="0f758ef6653215be643abaea4964352a"/><file name="HpsGiftCardVoid.php" hash="f0294740f5b7f545167d5fb258f4dcdd"/></dir><file name="HpsAddress.php" hash="fcc67451ff9f1c483e2943cf6ee5c5fe"/><file name="HpsConsumer.php" hash="1254142dfa0821cbb0bf154cf51f34d2"/><file name="HpsDirectMarketData.php" hash="1925c204d19cb9233ec8178e3b5cdc50"/><file name="HpsEncryptionData.php" hash="1e4845abc6c42e8f0265e2679b05efb6"/><file name="HpsTokenData.php" hash="18ab9125315bb8e5f9cb272966dac22b"/><file name="HpsTrackData.php" hash="4656f37b7c4c777d0c63b4102efe5a1a"/><file name="HpsTransaction.php" hash="f109d2d26ba237afb2dc17bc287f63a9"/><file name="HpsTransactionDetails.php" hash="4e77261d0aced118b49e26ef786beace"/><file name="HpsTransactionHeader.php" hash="ebd21539f84425f0e2fc57c6049a26a1"/><file name="HpsTransactionStatus.php" hash="a5a67f8fe3780f66b045cc4314660dc5"/><dir name="PayPlan"><file name="HpsPayPlanAmount.php" hash="25706476e264124567d704f981745b13"/><file name="HpsPayPlanCustomer.php" hash="2714a7525fb3830fc018544ea0622ab5"/><file name="HpsPayPlanPaymentMethod.php" hash="fd3077d63e6f31c2d8a4c60c78a678ea"/><file name="HpsPayPlanSchedule.php" hash="4c9fe8bd7db0810fd108e51b81bdf590"/></dir><file name="index.php" hash="ce407ff5715c837d02b1aba7975bf512"/><file name=".DS_Store" hash="92d42bd310aa7f6dd74d14e6cdd2b9e9"/></dir><dir name="Infrastructure"><dir name="Enums"><file name="HpsACHType.php" hash="1ff5593689a404cb0179c2b5cb5fe19e"/><file name="HpsAccountType.php" hash="760d91e120f443c326e6c7586aa61092"/><file name="HpsCardBrand.php" hash="9532bb7c40811c114a1eeeffa8b9732c"/><file name="HpsCentinelCheckoutType.php" hash="7370920cb980bbfc54c741a981cd79bb"/><file name="HpsCheckType.php" hash="d60c676d93c8ada169deb14ddc8e64e7"/><file name="HpsDataEntryMode.php" hash="c323d884a7a305f9af647ea1d9a4177e"/><file name="HpsExceptionCodes.php" hash="95322648a2093ed3982c6bb724f3507a"/><file name="HpsGiftCardAliasAction.php" hash="ebcb27c6fb800e17693ed4af2e8a8943"/><file name="HpsItemChoiceTypePosResponseVer10Transaction.php" hash="686225a07738db2233a2228bec6baabf"/><file name="HpsPayPlanAccountType.php" hash="4d383c42a990fb077fae49386c08b870"/><file name="HpsPayPlanCustomerStatus.php" hash="3ff092e8dd97f2a2474fb64103cb238f"/><file name="HpsPayPlanPaymentMethodStatus.php" hash="b020c52de7987ed3011cb97e4d440c6a"/><file name="HpsPayPlanPaymentMethodType.php" hash="1f77c5c8528815f05803c1381cb4151a"/><file name="HpsPayPlanScheduleDuration.php" hash="05101e6fe3b725b43917b59770f2dbb1"/><file name="HpsPayPlanScheduleFrequency.php" hash="0b3f029c64315ee9c8701d23319941c1"/><file name="HpsPayPlanScheduleStatus.php" hash="3579b52ccf36e576fd2dfb36118716f6"/><file name="HpsSECCode.php" hash="551661613c127c068f139083338b92d1"/><file name="HpsTaxType.php" hash="ba0e05330880810e58370f2f3490ca81"/><file name="HpsTrackDataMethod.php" hash="446069e9786f9585c3490140b29ae52f"/><file name="HpsTransactionType.php" hash="a38b3f4c654a4fa3b2c2d64b8afacf24"/></dir><file name="HpsApiConnectionException.php" hash="ac5a8064a7c2a1616035a5702f36cd50"/><file name="HpsArgumentException.php" hash="855c43e88fc24b582cfe56875d7cff42"/><file name="HpsAuthenticationException.php" hash="6feb2fdc5499b460274524aa469d9a7d"/><file name="HpsCheckException.php" hash="94870f2438217b3275d05fb943a0a8c0"/><file name="HpsConfiguration.php" hash="010996727d89c485c1d11463e5c53a8e"/><file name="HpsCreditException.php" hash="a16bf1ecd6a2c866b7b40351aab3df34"/><file name="HpsCreditExceptionDetails.php" hash="d71c54b2846283a8f97aae74a747dfd9"/><file name="HpsException.php" hash="8d2025b7fae9f0f756341b876a0dab41"/><file name="HpsGatewayException.php" hash="cdd6db6c8436e3e78ee15cdd7a043a9d"/><file name="HpsGatewayExceptionDetails.php" hash="16dd36360e2237ca89e056c61766bcdd"/><file name="HpsInvalidRequestException.php" hash="7877e48463ef3f488bb92423ae445412"/><file name="HpsProcessorError.php" hash="ff7f1f2c5327417b4997f9e36fa7c887"/><file name="HpsProcessorException.php" hash="ba28a92f0e551053506dcc391c5bc431"/><file name="HpsProcessorExceptionDetails.php" hash="6a569aacf045c19ade6472a857a3a274"/><dir name="Validation"><file name="HpsGatewayResponseValidation.php" hash="06fb818263b18b58974a569d0c986667"/><file name="HpsInputValidation.php" hash="1f51837f70c322f2a7c1cc39df752b1a"/><file name="HpsIssuerResponseValidation.php" hash="613377f8ca249df078c909e4d7674bfb"/><file name="HpsProcessorResponseValidation.php" hash="ff19a569f8bdd6ef7b58a460cf06b4e8"/></dir><file name="index.php" hash="ce407ff5715c837d02b1aba7975bf512"/></dir><dir name="Services"><dir name="Fluent"><dir name="Gateway"><dir name="Check"><file name="HpsCheckServiceOverrideBuilder.php" hash="5b4a49a897f87d2a332182a1ccd67d0c"/><file name="HpsCheckServiceRecurringBuilder.php" hash="c86a2fd5165a65c78e38e3bbb1b9636c"/><file name="HpsCheckServiceReturnBuilder.php" hash="5ce46356468714f65ad827e1593977cc"/><file name="HpsCheckServiceSaleBuilder.php" hash="b823e74642e165772f5cb03beffacce7"/><file name="HpsCheckServiceVoidBuilder.php" hash="17305b04474285a8b64007c549180ba5"/></dir><dir name="Credit"><file name="HpsCreditServiceAuthorizeBuilder.php" hash="51997a17ee9a1aaacd40d9d2c8d69c17"/><file name="HpsCreditServiceCaptureBuilder.php" hash="fd6512f3b72f9051eaf7c3daeff2cb48"/><file name="HpsCreditServiceChargeBuilder.php" hash="3421b227fe594f0cb1533b4496c805bd"/><file name="HpsCreditServiceCpcEditBuilder.php" hash="7401c33a56c5a3c6a23f5f70101a4926"/><file name="HpsCreditServiceEditBuilder.php" hash="cdcf661c4182625212ec724b52eb8491"/><file name="HpsCreditServiceGetBuilder.php" hash="05b0cafe715a4d3ceb3c88b99b0c8dc1"/><file name="HpsCreditServiceListTransactionsBuilder.php" hash="a7765dfadc8e21177cc453a1e7dfd715"/><file name="HpsCreditServiceOfflineAuthBuilder.php" hash="d86d2425c6bbf28854a31d09a9f802b8"/><file name="HpsCreditServiceOfflineChargeBuilder.php" hash="0ee9ecf6b499a16f01fa2a7b94af00ca"/><file name="HpsCreditServicePrepaidAddValueBuilder.php" hash="997b48104fcdbd791a3b990515f2527e"/><file name="HpsCreditServicePrepaidBalanceInquiryBuilder.php" hash="7e7dd067d79281c32417b6d338825acd"/><file name="HpsCreditServiceRecurringBuilder.php" hash="560c8b86eeb9e4e468642eaa739ebe03"/><file name="HpsCreditServiceRefundBuilder.php" hash="4d5ab9c2a11c18a47e416bd90dffc5e8"/><file name="HpsCreditServiceReverseBuilder.php" hash="7960e9efa00ceb0d0c5368715c07d424"/><file name="HpsCreditServiceVerifyBuilder.php" hash="62027b344ee5444ccd1534358a405857"/><file name="HpsCreditServiceVoidBuilder.php" hash="0029756571343a1d8c6380874f6f5b6b"/></dir><dir name="Debit"><file name="HpsDebitServiceAddValueBuilder.php" hash="5f972b68a5afa062cbf911bfb3a946bc"/><file name="HpsDebitServiceChargeBuilder.php" hash="26aafce2a87bbbd8231a039209c49657"/><file name="HpsDebitServiceReturnBuilder.php" hash="2e11267e12bdd338b953db352a373961"/><file name="HpsDebitServiceReverseBuilder.php" hash="b088431d3ba0726d44cc418e92267958"/></dir><dir name="GiftCard"><file name="HpsGiftCardServiceActivateBuilder.php" hash="65e3ebd1c6ded3860b238d03e542fe3b"/><file name="HpsGiftCardServiceAddValueBuilder.php" hash="432582c9fd6617c86b373f5fe0b14fb1"/><file name="HpsGiftCardServiceAliasBuilder.php" hash="1b096debfa6678af2d6ddecfa82a638e"/><file name="HpsGiftCardServiceBalanceBuilder.php" hash="6bebaac04d059204a2408d693f77c449"/><file name="HpsGiftCardServiceDeactivateBuilder.php" hash="92b16b331414c40ea11de330bd447273"/><file name="HpsGiftCardServiceReplaceBuilder.php" hash="063e6b33a673c23553047a6f72927b2a"/><file name="HpsGiftCardServiceReverseBuilder.php" hash="2f7b96b1f9608cb7e3526ecb9b15558f"/><file name="HpsGiftCardServiceRewardBuilder.php" hash="242fbe42ab731b138e4d74be4cde4e9a"/><file name="HpsGiftCardServiceSaleBuilder.php" hash="8af2977da26e3707e42569ad7bf4c4a5"/><file name="HpsGiftCardServiceVoidBuilder.php" hash="fff556a586bb09d22f521a90d30fb809"/></dir><file name="HpsFluentCheckService.php" hash="e89511e006e914bdd4daf6765a49e97b"/><file name="HpsFluentCreditService.php" hash="58e0d0480066fec8c5c6e31eaa275d12"/><file name="HpsFluentDebitService.php" hash="63e86fe32a92c80cc5bd163283da6c64"/><file name="HpsFluentGiftCardService.php" hash="53697a755fc90256b940c74282693b0d"/></dir></dir><dir name="Gateway"><dir name="AltPayment"><file name="HpsAltPaymentService.php" hash="3d9cdbad50ccceb45d4d888018d2bab7"/><file name="HpsMasterPassService.php" hash="f5639448d09a38377f16434351201b09"/><file name="HpsPayPalService.php" hash="c91eebb0eca8bdda2505b78c4746db28"/></dir><file name="HpsBatchService.php" hash="2a4c11a4f7c78ec1e3b461b3803826c5"/><file name="HpsCentinelGatewayService.php" hash="40300a57982ccd5325b7bd0986a8bcc4"/><file name="HpsCheckService.php" hash="17eac57a5f3a6f24e31000325ad9ac1d"/><file name="HpsCreditService.php" hash="f7baf1cf04cd6024039ad90284f08db9"/><file name="HpsDebitService.php" hash="0ea76c01b3c817fcaea876bff28681b3"/><file name="HpsGiftCardService.php" hash="e1deb113c685845e2af2bb0ff793ea4d"/><file name="HpsPayPlanService.php" hash="ce5d2c003e72be8328634d92ab8ae6eb"/><file name="HpsRestGatewayService.php" hash="3a0b4217eb4e9d8c92d298914e539a04"/><file name="HpsSoapGatewayService.php" hash="969751eb742eeb7d7a99d5d61d2d2afb"/><file name="HpsTokenService.php" hash="b1dad4289201b399f89ad1d29a799d39"/><dir name="PayPlan"><file name="HpsPayPlanCustomerService.php" hash="cda074fca2230c26919a813cc2d71b5c"/><file name="HpsPayPlanPaymentMethodService.php" hash="61dd42308d203251f4483d68561c191b"/><file name="HpsPayPlanScheduleService.php" hash="e8c81640a7440a19ed3590894a31a1f1"/></dir></dir><file name="HpsCentinelConfig.php" hash="f43f7ea211a51883fb8a2173072027a8"/><file name="HpsServicesConfig.php" hash="f3d63dc7d089a8bcd248e4abc381e6a7"/><file name="index.php" hash="ce407ff5715c837d02b1aba7975bf512"/></dir><file name="index.php" hash="ce407ff5715c837d02b1aba7975bf512"/><file name=".DS_Store" hash="fb4d06cbd65ab29860d86984919afa4a"/></dir></dir></target><target name="magedesign"><dir name="adminhtml"><dir name="default"><dir name="default"><dir name="layout"><file name="securesubmit.xml" hash="cc04e952cc17ea3462931a9e7a655316"/></dir><dir name="template"><dir name="securesubmit"><file name="form.phtml" hash="67a460ca8f034f4bfe3fbb8e7845f37f"/></dir></dir></dir></dir></dir><dir name="frontend"><dir name="base"><dir name="default"><dir name="layout"><file name="securesubmit.xml" hash="410fda5ef3920f893f5a17ec379aa2da"/></dir><dir name="template"><dir name="securesubmit"><file name="form.phtml" hash="78a8e941ab3164a7ee4c3bffacfc487d"/><dir name="masterpass"><file name="connect.phtml" hash="b5f47624447a44958ce4fa004c58c319"/><file name="form.phtml" hash="039d6a174ac24c45ece0d14b92b6c9c4"/><file name="js.phtml" hash="274e871b2d8270e3224b9ce12794c2c5"/><file name="mark.phtml" hash="fe27b341b5fb034e90ac35c92ef998d4"/><dir name="review"><file name="details.phtml" hash="0dc5e1201e7e424f089c15fc83a1c70f"/><dir name="shipping"><file name="method.phtml" hash="cc426553636aa08840bee1c4778d89e4"/></dir></dir><file name="review.phtml" hash="cfc643de65b962ba27306587357f45d3"/></dir><dir name="paypal"><dir name="incontext"><file name="js.phtml" hash="16b4ad23ea05464a55bb0390cd72e248"/><file name="payment.phtml" hash="b32d269057984f656422609015dd7d91"/></dir><dir name="review"><file name="details.phtml" hash="0dc5e1201e7e424f089c15fc83a1c70f"/><dir name="shipping"><file name="method.phtml" hash="cc426553636aa08840bee1c4778d89e4"/></dir></dir><file name="review.phtml" hash="cfc643de65b962ba27306587357f45d3"/><file name="shortcut.phtml" hash="268bfac86e653ec5981cd201075f4105"/></dir><file name="storedcards.phtml" hash="d083493f42af257cdb1949a8cbd8855b"/></dir></dir></dir></dir></dir></target><target name="mageetc"><dir name="modules"><file name="Hps_Securesubmit.xml" hash="d5aed3f48a45f8e611b68d1e6f34c959"/></dir></target><target name="mageskin"><dir name="frontend"><dir name="base"><dir name="default"><dir name="securesubmit"><dir name="css"><file name="hps-styles.css" hash="054fefd2b23342565da4a4b0d977fdb7"/></dir><dir name="images"><file name="ajax-loader.gif" hash="f48ee069890b16455c3ddcacee9b5f75"/><file name="arrow@2x.png" hash="ecc6766f32ae007e48f1cac2cefae87b"/><file name="bg_x.png" hash="c321c67f6929326129426c9e83207ea3"/><file name="cvv1.png" hash="0cba150037737255b0b750fd8b7aa3a8"/><file name="delete-hover.svg" hash="b50f601a53505660e093c126a84773b2"/><file name="delete.png" hash="0797e40a65fe0cf10252e788f40bee50"/><file name="delete.svg" hash="0793be8c20ffb397cc933d6c6de4df75"/><file name="heartland-logo.png" hash="0a15c70514f1449af4a98931b62d6844"/><file name="heartland-logo@1x.png" hash="d1982d3c613fee22120b06494aa92bfa"/><file name="heartland-logo@2x.png" hash="24daf8c6f920ed7b9c5aad79143f76b5"/><file name="icon_sprite.png" hash="e15f0103ef5ebe3baf48960bb9ccfaab"/><file name="icon_sprite@2x.png" hash="156b591cc9464429bc3b614cbbe636fd"/><file name="ss-input-amex@2x.png" hash="3a0311a7ae08337686031ee12d428b7b"/><file name="ss-inputcard-amex@2x.png" hash="a20df89111cf94aa5d653f44bf7e8cc8"/><file name="ss-inputcard-blank@2x.png" hash="1f84a3d28f8604a0ae1f019d10325c51"/><file name="ss-inputcard-discover@2x.png" hash="c17c70f6dc3908b1c066d0c0aa53a9bc"/><file name="ss-inputcard-jcb@2x.png" hash="bc353bc2e57fe2e2b689b69ce1826389"/><file name="ss-inputcard-mastercard@2x.png" hash="48cae147cae1ef0121e090df928632c0"/><file name="ss-inputcard-visa@2x.png" hash="c8bd7bf3aa1fff3226b5ce571ddefa42"/><file name="ss-lock.png" hash="430fbebc08387bcb43fed60ba14e5da1"/><file name="ss-lock@2x.png" hash="2772a5c4b0e7d622cb8773fd575108d2"/><file name="ss-logo.png" hash="a6e2017f773c3ebd82318cb5417a09dd"/><file name="ss-saved-amex@2x.png" hash="7aff4d28b217bceeb2d1fe139998e980"/><file name="ss-saved-discover@2x.png" hash="f5b5e76e49f3e02b677117068cd1d3fa"/><file name="ss-saved-jcb@2x.png" hash="58923ad29390b36556e61de061417fc8"/><file name="ss-saved-mastercard@2x.png" hash="19d69c364291adf7e87355fbe79ebd38"/><file name="ss-saved-visa@2x.png" hash="c3d935832dfcde4dba793e91665315b7"/><file name="ss-shield@1x.png" hash="473a87521ec93d14c906cd2415833f33"/><file name="ss-shield@2x.png" hash="ceada08d149bd9c2d63706e67eb7b1e9"/><file name=".DS_Store" hash="194577a7e20bdcc7afbb718f502c134c"/></dir></dir></dir></dir></dir></target></contents>
18
  <compatible/>
19
  <dependencies><required><php><min>5.2.0</min><max>5.6.28</max></php></required></dependencies>
20
  </package>
1
  <?xml version="1.0"?>
2
  <package>
3
  <name>Hps_Securesubmit</name>
4
+ <version>1.4.0</version>
5
  <stability>stable</stability>
6
+ <license uri="https://github.com/hps/heartland-magento-extension/blob/master/LICENSE">Custom</license>
7
  <channel>community</channel>
8
  <extends/>
9
  <summary>Take credit card payments and store cards in a PCI friendly way.</summary>
10
  <description>Use Heartland Payment Systems SecureSubmit platform to charge, authorize, void, refund and partial refund credit cards.&#xD;
11
  &#xD;
12
+ Allow customers to store their cards for reduced friction at next checkout using our multi-use card tokenization process which helps reduce PCI scope.</description>
13
+ <notes>Add: Consumer authentication (3DSecure)</notes>
14
  <authors><author><name>Heartland Payment Systems</name><user>markhagan</user><email>EntApp_DevPortal@e-hps.com</email></author></authors>
15
+ <date>2016-12-07</date>
16
+ <time>20:27:36</time>
17
+ <contents><target name="magecommunity"><dir name="Hps"><dir name="Securesubmit"><dir name="Block"><dir name="Adminhtml"><file name="Form.php" hash="ab296bcf9018c73690bb0f5ab381381d"/><dir name="Paypal"><dir name="Settlement"><dir name="Report"><dir name="Form"><file name="Form.php" hash="da5a943526a729a4e78def46c63d0109"/></dir><file name="Form.php" hash="ecc3101a2a399dc71ae544bbe7bb9595"/><file name="Grid.php" hash="35b62c9ab2fe5b5e9a9394e11167f50c"/></dir><file name="Report.php" hash="19171fb1fad872b0ebff9692de1415fd"/></dir></dir></dir><file name="Form.php" hash="aeb858ef86b0253dc542a90cbda2b6af"/><file name="Info.php" hash="f733311f2a666fdd481fb26f57f50b63"/><dir name="Masterpass"><dir name="Client"><file name="Js.php" hash="ed427387b93d2753d8e8ada51c0d8f37"/></dir><file name="Connect.php" hash="b5e362f21c219ec61c4df7dff561ace6"/><file name="Form.php" hash="6abc4c67143380fad13efec247a18af4"/><file name="Info.php" hash="b8f714200c8f74cd8a0a9547fafc3637"/><dir name="Review"><file name="Billing.php" hash="c5bc2f64c2dc30e8ca1458cd286a16ee"/><file name="Details.php" hash="c324f315b2dfda8263151612ec73f513"/><file name="Shipping.php" hash="aeb5f38aa185e9d3acbb7ce5d4c4b841"/></dir><file name="Review.php" hash="b6e4dbd308c44215e50fa94dd22a32b0"/></dir><dir name="Paypal"><dir name="Credit"><file name="Form.php" hash="68fc4811e8f2d9a1b502454533fe5bca"/></dir><file name="Form.php" hash="776d2aab11db7d212061ca9a30936af1"/><dir name="Incontext"><file name="Js.php" hash="d09bf9157c0b7c5f6dba16d8cdac557d"/></dir><file name="Info.php" hash="9c1948c538383376b1dc1b4c76c31e95"/><dir name="Review"><file name="Billing.php" hash="62a22e1f5bd65c4d9369b5794779ffe9"/><file name="Details.php" hash="57d97c8a2c3b7ddac7dc4cda43e4363f"/><file name="Shipping.php" hash="694374b68714b6d58d9af8b9fb15d502"/></dir><file name="Review.php" hash="87c8f3bf319799b33170bec9f42e2544"/><file name="Shortcut.php" hash="26f13ae7afac41ce88fb1cd4042b61b5"/></dir></dir><dir name="Helper"><dir name="Altpayment"><file name="Abstract.php" hash="5fc29e9d6355660415934426d0ee624e"/></dir><file name="Data.php" hash="35a26dab0e14154f2ee80a498f788d7c"/><file name="Jwt.php" hash="095f17eda9a1831cf5f97e8806b65202"/><file name="Masterpass.php" hash="69489b7cae8b99fe216f522b19f3d448"/><file name="Paypal.php" hash="74d1d0885349c432016bd04f3211c4c2"/></dir><dir name="Model"><dir name="Altpayment"><file name="Cart.php" hash="1dc83b97c44463e954efc8ee1c9e62b8"/></dir><file name="Masterpass.php" hash="063acd12e22bdc26d7591cbabf7e3005"/><file name="Payment.php" hash="31b2565f2b2d0803506a8af2364001dc"/><dir name="Paypal"><file name="Credit.php" hash="3548d6c4308df9d377cc1dd0d40f0f4d"/></dir><file name="Paypal.php" hash="c3eb2058ff6860e85a9310944c989301"/><file name="Report.php" hash="7f5e5bf0c652b37cf8c42eb553c8b3e0"/><dir name="Resource"><dir name="Report"><file name="Collection.php" hash="5870728a842922bbbff9c50173a90bd4"/></dir><file name="Report.php" hash="59598e2958a864119925c6e847b66121"/><file name="Setup.php" hash="8bdfbde89d786809d8aa2637efb1d2ae"/><dir name="Storedcard"><file name="Collection.php" hash="756c3c2d6dd5384f37847a028ac12fee"/></dir><file name="Storedcard.php" hash="d43320b704eb1e37c77a5ac20401c557"/></dir><file name="Session.php" hash="136b4146cea2f596847f0b838ec3f532"/><dir name="Source"><file name="Cctype.php" hash="d2dfff6147dc5c2748c7e9767b1fd1cb"/><file name="PaymentAction.php" hash="3c900b82e9af73a372d9f5f36bc1c264"/></dir><file name="Storedcard.php" hash="50897a56669c5938d4613579b603df93"/><dir name="System"><dir name="Config"><dir name="Backend"><file name="Proxy.php" hash="29ea9cb11927cd1e43055a42101eea36"/></dir></dir></dir></dir><dir name="controllers"><dir name="Adminhtml"><dir name="Hps"><dir name="Paypal"><file name="ReportsController.php" hash="914711bc008ec9e240918be7e77d1d54"/></dir></dir><file name="StoredcardController.php" hash="1e968134bf3b60a5f49544ddd1df8f03"/></dir><file name="GiftcardController.php" hash="dd15a7709121a3149fb30f77c385b18f"/><file name="MasterpassController.php" hash="2fb95214db3d3d017dd022743636ec50"/><file name="PaypalController.php" hash="962ce3dc3e738689d6ec6b122ed46001"/><file name="StoredcardController.php" hash="57116e86203df6f24a12fcd93186b534"/></dir><dir name="etc"><file name="adminhtml.xml" hash="8dc53c22d22cd633ebd6c06e7262c741"/><file name="config.xml" hash="4581a4347d7acdbb1cc482d090b29fdf"/><file name="system.xml" hash="657ee021e3b9bd9ceaae41328b16fe31"/></dir><dir name="sql"><dir name="hps_securesubmit_setup"><file name="install-1.0.0.php" hash="d424731dcb784aad59dad0bcce431375"/><file name="mysql4-upgrade-1.0.0-1.0.1.php" hash="510826261ea81ea6a09d4ea84c59d41d"/><file name="mysql4-upgrade-1.0.1-1.1.0.php" hash="01e948ea2939f9b0b69bb6748adc53f2"/><file name="mysql4-upgrade-1.1.0-1.2.0.php" hash="84cf1a359fc5a5600e1d98ba0089d911"/></dir></dir></dir></dir></target><target name="mageweb"><dir name="js"><dir name="securesubmit"><file name="admin-checkout.js" hash="14d970828f50bb463dc3f7cdaca97e1d"/><file name="checkout-form.js" hash="899cad514781c63fc6b6c1bf6e645494"/><dir name="masterpass"><file name="lightbox.js" hash="b534647c7c06b5ce90caf4cdd6166f91"/></dir><dir name="paypal"><file name="incontext.js" hash="e3810f12033fa9822db756a22622f799"/></dir><file name="secure.submit-1.0.1.js" hash="988d59dadbc272b869bc9e56cbd7518e"/></dir></dir></target><target name="magelib"><dir name="SecureSubmit"><file name="Hps.php" hash="c16cc4501127559a6b08594d14443e34"/><file name="LICENSE.txt" hash="de081f847a769f89be5a1f80862005ba"/><file name="PRIVACY.txt" hash="58cdc5fbbff24a84a838b0174b254f70"/><file name="README.md" hash="8320a396aa5544e61fe2e8f2adb09505"/><file name="index.php" hash="feabe5cc691b088d6ade3e04d6b120fc"/><dir name="src"><dir name="Abstractions"><file name="HpsAltPaymentServiceInterface.php" hash="ecd5ec9027af6c3998ac8cb9c5efe81a"/><file name="HpsBuilderAbstract.php" hash="6498e7b7e00716574a9dd238d1d7da5e"/><file name="HpsConfigInterface.php" hash="780f4506b58219cc706bd06ba7dce8af"/><file name="HpsGatewayServiceAbstract.php" hash="fab1e7552a4fa433328b35f7f2a78895"/><file name="HpsGatewayServiceInterface.php" hash="58a8c2e2dfe1b01382191ccd9ecc0d38"/><file name="HpsLoggerInterface.php" hash="94b90c78aa77c1a265a067486d98a769"/><file name="HpsPayPlanResourceAbstract.php" hash="f52b32fc7e2a6425b699050a3a2603a6"/><file name="HpsPayPlanResourceInterface.php" hash="22dd33e354f46218d2872eab956d57c1"/></dir><dir name="Entities"><dir name="AltPayment"><file name="HpsAltPaymentAddToBatch.php" hash="1684714c0cd14d6d33288a44f43c9dd6"/><file name="HpsAltPaymentAuth.php" hash="4f2748e2b95cffed6bd0e62f75af71eb"/><file name="HpsAltPaymentCapture.php" hash="51a86062c15c6f8de15147b5b53f89a4"/><file name="HpsAltPaymentCreateSession.php" hash="4e83acd11a03e7dfcf904f2421d858b3"/><file name="HpsAltPaymentResponse.php" hash="860336d2015560f889c41773574b97ab"/><file name="HpsAltPaymentReturn.php" hash="0b9d8cb0f67ddf113b99ca64ab6019a3"/><file name="HpsAltPaymentSale.php" hash="f390a9a4af50f7a8a863c607f7e3357f"/><file name="HpsAltPaymentSessionInfo.php" hash="3c50068d48634178a4259d789e1ddf1a"/><file name="HpsAltPaymentVoid.php" hash="429f0fbec31ae4842c494b0a8af47ddb"/><file name="HpsBuyerData.php" hash="4fd94d96a547378d2974fa386c89223f"/><file name="HpsCardinalMPIAddOrderNumberResponse.php" hash="a2f2c09eb9e7020e7af97819fe065dc3"/><file name="HpsCardinalMPIAuthenticateResponse.php" hash="6868b0bc55d8e3409684e795d1db92fc"/><file name="HpsCardinalMPIAuthorizeResponse.php" hash="566a64988246220b00da62078ae32068"/><file name="HpsCardinalMPIAuthresponseResponse.php" hash="a53fb4863feb909ccb0d2f2cc254562f"/><file name="HpsCardinalMPICaptureResponse.php" hash="29de876ce9bc632016fceab91dca22ac"/><file name="HpsCardinalMPILookupResponse.php" hash="7171aff90865b67db79559f7b2f579ba"/><file name="HpsCardinalMPIPreapprovalResponse.php" hash="e9408b385ca4f32de5f1adf96a36c42d"/><file name="HpsCardinalMPIRefundResponse.php" hash="71dbbff6f6383a19b0feb91f8771dbe5"/><file name="HpsCardinalMPIResponse.php" hash="d3729129967b1da049287e200e4d46e2"/><file name="HpsCardinalMPIVoidResponse.php" hash="2796de53634fccca806a4a4143779f81"/><file name="HpsLineItem.php" hash="4ff06a280975312365cf10a730636682"/><file name="HpsOrderData.php" hash="5d3ae0110d44f4786d4398861735a259"/><file name="HpsPaymentData.php" hash="2bd9ddc10ecdaebdbb5bf0e3cf71f642"/><file name="HpsShippingInfo.php" hash="63b621ebba4ae1711aca57073b0abec7"/></dir><dir name="Attachment"><file name="HpsAttachment.php" hash="2b65e1656a20e689258113edebef2839"/></dir><dir name="Batch"><file name="HpsBatch.php" hash="d9af4664e64172cb8edaeaa1ea7c7337"/></dir><dir name="Check"><file name="HpsCheck.php" hash="8fb85bd4d608e72a9690285ec46fa6d2"/><file name="HpsCheckHolder.php" hash="58f865b34faf2790fef26066de775a15"/><file name="HpsCheckResponse.php" hash="ff3c752bc85554424e62ed7efbc053f2"/><file name="HpsCheckResponseDetails.php" hash="28928ceb2dea574603a376aed1691a90"/></dir><dir name="Credit"><file name="HpsAccountVerify.php" hash="527a69e5a39153b764e6c14e0d98bf34"/><file name="HpsAuthorization.php" hash="7ec1bbfa6efa5bc48432b5de81eda314"/><file name="HpsCPCData.php" hash="f246c4aa1eec482ba84966c563aeb970"/><file name="HpsCPCEdit.php" hash="f04b0089485ba9e7eacba8e15815ec97"/><file name="HpsCardHolder.php" hash="ffee4609a3ffa886a386a12dea3f4508"/><file name="HpsCharge.php" hash="512fb9e459b336a9e256d8f1e08e36b9"/><file name="HpsChargeExceptions.php" hash="c7df102696a205a4c5689c48878ac5f3"/><file name="HpsCreditCard.php" hash="6aa3d449b0648997c4c532c1e3603cbb"/><file name="HpsManageTokensResponse.php" hash="47762f73bcda996033881861fcc7fb8a"/><file name="HpsOfflineAuthorization.php" hash="6f11736d36cfde0d9d79c94e92f60c8b"/><file name="HpsRecurringBilling.php" hash="9da8f9b16179729b77615f04993b05bf"/><file name="HpsRefund.php" hash="aa4664916ebb94b8f2066fd7c17b0fd4"/><file name="HpsReportTransactionDetails.php" hash="b2a92c5b66c4173ac4f98f7512bb1b62"/><file name="HpsReportTransactionSummary.php" hash="441b01c652db42213264980e6f693b40"/><file name="HpsReversal.php" hash="350191a2d38189ef8e098ed1f922c1d3"/><file name="HpsSecureEcommerce.php" hash="99fa819aa300477ef390c76fd04d0b69"/><file name="HpsVoid.php" hash="bf6216cea2f130789a045fc226c54cd0"/></dir><dir name="Debit"><file name="HpsDebitAddValue.php" hash="9053c701093889f864dd36af208f4f71"/><file name="HpsDebitReturn.php" hash="519cb73c6fc4ce716453d5ff94f437a0"/><file name="HpsDebitReversal.php" hash="223f6db72f0219ef25eb0f0adec4e9be"/><file name="HpsDebitSale.php" hash="74fa1e1425cfe6294146c879a4049aa8"/></dir><dir name="Fluent"><file name="HpsBuilderAction.php" hash="8649cc2c53fd961f350070193fedb5c6"/><file name="HpsUnknownPropertyException.php" hash="d019e8645fae6f984ad7b7ea3cebb546"/></dir><dir name="Gift"><file name="HpsGiftCard.php" hash="c8bad2a5336689e3192ea223a97760bf"/><file name="HpsGiftCardActivate.php" hash="097ac7c36cae11b8c40a3f1414518e49"/><file name="HpsGiftCardAddValue.php" hash="131a9d7cbc711a4e3e85c66049028f30"/><file name="HpsGiftCardAlias.php" hash="133d2d4701c5aa88fa0eece6ee69de06"/><file name="HpsGiftCardBalance.php" hash="9b9fe395d218c79c55faf28fd736b431"/><file name="HpsGiftCardDeactivate.php" hash="323ca5a67c6ff0169925192952881db5"/><file name="HpsGiftCardReplace.php" hash="f122a7d924a56fcc406bc8b1c82ac2b2"/><file name="HpsGiftCardReversal.php" hash="88ba755e52f41311206add4fa8ee5e09"/><file name="HpsGiftCardReward.php" hash="f758e8c5462d336236ae0d257789cdaf"/><file name="HpsGiftCardSale.php" hash="0f758ef6653215be643abaea4964352a"/><file name="HpsGiftCardVoid.php" hash="f0294740f5b7f545167d5fb258f4dcdd"/></dir><file name="HpsAddress.php" hash="8de2c8ea4a2b0a440d1b4bc0bf8321b8"/><file name="HpsConsumer.php" hash="1254142dfa0821cbb0bf154cf51f34d2"/><file name="HpsDirectMarketData.php" hash="1925c204d19cb9233ec8178e3b5cdc50"/><file name="HpsEncryptionData.php" hash="1e4845abc6c42e8f0265e2679b05efb6"/><file name="HpsTokenData.php" hash="c1d795a70b9082397dde41a8cc317ef0"/><file name="HpsTrackData.php" hash="4656f37b7c4c777d0c63b4102efe5a1a"/><file name="HpsTransaction.php" hash="e44e54a5a1ef736b0e63a76085deac75"/><file name="HpsTransactionDetails.php" hash="4e77261d0aced118b49e26ef786beace"/><file name="HpsTransactionHeader.php" hash="ebd21539f84425f0e2fc57c6049a26a1"/><file name="HpsTransactionStatus.php" hash="a5a67f8fe3780f66b045cc4314660dc5"/><dir name="PayPlan"><file name="HpsPayPlanAmount.php" hash="25706476e264124567d704f981745b13"/><file name="HpsPayPlanCustomer.php" hash="2714a7525fb3830fc018544ea0622ab5"/><file name="HpsPayPlanPaymentMethod.php" hash="fd3077d63e6f31c2d8a4c60c78a678ea"/><file name="HpsPayPlanSchedule.php" hash="889ff67177e343b37df11b3490822c72"/></dir><file name="index.php" hash="ce407ff5715c837d02b1aba7975bf512"/><file name=".DS_Store" hash="92d42bd310aa7f6dd74d14e6cdd2b9e9"/></dir><dir name="Infrastructure"><dir name="Enums"><file name="HpsACHType.php" hash="1ff5593689a404cb0179c2b5cb5fe19e"/><file name="HpsAccountType.php" hash="760d91e120f443c326e6c7586aa61092"/><file name="HpsAttachmentType.php" hash="0447e22804438c0235c273a880dd5cdd"/><file name="HpsCardBrand.php" hash="9532bb7c40811c114a1eeeffa8b9732c"/><file name="HpsCentinelCheckoutType.php" hash="7370920cb980bbfc54c741a981cd79bb"/><file name="HpsCheckType.php" hash="d60c676d93c8ada169deb14ddc8e64e7"/><file name="HpsDataEntryMode.php" hash="c323d884a7a305f9af647ea1d9a4177e"/><file name="HpsExceptionCodes.php" hash="65feb7be80853e0de9994037c9ffb834"/><file name="HpsGiftCardAliasAction.php" hash="ebcb27c6fb800e17693ed4af2e8a8943"/><file name="HpsItemChoiceTypePosResponseVer10Transaction.php" hash="686225a07738db2233a2228bec6baabf"/><file name="HpsPayPlanAccountType.php" hash="4d383c42a990fb077fae49386c08b870"/><file name="HpsPayPlanCustomerStatus.php" hash="3ff092e8dd97f2a2474fb64103cb238f"/><file name="HpsPayPlanPaymentMethodStatus.php" hash="b020c52de7987ed3011cb97e4d440c6a"/><file name="HpsPayPlanPaymentMethodType.php" hash="1f77c5c8528815f05803c1381cb4151a"/><file name="HpsPayPlanScheduleDuration.php" hash="05101e6fe3b725b43917b59770f2dbb1"/><file name="HpsPayPlanScheduleFrequency.php" hash="0b3f029c64315ee9c8701d23319941c1"/><file name="HpsPayPlanScheduleStatus.php" hash="3579b52ccf36e576fd2dfb36118716f6"/><file name="HpsSECCode.php" hash="551661613c127c068f139083338b92d1"/><file name="HpsTaxType.php" hash="ba0e05330880810e58370f2f3490ca81"/><file name="HpsTrackDataMethod.php" hash="446069e9786f9585c3490140b29ae52f"/><file name="HpsTransactionType.php" hash="a38b3f4c654a4fa3b2c2d64b8afacf24"/></dir><file name="HpsApiConnectionException.php" hash="ac5a8064a7c2a1616035a5702f36cd50"/><file name="HpsArgumentException.php" hash="855c43e88fc24b582cfe56875d7cff42"/><file name="HpsAuthenticationException.php" hash="ddfb78554d130dfa8c1d00418917f440"/><file name="HpsCheckException.php" hash="13f8764a73dbdc8b5ac4fa092d6f6790"/><file name="HpsConfiguration.php" hash="010996727d89c485c1d11463e5c53a8e"/><file name="HpsCreditException.php" hash="a16bf1ecd6a2c866b7b40351aab3df34"/><file name="HpsCreditExceptionDetails.php" hash="d71c54b2846283a8f97aae74a747dfd9"/><file name="HpsEmptyLogger.php" hash="c670a657abbe119467aee7bf58b7cb15"/><file name="HpsException.php" hash="e5757d0744e7bd1b8c0d2a17dc655267"/><file name="HpsGatewayException.php" hash="e8a5285067fe02528d9fb63fd205e3a3"/><file name="HpsGatewayExceptionDetails.php" hash="16dd36360e2237ca89e056c61766bcdd"/><file name="HpsInvalidRequestException.php" hash="d8205e32059164e0aead66bd90cb1784"/><file name="HpsLogger.php" hash="420c2fc7a2d48b05ebd6a659a60ef867"/><file name="HpsProcessorError.php" hash="ff7f1f2c5327417b4997f9e36fa7c887"/><file name="HpsProcessorException.php" hash="ba28a92f0e551053506dcc391c5bc431"/><file name="HpsProcessorExceptionDetails.php" hash="6a569aacf045c19ade6472a857a3a274"/><dir name="Validation"><file name="HpsGatewayResponseValidation.php" hash="92a6983b38d6127ffefe8157a774c47a"/><file name="HpsInputValidation.php" hash="2f3b9ddeedd641b6112a8d49cd538663"/><file name="HpsIssuerResponseValidation.php" hash="af9f575a0034685a7cef77f7cbe99342"/><file name="HpsProcessorResponseValidation.php" hash="ff19a569f8bdd6ef7b58a460cf06b4e8"/></dir><file name="index.php" hash="ce407ff5715c837d02b1aba7975bf512"/></dir><dir name="Services"><dir name="Fluent"><dir name="Gateway"><dir name="Check"><file name="HpsCheckServiceOverrideBuilder.php" hash="5b4a49a897f87d2a332182a1ccd67d0c"/><file name="HpsCheckServiceRecurringBuilder.php" hash="c86a2fd5165a65c78e38e3bbb1b9636c"/><file name="HpsCheckServiceReturnBuilder.php" hash="5ce46356468714f65ad827e1593977cc"/><file name="HpsCheckServiceSaleBuilder.php" hash="b823e74642e165772f5cb03beffacce7"/><file name="HpsCheckServiceVoidBuilder.php" hash="17305b04474285a8b64007c549180ba5"/></dir><dir name="Credit"><file name="HpsCreditServiceAuthorizeBuilder.php" hash="e640918f2a07d7217a601b5d01d4803e"/><file name="HpsCreditServiceCaptureBuilder.php" hash="fd6512f3b72f9051eaf7c3daeff2cb48"/><file name="HpsCreditServiceChargeBuilder.php" hash="8162a151298c67322d79f4d6514ac73b"/><file name="HpsCreditServiceCpcEditBuilder.php" hash="7401c33a56c5a3c6a23f5f70101a4926"/><file name="HpsCreditServiceEditBuilder.php" hash="cdcf661c4182625212ec724b52eb8491"/><file name="HpsCreditServiceGetBuilder.php" hash="05b0cafe715a4d3ceb3c88b99b0c8dc1"/><file name="HpsCreditServiceListTransactionsBuilder.php" hash="a7765dfadc8e21177cc453a1e7dfd715"/><file name="HpsCreditServiceOfflineAuthBuilder.php" hash="d86d2425c6bbf28854a31d09a9f802b8"/><file name="HpsCreditServiceOfflineChargeBuilder.php" hash="0ee9ecf6b499a16f01fa2a7b94af00ca"/><file name="HpsCreditServicePrepaidAddValueBuilder.php" hash="86b2cc263fb9b9646e756796d4db2f3e"/><file name="HpsCreditServicePrepaidBalanceInquiryBuilder.php" hash="c1af37b0b03758cd80efb2ac74082984"/><file name="HpsCreditServiceRecurringBuilder.php" hash="50a4e26c4e4eef5c7a83a98741009b5e"/><file name="HpsCreditServiceRefundBuilder.php" hash="4d5ab9c2a11c18a47e416bd90dffc5e8"/><file name="HpsCreditServiceReverseBuilder.php" hash="7960e9efa00ceb0d0c5368715c07d424"/><file name="HpsCreditServiceUpdateTokenExpirationBuilder.php" hash="7aa2531c6ca4d8ab9ce8a04fcfa2060a"/><file name="HpsCreditServiceVerifyBuilder.php" hash="62027b344ee5444ccd1534358a405857"/><file name="HpsCreditServiceVoidBuilder.php" hash="0029756571343a1d8c6380874f6f5b6b"/></dir><dir name="Debit"><file name="HpsDebitServiceAddValueBuilder.php" hash="5f972b68a5afa062cbf911bfb3a946bc"/><file name="HpsDebitServiceChargeBuilder.php" hash="26aafce2a87bbbd8231a039209c49657"/><file name="HpsDebitServiceReturnBuilder.php" hash="2e11267e12bdd338b953db352a373961"/><file name="HpsDebitServiceReverseBuilder.php" hash="b088431d3ba0726d44cc418e92267958"/></dir><dir name="GiftCard"><file name="HpsGiftCardServiceActivateBuilder.php" hash="65e3ebd1c6ded3860b238d03e542fe3b"/><file name="HpsGiftCardServiceAddValueBuilder.php" hash="432582c9fd6617c86b373f5fe0b14fb1"/><file name="HpsGiftCardServiceAliasBuilder.php" hash="1b096debfa6678af2d6ddecfa82a638e"/><file name="HpsGiftCardServiceBalanceBuilder.php" hash="6bebaac04d059204a2408d693f77c449"/><file name="HpsGiftCardServiceDeactivateBuilder.php" hash="92b16b331414c40ea11de330bd447273"/><file name="HpsGiftCardServiceReplaceBuilder.php" hash="063e6b33a673c23553047a6f72927b2a"/><file name="HpsGiftCardServiceReverseBuilder.php" hash="2f7b96b1f9608cb7e3526ecb9b15558f"/><file name="HpsGiftCardServiceRewardBuilder.php" hash="242fbe42ab731b138e4d74be4cde4e9a"/><file name="HpsGiftCardServiceSaleBuilder.php" hash="8af2977da26e3707e42569ad7bf4c4a5"/><file name="HpsGiftCardServiceVoidBuilder.php" hash="fff556a586bb09d22f521a90d30fb809"/></dir><file name="HpsFluentCheckService.php" hash="e89511e006e914bdd4daf6765a49e97b"/><file name="HpsFluentCreditService.php" hash="9d1a39abb596ed14a4e7a1e58a2015b3"/><file name="HpsFluentDebitService.php" hash="63e86fe32a92c80cc5bd163283da6c64"/><file name="HpsFluentGiftCardService.php" hash="53697a755fc90256b940c74282693b0d"/></dir></dir><dir name="Gateway"><dir name="AltPayment"><file name="HpsAltPaymentService.php" hash="18ccfae5ce40a88296f55969d31373ad"/><file name="HpsMasterPassService.php" hash="8cb56ffc62b91c4fdb14037515d3a10c"/><file name="HpsPayPalService.php" hash="c91eebb0eca8bdda2505b78c4746db28"/></dir><file name="HpsAttachmentService.php" hash="884cdaa820b99bcb5dfd7cb950c13b25"/><file name="HpsBatchService.php" hash="2a4c11a4f7c78ec1e3b461b3803826c5"/><file name="HpsCentinelGatewayService.php" hash="40300a57982ccd5325b7bd0986a8bcc4"/><file name="HpsCheckService.php" hash="17eac57a5f3a6f24e31000325ad9ac1d"/><file name="HpsCreditService.php" hash="ba6213fbc7babefc8206e992a3f68407"/><file name="HpsDebitService.php" hash="0ea76c01b3c817fcaea876bff28681b3"/><file name="HpsGiftCardService.php" hash="e1deb113c685845e2af2bb0ff793ea4d"/><file name="HpsPayPlanService.php" hash="ce5d2c003e72be8328634d92ab8ae6eb"/><file name="HpsRestGatewayService.php" hash="42f7053d3ba9f9b1f87cf9aac70d77a5"/><file name="HpsSoapGatewayService.php" hash="c2f52eb5f0f9e63f4eb2ae87dd94770b"/><file name="HpsTokenService.php" hash="b1dad4289201b399f89ad1d29a799d39"/><dir name="PayPlan"><file name="HpsPayPlanCustomerService.php" hash="cda074fca2230c26919a813cc2d71b5c"/><file name="HpsPayPlanPaymentMethodService.php" hash="61dd42308d203251f4483d68561c191b"/><file name="HpsPayPlanScheduleService.php" hash="e9afcd7adba7847ee5ad71f1f57249c1"/></dir></dir><file name="HpsCentinelConfig.php" hash="0f714106eb4fc4c2eb95c3fb27898018"/><file name="HpsServicesConfig.php" hash="bdc301430767bf25a4333dcdf6772aaa"/><file name="index.php" hash="ce407ff5715c837d02b1aba7975bf512"/></dir><file name="index.php" hash="ce407ff5715c837d02b1aba7975bf512"/><file name=".DS_Store" hash="fb4d06cbd65ab29860d86984919afa4a"/></dir></dir></target><target name="magedesign"><dir name="adminhtml"><dir name="default"><dir name="default"><dir name="layout"><file name="securesubmit.xml" hash="cc04e952cc17ea3462931a9e7a655316"/></dir><dir name="template"><dir name="securesubmit"><file name="form.phtml" hash="67a460ca8f034f4bfe3fbb8e7845f37f"/></dir></dir></dir></dir></dir><dir name="frontend"><dir name="base"><dir name="default"><dir name="layout"><file name="securesubmit.xml" hash="410fda5ef3920f893f5a17ec379aa2da"/></dir><dir name="template"><dir name="securesubmit"><file name="form.phtml" hash="d2d68ae07e97339ce760e012de3cee95"/><dir name="masterpass"><file name="connect.phtml" hash="b5f47624447a44958ce4fa004c58c319"/><file name="form.phtml" hash="039d6a174ac24c45ece0d14b92b6c9c4"/><file name="js.phtml" hash="274e871b2d8270e3224b9ce12794c2c5"/><file name="mark.phtml" hash="fe27b341b5fb034e90ac35c92ef998d4"/><dir name="review"><file name="details.phtml" hash="0dc5e1201e7e424f089c15fc83a1c70f"/><dir name="shipping"><file name="method.phtml" hash="cc426553636aa08840bee1c4778d89e4"/></dir></dir><file name="review.phtml" hash="cfc643de65b962ba27306587357f45d3"/></dir><dir name="paypal"><dir name="incontext"><file name="js.phtml" hash="16b4ad23ea05464a55bb0390cd72e248"/><file name="payment.phtml" hash="b32d269057984f656422609015dd7d91"/></dir><dir name="review"><file name="details.phtml" hash="0dc5e1201e7e424f089c15fc83a1c70f"/><dir name="shipping"><file name="method.phtml" hash="cc426553636aa08840bee1c4778d89e4"/></dir></dir><file name="review.phtml" hash="cfc643de65b962ba27306587357f45d3"/><file name="shortcut.phtml" hash="268bfac86e653ec5981cd201075f4105"/></dir><file name="storedcards.phtml" hash="d083493f42af257cdb1949a8cbd8855b"/></dir></dir></dir></dir></dir></target><target name="mageetc"><dir name="modules"><file name="Hps_Securesubmit.xml" hash="d5aed3f48a45f8e611b68d1e6f34c959"/></dir></target><target name="mageskin"><dir name="frontend"><dir name="base"><dir name="default"><dir name="securesubmit"><dir name="css"><file name="hps-styles.css" hash="054fefd2b23342565da4a4b0d977fdb7"/></dir><dir name="images"><file name="ajax-loader.gif" hash="f48ee069890b16455c3ddcacee9b5f75"/><file name="arrow@2x.png" hash="ecc6766f32ae007e48f1cac2cefae87b"/><file name="bg_x.png" hash="c321c67f6929326129426c9e83207ea3"/><file name="cvv1.png" hash="0cba150037737255b0b750fd8b7aa3a8"/><file name="delete-hover.svg" hash="b50f601a53505660e093c126a84773b2"/><file name="delete.png" hash="0797e40a65fe0cf10252e788f40bee50"/><file name="delete.svg" hash="0793be8c20ffb397cc933d6c6de4df75"/><file name="heartland-logo.png" hash="0a15c70514f1449af4a98931b62d6844"/><file name="heartland-logo@1x.png" hash="d1982d3c613fee22120b06494aa92bfa"/><file name="heartland-logo@2x.png" hash="24daf8c6f920ed7b9c5aad79143f76b5"/><file name="icon_sprite.png" hash="e15f0103ef5ebe3baf48960bb9ccfaab"/><file name="icon_sprite@2x.png" hash="156b591cc9464429bc3b614cbbe636fd"/><file name="ss-input-amex@2x.png" hash="3a0311a7ae08337686031ee12d428b7b"/><file name="ss-inputcard-amex@2x.png" hash="a20df89111cf94aa5d653f44bf7e8cc8"/><file name="ss-inputcard-blank@2x.png" hash="1f84a3d28f8604a0ae1f019d10325c51"/><file name="ss-inputcard-discover@2x.png" hash="c17c70f6dc3908b1c066d0c0aa53a9bc"/><file name="ss-inputcard-jcb@2x.png" hash="bc353bc2e57fe2e2b689b69ce1826389"/><file name="ss-inputcard-mastercard@2x.png" hash="48cae147cae1ef0121e090df928632c0"/><file name="ss-inputcard-visa@2x.png" hash="c8bd7bf3aa1fff3226b5ce571ddefa42"/><file name="ss-lock.png" hash="430fbebc08387bcb43fed60ba14e5da1"/><file name="ss-lock@2x.png" hash="2772a5c4b0e7d622cb8773fd575108d2"/><file name="ss-logo.png" hash="a6e2017f773c3ebd82318cb5417a09dd"/><file name="ss-saved-amex@2x.png" hash="7aff4d28b217bceeb2d1fe139998e980"/><file name="ss-saved-discover@2x.png" hash="f5b5e76e49f3e02b677117068cd1d3fa"/><file name="ss-saved-jcb@2x.png" hash="58923ad29390b36556e61de061417fc8"/><file name="ss-saved-mastercard@2x.png" hash="19d69c364291adf7e87355fbe79ebd38"/><file name="ss-saved-visa@2x.png" hash="c3d935832dfcde4dba793e91665315b7"/><file name="ss-shield@1x.png" hash="473a87521ec93d14c906cd2415833f33"/><file name="ss-shield@2x.png" hash="ceada08d149bd9c2d63706e67eb7b1e9"/><file name=".DS_Store" hash="194577a7e20bdcc7afbb718f502c134c"/></dir></dir></dir></dir></dir></target></contents>
18
  <compatible/>
19
  <dependencies><required><php><min>5.2.0</min><max>5.6.28</max></php></required></dependencies>
20
  </package>