CardAccessServices_Casmtp - Version 1.1.0

Version Notes

Release 1.1.0

Introduces a mechanism to send custom Key Value Pairs (KVP) to CASMTP by mapping Magento configuration paths to CASMTP KVPs.

The mapping is specified in the package's Config KVP Map configuration area.

At the time of a transaction, the value associated with each configuration path is retrieved and sent as the value of the corresponding KVP.

Download this release

Release Info

Developer Card Access Services
Extension CardAccessServices_Casmtp
Version 1.1.0
Comparing to
See all releases


Code changes from version 1.0.1 to 1.1.0

app/code/community/CardAccessServices/Casmtp/Block/Adminhtml/System/Config/ConfigKvpMap.php ADDED
@@ -0,0 +1,43 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Card Access Services CASMTP
4
+ *
5
+ * Copyright 2013 Card Access Services
6
+ *
7
+ * Licensed under the Apache License, Version 2.0 (the "License");
8
+ * you may not use this file except in compliance with the License.
9
+ * You may obtain a copy of the License at
10
+ *
11
+ * http://www.apache.org/licenses/LICENSE-2.0
12
+ *
13
+ * Unless required by applicable law or agreed to in writing, software
14
+ * distributed under the License is distributed on an "AS IS" BASIS,
15
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ * See the License for the specific language governing permissions and
17
+ * limitations under the License.
18
+ *
19
+ * @author Card Access Services
20
+ * @copyright Copyright (c) 2013 Card Access Services (http://www.cardaccess.com.au)
21
+ * @license http://opensource.org/licenses/Apache-2.0 Apache Software License (ASL 2.0)
22
+ */
23
+
24
+ /**
25
+ * Magento config path to CASMTP KVP key renderer.
26
+ */
27
+ class CardAccessServices_Casmtp_Block_Adminhtml_System_Config_ConfigKvpMap extends Mage_Adminhtml_Block_System_Config_Form_Field_Array_Abstract
28
+ {
29
+ public function __construct()
30
+ {
31
+ $this->addColumn('kvp_key', array(
32
+ 'label' => Mage::helper('adminhtml')->__('CASMTP KVP Key'),
33
+ 'style' => 'width:150px',
34
+ ));
35
+ $this->addColumn('config_path', array(
36
+ 'label' => Mage::helper('adminhtml')->__('Magento Config Path'),
37
+ 'style' => 'width:160px',
38
+ ));
39
+ $this->_addAfter = false;
40
+ $this->_addButtonLabel = Mage::helper('adminhtml')->__('Add Mapping');
41
+ parent::__construct();
42
+ }
43
+ }
app/code/community/CardAccessServices/Casmtp/Model/Adminhtml/System/Config/Backend/ConfigKvpMap.php ADDED
@@ -0,0 +1,73 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Card Access Services CASMTP
4
+ *
5
+ * Copyright 2013 Card Access Services
6
+ *
7
+ * Licensed under the Apache License, Version 2.0 (the "License");
8
+ * you may not use this file except in compliance with the License.
9
+ * You may obtain a copy of the License at
10
+ *
11
+ * http://www.apache.org/licenses/LICENSE-2.0
12
+ *
13
+ * Unless required by applicable law or agreed to in writing, software
14
+ * distributed under the License is distributed on an "AS IS" BASIS,
15
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ * See the License for the specific language governing permissions and
17
+ * limitations under the License.
18
+ *
19
+ * @author Card Access Services
20
+ * @copyright Copyright (c) 2013 Card Access Services (http://www.cardaccess.com.au)
21
+ * @license http://opensource.org/licenses/Apache-2.0 Apache Software License (ASL 2.0)
22
+ */
23
+
24
+ /**
25
+ * Backend for serialized array data
26
+ *
27
+ */
28
+ class CardAccessServices_Casmtp_Model_Adminhtml_System_Config_Backend_ConfigKvpMap extends Mage_Adminhtml_Model_System_Config_Backend_Serialized
29
+ {
30
+ /**
31
+ * Unset array element with '__empty' key
32
+ * Trim whitespace from all keys and values.
33
+ * Emit warnings for duplicate keys, masked defaults, and empty values.
34
+ * Prevent entry of empty keys.
35
+ */
36
+ protected function _beforeSave()
37
+ {
38
+ $config_kvp_map = $this->getValue();
39
+ if (is_array($config_kvp_map)) {
40
+ unset($config_kvp_map['__empty']);
41
+ }
42
+
43
+ $kvps = $kvps_seen = array();
44
+ foreach ($config_kvp_map as $config_kvp) {
45
+ $kvp_key = trim($config_kvp['kvp_key']);
46
+ if (empty($kvp_key))
47
+ Mage::throwException(Mage::helper('casmtp')->__('A KVP key was missing. The configuration has not been saved.'));
48
+
49
+ $config_path = trim($config_kvp['config_path']);
50
+ if (empty($config_path))
51
+ $warnings[] = 'Empty config path for KVP "' . $kvp_key . '".';
52
+
53
+ if (in_array($kvp_key, $kvps_seen))
54
+ $warnings[] = 'Duplicate KVP key "' . $kvp_key . '" <i>(The last valid one defined will be used)</i>';
55
+
56
+ if ($kvp_key == 'CAS.CUSTREF')
57
+ $warnings[] = 'CAS.CUSTREF will mask the default order number value <i>(Use this only if you know what you are doing)</i>';
58
+
59
+ $kvps_seen[] = $kvp_key;
60
+ $kvps[] = array('kvp_key' => $kvp_key,
61
+ 'config_path' => $config_path,);
62
+ }
63
+
64
+ if (!empty($warnings)) {
65
+ $session = Mage::getSingleton('adminhtml/session');
66
+ foreach (array_unique($warnings) as $warning)
67
+ $session->addWarning(Mage::helper('casmtp')->__($warning));
68
+ }
69
+
70
+ $this->setValue($kvps);
71
+ parent::_beforeSave();
72
+ }
73
+ }
app/code/community/CardAccessServices/Casmtp/Model/PaymentMethod.php CHANGED
@@ -353,6 +353,54 @@ class CardAccessServices_Casmtp_Model_PaymentMethod extends Mage_Payment_Model_M
353
  return $this;
354
  }
355
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
356
  /**
357
  * Perform a capture of the transaction
358
  *
@@ -363,8 +411,10 @@ class CardAccessServices_Casmtp_Model_PaymentMethod extends Mage_Payment_Model_M
363
  * @access public
364
  */
365
  public function capture(Varien_Object $payment, $amount) {
366
- $cust_ref = CasMiscUtil::getCustRefFromPayment($payment);
367
  $this->_logPaymentEvent($payment, "capture invoked");
 
 
 
368
  $casmtp = $this->_createCasmtp();
369
 
370
  /* Get an audit number first */
@@ -377,10 +427,10 @@ class CardAccessServices_Casmtp_Model_PaymentMethod extends Mage_Payment_Model_M
377
  $expiry = CasMiscUtil::formatExpiryFromPayment($payment);
378
  $this->_logPaymentEvent($payment, "starting capture for $audit (pan = xxxx-" . $payment->getCcLast4() . ", amount = $amount)");
379
 
380
- $result = $casmtp->purchase($audit, $pan, $expiry, $cvv, CasMiscUtil::flattenAmount($amount), $cust_ref);
381
  }
382
  catch (Exception $e) {
383
- /* This usually indicates some kind of wierd networking issue */
384
  Mage::log("$this->_code $cust_ref: error encountered: " . $e->getMessage());
385
  Mage::throwException(Mage::helper('casmtp')->__("There was an error encountered while performing the transaction"));
386
  }
@@ -401,11 +451,12 @@ class CardAccessServices_Casmtp_Model_PaymentMethod extends Mage_Payment_Model_M
401
  * @access public
402
  */
403
  public function refund(Varien_Object $payment, $amount) {
404
- $cust_ref = CasMiscUtil::getCustRefFromPayment($payment);
405
  $this->_logPaymentEvent($payment, "refund invoked");
406
 
 
 
407
  /*
408
- * Filter out zero amounts just in case the care framework doesn't do this
409
  *
410
  * The gateway has no issue with this, but it's probably less confusing to the merchant if we block off
411
  * the transaction immediately
@@ -428,7 +479,7 @@ class CardAccessServices_Casmtp_Model_PaymentMethod extends Mage_Payment_Model_M
428
  /* Do the refund */
429
  try {
430
  $this->_logPaymentEvent($payment, "starting refund for $audit (pan = xxxx-" . $payment->getCcLast4() . ", amount = $amount)");
431
- $result = $casmtp->refund($audit, $old_audit, CasMiscUtil::flattenAmount($amount));
432
  }
433
  catch (Exception $e) {
434
  // This usually indicates some kind of wierd networking issue
353
  return $this;
354
  }
355
 
356
+ /**
357
+ * Construct an array of KVPs to send to CASMTP.
358
+ * This maps Magento config values defined by their config path to CASMTP KVPs.
359
+ * The KVP keys and config paths are stored in config path "config_kvp_map".
360
+ *
361
+ * @param boolean $log_kvps whether to log the final set of KVPs
362
+ *
363
+ * @return array the KVPs
364
+ * @access private
365
+ */
366
+ private function _get_config_kvps($log_kvps=false) {
367
+ $kvps = array();
368
+ $config_kvp_map = unserialize($this->_getConfig("config_kvp_map"));
369
+ if (is_array($config_kvp_map)) {
370
+ foreach ($config_kvp_map as $config_kvp) {
371
+ $config_path = trim($config_kvp['config_path']);
372
+ $kvp_key = trim($config_kvp['kvp_key']);
373
+ if (empty($config_path))
374
+ Mage::Log('casmtp: empty config path for KVP key "' . $kvp_key . '", ignored', Zend_Log::WARN);
375
+ elseif (empty($kvp_key))
376
+ Mage::Log('casmtp: empty KVP key for config path "' . $config_path . '", ignored', Zend_Log::WARN);
377
+ else {
378
+ $config_value = trim(Mage::getStoreConfig($config_path));
379
+ if (empty($config_value))
380
+ Mage::Log('casmtp: config path "' . $config_path . '" not found or contains an empty value', Zend_Log::WARN);
381
+ else {
382
+ if (strlen($kvp_key) > Casmtp::MAX_KVP_KEY_LENGTH) {
383
+ Mage::Log('casmtp: KVP key "' . $kvp_key . '" truncated (max ' . Casmtp::MAX_KVP_KEY_LENGTH . ')', Zend_Log::WARN);
384
+ $kvp_key = substr($kvp_key, 0, Casmtp::MAX_KVP_KEY_LENGTH);
385
+ }
386
+ if (strlen($config_value) > Casmtp::MAX_KVP_VALUE_LENGTH) {
387
+ Mage::Log('casmtp: KVP value "' . $config_value . '" truncated (max ' . Casmtp::MAX_KVP_VALUE_LENGTH . ')', Zend_Log::WARN);
388
+ $config_value = substr($config_value, 0, Casmtp::MAX_KVP_VALUE_LENGTH);
389
+ }
390
+ if (array_key_exists($kvp_key, $kvps))
391
+ Mage::Log('casmtp: duplicate KVP key "' . $kvp_key . '" overriding value with "' . $config_value . '"', Zend_Log::WARN);
392
+ $kvps[$kvp_key] = $config_value;
393
+ }
394
+ }
395
+ }
396
+ }
397
+
398
+ if ($log_kvps)
399
+ Mage::Log('casmtp: config kvps = ' . print_r($kvps, true));
400
+
401
+ return $kvps;
402
+ }
403
+
404
  /**
405
  * Perform a capture of the transaction
406
  *
411
  * @access public
412
  */
413
  public function capture(Varien_Object $payment, $amount) {
 
414
  $this->_logPaymentEvent($payment, "capture invoked");
415
+
416
+ $cust_ref = CasMiscUtil::getCustRefFromPayment($payment);
417
+
418
  $casmtp = $this->_createCasmtp();
419
 
420
  /* Get an audit number first */
427
  $expiry = CasMiscUtil::formatExpiryFromPayment($payment);
428
  $this->_logPaymentEvent($payment, "starting capture for $audit (pan = xxxx-" . $payment->getCcLast4() . ", amount = $amount)");
429
 
430
+ $result = $casmtp->purchase($audit, $pan, $expiry, $cvv, CasMiscUtil::flattenAmount($amount), $cust_ref, $this->_get_config_kvps(true));
431
  }
432
  catch (Exception $e) {
433
+ /* This usually indicates some kind of weird networking issue */
434
  Mage::log("$this->_code $cust_ref: error encountered: " . $e->getMessage());
435
  Mage::throwException(Mage::helper('casmtp')->__("There was an error encountered while performing the transaction"));
436
  }
451
  * @access public
452
  */
453
  public function refund(Varien_Object $payment, $amount) {
 
454
  $this->_logPaymentEvent($payment, "refund invoked");
455
 
456
+ $cust_ref = CasMiscUtil::getCustRefFromPayment($payment);
457
+
458
  /*
459
+ * Filter out zero amounts just in case the core framework doesn't do this
460
  *
461
  * The gateway has no issue with this, but it's probably less confusing to the merchant if we block off
462
  * the transaction immediately
479
  /* Do the refund */
480
  try {
481
  $this->_logPaymentEvent($payment, "starting refund for $audit (pan = xxxx-" . $payment->getCcLast4() . ", amount = $amount)");
482
+ $result = $casmtp->refund($audit, $old_audit, CasMiscUtil::flattenAmount($amount), $cust_ref, $this->_get_config_kvps(true));
483
  }
484
  catch (Exception $e) {
485
  // This usually indicates some kind of wierd networking issue
app/code/community/CardAccessServices/Casmtp/casmtpprotocol.php CHANGED
@@ -397,12 +397,30 @@ class Casmtp {
397
  /**
398
  * The default HTTP timeout
399
  *
400
- * @var string
401
  * @access public
402
  * @const
403
  */
404
  const DEFAULT_HTTPS_TIMEOUT = 120;
405
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
406
  /**
407
  * Constructor
408
  *
@@ -474,10 +492,12 @@ class Casmtp {
474
  * @return void
475
  * @access public
476
  */
477
- public function purchase($audit, $pan, $expiry, $cvv, $amt, $custref = "") {
478
  /* Send the request */
479
- $kvps = array('CAS.AUDIT' => $audit);
480
- if (!empty($custref)) {
 
 
481
  $kvps['CAS.CUSTREF'] = $custref;
482
  }
483
  if (!empty($cvv)) {
@@ -521,11 +541,15 @@ class Casmtp {
521
  * @return void
522
  * @access public
523
  */
524
- public function refund($audit, $audit_to_refund, $amt, $custref = "") {
525
  /* Send request */
526
- $kvps = array('CAS.AUDIT' => $audit, 'CAS.REFUNDAUDIT' => $audit_to_refund);
527
- if (!empty($custref))
 
 
 
528
  $kvps['CAS.CUSTREF'] = $custref;
 
529
  $resp = $this->_sendRequest(
530
  array(
531
  'dataformat' => 'HTTP_AS2805',
397
  /**
398
  * The default HTTP timeout
399
  *
400
+ * @var integer
401
  * @access public
402
  * @const
403
  */
404
  const DEFAULT_HTTPS_TIMEOUT = 120;
405
 
406
+ /**
407
+ * Maximum KVP key length
408
+ *
409
+ * @var integer
410
+ * @access public
411
+ * @const
412
+ */
413
+ const MAX_KVP_KEY_LENGTH = 128;
414
+
415
+ /**
416
+ * Maximum KVP value length
417
+ *
418
+ * @var integer
419
+ * @access public
420
+ * @const
421
+ */
422
+ const MAX_KVP_VALUE_LENGTH = 512;
423
+
424
  /**
425
  * Constructor
426
  *
492
  * @return void
493
  * @access public
494
  */
495
+ public function purchase($audit, $pan, $expiry, $cvv, $amt, $custref="", $extra_kvps=array()) {
496
  /* Send the request */
497
+ $kvps = is_array($extra_kvps) ? $extra_kvps : array();
498
+ $kvps['CAS.AUDIT'] = $audit;
499
+ if (!empty($custref) && !array_key_exists('CAS.CUSTREF', $kvps)) {
500
+ /* allow custom kvps to override default CAS.CUSTREF */
501
  $kvps['CAS.CUSTREF'] = $custref;
502
  }
503
  if (!empty($cvv)) {
541
  * @return void
542
  * @access public
543
  */
544
+ public function refund($audit, $audit_to_refund, $amt, $custref="", $extra_kvps=array()) {
545
  /* Send request */
546
+ $kvps = is_array($extra_kvps) ? $extra_kvps : array();
547
+ $kvps['CAS.AUDIT'] = $audit;
548
+ $kvps['CAS.REFUNDAUDIT'] = $audit_to_refund;
549
+ if (!empty($custref) && !array_key_exists('CAS.CUSTREF', $kvps)) {
550
+ /* allow custom kvps to override default CAS.CUSTREF */
551
  $kvps['CAS.CUSTREF'] = $custref;
552
+ }
553
  $resp = $this->_sendRequest(
554
  array(
555
  'dataformat' => 'HTTP_AS2805',
app/code/community/CardAccessServices/Casmtp/etc/system.xml CHANGED
@@ -4,7 +4,7 @@
4
  <payment>
5
  <groups>
6
  <casmtp translate="label">
7
- <label>Card Access Services (Merchant Hosted)</label>
8
  <comment><![CDATA[<a href="http://www.cardaccess.com.au" target="_blank">For more information please visit http://www.cardaccess.com.au</a>]]></comment>
9
  <sort_order>1</sort_order>
10
  <show_in_default>1</show_in_default>
@@ -166,6 +166,16 @@
166
  <show_in_website>1</show_in_website>
167
  <show_in_store>1</show_in_store>
168
  </log_events>
 
 
 
 
 
 
 
 
 
 
169
  </fields>
170
  </casmtp>
171
  </groups>
4
  <payment>
5
  <groups>
6
  <casmtp translate="label">
7
+ <label>Card Access Services <![CDATA[<i>(Merchant Hosted)</i>]]></label>
8
  <comment><![CDATA[<a href="http://www.cardaccess.com.au" target="_blank">For more information please visit http://www.cardaccess.com.au</a>]]></comment>
9
  <sort_order>1</sort_order>
10
  <show_in_default>1</show_in_default>
166
  <show_in_website>1</show_in_website>
167
  <show_in_store>1</show_in_store>
168
  </log_events>
169
+ <config_kvp_map translate="comment">
170
+ <label>Config KVP Map</label>
171
+ <frontend_model>casmtp/adminhtml_system_config_ConfigKvpMap</frontend_model>
172
+ <backend_model>casmtp/adminhtml_system_config_backend_ConfigKvpMap</backend_model>
173
+ <sort_order>20</sort_order>
174
+ <show_in_default>1</show_in_default>
175
+ <show_in_website>1</show_in_website>
176
+ <show_in_store>1</show_in_store>
177
+ <comment><![CDATA[Map configuration values to CASMTP KVPs.<br>The value stored for each Magento configuration path will be sent to CASMTP using the given Key Value Pair (KVP) key.]]></comment>
178
+ </config_kvp_map>
179
  </fields>
180
  </casmtp>
181
  </groups>
package.xml CHANGED
@@ -1,24 +1,29 @@
1
  <?xml version="1.0"?>
2
  <package>
3
  <name>CardAccessServices_Casmtp</name>
4
- <version>1.0.1</version>
5
  <stability>stable</stability>
6
  <license uri="http://opensource.org/licenses/Apache-2.0">Apache Software License (ASL)</license>
7
  <channel>community</channel>
8
  <extends/>
9
- <summary>Merchant hosted transaction processing using the Card Access Services gateway</summary>
10
- <description>This gateway extension allows you to process merchant hosted transactions through the Card Access Services payment&#xD;
11
  &#xD;
12
- You will need a compatible merchant account with any of the numerous financial institutions we are connected to worldwide, as well as an account with us&#xD;
13
  &#xD;
14
- Please contact info@cardaccess.com.au (http://www.cardaccess.com.au) for more information&#xD;
15
  </description>
16
- <notes>Release 1.0.1&#xD;
17
- - renamed to be consistent with rest of doco</notes>
18
- <authors><author><name>Card Access Services</name><user>cardaccessservices</user><email>techadmin@rt.cardaccess.com.au</email></author></authors>
19
- <date>2012-06-27</date>
20
- <time>01:09:12</time>
21
- <contents><target name="mageetc"><dir name="modules"><file name="CardAccessServices_Casmtp.xml" hash="78d9b601cf91a93dddc4356edff54870"/></dir></target><target name="magecommunity"><dir name="CardAccessServices"><dir name="Casmtp"><dir name="Helper"><file name="Data.php" hash="018d64d703c1eb68c28068c0de721cbc"/></dir><dir name="Model"><file name="PaymentMethod.php" hash="3c3b66c09004e2a4d8b9dcdcee7d2013"/></dir><file name="casmiscutil.php" hash="23e8224f830b7041a69290d642db27e1"/><file name="casmtpprotocol.php" hash="09dc63f173f10e2fdd4b8c8cf02d53bf"/><dir name="etc"><file name="config.xml" hash="d0d79f8c09fea654b36497fcfb9ab2e3"/><file name="system.xml" hash="e90a5197cfe90c13c54b0a5f85e7b2b1"/></dir></dir></dir></target></contents>
 
 
 
 
 
22
  <compatible/>
23
  <dependencies><required><php><min>5.1.2</min><max>6.0.0</max></php><extension><name>hash</name><min>1.1</min><max></max></extension></required></dependencies>
24
  </package>
1
  <?xml version="1.0"?>
2
  <package>
3
  <name>CardAccessServices_Casmtp</name>
4
+ <version>1.1.0</version>
5
  <stability>stable</stability>
6
  <license uri="http://opensource.org/licenses/Apache-2.0">Apache Software License (ASL)</license>
7
  <channel>community</channel>
8
  <extends/>
9
+ <summary>Merchant hosted transaction processing using the Card Access Services gateway.</summary>
10
+ <description>This gateway extension allows you to process merchant hosted transactions through the Card Access Services payment.&#xD;
11
  &#xD;
12
+ You will need a compatible merchant account with any of the numerous financial institutions we are connected to worldwide, as well as an account with us.&#xD;
13
  &#xD;
14
+ Please contact info@cardaccess.com.au (http://www.cardaccess.com.au) for more information.&#xD;
15
  </description>
16
+ <notes>Release 1.1.0&#xD;
17
+ &#xD;
18
+ Introduces a mechanism to send custom Key Value Pairs (KVP) to CASMTP by mapping Magento configuration paths to CASMTP KVPs.&#xD;
19
+ &#xD;
20
+ The mapping is specified in the package's &lt;i&gt;Config KVP Map&lt;/i&gt; configuration area.&#xD;
21
+ &#xD;
22
+ At the time of a transaction, the value associated with each configuration path is retrieved and sent as the value of the corresponding KVP.</notes>
23
+ <authors><author><name>Card Access Services</name><user>cardaccessservices</user><email>techadmin@rt.cardaccess.com.au</email></author><author><name>Malcolm Hawke</name><user>mhawke</user><email>mhawke@cardaccess.com.au</email></author></authors>
24
+ <date>2013-10-01</date>
25
+ <time>08:02:11</time>
26
+ <contents><target name="mageetc"><dir name="modules"><file name="CardAccessServices_Casmtp.xml" hash="78d9b601cf91a93dddc4356edff54870"/></dir></target><target name="magecommunity"><dir name="CardAccessServices"><dir name="Casmtp"><dir name="Block"><dir name="Adminhtml"><dir name="System"><dir name="Config"><file name="ConfigKvpMap.php" hash="0986e94aa76b7dc566647b4a9431b556"/></dir></dir></dir></dir><dir name="Helper"><file name="Data.php" hash="018d64d703c1eb68c28068c0de721cbc"/></dir><dir name="Model"><dir name="Adminhtml"><dir name="System"><dir name="Config"><dir name="Backend"><file name="ConfigKvpMap.php" hash="cdef5b1236e6bebe1e9ceaf0f6bd1ae7"/></dir></dir></dir></dir><file name="PaymentMethod.php" hash="9718883bcac2257ccba34464f6ae7438"/></dir><file name="casmiscutil.php" hash="23e8224f830b7041a69290d642db27e1"/><file name="casmtpprotocol.php" hash="626770a991c6e0daeab0c2c09cd25587"/><dir name="etc"><file name="config.xml" hash="d0d79f8c09fea654b36497fcfb9ab2e3"/><file name="system.xml" hash="cfc03ad79749bcd2772030b8d5547d24"/></dir></dir></dir></target></contents>
27
  <compatible/>
28
  <dependencies><required><php><min>5.1.2</min><max>6.0.0</max></php><extension><name>hash</name><min>1.1</min><max></max></extension></required></dependencies>
29
  </package>