Gene_Braintree - Version 1.0.2

Version Notes

Connect your Magento store to Braintree to accept Credit Cards & PayPal using V.Zero SDK

Download this release

Release Info

Developer Dave Macaulay
Extension Gene_Braintree
Version 1.0.2
Comparing to
See all releases


Code changes from version 1.0.1 to 1.0.2

app/code/community/Gene/Braintree/Block/Creditcard/Info.php CHANGED
@@ -28,7 +28,13 @@ class Gene_Braintree_Block_Creditcard_Info extends Mage_Payment_Block_Info
28
  return Mage::registry('current_order');
29
  } else if(Mage::registry('current_invoice')) {
30
  return Mage::registry('current_invoice')->getOrder();
 
 
 
 
31
  }
 
 
32
  }
33
 
34
  /**
@@ -55,16 +61,20 @@ class Gene_Braintree_Block_Creditcard_Info extends Mage_Payment_Block_Info
55
  // Transaction ID won't matter for customers
56
  $data[$this->__('Braintree Transaction ID')] = $this->getInfo()->getLastTransId();
57
 
58
- // Add in the current status
59
- try {
60
- $transaction = Mage::getModel('gene_braintree/wrapper_braintree')->init($this->getOrder()->getStoreId())->findTransaction($this->getInfo()->getLastTransId());
61
- if ($transaction) {
62
- $data[$this->__('Status')] = $this->convertStatus($transaction->status);
63
- } else {
64
- $data[$this->__('Status')] = $this->__('<span style="color:red;"><strong>Warning:</strong> Cannot load payment in Braintree.</span>');
 
 
 
 
 
 
65
  }
66
- } catch (Exception $e) {
67
- $data[$this->__('Status')] = $this->__('<span style="color:red;"><strong>Warning:</strong> Unable to connect to Braintree to load transaction.</span>');
68
  }
69
 
70
  // What additional information should we show
28
  return Mage::registry('current_order');
29
  } else if(Mage::registry('current_invoice')) {
30
  return Mage::registry('current_invoice')->getOrder();
31
+ } else if(Mage::registry('current_shipment')) {
32
+ return Mage::registry('current_shipment')->getOrder();
33
+ } else if(Mage::registry('current_creditmemo')) {
34
+ return Mage::registry('current_creditmemo')->getOrder();
35
  }
36
+
37
+ return false;
38
  }
39
 
40
  /**
61
  // Transaction ID won't matter for customers
62
  $data[$this->__('Braintree Transaction ID')] = $this->getInfo()->getLastTransId();
63
 
64
+ // Only display transaction if we can load the order
65
+ if($this->getOrder()) {
66
+
67
+ // Add in the current status
68
+ try {
69
+ $transaction = Mage::getModel('gene_braintree/wrapper_braintree')->init($this->getOrder()->getStoreId())->findTransaction($this->getInfo()->getLastTransId());
70
+ if ($transaction) {
71
+ $data[$this->__('Status')] = $this->convertStatus($transaction->status);
72
+ } else {
73
+ $data[$this->__('Status')] = $this->__('<span style="color:red;"><strong>Warning:</strong> Cannot load payment in Braintree.</span>');
74
+ }
75
+ } catch (Exception $e) {
76
+ $data[$this->__('Status')] = $this->__('<span style="color:red;"><strong>Warning:</strong> Unable to connect to Braintree to load transaction.</span>');
77
  }
 
 
78
  }
79
 
80
  // What additional information should we show
app/code/community/Gene/Braintree/Block/Creditcard/Threedsecure.php CHANGED
@@ -15,9 +15,9 @@ class Gene_Braintree_Block_Creditcard_Threedsecure extends Mage_Core_Block_Templ
15
  protected function _toHtml()
16
  {
17
  // Check the payment method is active
18
- if (Mage::getModel('gene_braintree/paymentmethod_creditcard')->isAvailable()
19
- && Mage::getModel('gene_braintree/paymentmethod_creditcard')->is3DEnabled()
20
- ) {
21
  return parent::_toHtml();
22
  }
23
 
15
  protected function _toHtml()
16
  {
17
  // Check the payment method is active
18
+ if (Mage::getSingleton('gene_braintree/paymentmethod_creditcard')->isAvailable()) {
19
+
20
+ // Due to the introduction of the 3Ds threshold we need this block to always be present
21
  return parent::_toHtml();
22
  }
23
 
app/code/community/Gene/Braintree/Block/Js.php CHANGED
@@ -52,16 +52,11 @@ class Gene_Braintree_Block_Js extends Mage_Core_Block_Template
52
  /**
53
  * is 3D secure enabled?
54
  *
55
- * @return int
56
  */
57
  protected function is3DEnabled()
58
  {
59
- // Return an int
60
- if(Mage::getModel('gene_braintree/paymentmethod_creditcard')->is3DEnabled()) {
61
- return 1;
62
- } else {
63
- return 0;
64
- }
65
  }
66
 
67
  /**
52
  /**
53
  * is 3D secure enabled?
54
  *
55
+ * @return string
56
  */
57
  protected function is3DEnabled()
58
  {
59
+ return var_export(Mage::getModel('gene_braintree/paymentmethod_creditcard')->is3DEnabled(), true);
 
 
 
 
 
60
  }
61
 
62
  /**
app/code/community/Gene/Braintree/Model/Paymentmethod/Abstract.php CHANGED
@@ -7,6 +7,11 @@
7
  */
8
  abstract class Gene_Braintree_Model_Paymentmethod_Abstract extends Mage_Payment_Model_Method_Abstract
9
  {
 
 
 
 
 
10
 
11
  /**
12
  * Verify that the module has been setup
@@ -72,4 +77,33 @@ abstract class Gene_Braintree_Model_Paymentmethod_Abstract extends Mage_Payment_
72
  return $this->_getConfig('use_vault');
73
  }
74
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
75
  }
7
  */
8
  abstract class Gene_Braintree_Model_Paymentmethod_Abstract extends Mage_Payment_Model_Method_Abstract
9
  {
10
+ /**
11
+ * The decision responses from braintree
12
+ */
13
+ const ADVANCED_FRAUD_REVIEW = 'Review';
14
+ const ADVANCED_FRAUD_DECLINE = 'Decline';
15
 
16
  /**
17
  * Verify that the module has been setup
77
  return $this->_getConfig('use_vault');
78
  }
79
 
80
+ /**
81
+ * Handle any risk decision returned from Braintree
82
+ *
83
+ * @param $result
84
+ * @param \Varien_Object $payment
85
+ *
86
+ * @return $this
87
+ */
88
+ protected function handleFraud($result, Varien_Object $payment)
89
+ {
90
+ // Verify we have risk data
91
+ if(isset($result->transaction) && isset($result->transaction->riskData) && isset($result->transaction->riskData->decision)) {
92
+
93
+ // If the decision is to review the payment mark the payment as such
94
+ if($result->transaction->riskData->decision == self::ADVANCED_FRAUD_REVIEW || $result->transaction->riskData->decision == self::ADVANCED_FRAUD_DECLINE) {
95
+
96
+ // Mark the payment as pending
97
+ $payment->setIsTransactionPending(true);
98
+
99
+ // If the payment got marked as fraud/decline, we mark it as fraud
100
+ if($result->transaction->riskData->decision == self::ADVANCED_FRAUD_DECLINE) {
101
+ $payment->setIsFraudDetected(true);
102
+ }
103
+ }
104
+ }
105
+
106
+ return $this;
107
+ }
108
+
109
  }
app/code/community/Gene/Braintree/Model/Paymentmethod/Creditcard.php CHANGED
@@ -68,9 +68,23 @@ class Gene_Braintree_Model_Paymentmethod_Creditcard extends Gene_Braintree_Model
68
  return false;
69
  }
70
 
 
71
  if($this->_getConfig('threedsecure')) {
 
 
 
 
 
 
 
 
 
 
 
 
72
  return true;
73
  }
 
74
  return false;
75
  }
76
 
@@ -224,6 +238,13 @@ class Gene_Braintree_Model_Paymentmethod_Creditcard extends Gene_Braintree_Model
224
  // Log the initial sale array, no protected data is included
225
  Gene_Braintree_Model_Debug::log(array('_authorize:result' => $result));
226
 
 
 
 
 
 
 
 
227
  // If the sale has failed
228
  if ($result->success != true) {
229
 
@@ -231,30 +252,30 @@ class Gene_Braintree_Model_Paymentmethod_Creditcard extends Gene_Braintree_Model
231
  Mage::dispatchEvent('gene_braintree_creditcard_failed', array('payment' => $payment, 'result' => $result));
232
 
233
  // Return a different message for declined cards
234
- if(isset($result->transaction->status) && $result->transaction->status == Braintree_Transaction::PROCESSOR_DECLINED) {
235
- Mage::throwException($this->_getHelper()->__('Your transaction has been declined, please try another payment method or contacting your issuing bank.'));
236
- }
237
 
238
- Mage::throwException($this->_getHelper()->__('%s. Please try again or attempt refreshing the page.', $result->message));
239
- }
240
 
241
- // If 3D is enabled and the transaction gets a rejection reason
242
- if($this->is3DEnabled()) {
243
 
244
- // Check the rejection reason
245
- if (isset($result->transaction) && $result->transaction->gatewayRejectionReason == Braintree_Transaction::THREE_D_SECURE) {
 
 
246
 
247
- // An event for when 3D secure fails
248
- Mage::dispatchEvent('gene_braintree_creditcard_failed_threed', array('payment' => $payment, 'result' => $result));
249
 
250
- // Log it
251
- Gene_Braintree_Model_Debug::log('Transaction failed with 3D secure');
252
 
253
- // Politely inform the user
254
- Mage::throwException(
255
- $this->_getHelper()->__('Your 3D secure verification has failed, please try using another card, or payment method.')
256
- );
257
  }
 
 
258
  }
259
 
260
  $this->_processSuccessResult($payment, $result, $amount);
@@ -353,6 +374,9 @@ class Gene_Braintree_Model_Paymentmethod_Creditcard extends Gene_Braintree_Model
353
  'threeDSecure'
354
  );
355
 
 
 
 
356
  // If 3D secure is enabled, presume it's passed
357
  if($this->is3DEnabled()) {
358
  $additionalInfo['threeDSecure'] = Mage::helper('gene_braintree')->__('Passed');
68
  return false;
69
  }
70
 
71
+ // Is 3Ds enabled within the configuration?
72
  if($this->_getConfig('threedsecure')) {
73
+
74
+ // Do we have a requirement on the threshold
75
+ if($this->_getConfig('threedsecure_threshold') > 0) {
76
+
77
+ // Check to see if the base grand total is bigger then the threshold
78
+ if(Mage::getSingleton('checkout/cart')->getQuote()->collectTotals()->getBaseGrandTotal() > $this->_getConfig('threedsecure_threshold')) {
79
+ return true;
80
+ }
81
+
82
+ return false;
83
+ }
84
+
85
  return true;
86
  }
87
+
88
  return false;
89
  }
90
 
238
  // Log the initial sale array, no protected data is included
239
  Gene_Braintree_Model_Debug::log(array('_authorize:result' => $result));
240
 
241
+ // If the transaction was 3Ds but doesn't contain a 3Ds response
242
+ if(($this->is3DEnabled() && isset($saleArray['options']['three_d_secure']['required']) && $saleArray['options']['three_d_secure']['required'] == true) && (!isset($result->transaction->threeDSecureInfo) || (isset($result->transaction->threeDSecureInfo) && is_null($result->transaction->threeDSecureInfo)))) {
243
+
244
+ // Inform the user that their payment didn't go through 3Ds and thus failed
245
+ Mage::throwException($this->_getHelper()->__('This transaction must be passed through 3D secure, please try again or consider using an alternate payment method.'));
246
+ }
247
+
248
  // If the sale has failed
249
  if ($result->success != true) {
250
 
252
  Mage::dispatchEvent('gene_braintree_creditcard_failed', array('payment' => $payment, 'result' => $result));
253
 
254
  // Return a different message for declined cards
255
+ if(isset($result->transaction->status)) {
 
 
256
 
257
+ // Return a custom response for processor declined messages
258
+ if($result->transaction->status == Braintree_Transaction::PROCESSOR_DECLINED) {
259
 
260
+ Mage::throwException($this->_getHelper()->__('Your transaction has been declined, please try another payment method or contacting your issuing bank.'));
 
261
 
262
+ } else if($result->transaction->status == Braintree_Transaction::GATEWAY_REJECTED
263
+ && isset($result->transaction->gatewayRejectionReason)
264
+ && $result->transaction->gatewayRejectionReason == Braintree_Transaction::THREE_D_SECURE)
265
+ {
266
 
267
+ // An event for when 3D secure fails
268
+ Mage::dispatchEvent('gene_braintree_creditcard_failed_threed', array('payment' => $payment, 'result' => $result));
269
 
270
+ // Log it
271
+ Gene_Braintree_Model_Debug::log('Transaction failed with 3D secure');
272
 
273
+ // Politely inform the user
274
+ Mage::throwException($this->_getHelper()->__('Your card has failed 3D secure validation, please try again or consider using an alternate payment method.'));
275
+ }
 
276
  }
277
+
278
+ Mage::throwException($this->_getHelper()->__('%s. Please try again or attempt refreshing the page.', $result->message));
279
  }
280
 
281
  $this->_processSuccessResult($payment, $result, $amount);
374
  'threeDSecure'
375
  );
376
 
377
+ // Handle any fraud response from Braintree
378
+ $this->handleFraud($result, $payment);
379
+
380
  // If 3D secure is enabled, presume it's passed
381
  if($this->is3DEnabled()) {
382
  $additionalInfo['threeDSecure'] = Mage::helper('gene_braintree')->__('Passed');
app/code/community/Gene/Braintree/Model/Paymentmethod/Paypal.php CHANGED
@@ -196,6 +196,9 @@ class Gene_Braintree_Model_Paymentmethod_Paypal extends Gene_Braintree_Model_Pay
196
  )
197
  );
198
 
 
 
 
199
  // Store the PayPal token if we have one
200
  if (isset($result->transaction->paypal['token']) && !empty($result->transaction->paypal['token'])) {
201
  $payment->setAdditionalInformation('token', $result->transaction->paypal['token']);
196
  )
197
  );
198
 
199
+ // Handle any fraud response from Braintree
200
+ $this->handleFraud($result, $payment);
201
+
202
  // Store the PayPal token if we have one
203
  if (isset($result->transaction->paypal['token']) && !empty($result->transaction->paypal['token'])) {
204
  $payment->setAdditionalInformation('token', $result->transaction->paypal['token']);
app/code/community/Gene/Braintree/Model/System/Config/Backend/Currency.php CHANGED
@@ -15,7 +15,7 @@ class Gene_Braintree_Model_System_Config_Backend_Currency extends Mage_Core_Mode
15
  {
16
  if (!is_array($this->getValue())) {
17
  $value = $this->getValue();
18
- $this->setValue(empty($value) ? false : json_decode($value));
19
  }
20
  }
21
 
@@ -25,7 +25,7 @@ class Gene_Braintree_Model_System_Config_Backend_Currency extends Mage_Core_Mode
25
  protected function _beforeSave()
26
  {
27
  if (is_array($this->getValue())) {
28
- $this->setValue(json_encode($this->getValue()));
29
  }
30
  }
31
 
15
  {
16
  if (!is_array($this->getValue())) {
17
  $value = $this->getValue();
18
+ $this->setValue(empty($value) ? false : Mage::helper('core')->jsonDecode($value, Zend_Json::TYPE_OBJECT));
19
  }
20
  }
21
 
25
  protected function _beforeSave()
26
  {
27
  if (is_array($this->getValue())) {
28
+ $this->setValue(Mage::helper('core')->jsonEncode($this->getValue()));
29
  }
30
  }
31
 
app/code/community/Gene/Braintree/Model/Wrapper/Braintree.php CHANGED
@@ -149,7 +149,9 @@ class Gene_Braintree_Model_Wrapper_Braintree extends Mage_Core_Model_Abstract
149
  public function generateToken()
150
  {
151
  // Use the class to generate the token
152
- return Braintree_ClientToken::generate();
 
 
153
  }
154
 
155
 
@@ -252,7 +254,7 @@ class Gene_Braintree_Model_Wrapper_Braintree extends Mage_Core_Model_Abstract
252
  *
253
  * @return bool
254
  */
255
- public function validateCredentials($prettyResponse = false, $alreadyInit = false, $merchantAccountId = false)
256
  {
257
  // Try to init the environment
258
  try {
@@ -268,11 +270,23 @@ class Gene_Braintree_Model_Wrapper_Braintree extends Mage_Core_Model_Abstract
268
  $this->init();
269
  }
270
  }
 
 
 
 
271
  } catch (Exception $e) {
272
 
 
 
 
 
 
 
273
  if($prettyResponse) {
274
  return '<span style="color: red;font-weight: bold;" id="braintree-valid-config">' . Mage::helper('gene_braintree')->__('Invalid Credentials') . '</span><br />' . Mage::helper('gene_braintree')->__('Payments cannot be processed until this is resolved, due to this the methods will be hidden within the checkout');
275
  }
 
 
276
  return false;
277
  }
278
 
@@ -289,9 +303,18 @@ class Gene_Braintree_Model_Wrapper_Braintree extends Mage_Core_Model_Abstract
289
  try {
290
  Braintree_Configuration::gateway()->merchantAccount()->find($merchantAccountId);
291
  } catch (Exception $e) {
 
 
 
 
 
 
 
292
  if($prettyResponse) {
293
  return '<span style="color: orange;font-weight: bold;" id="braintree-valid-config">' . Mage::helper('gene_braintree')->__('Invalid Merchant Account ID') . '</span><br />' . Mage::helper('gene_braintree')->__('Payments cannot be processed until this is resolved. We cannot find your merchant account ID associated with the other credentials you\'ve provided, please update this field');
294
  }
 
 
295
  return false;
296
  }
297
 
@@ -326,36 +349,32 @@ class Gene_Braintree_Model_Wrapper_Braintree extends Mage_Core_Model_Abstract
326
 
327
  } else {
328
 
329
- // Try and validate the stored credentials
330
- if (!Mage::getModel('gene_braintree/wrapper_braintree')->validateCredentials()) {
331
-
332
- // Only add this in if it's not the last notice
333
- $latestNotice = Mage::getModel('adminnotification/inbox')->loadLatestNotice();
334
-
335
- // Validate there is a latest notice
336
- if ($latestNotice && $latestNotice->getId()) {
337
 
338
- // Check to see if the title contains our error
339
- // Magento does not provide a nice way of doing this that I'm aware of
340
- if (strpos($latestNotice->getTitle(), 'Braintree Configuration Invalid') === false) {
341
 
342
- // If it doesn't add it again!
343
- Mage::getModel('adminnotification/inbox')->addMajor(Mage::helper('gene_braintree')->__('Braintree Configuration Invalid - %s - This could be stopping payments', Mage::app()->getStore()->getFrontendName()), Mage::helper('gene_braintree')->__('The configuration values in the Magento Braintree v.zero module are incorrect, until these values are corrected the system can not function. This occurred on store %s - ID: %s', Mage::app()->getStore()->getFrontendName(), Mage::app()->getStore()->getId()));
344
- }
345
 
346
  } else {
347
 
348
- // Otherwise there hasn't been any other notices
349
- Mage::getModel('adminnotification/inbox')->addMajor(Mage::helper('gene_braintree')->__('Braintree Configuration Invalid - %s - This could be stopping payments', Mage::app()->getStore()->getFrontendName()), Mage::helper('gene_braintree')->__('The configuration values in the Magento Braintree v.zero module are incorrect, until these values are corrected the system can not function. This occurred on store %s - ID: %s', Mage::app()->getStore()->getFrontendName(), Mage::app()->getStore()->getId()));
 
350
  }
351
 
352
- $this->validated = false;
353
 
354
- } else {
 
 
355
 
356
- // Otherwise the method validated
357
- $this->validated = true;
358
  }
 
359
  }
360
  }
361
  }
149
  public function generateToken()
150
  {
151
  // Use the class to generate the token
152
+ return Braintree_ClientToken::generate(
153
+ array("merchantAccountId" => $this->getMerchantAccountId())
154
+ );
155
  }
156
 
157
 
254
  *
255
  * @return bool
256
  */
257
+ public function validateCredentials($prettyResponse = false, $alreadyInit = false, $merchantAccountId = false, $throwException = false)
258
  {
259
  // Try to init the environment
260
  try {
270
  $this->init();
271
  }
272
  }
273
+
274
+ // Attempt to retrieve the gateway plans to check
275
+ Braintree_Configuration::gateway()->plan()->all();
276
+
277
  } catch (Exception $e) {
278
 
279
+ // Do we want to rethrow the exception?
280
+ if($throwException) {
281
+ throw $e;
282
+ }
283
+
284
+ // Otherwise give the user a little bit more information
285
  if($prettyResponse) {
286
  return '<span style="color: red;font-weight: bold;" id="braintree-valid-config">' . Mage::helper('gene_braintree')->__('Invalid Credentials') . '</span><br />' . Mage::helper('gene_braintree')->__('Payments cannot be processed until this is resolved, due to this the methods will be hidden within the checkout');
287
  }
288
+
289
+ // Otherwise return with a boolean
290
  return false;
291
  }
292
 
303
  try {
304
  Braintree_Configuration::gateway()->merchantAccount()->find($merchantAccountId);
305
  } catch (Exception $e) {
306
+
307
+ // Do we want to rethrow the exception?
308
+ if($throwException) {
309
+ throw $e;
310
+ }
311
+
312
+ // Otherwise do we want a pretty response?
313
  if($prettyResponse) {
314
  return '<span style="color: orange;font-weight: bold;" id="braintree-valid-config">' . Mage::helper('gene_braintree')->__('Invalid Merchant Account ID') . '</span><br />' . Mage::helper('gene_braintree')->__('Payments cannot be processed until this is resolved. We cannot find your merchant account ID associated with the other credentials you\'ve provided, please update this field');
315
  }
316
+
317
+ // Finally return a boolean
318
  return false;
319
  }
320
 
349
 
350
  } else {
351
 
352
+ // Attempt to validate credentials
353
+ try {
 
 
 
 
 
 
354
 
355
+ // Passing true will cause the system to rethrow exceptions
356
+ if(Mage::getModel('gene_braintree/wrapper_braintree')->validateCredentials(false, false, false, true)) {
 
357
 
358
+ // Mark our flag as true
359
+ $this->validated = true;
 
360
 
361
  } else {
362
 
363
+ // Mark our flag as false, this shouldn't even return false it should always throw an
364
+ // Exception but just in case
365
+ $this->validated = false;
366
  }
367
 
368
+ } catch (Exception $e) {
369
 
370
+ // If it fails log it
371
+ Gene_Braintree_Model_Debug::log('CRITICAL ERROR: The system was unable to connect to Braintree, error is below');
372
+ Gene_Braintree_Model_Debug::log($e);
373
 
374
+ // If the validateCredentials throws an exception it has failed
375
+ $this->validated = false;
376
  }
377
+
378
  }
379
  }
380
  }
app/code/community/Gene/Braintree/controllers/CheckoutController.php CHANGED
@@ -7,20 +7,42 @@
7
  */
8
  class Gene_Braintree_CheckoutController extends Mage_Core_Controller_Front_Action
9
  {
 
10
  /**
11
  * The front-end is requesting the grand total of the quote
 
 
12
  */
13
  public function quoteTotalAction()
14
  {
15
  // Grab the quote
16
  $quote = Mage::getSingleton('checkout/type_onepage')->getQuote();
17
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
18
  // Build up our JSON response
19
  $jsonResponse = array(
20
- 'billingName' => $quote->getBillingAddress()->getName(),
21
- 'billingPostcode' => $quote->getBillingAddress()->getPostcode(),
22
  'grandTotal' => number_format($quote->getGrandTotal(), 2),
23
- 'currencyCode' => $quote->getQuoteCurrencyCode()
 
24
  );
25
 
26
  // Set the response
@@ -30,6 +52,8 @@ class Gene_Braintree_CheckoutController extends Mage_Core_Controller_Front_Actio
30
 
31
  /**
32
  * Tokenize the card tokens via Ajax
 
 
33
  */
34
  public function tokenizeCardAction()
35
  {
7
  */
8
  class Gene_Braintree_CheckoutController extends Mage_Core_Controller_Front_Action
9
  {
10
+
11
  /**
12
  * The front-end is requesting the grand total of the quote
13
+ *
14
+ * @return bool
15
  */
16
  public function quoteTotalAction()
17
  {
18
  // Grab the quote
19
  $quote = Mage::getSingleton('checkout/type_onepage')->getQuote();
20
 
21
+ // Retrieve the billing information from the quote
22
+ $billingName = $quote->getBillingAddress()->getName();
23
+ $billingPostcode = $quote->getBillingAddress()->getPostcode();
24
+
25
+ // Has the request supplied the billing address ID?
26
+ if($addressId = $this->getRequest()->getParam('addressId') && Mage::getSingleton('customer/session')->isLoggedIn()) {
27
+
28
+ // Retrieve the address
29
+ $billingAddress = $quote->getCustomer()->getAddressById($addressId);
30
+
31
+ // If the address loads override the values
32
+ if($billingAddress && $billingAddress->getId()) {
33
+ $billingName = $billingAddress->getName();
34
+ $billingPostcode = $billingAddress->getPostcode();
35
+ }
36
+
37
+ }
38
+
39
  // Build up our JSON response
40
  $jsonResponse = array(
41
+ 'billingName' => $billingName,
42
+ 'billingPostcode' => $billingPostcode,
43
  'grandTotal' => number_format($quote->getGrandTotal(), 2),
44
+ 'currencyCode' => $quote->getQuoteCurrencyCode(),
45
+ 'threeDSecure' => Mage::getSingleton('gene_braintree/paymentmethod_creditcard')->is3DEnabled()
46
  );
47
 
48
  // Set the response
52
 
53
  /**
54
  * Tokenize the card tokens via Ajax
55
+ *
56
+ * @return bool
57
  */
58
  public function tokenizeCardAction()
59
  {
app/code/community/Gene/Braintree/etc/config.xml CHANGED
@@ -2,7 +2,7 @@
2
  <config>
3
  <modules>
4
  <Gene_Braintree>
5
- <version>1.0.1</version>
6
  </Gene_Braintree>
7
  </modules>
8
  <global>
@@ -87,6 +87,8 @@
87
  <environment>sandbox</environment>
88
  <allowspecific>0</allowspecific>
89
  <use_vault>0</use_vault>
 
 
90
  <useccv>1</useccv>
91
  </gene_braintree_creditcard>
92
 
2
  <config>
3
  <modules>
4
  <Gene_Braintree>
5
+ <version>1.0.2</version>
6
  </Gene_Braintree>
7
  </modules>
8
  <global>
87
  <environment>sandbox</environment>
88
  <allowspecific>0</allowspecific>
89
  <use_vault>0</use_vault>
90
+ <threedsecure>0</threedsecure>
91
+ <threedsecure_threshold>0</threedsecure_threshold>
92
  <useccv>1</useccv>
93
  </gene_braintree_creditcard>
94
 
app/code/community/Gene/Braintree/etc/system.xml CHANGED
@@ -404,11 +404,26 @@
404
  ]]></comment>
405
  </threedsecure>
406
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
407
  <useccv translate="label comment">
408
  <label>CVV Verification</label>
409
  <frontend_type>select</frontend_type>
410
  <source_model>adminhtml/system_config_source_yesno</source_model>
411
- <sort_order>76</sort_order>
412
  <show_in_default>1</show_in_default>
413
  <show_in_website>1</show_in_website>
414
  <show_in_store>1</show_in_store>
@@ -420,7 +435,7 @@
420
  <kount_merchant_id translate="label comment">
421
  <label>Kount Merchant ID</label>
422
  <frontend_type>text</frontend_type>
423
- <sort_order>78</sort_order>
424
  <show_in_default>1</show_in_default>
425
  <show_in_website>1</show_in_website>
426
  <show_in_store>1</show_in_store>
404
  ]]></comment>
405
  </threedsecure>
406
 
407
+ <threedsecure_threshold translate="label comment">
408
+ <label>3D Secure Threshold</label>
409
+ <frontend_type>text</frontend_type>
410
+ <sort_order>77</sort_order>
411
+ <show_in_default>1</show_in_default>
412
+ <show_in_website>1</show_in_website>
413
+ <show_in_store>1</show_in_store>
414
+ <comment><![CDATA[
415
+ The threshold which requires a transaction to be passed through 3D secure. Set this to 0 to pass all transactions through 3D secure.
416
+ ]]></comment>
417
+ <depends>
418
+ <threedsecure>1</threedsecure>
419
+ </depends>
420
+ </threedsecure_threshold>
421
+
422
  <useccv translate="label comment">
423
  <label>CVV Verification</label>
424
  <frontend_type>select</frontend_type>
425
  <source_model>adminhtml/system_config_source_yesno</source_model>
426
+ <sort_order>78</sort_order>
427
  <show_in_default>1</show_in_default>
428
  <show_in_website>1</show_in_website>
429
  <show_in_store>1</show_in_store>
435
  <kount_merchant_id translate="label comment">
436
  <label>Kount Merchant ID</label>
437
  <frontend_type>text</frontend_type>
438
+ <sort_order>79</sort_order>
439
  <show_in_default>1</show_in_default>
440
  <show_in_website>1</show_in_website>
441
  <show_in_store>1</show_in_store>
app/design/adminhtml/default/default/template/gene/braintree/js.phtml CHANGED
@@ -19,7 +19,7 @@
19
  AdminOrder.prototype.submit = function() {
20
 
21
  // Check we're using the braintree card method
22
- if(order.paymentMethod == 'gene_braintree_creditcard') {
23
 
24
  // Validate the form contents
25
  if (editForm.validate()) {
19
  AdminOrder.prototype.submit = function() {
20
 
21
  // Check we're using the braintree card method
22
+ if(order.paymentMethod == 'gene_braintree_creditcard' && $('p_method_free') == null) {
23
 
24
  // Validate the form contents
25
  if (editForm.validate()) {
app/design/frontend/base/default/template/gene/braintree/creditcard.phtml CHANGED
@@ -158,6 +158,14 @@ $_code = $this->getMethodCode()
158
 
159
  // Set the accepted cards
160
  vzero.setAcceptedCards(<?php echo $this->getCcAvailableTypes(); ?>);
 
 
 
 
 
 
 
 
161
  }
162
 
163
  // Loop through each saved card being selected
158
 
159
  // Set the accepted cards
160
  vzero.setAcceptedCards(<?php echo $this->getCcAvailableTypes(); ?>);
161
+
162
+ <?php
163
+ // Dynamically swap the 3Ds flag in the JS class
164
+ if($this->getMethod()->is3DEnabled()): ?>
165
+ vzero.setThreeDSecure(true);
166
+ <?php else: ?>
167
+ vzero.setThreeDSecure(false);
168
+ <?php endif; ?>
169
  }
170
 
171
  // Loop through each saved card being selected
app/design/frontend/base/default/template/gene/braintree/js/amasty.phtml CHANGED
@@ -34,60 +34,76 @@
34
  // Are we dealing with the credit card method?
35
  if (payment.currentMethod == 'gene_braintree_creditcard') {
36
 
37
- // Update the data as we're in a one step
38
- vzero.updateData(function() {
39
 
40
- // Grab these directly from the form and update
41
- if ($('billing:firstname') != undefined && $('billing:lastname') != undefined) {
42
- vzero.setBillingName($('billing:firstname').value + ' ' + $('billing:lastname').value);
43
- }
44
- if ($('billing:postcode') != undefined) {
45
- vzero.setBillingPostcode($('billing:postcode').value);
46
- }
47
 
48
- // Check is running
49
- checkoutRunning = true;
 
 
 
 
 
 
 
 
 
 
 
 
 
50
 
51
- // Show the loading
52
- showLoading();
53
 
54
- // Process the card
55
- vzero.process({
56
- onSuccess: function () {
57
 
58
- // Disable the standard credit card form so the values don't get passed through to the checkout
59
- $$('#credit-card-form input, #credit-card-form select').each(function (formElement) {
60
- if (formElement.id != 'creditcard-payment-nonce' && formElement.getAttribute('data-genebraintree-name') != 'cvv' && formElement.id != 'gene_braintree_creditcard_store_in_vault' && formElement.id != 'device_data') {
61
- formElement.setAttribute('disabled', 'disabled');
62
- }
63
- });
64
 
65
- // No longer running
66
- checkoutRunning = false;
 
 
 
 
67
 
68
- // Fire the original event and return the response
69
- completeCheckoutResponse = originalCompleteCheckout.apply(this, arguments);
70
 
71
- // Re-enable any form elements which were disabled
72
- $$('#credit-card-form input, #credit-card-form select').each(function (formElement) {
73
- formElement.removeAttribute('disabled');
74
- });
75
 
76
- // Run the original function
77
- return completeCheckoutResponse;
78
- },
79
- onFailure: function() {
80
 
81
- // Reset the waiting for the parent function
82
- hideLoading();
 
 
83
 
84
- // No longer running
85
- checkoutRunning = false;
86
 
87
- }
88
- });
 
 
 
89
 
90
- });
 
 
91
 
92
  // We're updating data don't do anything else for now
93
  return false;
34
  // Are we dealing with the credit card method?
35
  if (payment.currentMethod == 'gene_braintree_creditcard') {
36
 
37
+ // Do we want to pass any extra paramters into the updateData request
38
+ var parameters = {};
39
 
40
+ // If the billing address is selected and we're wanting to ship to that address we need to pass the addressId
41
+ if($('billing-address-select') != undefined && $('billing-address-select').value != '')
42
+ {
43
+ parameters.addressId = $('billing-address-select').value;
44
+ }
 
 
45
 
46
+ // Update the data as we're in a one step
47
+ vzero.updateData(
48
+ function() {
49
+
50
+ // Verify we're not using a saved address
51
+ if($('billing-address-select') != undefined && $('billing-address-select').value == '' || $('billing-address-select') == undefined) {
52
+
53
+ // Grab these directly from the form and update
54
+ if ($('billing:firstname') != undefined && $('billing:lastname') != undefined) {
55
+ vzero.setBillingName($('billing:firstname').value + ' ' + $('billing:lastname').value);
56
+ }
57
+ if ($('billing:postcode') != undefined) {
58
+ vzero.setBillingPostcode($('billing:postcode').value);
59
+ }
60
+ }
61
 
62
+ // Check is running
63
+ checkoutRunning = true;
64
 
65
+ // Show the loading
66
+ showLoading();
 
67
 
68
+ // Process the card
69
+ vzero.process({
70
+ onSuccess: function () {
 
 
 
71
 
72
+ // Disable the standard credit card form so the values don't get passed through to the checkout
73
+ $$('#credit-card-form input, #credit-card-form select').each(function (formElement) {
74
+ if (formElement.id != 'creditcard-payment-nonce' && formElement.getAttribute('data-genebraintree-name') != 'cvv' && formElement.id != 'gene_braintree_creditcard_store_in_vault' && formElement.id != 'device_data') {
75
+ formElement.setAttribute('disabled', 'disabled');
76
+ }
77
+ });
78
 
79
+ // No longer running
80
+ checkoutRunning = false;
81
 
82
+ // Fire the original event and return the response
83
+ completeCheckoutResponse = originalCompleteCheckout.apply(this, arguments);
 
 
84
 
85
+ // Re-enable any form elements which were disabled
86
+ $$('#credit-card-form input, #credit-card-form select').each(function (formElement) {
87
+ formElement.removeAttribute('disabled');
88
+ });
89
 
90
+ // Run the original function
91
+ return completeCheckoutResponse;
92
+ },
93
+ onFailure: function() {
94
 
95
+ // Reset the waiting for the parent function
96
+ hideLoading();
97
 
98
+ // No longer running
99
+ checkoutRunning = false;
100
+
101
+ }
102
+ });
103
 
104
+ },
105
+ parameters
106
+ );
107
 
108
  // We're updating data don't do anything else for now
109
  return false;
app/design/frontend/base/default/template/gene/braintree/js/idev.phtml CHANGED
@@ -48,52 +48,69 @@
48
 
49
  startLoading();
50
 
 
 
 
 
 
 
 
 
 
51
  // Update the data as we're in a one step
52
- vzero.updateData(function() {
 
53
 
54
- // Grab these directly from the form and update
55
- if ($('billing:firstname') != undefined && $('billing:lastname') != undefined) {
56
- vzero.setBillingName($('billing:firstname').value + ' ' + $('billing:lastname').value);
57
- }
58
- if ($('billing:postcode') != undefined) {
59
- vzero.setBillingPostcode($('billing:postcode').value);
60
- }
61
 
62
- // Process the card
63
- vzero.process({
64
- onSuccess: function () {
 
 
 
 
65
 
66
- // Disable the standard credit card form so the values don't get passed through to the checkout
67
- $$('#credit-card-form input, #credit-card-form select').each(function (formElement) {
68
- if (formElement.id != 'creditcard-payment-nonce' && formElement.getAttribute('data-genebraintree-name') != 'cvv' && formElement.id != 'gene_braintree_creditcard_store_in_vault' && formElement.id != 'device_data') {
69
- formElement.setAttribute('disabled', 'disabled');
70
- }
71
- });
72
 
73
- stopLoading();
 
 
74
 
75
- // Set the flag to true
76
- processedVZero = true;
 
 
 
 
77
 
78
- // We're no longer stopping the events
79
- already_placing_order = false;
80
 
81
- // Fire the same event over again
82
- $(elem).click();
83
- },
84
- onFailure: function() {
85
 
86
- // Set the flag to true
87
- processedVZero = false;
88
 
89
- stopLoading();
 
 
 
90
 
91
- // We're no longer stopping the events
92
- already_placing_order = false;
93
 
94
- }
95
- });
96
- });
 
 
 
 
 
 
 
97
 
98
  }
99
  }
48
 
49
  startLoading();
50
 
51
+ // Do we want to pass any extra paramters into the updateData request
52
+ var parameters = {};
53
+
54
+ // If the billing address is selected and we're wanting to ship to that address we need to pass the addressId
55
+ if($('billing-address-select') != undefined && $('billing-address-select').value != '')
56
+ {
57
+ parameters.addressId = $('billing-address-select').value;
58
+ }
59
+
60
  // Update the data as we're in a one step
61
+ vzero.updateData(
62
+ function() {
63
 
64
+ // Verify we're not using a saved address
65
+ if($('billing-address-select') != undefined && $('billing-address-select').value == '' || $('billing-address-select') == undefined) {
 
 
 
 
 
66
 
67
+ // Grab these directly from the form and update
68
+ if ($('billing:firstname') != undefined && $('billing:lastname') != undefined) {
69
+ vzero.setBillingName($('billing:firstname').value + ' ' + $('billing:lastname').value);
70
+ }
71
+ if ($('billing:postcode') != undefined) {
72
+ vzero.setBillingPostcode($('billing:postcode').value);
73
+ }
74
 
75
+ }
 
 
 
 
 
76
 
77
+ // Process the card
78
+ vzero.process({
79
+ onSuccess: function () {
80
 
81
+ // Disable the standard credit card form so the values don't get passed through to the checkout
82
+ $$('#credit-card-form input, #credit-card-form select').each(function (formElement) {
83
+ if (formElement.id != 'creditcard-payment-nonce' && formElement.getAttribute('data-genebraintree-name') != 'cvv' && formElement.id != 'gene_braintree_creditcard_store_in_vault' && formElement.id != 'device_data') {
84
+ formElement.setAttribute('disabled', 'disabled');
85
+ }
86
+ });
87
 
88
+ stopLoading();
 
89
 
90
+ // Set the flag to true
91
+ processedVZero = true;
 
 
92
 
93
+ // We're no longer stopping the events
94
+ already_placing_order = false;
95
 
96
+ // Fire the same event over again
97
+ $(elem).click();
98
+ },
99
+ onFailure: function() {
100
 
101
+ // Set the flag to true
102
+ processedVZero = false;
103
 
104
+ stopLoading();
105
+
106
+ // We're no longer stopping the events
107
+ already_placing_order = false;
108
+
109
+ }
110
+ });
111
+ },
112
+ parameters
113
+ );
114
 
115
  }
116
  }
js/gene/braintree/vzero.js CHANGED
@@ -61,6 +61,15 @@ vZero.prototype = {
61
 
62
  },
63
 
 
 
 
 
 
 
 
 
 
64
  /**
65
  * Set the amount within the checkout, this is only used in the default integration
66
  * For any other checkouts see the updateData method, this is used by 3D secure
@@ -132,7 +141,7 @@ vZero.prototype = {
132
  /**
133
  * Push through the selected accepted cards from the admin
134
  *
135
- * @param cards
136
  */
137
  setAcceptedCards: function(cards) {
138
  this.acceptedCards = cards;
@@ -253,14 +262,16 @@ vZero.prototype = {
253
  * Make an Ajax request to the server and request up to date information regarding the quote
254
  *
255
  * @param callback A defined callback function if needed
 
256
  */
257
- updateData: function(callback) {
258
 
259
  // Make a new ajax request to the server
260
  new Ajax.Request(
261
  this.quoteUrl,
262
  {
263
  method:'post',
 
264
  onSuccess: function(transport) {
265
 
266
  // Verify we have some response text
@@ -283,11 +294,14 @@ vZero.prototype = {
283
  if(response.grandTotal != undefined) {
284
  this.amount = response.grandTotal;
285
  }
 
 
 
286
 
287
  // If PayPal is active update it
288
  if(typeof vzeroPaypal != "undefined") {
289
 
290
- // Totals
291
  if(response.grandTotal != undefined && response.currencyCode != undefined) {
292
  vzeroPaypal.setPricing(response.grandTotal, response.currencyCode);
293
  }
@@ -415,10 +429,7 @@ vZero.prototype = {
415
  number: $$('[data-genebraintree-name="number"]').first().value,
416
  expirationMonth: $$('[data-genebraintree-name="expiration_month"]').first().value,
417
  expirationYear: $$('[data-genebraintree-name="expiration_year"]').first().value,
418
- cardholderName: this.getBillingName(),
419
- billingAddress: {
420
- postalCode: this.getBillingPostcode()
421
- }
422
  }
423
  };
424
 
@@ -427,6 +438,13 @@ vZero.prototype = {
427
  threeDSecureRequest.creditCard.cvv = $$('[data-genebraintree-name="cvv"]').first().value;
428
  }
429
 
 
 
 
 
 
 
 
430
  // Run the verify function on the braintree client
431
  this.client.verify3DS(threeDSecureRequest, function (error, response) {
432
 
@@ -517,10 +535,7 @@ vZero.prototype = {
517
  number: $$('[data-genebraintree-name="number"]').first().value,
518
  cardholderName: this.getBillingName(),
519
  expirationMonth: $$('[data-genebraintree-name="expiration_month"]').first().value,
520
- expirationYear: $$('[data-genebraintree-name="expiration_year"]').first().value,
521
- billingAddress: {
522
- postalCode: this.getBillingPostcode()
523
- }
524
  };
525
 
526
  // If the CVV field exists include it
@@ -528,6 +543,13 @@ vZero.prototype = {
528
  tokenizeRequest.cvv = $$('[data-genebraintree-name="cvv"]').first().value;
529
  }
530
 
 
 
 
 
 
 
 
531
  // Attempt to tokenize the card
532
  this.client.tokenizeCard(tokenizeRequest, function (errors, nonce) {
533
 
61
 
62
  },
63
 
64
+ /**
65
+ * Set the 3Ds flag
66
+ *
67
+ * @param flag a boolean value
68
+ */
69
+ setThreeDSecure: function(flag) {
70
+ this.threeDSecure = flag;
71
+ },
72
+
73
  /**
74
  * Set the amount within the checkout, this is only used in the default integration
75
  * For any other checkouts see the updateData method, this is used by 3D secure
141
  /**
142
  * Push through the selected accepted cards from the admin
143
  *
144
+ * @param cards an array of accepted cards
145
  */
146
  setAcceptedCards: function(cards) {
147
  this.acceptedCards = cards;
262
  * Make an Ajax request to the server and request up to date information regarding the quote
263
  *
264
  * @param callback A defined callback function if needed
265
+ * @param params any extra data to be passed to the controller
266
  */
267
+ updateData: function(callback, params) {
268
 
269
  // Make a new ajax request to the server
270
  new Ajax.Request(
271
  this.quoteUrl,
272
  {
273
  method:'post',
274
+ parameters: params,
275
  onSuccess: function(transport) {
276
 
277
  // Verify we have some response text
294
  if(response.grandTotal != undefined) {
295
  this.amount = response.grandTotal;
296
  }
297
+ if(response.threeDSecure != undefined) {
298
+ this.setThreeDSecure(response.threeDSecure);
299
+ }
300
 
301
  // If PayPal is active update it
302
  if(typeof vzeroPaypal != "undefined") {
303
 
304
+ // Update the totals within the PayPal system
305
  if(response.grandTotal != undefined && response.currencyCode != undefined) {
306
  vzeroPaypal.setPricing(response.grandTotal, response.currencyCode);
307
  }
429
  number: $$('[data-genebraintree-name="number"]').first().value,
430
  expirationMonth: $$('[data-genebraintree-name="expiration_month"]').first().value,
431
  expirationYear: $$('[data-genebraintree-name="expiration_year"]').first().value,
432
+ cardholderName: this.getBillingName()
 
 
 
433
  }
434
  };
435
 
438
  threeDSecureRequest.creditCard.cvv = $$('[data-genebraintree-name="cvv"]').first().value;
439
  }
440
 
441
+ // If we have the billing postcode add it into the request
442
+ if(this.getBillingPostcode() != "") {
443
+ threeDSecureRequest.creditCard.billingAddress = {
444
+ postalCode: this.getBillingPostcode()
445
+ };
446
+ }
447
+
448
  // Run the verify function on the braintree client
449
  this.client.verify3DS(threeDSecureRequest, function (error, response) {
450
 
535
  number: $$('[data-genebraintree-name="number"]').first().value,
536
  cardholderName: this.getBillingName(),
537
  expirationMonth: $$('[data-genebraintree-name="expiration_month"]').first().value,
538
+ expirationYear: $$('[data-genebraintree-name="expiration_year"]').first().value
 
 
 
539
  };
540
 
541
  // If the CVV field exists include it
543
  tokenizeRequest.cvv = $$('[data-genebraintree-name="cvv"]').first().value;
544
  }
545
 
546
+ // If we have the billing postcode add it into the request
547
+ if(this.getBillingPostcode() != "") {
548
+ tokenizeRequest.billingAddress = {
549
+ postalCode: this.getBillingPostcode()
550
+ };
551
+ }
552
+
553
  // Attempt to tokenize the card
554
  this.client.tokenizeCard(tokenizeRequest, function (errors, nonce) {
555
 
package.xml CHANGED
@@ -1,7 +1,7 @@
1
  <?xml version="1.0"?>
2
  <package>
3
  <name>Gene_Braintree</name>
4
- <version>1.0.1</version>
5
  <stability>stable</stability>
6
  <license uri="http://opensource.org/licenses/mit-license.php">MIT License</license>
7
  <channel>community</channel>
@@ -36,9 +36,9 @@ Easily add PayPal to your checkout. We've built the best PayPal integration arou
36
  &lt;/ul&gt;</description>
37
  <notes>Connect your Magento store to Braintree to accept Credit Cards &amp;amp; PayPal using V.Zero SDK</notes>
38
  <authors><author><name>Dave Macaulay</name><user>dave</user><email>magento@gene.co.uk</email></author></authors>
39
- <date>2015-04-21</date>
40
- <time>13:28:11</time>
41
- <contents><target name="magecommunity"><dir name="Gene"><dir name="Braintree"><dir name="Block"><dir name="Adminhtml"><dir name="Report"><dir name="Transactions"><file name="Grid.php" hash="32b32086548f62ae4aca4baf456b9ed2"/><file name="Search.php" hash="81d57c3744530f36c37782ce9d0f3a70"/></dir><file name="Transactions.php" hash="7afe45b49353e52b432aa0392d76a08e"/></dir><dir name="System"><dir name="Config"><dir name="Braintree"><file name="Config.php" hash="eaaf6c74be4233a315d5aa5932f7c9ca"/><file name="Currency.php" hash="9ffa8a2ded53be75e88a60a024883b07"/><file name="Moduleversion.php" hash="fe3836bde24bb31c4c4585f2cd2f20ed"/><file name="Version.php" hash="ce58278a4faf965301cc2d8b2da4483c"/></dir></dir></dir></dir><dir name="Cart"><file name="Totals.php" hash="a03c441e8143896f92d02931a809f666"/></dir><dir name="Creditcard"><file name="Info.php" hash="40aa92bed04bd3744048befca2a0217a"/><file name="Threedsecure.php" hash="8eae09e8167e787f24eb80bc7ad7cd4a"/></dir><file name="Creditcard.php" hash="989678324ff3fcddcc99cbe4613019fa"/><file name="Js.php" hash="d1b2dbd2ba187100ecbbedefc633b845"/><dir name="Paypal"><file name="Info.php" hash="a0206fad8b91aa382c3ac16b9651c723"/></dir><file name="Paypal.php" hash="36294a461378cceee66e99d45753c6e1"/><file name="Saved.php" hash="74ed8e70a404a814b94f21f88c1ca737"/></dir><dir name="Helper"><file name="Data.php" hash="a5b64dd6760e881b1823adfaeb7c1501"/></dir><dir name="Model"><file name="Debug.php" hash="f3360f71e2346881f93424792ed9f209"/><file name="Observer.php" hash="176b48ac3b74bfaa3c28f4126093b49b"/><dir name="Paymentmethod"><file name="Abstract.php" hash="4043a0ac548fe0ec9acbc2dd0c57dfb4"/><file name="Creditcard.php" hash="822df144f2731ef4ceeade79f899e570"/><file name="Paypal.php" hash="445bb04b3b1d5d41383962ec8ef9daa3"/></dir><file name="Saved.php" hash="3b235b454a3692d1c3d5343e2a1c91e9"/><dir name="Source"><file name="Cctype.php" hash="d76aa6c3a4bd798e3a47695f579d21d4"/><dir name="Creditcard"><file name="CaptureAction.php" hash="6444cfc430de44f06e85bd9c8b80d77b"/><file name="PaymentAction.php" hash="a2f3f3d36a98df4d12f76b6ab77f9c47"/></dir><file name="Environment.php" hash="02567d2ddba74d06ac000b4ddb12723a"/><dir name="Paypal"><file name="Locale.php" hash="8988ca77f9c2aa2d19ff0b614a4b7621"/><file name="Paymenttype.php" hash="fe1fe4ee89d5b7a87c7c28716bb2f1cb"/></dir></dir><dir name="System"><dir name="Config"><dir name="Backend"><file name="Currency.php" hash="f0cca96917d3c4c2bc05aa255544f25a"/></dir></dir></dir><dir name="Wrapper"><file name="Braintree.php" hash="618fa6b53c0201545f178543506803d4"/></dir></dir><dir name="controllers"><dir name="Adminhtml"><file name="BraintreeController.php" hash="7c621fa1548c04e24bb1136bcbbe1d72"/></dir><file name="CheckoutController.php" hash="7494f5fa81cbae80778fac80fa577101"/><file name="SavedController.php" hash="036e97703c853a5bae064dd7cf5030a8"/></dir><dir name="etc"><file name="adminhtml.xml" hash="c9c940beffa0ec19e4a1499a66f7fd12"/><file name="config.xml" hash="24ec6bab4f5c48eda6e74daac4a6d2e4"/><file name="system.xml" hash="077114993f5d60f16e8d33221cbd19ff"/></dir><dir name="sql"><dir name="gene_braintree_setup"><file name="install-0.1.0.php" hash="7ef62b7c19b9da5990974da6edb3e77c"/></dir></dir></dir></dir></target><target name="magedesign"><dir name="frontend"><dir name="base"><dir name="default"><dir name="layout"><dir name="gene"><file name="braintree.xml" hash="1ded19331e4656bd31d052eb729ff7c2"/></dir></dir><dir name="template"><dir name="gene"><dir name="braintree"><dir name="creditcard"><file name="info.phtml" hash="2ae1e397b3a633dd305bc26c7b9c1065"/><file name="threedsecure.phtml" hash="ee8ad689afde041c39dd92ffa5274883"/></dir><file name="creditcard.phtml" hash="a083837c8b7d32b61336f891c5a87cb8"/><dir name="customer"><file name="methods.phtml" hash="eb5e2d8f4a0f419fcf720c12062f808a"/><file name="saved.phtml" hash="691162b89ed085599f76072226ca2307"/></dir><dir name="js"><file name="amasty.phtml" hash="652f7d6b1c9dfe6249b29ca8ee8abf82"/><file name="data.phtml" hash="7c77e2c13c9037ab993b7c7f8aa72d98"/><file name="default.phtml" hash="4fde57aa847f06bc02feaaf9097b1f57"/><file name="idev.phtml" hash="9328346d501ca6ab91451d5a99fdc287"/><file name="setup.phtml" hash="86a6da43f073b5fc75ce170a50af3bcd"/></dir><dir name="paypal"><file name="info.phtml" hash="5149b273730121e4dec3c3179820f747"/></dir><file name="paypal.phtml" hash="3c579ad7ba3290c15fcce027cdd66d16"/></dir></dir></dir></dir></dir></dir><dir name="adminhtml"><dir name="default"><dir name="default"><dir name="layout"><dir name="gene"><file name="braintree.xml" hash="1995e85eb47b909120ce8b9b537bf5db"/></dir></dir><dir name="template"><dir name="gene"><dir name="braintree"><dir name="creditcard"><file name="info.phtml" hash="3c5f033eb99ab8d78517ae5eb45a3a1a"/></dir><file name="creditcard.phtml" hash="0c6b7806732c336ead14fab596f1b923"/><file name="js.phtml" hash="9d51d9d573ada5f3222e29e4b9b7aaa1"/><dir name="paypal"><file name="info.phtml" hash="53fae03530369f101f5eaed49508a1ee"/></dir><dir name="transactions"><file name="index.phtml" hash="1791b6393f319616dd79c0b46e391847"/><file name="search.phtml" hash="1682ce6200681681f0ce3c848e2e6694"/></dir></dir></dir></dir></dir></dir></dir></target><target name="mageetc"><dir name="modules"><file name="Gene_Braintree.xml" hash="8c0ffda8566dca2f0b98a999921e3e55"/></dir></target><target name="mageweb"><dir name="js"><dir name="gene"><dir name="braintree"><file name="braintree.js" hash="4a074b2952d6e3c0052f85442b284abc"/><file name="vzero.js" hash="7e9bf97aee5e7bfe9c2d465b0609d238"/></dir></dir></dir></target><target name="mageskin"><dir name="frontend"><dir name="base"><dir name="default"><dir name="images"><dir name="gene"><dir name="braintree"><file name="AE.png" hash="6b6f405105413b0723a62ee498f88bf6"/><file name="DI.png" hash="d8e3c3022dda9e723f466b8976ae428f"/><file name="JCB.png" hash="3aa9a71ed8a1d6610bbe0dfe2040e29e"/><file name="MC.png" hash="1fcd14928245139962b72f9368bdbe32"/><file name="ME.png" hash="b9389913c47b9546a67f907fcca73706"/><file name="PP.png" hash="b4946bccba574e86c9716a4986e21c36"/><file name="VI.png" hash="c9f74d1d54e61ab2c748f45a4bdface0"/><file name="card.png" hash="66e16f8c573fad93bb0d62258dce28bb"/><file name=".DS_Store" hash="194577a7e20bdcc7afbb718f502c134c"/></dir></dir></dir></dir></dir></dir></target><target name="magelib"><dir name="Braintree"><file name="AddOn.php" hash="07bc690cf426276dfdd802c49cfd72a3"/><file name="AddOnGateway.php" hash="ed9a94155c1c13ba37910fd48bdad40a"/><file name="Address.php" hash="1d4e7f964ed208a381b352d21fc370b8"/><file name="AddressGateway.php" hash="11716dc4ede8b7455197d08b88c91568"/><file name="ApplePayCard.php" hash="6fdbe99722514408f613c417e0e48711"/><file name="ClientToken.php" hash="f606f4bbafaea470333290be52b0030d"/><file name="ClientTokenGateway.php" hash="ede93fa63f0e96d296f315180f5ff1ad"/><file name="CoinbaseAccount.php" hash="7a4992ed13c26ad3785cf7d3455ef5fb"/><file name="Collection.php" hash="0e7d31ffcbd9780fb554186bd2c194b0"/><file name="Configuration.php" hash="6414dae20a80d926c28bd681bb535934"/><file name="CreditCard.php" hash="cf0aab2bcdcc7c231ccedc05a0f853e4"/><file name="CreditCardGateway.php" hash="3c5c3d9cee27da71e338b51d42b685ee"/><file name="CreditCardVerification.php" hash="48d6ea546914278f4bea2fefb75e7836"/><file name="CreditCardVerificationGateway.php" hash="e020dd1c26cd8c3bd7eb55eed2f72346"/><file name="CreditCardVerificationSearch.php" hash="baa6ed22471ea1f142a4195d1e36f89a"/><file name="Customer.php" hash="69d834344b93277dbeadb4ee6a881a60"/><file name="CustomerGateway.php" hash="bde59d4c6d7418fcbd87d4484384705b"/><file name="CustomerSearch.php" hash="8aacc83dac341cd9afec5a3deab17593"/><file name="Descriptor.php" hash="3f5db5e817280ce7f2fa18a205281ad9"/><file name="Digest.php" hash="9d12d067770f55b123b8498fce4478fa"/><file name="Disbursement.php" hash="589534043e466d17fede916fd7986edc"/><file name="DisbursementDetails.php" hash="ae632207d0982e288a83aed401c880d9"/><file name="Discount.php" hash="763b3f9cde0ff3af3e8795cac4097595"/><file name="DiscountGateway.php" hash="42ca6f2f11074ec18eecd1506996a393"/><dir name="Dispute"><file name="TransactionDetails.php" hash="7fdea673a1295055508f42286ad57f4e"/></dir><file name="Dispute.php" hash="2ee0f4a77b7cfec4763b55627a57e348"/><file name="EqualityNode.php" hash="cfd6aa184186233b8d6d1ec0f0e79298"/><dir name="Error"><file name="Codes.php" hash="d0d1007255af20889a4874d028ebeab2"/><file name="ErrorCollection.php" hash="e28d638db56524f5bf3609fa725e6d55"/><file name="Validation.php" hash="bf4e2198300019c52ba56f16269d66ce"/><file name="ValidationErrorCollection.php" hash="9ef25d0126a0b4f6951da5334ae6f0dc"/></dir><dir name="Exception"><file name="Authentication.php" hash="f9e13654988452cca2ac5228a80adae4"/><file name="Authorization.php" hash="5f8c017c6e9fd79a556dade8e15a72e8"/><file name="Configuration.php" hash="b50f67e8ea36cff0d9f6ad718126c6fc"/><file name="DownForMaintenance.php" hash="7fd30b1f8976ed7e38b7e9fae5c20f03"/><file name="ForgedQueryString.php" hash="6884dbae1e86767834b77c821df2db62"/><file name="InvalidSignature.php" hash="b83f5b16735cb3a8e0a8111c4f32711e"/><file name="NotFound.php" hash="f832f771d20b381c2780eb2a572b9f44"/><file name="SSLCaFileNotFound.php" hash="e927c7307bf1761814dc8a755238070d"/><file name="SSLCertificate.php" hash="d509b6a6206bd7c5563ac142dfe3801f"/><file name="ServerError.php" hash="b4645290229ab228a257047d08ef63d7"/><file name="Unexpected.php" hash="01ea2800fb91995ec2a15aee5024611e"/><file name="UpgradeRequired.php" hash="7f40b174df891cc3b3e206d1be884a58"/><file name="ValidationsFailed.php" hash="cd2d30c69911f81b55279c3d6bf88c61"/></dir><file name="Exception.php" hash="f14c94bf67206184eb3e4e7aeb4a608a"/><file name="Gateway.php" hash="8b214a63ed50539e75031caff78d4560"/><file name="Http.php" hash="5f6a9990a14684c82b6952937889412b"/><file name="Instance.php" hash="f0603b3f9213b53687e079c5621ac8f3"/><file name="IsNode.php" hash="e4b1f7bbfcbd24b1d08b97f94df592be"/><file name="KeyValueNode.php" hash="255595ec01a16906dd0c49faf67d9efb"/><dir name="MerchantAccount"><file name="AddressDetails.php" hash="1d265d864a884ebcf2504f55207cc0dd"/><file name="BusinessDetails.php" hash="c9ae627c4a4b526c2ecb0c07d70b3017"/><file name="FundingDetails.php" hash="7368f653fcbcc3d87924447b1763e616"/><file name="IndividualDetails.php" hash="68daf00759335cde82f176f0844e0d9b"/></dir><file name="MerchantAccount.php" hash="489844cfd91dcc6a53024af97b85f3c7"/><file name="MerchantAccountGateway.php" hash="6a9033758b8c02501fd835a96fc385b7"/><file name="Modification.php" hash="fcce6784af2e658affe4a67ca75d8230"/><file name="MultipleValueNode.php" hash="92700fa03011eaa9561010b3a160449c"/><file name="MultipleValueOrTextNode.php" hash="ef06bac18e2bc40974bdc0bcb854890f"/><file name="PartialMatchNode.php" hash="370c7e0ab8a445cfeef6b19ef1755f4d"/><file name="PartnerMerchant.php" hash="20c87322d040eac1abcdf12b8838ec1c"/><file name="PayPalAccount.php" hash="1bbe86a33bbf3e3620364ba0c2e9b6fe"/><file name="PayPalAccountGateway.php" hash="bdf94548085765927368c49bcf028f47"/><file name="PaymentInstrumentType.php" hash="84e2d2fcfe45cf7cf188dc46f302fac8"/><file name="PaymentMethod.php" hash="8aca88278367fcbd5404a0abae848a45"/><file name="PaymentMethodGateway.php" hash="ed81d66dcb097021c4f6518b9ea5e5cf"/><file name="PaymentMethodNonce.php" hash="a72e8ed6506327cdac92d8b082e4dd74"/><file name="PaymentMethodNonceGateway.php" hash="e8ee61d15b73bd2ef9efef8a6b5f4132"/><file name="Plan.php" hash="f73f24fcc57cfeb2e6f0e6312e531073"/><file name="PlanGateway.php" hash="8392fc6b714b30d16fe0308a1e81db4f"/><file name="RangeNode.php" hash="4ad9a92547423b3d54d69097114c3daf"/><file name="ResourceCollection.php" hash="8f437cb5014148c0e2f6049347ae795c"/><dir name="Result"><file name="CreditCardVerification.php" hash="27b965f1e197b0392879e24cccf6dd9c"/><file name="Error.php" hash="81b616e25f182c0c571ad4e9e6fbc611"/><file name="Successful.php" hash="56c6f9a3e5996d18e01a8d382cc03cde"/></dir><file name="RiskData.php" hash="dd74658f351fe8af26cee3016a076fb9"/><file name="SettlementBatchSummary.php" hash="0dcc2b5dd7071d9037cf5970fafe8668"/><file name="SettlementBatchSummaryGateway.php" hash="4ec1a7a1c8875693123430aa51410b22"/><file name="SignatureService.php" hash="4b78d3e5897e715dcc877c5f65b3cfae"/><dir name="Subscription"><file name="StatusDetails.php" hash="29e375f02150bfd7147591f0eb27cb4f"/></dir><file name="Subscription.php" hash="96db82b5b67a72d4287d79b7c691b3d7"/><file name="SubscriptionGateway.php" hash="34118ee95b83d8904a47b388cbb8cfea"/><file name="SubscriptionSearch.php" hash="1874ebe5cb42d7d2836617810cced1af"/><dir name="Test"><file name="CreditCardNumbers.php" hash="676a9100354eb679e7ca1e0f0d67293f"/><file name="MerchantAccount.php" hash="612e7e30cca364c0d14cbff3b54ebf3f"/><file name="Nonces.php" hash="89bb29ef4552037973fe04d344f657ef"/><file name="TransactionAmounts.php" hash="ed9bf1f57d871542c32d11de9e031f05"/><file name="VenmoSdk.php" hash="6ce94deccd1f968596011487c7e69cc7"/></dir><file name="TextNode.php" hash="94c95ec9645de57acace2179fef7fb43"/><dir name="Transaction"><file name="AddressDetails.php" hash="ff52a4a48248085b7ea92e992160e413"/><file name="ApplePayCardDetails.php" hash="c4dd87cd46fe7269e1bd51c867adf7cb"/><file name="CoinbaseDetails.php" hash="d19a625f8de98698b8277c25660358f0"/><file name="CreditCardDetails.php" hash="aac5eb1f5804d4f979b9c71f7b98cb36"/><file name="CustomerDetails.php" hash="e137895c646127312be44292c84a2d81"/><file name="PayPalDetails.php" hash="ede299e376bce7714838d79ca3d40842"/><file name="StatusDetails.php" hash="7c6e719c51bf13bdfd07615030100ac6"/><file name="SubscriptionDetails.php" hash="1cf1f511d1545a2e27b8d3f4bee800ca"/></dir><file name="Transaction.php" hash="9970a0fa9d6af3e543703426da99a3c4"/><file name="TransactionGateway.php" hash="37500b8a181a18375c171d4a5a4938c6"/><file name="TransactionSearch.php" hash="41dd086066fa57582161032249b3d8ee"/><file name="TransparentRedirect.php" hash="154c9850be5175a5cd1b35bdf78ae939"/><file name="TransparentRedirectGateway.php" hash="89f002df5a2abafcaa9676a3e2935c75"/><file name="UnknownPaymentMethod.php" hash="811394ea4bee98a651dc5e1cba8223da"/><file name="Util.php" hash="2cf47c3acd49da4a6c2b0a9a55701d7b"/><file name="Version.php" hash="1ebf13fcec95da846f917f74e030714b"/><file name="WebhookNotification.php" hash="f58be59156e5728f491da4235a58e994"/><file name="WebhookTesting.php" hash="c40311458bb64e37b4c08eb88df37805"/><dir name="Xml"><file name="Generator.php" hash="f82af40e5759c3d46909f3dec2498d02"/><file name="Parser.php" hash="4e6df3327a04915715333460733df93c"/></dir><file name="Xml.php" hash="dc69e05bea21e3d1185d45d53e4747db"/></dir><dir name="."><file name="Braintree.php" hash="ee3e665877882e5b5076ff51dc8111bd"/></dir><dir name="ssl"><file name="api_braintreegateway_com.ca.crt" hash="04beb23c767547e980c76eb68c7eab15"/><file name="sandbox_braintreegateway_com.ca.crt" hash="f1b529883c7c2cbb4251658f5da7b4c9"/></dir></target><target name="magelocale"><dir><dir name="en_US"><file name="Gene_Braintree.csv" hash="00ae6dc359bc0d9c48bfc90a865232a3"/></dir></dir></target></contents>
42
  <compatible/>
43
  <dependencies><required><php><min>5.2.1</min><max>6.0.0</max></php><package><name/><channel>connect.magentocommerce.com/core</channel><min/><max/></package></required></dependencies>
44
  </package>
1
  <?xml version="1.0"?>
2
  <package>
3
  <name>Gene_Braintree</name>
4
+ <version>1.0.2</version>
5
  <stability>stable</stability>
6
  <license uri="http://opensource.org/licenses/mit-license.php">MIT License</license>
7
  <channel>community</channel>
36
  &lt;/ul&gt;</description>
37
  <notes>Connect your Magento store to Braintree to accept Credit Cards &amp;amp; PayPal using V.Zero SDK</notes>
38
  <authors><author><name>Dave Macaulay</name><user>dave</user><email>magento@gene.co.uk</email></author></authors>
39
+ <date>2015-05-29</date>
40
+ <time>08:44:09</time>
41
+ <contents><target name="magecommunity"><dir name="Gene"><dir name="Braintree"><dir name="Block"><dir name="Adminhtml"><dir name="Report"><dir name="Transactions"><file name="Grid.php" hash="32b32086548f62ae4aca4baf456b9ed2"/><file name="Search.php" hash="81d57c3744530f36c37782ce9d0f3a70"/></dir><file name="Transactions.php" hash="7afe45b49353e52b432aa0392d76a08e"/></dir><dir name="System"><dir name="Config"><dir name="Braintree"><file name="Config.php" hash="eaaf6c74be4233a315d5aa5932f7c9ca"/><file name="Currency.php" hash="9ffa8a2ded53be75e88a60a024883b07"/><file name="Moduleversion.php" hash="fe3836bde24bb31c4c4585f2cd2f20ed"/><file name="Version.php" hash="ce58278a4faf965301cc2d8b2da4483c"/></dir></dir></dir></dir><dir name="Cart"><file name="Totals.php" hash="a03c441e8143896f92d02931a809f666"/></dir><dir name="Creditcard"><file name="Info.php" hash="adb06dab5fb625e4bf71e8cd62230f9c"/><file name="Threedsecure.php" hash="7848d4ecac743be985f328fa969318bf"/></dir><file name="Creditcard.php" hash="989678324ff3fcddcc99cbe4613019fa"/><file name="Js.php" hash="50cdd6d01eddfbdcc0061f4369cbeb58"/><dir name="Paypal"><file name="Info.php" hash="a0206fad8b91aa382c3ac16b9651c723"/></dir><file name="Paypal.php" hash="36294a461378cceee66e99d45753c6e1"/><file name="Saved.php" hash="74ed8e70a404a814b94f21f88c1ca737"/></dir><dir name="Helper"><file name="Data.php" hash="a5b64dd6760e881b1823adfaeb7c1501"/></dir><dir name="Model"><file name="Debug.php" hash="f3360f71e2346881f93424792ed9f209"/><file name="Observer.php" hash="176b48ac3b74bfaa3c28f4126093b49b"/><dir name="Paymentmethod"><file name="Abstract.php" hash="cebdcee57db8ed28760313b6078348c3"/><file name="Creditcard.php" hash="4c1256ff5aef5c958a5059e3a3d3a1b3"/><file name="Paypal.php" hash="f7802643b422628d09ae2b5ae03163fb"/></dir><file name="Saved.php" hash="3b235b454a3692d1c3d5343e2a1c91e9"/><dir name="Source"><file name="Cctype.php" hash="d76aa6c3a4bd798e3a47695f579d21d4"/><dir name="Creditcard"><file name="CaptureAction.php" hash="6444cfc430de44f06e85bd9c8b80d77b"/><file name="PaymentAction.php" hash="a2f3f3d36a98df4d12f76b6ab77f9c47"/></dir><file name="Environment.php" hash="02567d2ddba74d06ac000b4ddb12723a"/><dir name="Paypal"><file name="Locale.php" hash="8988ca77f9c2aa2d19ff0b614a4b7621"/><file name="Paymenttype.php" hash="fe1fe4ee89d5b7a87c7c28716bb2f1cb"/></dir></dir><dir name="System"><dir name="Config"><dir name="Backend"><file name="Currency.php" hash="73cb15b1de303e88c487db4c585ef94e"/></dir></dir></dir><dir name="Wrapper"><file name="Braintree.php" hash="203dbffc8be8e9827f92c971bdb15337"/></dir></dir><dir name="controllers"><dir name="Adminhtml"><file name="BraintreeController.php" hash="7c621fa1548c04e24bb1136bcbbe1d72"/></dir><file name="CheckoutController.php" hash="6c97fd8d9894cebcd1f5d839c0901dd5"/><file name="SavedController.php" hash="036e97703c853a5bae064dd7cf5030a8"/></dir><dir name="etc"><file name="adminhtml.xml" hash="c9c940beffa0ec19e4a1499a66f7fd12"/><file name="config.xml" hash="0394250964f9b7207d4e2d4f2c5e99d7"/><file name="system.xml" hash="01fc95e2c590d2fad81b007e361cfa63"/></dir><dir name="sql"><dir name="gene_braintree_setup"><file name="install-0.1.0.php" hash="7ef62b7c19b9da5990974da6edb3e77c"/></dir></dir></dir></dir></target><target name="magedesign"><dir name="frontend"><dir name="base"><dir name="default"><dir name="layout"><dir name="gene"><file name="braintree.xml" hash="1ded19331e4656bd31d052eb729ff7c2"/></dir></dir><dir name="template"><dir name="gene"><dir name="braintree"><dir name="creditcard"><file name="info.phtml" hash="2ae1e397b3a633dd305bc26c7b9c1065"/><file name="threedsecure.phtml" hash="ee8ad689afde041c39dd92ffa5274883"/></dir><file name="creditcard.phtml" hash="1d1795c1d29b37ac9cf090ad76f22bb5"/><dir name="customer"><file name="methods.phtml" hash="eb5e2d8f4a0f419fcf720c12062f808a"/><file name="saved.phtml" hash="691162b89ed085599f76072226ca2307"/></dir><dir name="js"><file name="amasty.phtml" hash="2f0601e50fc2fcf0ffe03a013737186c"/><file name="data.phtml" hash="7c77e2c13c9037ab993b7c7f8aa72d98"/><file name="default.phtml" hash="4fde57aa847f06bc02feaaf9097b1f57"/><file name="idev.phtml" hash="5fd739089dbe0191c1f44640f7ef2f76"/><file name="setup.phtml" hash="86a6da43f073b5fc75ce170a50af3bcd"/></dir><dir name="paypal"><file name="info.phtml" hash="5149b273730121e4dec3c3179820f747"/></dir><file name="paypal.phtml" hash="3c579ad7ba3290c15fcce027cdd66d16"/></dir></dir></dir></dir></dir></dir><dir name="adminhtml"><dir name="default"><dir name="default"><dir name="layout"><dir name="gene"><file name="braintree.xml" hash="1995e85eb47b909120ce8b9b537bf5db"/></dir></dir><dir name="template"><dir name="gene"><dir name="braintree"><dir name="creditcard"><file name="info.phtml" hash="3c5f033eb99ab8d78517ae5eb45a3a1a"/></dir><file name="creditcard.phtml" hash="0c6b7806732c336ead14fab596f1b923"/><file name="js.phtml" hash="0a66005bfd1452be665299b11b6fbf8b"/><dir name="paypal"><file name="info.phtml" hash="53fae03530369f101f5eaed49508a1ee"/></dir><dir name="transactions"><file name="index.phtml" hash="1791b6393f319616dd79c0b46e391847"/><file name="search.phtml" hash="1682ce6200681681f0ce3c848e2e6694"/></dir></dir></dir></dir></dir></dir></dir></target><target name="mageetc"><dir name="modules"><file name="Gene_Braintree.xml" hash="8c0ffda8566dca2f0b98a999921e3e55"/></dir></target><target name="mageweb"><dir name="js"><dir name="gene"><dir name="braintree"><file name="braintree.js" hash="4a074b2952d6e3c0052f85442b284abc"/><file name="vzero.js" hash="0ea7d83df34c94eae8fa9d1c112d6824"/></dir></dir></dir></target><target name="mageskin"><dir name="frontend"><dir name="base"><dir name="default"><dir name="images"><dir name="gene"><dir name="braintree"><file name="AE.png" hash="6b6f405105413b0723a62ee498f88bf6"/><file name="DI.png" hash="d8e3c3022dda9e723f466b8976ae428f"/><file name="JCB.png" hash="3aa9a71ed8a1d6610bbe0dfe2040e29e"/><file name="MC.png" hash="1fcd14928245139962b72f9368bdbe32"/><file name="ME.png" hash="b9389913c47b9546a67f907fcca73706"/><file name="PP.png" hash="b4946bccba574e86c9716a4986e21c36"/><file name="VI.png" hash="c9f74d1d54e61ab2c748f45a4bdface0"/><file name="card.png" hash="66e16f8c573fad93bb0d62258dce28bb"/><file name=".DS_Store" hash="194577a7e20bdcc7afbb718f502c134c"/></dir></dir></dir></dir></dir></dir></target><target name="magelib"><dir name="Braintree"><file name="AddOn.php" hash="07bc690cf426276dfdd802c49cfd72a3"/><file name="AddOnGateway.php" hash="ed9a94155c1c13ba37910fd48bdad40a"/><file name="Address.php" hash="1d4e7f964ed208a381b352d21fc370b8"/><file name="AddressGateway.php" hash="11716dc4ede8b7455197d08b88c91568"/><file name="ApplePayCard.php" hash="6fdbe99722514408f613c417e0e48711"/><file name="ClientToken.php" hash="f606f4bbafaea470333290be52b0030d"/><file name="ClientTokenGateway.php" hash="ede93fa63f0e96d296f315180f5ff1ad"/><file name="CoinbaseAccount.php" hash="7a4992ed13c26ad3785cf7d3455ef5fb"/><file name="Collection.php" hash="0e7d31ffcbd9780fb554186bd2c194b0"/><file name="Configuration.php" hash="6414dae20a80d926c28bd681bb535934"/><file name="CreditCard.php" hash="cf0aab2bcdcc7c231ccedc05a0f853e4"/><file name="CreditCardGateway.php" hash="3c5c3d9cee27da71e338b51d42b685ee"/><file name="CreditCardVerification.php" hash="48d6ea546914278f4bea2fefb75e7836"/><file name="CreditCardVerificationGateway.php" hash="e020dd1c26cd8c3bd7eb55eed2f72346"/><file name="CreditCardVerificationSearch.php" hash="baa6ed22471ea1f142a4195d1e36f89a"/><file name="Customer.php" hash="69d834344b93277dbeadb4ee6a881a60"/><file name="CustomerGateway.php" hash="bde59d4c6d7418fcbd87d4484384705b"/><file name="CustomerSearch.php" hash="8aacc83dac341cd9afec5a3deab17593"/><file name="Descriptor.php" hash="3f5db5e817280ce7f2fa18a205281ad9"/><file name="Digest.php" hash="9d12d067770f55b123b8498fce4478fa"/><file name="Disbursement.php" hash="589534043e466d17fede916fd7986edc"/><file name="DisbursementDetails.php" hash="ae632207d0982e288a83aed401c880d9"/><file name="Discount.php" hash="763b3f9cde0ff3af3e8795cac4097595"/><file name="DiscountGateway.php" hash="42ca6f2f11074ec18eecd1506996a393"/><dir name="Dispute"><file name="TransactionDetails.php" hash="7fdea673a1295055508f42286ad57f4e"/></dir><file name="Dispute.php" hash="2ee0f4a77b7cfec4763b55627a57e348"/><file name="EqualityNode.php" hash="cfd6aa184186233b8d6d1ec0f0e79298"/><dir name="Error"><file name="Codes.php" hash="d0d1007255af20889a4874d028ebeab2"/><file name="ErrorCollection.php" hash="e28d638db56524f5bf3609fa725e6d55"/><file name="Validation.php" hash="bf4e2198300019c52ba56f16269d66ce"/><file name="ValidationErrorCollection.php" hash="9ef25d0126a0b4f6951da5334ae6f0dc"/></dir><dir name="Exception"><file name="Authentication.php" hash="f9e13654988452cca2ac5228a80adae4"/><file name="Authorization.php" hash="5f8c017c6e9fd79a556dade8e15a72e8"/><file name="Configuration.php" hash="b50f67e8ea36cff0d9f6ad718126c6fc"/><file name="DownForMaintenance.php" hash="7fd30b1f8976ed7e38b7e9fae5c20f03"/><file name="ForgedQueryString.php" hash="6884dbae1e86767834b77c821df2db62"/><file name="InvalidSignature.php" hash="b83f5b16735cb3a8e0a8111c4f32711e"/><file name="NotFound.php" hash="f832f771d20b381c2780eb2a572b9f44"/><file name="SSLCaFileNotFound.php" hash="e927c7307bf1761814dc8a755238070d"/><file name="SSLCertificate.php" hash="d509b6a6206bd7c5563ac142dfe3801f"/><file name="ServerError.php" hash="b4645290229ab228a257047d08ef63d7"/><file name="Unexpected.php" hash="01ea2800fb91995ec2a15aee5024611e"/><file name="UpgradeRequired.php" hash="7f40b174df891cc3b3e206d1be884a58"/><file name="ValidationsFailed.php" hash="cd2d30c69911f81b55279c3d6bf88c61"/></dir><file name="Exception.php" hash="f14c94bf67206184eb3e4e7aeb4a608a"/><file name="Gateway.php" hash="8b214a63ed50539e75031caff78d4560"/><file name="Http.php" hash="5f6a9990a14684c82b6952937889412b"/><file name="Instance.php" hash="f0603b3f9213b53687e079c5621ac8f3"/><file name="IsNode.php" hash="e4b1f7bbfcbd24b1d08b97f94df592be"/><file name="KeyValueNode.php" hash="255595ec01a16906dd0c49faf67d9efb"/><dir name="MerchantAccount"><file name="AddressDetails.php" hash="1d265d864a884ebcf2504f55207cc0dd"/><file name="BusinessDetails.php" hash="c9ae627c4a4b526c2ecb0c07d70b3017"/><file name="FundingDetails.php" hash="7368f653fcbcc3d87924447b1763e616"/><file name="IndividualDetails.php" hash="68daf00759335cde82f176f0844e0d9b"/></dir><file name="MerchantAccount.php" hash="489844cfd91dcc6a53024af97b85f3c7"/><file name="MerchantAccountGateway.php" hash="6a9033758b8c02501fd835a96fc385b7"/><file name="Modification.php" hash="fcce6784af2e658affe4a67ca75d8230"/><file name="MultipleValueNode.php" hash="92700fa03011eaa9561010b3a160449c"/><file name="MultipleValueOrTextNode.php" hash="ef06bac18e2bc40974bdc0bcb854890f"/><file name="PartialMatchNode.php" hash="370c7e0ab8a445cfeef6b19ef1755f4d"/><file name="PartnerMerchant.php" hash="20c87322d040eac1abcdf12b8838ec1c"/><file name="PayPalAccount.php" hash="1bbe86a33bbf3e3620364ba0c2e9b6fe"/><file name="PayPalAccountGateway.php" hash="bdf94548085765927368c49bcf028f47"/><file name="PaymentInstrumentType.php" hash="84e2d2fcfe45cf7cf188dc46f302fac8"/><file name="PaymentMethod.php" hash="8aca88278367fcbd5404a0abae848a45"/><file name="PaymentMethodGateway.php" hash="ed81d66dcb097021c4f6518b9ea5e5cf"/><file name="PaymentMethodNonce.php" hash="a72e8ed6506327cdac92d8b082e4dd74"/><file name="PaymentMethodNonceGateway.php" hash="e8ee61d15b73bd2ef9efef8a6b5f4132"/><file name="Plan.php" hash="f73f24fcc57cfeb2e6f0e6312e531073"/><file name="PlanGateway.php" hash="8392fc6b714b30d16fe0308a1e81db4f"/><file name="RangeNode.php" hash="4ad9a92547423b3d54d69097114c3daf"/><file name="ResourceCollection.php" hash="8f437cb5014148c0e2f6049347ae795c"/><dir name="Result"><file name="CreditCardVerification.php" hash="27b965f1e197b0392879e24cccf6dd9c"/><file name="Error.php" hash="81b616e25f182c0c571ad4e9e6fbc611"/><file name="Successful.php" hash="56c6f9a3e5996d18e01a8d382cc03cde"/></dir><file name="RiskData.php" hash="dd74658f351fe8af26cee3016a076fb9"/><file name="SettlementBatchSummary.php" hash="0dcc2b5dd7071d9037cf5970fafe8668"/><file name="SettlementBatchSummaryGateway.php" hash="4ec1a7a1c8875693123430aa51410b22"/><file name="SignatureService.php" hash="4b78d3e5897e715dcc877c5f65b3cfae"/><dir name="Subscription"><file name="StatusDetails.php" hash="29e375f02150bfd7147591f0eb27cb4f"/></dir><file name="Subscription.php" hash="96db82b5b67a72d4287d79b7c691b3d7"/><file name="SubscriptionGateway.php" hash="34118ee95b83d8904a47b388cbb8cfea"/><file name="SubscriptionSearch.php" hash="1874ebe5cb42d7d2836617810cced1af"/><dir name="Test"><file name="CreditCardNumbers.php" hash="676a9100354eb679e7ca1e0f0d67293f"/><file name="MerchantAccount.php" hash="612e7e30cca364c0d14cbff3b54ebf3f"/><file name="Nonces.php" hash="89bb29ef4552037973fe04d344f657ef"/><file name="TransactionAmounts.php" hash="ed9bf1f57d871542c32d11de9e031f05"/><file name="VenmoSdk.php" hash="6ce94deccd1f968596011487c7e69cc7"/></dir><file name="TextNode.php" hash="94c95ec9645de57acace2179fef7fb43"/><dir name="Transaction"><file name="AddressDetails.php" hash="ff52a4a48248085b7ea92e992160e413"/><file name="ApplePayCardDetails.php" hash="c4dd87cd46fe7269e1bd51c867adf7cb"/><file name="CoinbaseDetails.php" hash="d19a625f8de98698b8277c25660358f0"/><file name="CreditCardDetails.php" hash="aac5eb1f5804d4f979b9c71f7b98cb36"/><file name="CustomerDetails.php" hash="e137895c646127312be44292c84a2d81"/><file name="PayPalDetails.php" hash="ede299e376bce7714838d79ca3d40842"/><file name="StatusDetails.php" hash="7c6e719c51bf13bdfd07615030100ac6"/><file name="SubscriptionDetails.php" hash="1cf1f511d1545a2e27b8d3f4bee800ca"/></dir><file name="Transaction.php" hash="9970a0fa9d6af3e543703426da99a3c4"/><file name="TransactionGateway.php" hash="37500b8a181a18375c171d4a5a4938c6"/><file name="TransactionSearch.php" hash="41dd086066fa57582161032249b3d8ee"/><file name="TransparentRedirect.php" hash="154c9850be5175a5cd1b35bdf78ae939"/><file name="TransparentRedirectGateway.php" hash="89f002df5a2abafcaa9676a3e2935c75"/><file name="UnknownPaymentMethod.php" hash="811394ea4bee98a651dc5e1cba8223da"/><file name="Util.php" hash="2cf47c3acd49da4a6c2b0a9a55701d7b"/><file name="Version.php" hash="1ebf13fcec95da846f917f74e030714b"/><file name="WebhookNotification.php" hash="f58be59156e5728f491da4235a58e994"/><file name="WebhookTesting.php" hash="c40311458bb64e37b4c08eb88df37805"/><dir name="Xml"><file name="Generator.php" hash="f82af40e5759c3d46909f3dec2498d02"/><file name="Parser.php" hash="4e6df3327a04915715333460733df93c"/></dir><file name="Xml.php" hash="dc69e05bea21e3d1185d45d53e4747db"/></dir><dir name="."><file name="Braintree.php" hash="ee3e665877882e5b5076ff51dc8111bd"/></dir><dir name="ssl"><file name="api_braintreegateway_com.ca.crt" hash="04beb23c767547e980c76eb68c7eab15"/><file name="sandbox_braintreegateway_com.ca.crt" hash="f1b529883c7c2cbb4251658f5da7b4c9"/></dir></target><target name="magelocale"><dir><dir name="en_US"><file name="Gene_Braintree.csv" hash="00ae6dc359bc0d9c48bfc90a865232a3"/></dir></dir></target></contents>
42
  <compatible/>
43
  <dependencies><required><php><min>5.2.1</min><max>6.0.0</max></php><package><name/><channel>connect.magentocommerce.com/core</channel><min/><max/></package></required></dependencies>
44
  </package>