multon_everypay - Version 1.2.0

Version Notes

1.2.0
API protocol update
FIX: remove SID from callback_url

1.1.1
Use billing address if shipping address not present (downloadable products)

1.1.0
Converted to stand-alone community extension

1.0.6
Description and contact info

1.0.5
API protocol update: separated fail/cancelled transaction status

1.0.4
API protocol update

1.0.3
add account id

1.0.2
FIX: return url
FIX: return verification
new gateway url

1.0.1
FIX: redirect template

1.0.0
Stable release

Download this release

Release Info

Developer Multon
Extension multon_everypay
Version 1.2.0
Comparing to
See all releases


Code changes from version 1.1.0 to 1.2.0

app/code/community/Multon/Everypay/Block/Everypay.php CHANGED
@@ -4,21 +4,22 @@ class Multon_Everypay_Block_Everypay extends Mage_Payment_Block_Form
4
  {
5
  protected $_code = 'multon_everypay';
6
  protected $_gateway = 'everypay';
 
7
 
8
  protected function getReturnUrl()
9
  {
10
- return Mage::getUrl('everypay/everypay/return');
11
  }
12
 
13
- /**
14
- * Returns payment gateway URL
15
- *
16
- * @return string Gateway URL
17
- */
18
- public function getGatewayUrl()
19
- {
20
- return Mage::getStoreConfig('payment/' . $this->_code . '/gateway_url');
21
- }
22
 
23
  /**
24
  * Returns payment method logo URL
@@ -30,44 +31,43 @@ class Multon_Everypay_Block_Everypay extends Mage_Payment_Block_Form
30
  return $this->getSkinUrl('images/multon/everypay/mastercard_visa_acceptance.jpg');
31
  }
32
 
33
- /**
34
- * Adds payment mehtod logotypes after method name
35
- *
36
- * @return string
37
- */
38
- public function getMethodLabelAfterHtml()
39
- {
40
  if (Mage::getStoreConfig('payment/' . $this->_code . '/hide_logo'))
41
- return '';
42
-
43
- $blockHtml = sprintf(
44
- '<img src="%1$s"
45
  title="%2$s"
46
  alt="%2$s"
47
- class="payment-method-logo"/>',
48
- $this->getMethodLogoUrl(), ucfirst($this->_gateway)
49
- );
50
- return $blockHtml;
51
- }
52
-
53
- /**
54
- * Checks if quick redirect is enabled and
55
- * returns javascript block that redirects user
56
- * to bank without intermediate page
57
- *
58
- * @return outstr Javascript block
59
- */
60
- public function getQuickRedirectScript()
61
- {
62
- $outstr = '';
63
- if (Mage::getStoreConfig('payment/' . $this->_code . '/quick_redirect'))
64
  {
65
- $outstr = '<script type="text/javascript"><!--
66
  if($("GatewayForm")){$("GatewayForm").submit();}
67
  //--></script>';
68
- }
69
- return $outstr;
70
- }
71
 
72
  /**
73
  * Populates and returns array of fields to be submitted
@@ -95,6 +95,9 @@ class Multon_Everypay_Block_Everypay extends Mage_Payment_Block_Form
95
 
96
  $billing = $order->getBillingAddress();
97
  $shipping = $order->getShippingAddress();
 
 
 
98
 
99
  $fields = array(
100
  'account_id' => Mage::getStoreConfig('payment/' . $this->_code . '/account_id'),
@@ -111,6 +114,8 @@ class Multon_Everypay_Block_Everypay extends Mage_Payment_Block_Form
111
  'delivery_country' => $shipping->getCountry(),
112
  'delivery_postcode' => $shipping->getPostcode(),
113
  'email' => $billing->getEmail(),
 
 
114
  'nonce' => $this->getNonce(),
115
  'order_reference' => $order->getIncrementId(),
116
  'timestamp' => time(),
4
  {
5
  protected $_code = 'multon_everypay';
6
  protected $_gateway = 'everypay';
7
+ protected $logFile = 'everypay.log';
8
 
9
  protected function getReturnUrl()
10
  {
11
+ return Mage::getUrl('everypay/everypay/return', array('_nosid' => true));
12
  }
13
 
14
+ /**
15
+ * Returns payment gateway URL
16
+ *
17
+ * @return string Gateway URL
18
+ */
19
+ public function getGatewayUrl()
20
+ {
21
+ return Mage::getStoreConfig('payment/' . $this->_code . '/gateway_url');
22
+ }
23
 
24
  /**
25
  * Returns payment method logo URL
31
  return $this->getSkinUrl('images/multon/everypay/mastercard_visa_acceptance.jpg');
32
  }
33
 
34
+ /**
35
+ * Adds payment mehtod logotypes after method name
36
+ *
37
+ * @return string
38
+ */
39
+ public function getMethodLabelAfterHtml()
40
+ {
41
  if (Mage::getStoreConfig('payment/' . $this->_code . '/hide_logo'))
42
+ return '';
43
+
44
+ $blockHtml = sprintf(
45
+ '<img src="%1$s"
46
  title="%2$s"
47
  alt="%2$s"
48
+ class="payment-method-logo"/>', $this->getMethodLogoUrl(), ucfirst($this->_gateway)
49
+ );
50
+ return $blockHtml;
51
+ }
52
+
53
+ /**
54
+ * Checks if quick redirect is enabled and
55
+ * returns javascript block that redirects user
56
+ * to bank without intermediate page
57
+ *
58
+ * @return outstr Javascript block
59
+ */
60
+ public function getQuickRedirectScript()
61
+ {
62
+ $outstr = '';
63
+ if (Mage::getStoreConfig('payment/' . $this->_code . '/quick_redirect'))
 
64
  {
65
+ $outstr = '<script type="text/javascript"><!--
66
  if($("GatewayForm")){$("GatewayForm").submit();}
67
  //--></script>';
68
+ }
69
+ return $outstr;
70
+ }
71
 
72
  /**
73
  * Populates and returns array of fields to be submitted
95
 
96
  $billing = $order->getBillingAddress();
97
  $shipping = $order->getShippingAddress();
98
+ // downloadable products only orders don't have shipping address
99
+ if (!$shipping)
100
+ $shipping = $billing;
101
 
102
  $fields = array(
103
  'account_id' => Mage::getStoreConfig('payment/' . $this->_code . '/account_id'),
114
  'delivery_country' => $shipping->getCountry(),
115
  'delivery_postcode' => $shipping->getPostcode(),
116
  'email' => $billing->getEmail(),
117
+ 'hmac_fields' => 'account_id,amount,api_username,billing_address,billing_city,billing_country,billing_postcode,callback_url,customer_url,delivery_address,delivery_city,' .
118
+ 'delivery_country,delivery_postcode,email,hmac_fields,nonce,order_reference,timestamp,transaction_type,user_ip',
119
  'nonce' => $this->getNonce(),
120
  'order_reference' => $order->getIncrementId(),
121
  'timestamp' => time(),
app/code/community/Multon/Everypay/Model/Everypay.php CHANGED
@@ -2,21 +2,15 @@
2
 
3
  class Multon_Everypay_Model_Everypay extends Mage_Payment_Model_Method_Abstract
4
  {
5
- const _VERIFY_SUCCESS = 1; // payment successful
6
- const _VERIFY_CANCEL = 2; // payment unsuccessful
7
- const _VERIFY_CORRUPT = 3; // wrong or corrupt response
8
 
9
  protected $_canAuthorize = true;
10
  protected $_isGateway = true;
11
  protected $_canUseCheckout = true;
12
  protected $logFile = 'everypay.log';
13
 
14
- /**
15
- * Order Id to create invoice for
16
- * @var string
17
- */
18
- protected $_orderId;
19
-
20
  protected $_code = 'multon_everypay';
21
  protected $_formBlockType = 'everypay/everypay';
22
  private $statuses = array(
@@ -39,6 +33,24 @@ class Multon_Everypay_Model_Everypay extends Mage_Payment_Model_Method_Abstract
39
  */
40
  public function verify(array $params = array())
41
  {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
42
  // only in automatic callback message
43
  if (isset($params['processing_errors']))
44
  {
@@ -46,12 +58,12 @@ class Multon_Everypay_Model_Everypay extends Mage_Payment_Model_Method_Abstract
46
  if (!empty($errors))
47
  $this->log('(Everypay) Errors: ' . print_r($errors, 1), __METHOD__, __LINE__);
48
  }
49
- if (isset($params['processing_warnings']))
50
- {
51
- $warnings = json_decode($params['processing_warnings']);
52
- if (!empty($warnings))
53
- $this->log('(Everypay) Warnings: ' . print_r($warnings, 1), __METHOD__, __LINE__);
54
- }
55
 
56
  if (!isset($params['api_username']) || ($params['api_username'] !== Mage::getStoreConfig('payment/' . $this->_code . '/api_username')))
57
  {
@@ -68,14 +80,16 @@ class Multon_Everypay_Model_Everypay extends Mage_Payment_Model_Method_Abstract
68
  return self::_VERIFY_CORRUPT;
69
  }
70
 
71
- $session = Mage::getSingleton('checkout/session');
 
 
72
  // Reference number doesn't match.
73
- if ($session->getLastRealOrderId() != $params['order_reference'])
74
- {
75
- $this->log('(Everypay): Order number doesn\'t match (potential tampering attempt).', __METHOD__, __LINE__);
76
- Mage::getSingleton('checkout/session')->addError('Order number error.');
77
- return self::_VERIFY_CORRUPT;
78
- }
79
 
80
  if (!$this->verifyNonce($params['nonce']))
81
  {
@@ -84,51 +98,25 @@ class Multon_Everypay_Model_Everypay extends Mage_Payment_Model_Method_Abstract
84
  return self::_VERIFY_CORRUPT;
85
  }
86
 
87
- $status = $this->statuses[$params['transaction_result']];
88
- switch ($params['transaction_result'])
89
  {
90
- case 'completed':
91
- case 'failed':
92
- if ($params['account_id'] !== Mage::getStoreConfig('payment/' . $this->_code . '/account_id'))
93
- {
94
- $this->log('(Everypay) Invalid account ID', __METHOD__, __LINE__);
95
- Mage::getSingleton('checkout/session')->addError('Invalid account.');
96
- return self::_VERIFY_CORRUPT;
97
- }
98
-
99
- $data = 'account_id=' . $params['account_id'] . '&' .
100
- 'amount=' . $params['amount'] . '&' .
101
- 'api_username=' . $params['api_username'] . '&' .
102
- 'nonce=' . $params['nonce'] . '&' .
103
- 'order_reference=' . $params['order_reference'] . '&' .
104
- 'payment_reference=' . $params['payment_reference'] . '&' .
105
- 'payment_state=' . $params['payment_state'] . '&';
106
- if (isset($params['processing_errors']))
107
- {
108
- $data .= 'processing_errors=' . $params['processing_errors'] . '&' .
109
- 'processing_warnings=' . $params['processing_warnings'] . '&';
110
- }
111
- $data .= 'timestamp=' . $params['timestamp'] . '&' .
112
- 'transaction_result=' . $params['transaction_result'];
113
- break;
114
- case 'cancelled':
115
- $data = 'api_username=' . $params['api_username'] . '&' .
116
- 'nonce=' . $params['nonce'] . '&' .
117
- 'order_reference=' . $params['order_reference'] . '&' .
118
- 'payment_state=' . $params['payment_state'] . '&' .
119
- 'timestamp=' . $params['timestamp'] . '&' .
120
- 'transaction_result=' . $params['transaction_result'];
121
- break;
122
  }
123
- $hmac = hash_hmac('sha1', $data, Mage::getStoreConfig('payment/' . $this->_code . '/api_secret'));
124
- if ($params['hmac'] != $hmac)
 
 
 
 
125
  {
126
- $this->log('(Everypay) Invalid HMAC', __METHOD__, __LINE__);
127
- Mage::getSingleton('checkout/session')->addError('Invalid HMAC.');
128
  return self::_VERIFY_CORRUPT;
129
  }
130
 
131
- return $status;
132
  }
133
 
134
  protected function verifyNonce($nonce)
2
 
3
  class Multon_Everypay_Model_Everypay extends Mage_Payment_Model_Method_Abstract
4
  {
5
+ const _VERIFY_SUCCESS = 1; // payment successful
6
+ const _VERIFY_CANCEL = 2; // payment unsuccessful
7
+ const _VERIFY_CORRUPT = 3; // wrong or corrupt response
8
 
9
  protected $_canAuthorize = true;
10
  protected $_isGateway = true;
11
  protected $_canUseCheckout = true;
12
  protected $logFile = 'everypay.log';
13
 
 
 
 
 
 
 
14
  protected $_code = 'multon_everypay';
15
  protected $_formBlockType = 'everypay/everypay';
16
  private $statuses = array(
33
  */
34
  public function verify(array $params = array())
35
  {
36
+ // check for integrity first
37
+ $fields = explode(',', $params['hmac_fields']);
38
+ sort($fields);
39
+
40
+ $data = '';
41
+ foreach ($fields as $field)
42
+ $data .= $field . '=' . $params[$field] . '&';
43
+
44
+ // $this->log($data, __METHOD__, __LINE__);
45
+
46
+ $hmac = hash_hmac('sha1', substr($data, 0, -1), Mage::getStoreConfig('payment/' . $this->_code . '/api_secret'));
47
+ if ($params['hmac'] != $hmac)
48
+ {
49
+ $this->log('(Everypay) Invalid HMAC (Expected: ' . $hmac . ')', __METHOD__, __LINE__);
50
+ Mage::getSingleton('checkout/session')->addError('Invalid HMAC.');
51
+ return self::_VERIFY_CORRUPT;
52
+ }
53
+
54
  // only in automatic callback message
55
  if (isset($params['processing_errors']))
56
  {
58
  if (!empty($errors))
59
  $this->log('(Everypay) Errors: ' . print_r($errors, 1), __METHOD__, __LINE__);
60
  }
61
+ // if (isset($params['processing_warnings']))
62
+ // {
63
+ // $warnings = json_decode($params['processing_warnings']);
64
+ // if (!empty($warnings))
65
+ // $this->log('(Everypay) Warnings: ' . print_r($warnings, 1), __METHOD__, __LINE__);
66
+ // }
67
 
68
  if (!isset($params['api_username']) || ($params['api_username'] !== Mage::getStoreConfig('payment/' . $this->_code . '/api_username')))
69
  {
80
  return self::_VERIFY_CORRUPT;
81
  }
82
 
83
+ // !! background return message does not have session !!
84
+ // $session = Mage::getSingleton('checkout/session');
85
+ /* @var $session Mage_Checkout_Model_Session */
86
  // Reference number doesn't match.
87
+ // if ($session->getLastRealOrderId() != $params['order_reference'])
88
+ // {
89
+ // $this->log('(Everypay): Order number doesn\'t match (potential tampering attempt). Expecting: ' . $session->getLastRealOrderId(), __METHOD__, __LINE__);
90
+ // Mage::getSingleton('checkout/session')->addError('Order number error.');
91
+ // return self::_VERIFY_CORRUPT;
92
+ // }
93
 
94
  if (!$this->verifyNonce($params['nonce']))
95
  {
98
  return self::_VERIFY_CORRUPT;
99
  }
100
 
101
+ if (isset($params['account_id']) && ($params['account_id'] !== Mage::getStoreConfig('payment/' . $this->_code . '/account_id')))
 
102
  {
103
+ $this->log('(Everypay) Invalid account ID', __METHOD__, __LINE__);
104
+ Mage::getSingleton('checkout/session')->addError('Invalid account.');
105
+ return self::_VERIFY_CORRUPT;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
106
  }
107
+
108
+ // return data is all checked and valid, now check order
109
+ $order = Mage::getModel('sales/order')->loadByIncrementId($params['order_reference']);
110
+ /* @var $order Mage_Sales_Model_Order */
111
+ $orderMethod = $order->getPayment()->getMethod();
112
+ if ($orderMethod != $this->_code)
113
  {
114
+ $this->log('(Everypay): Wrong payment method. Order has: '.$orderMethod, __METHOD__, __LINE__);
115
+ Mage::getSingleton('checkout/session')->addError('Wrong payment method.');
116
  return self::_VERIFY_CORRUPT;
117
  }
118
 
119
+ return $this->statuses[$params['transaction_result']];
120
  }
121
 
122
  protected function verifyNonce($nonce)
app/code/community/Multon/Everypay/etc/config.xml CHANGED
@@ -2,7 +2,7 @@
2
  <config>
3
  <modules>
4
  <Multon_Everypay>
5
- <version>1.1.0</version>
6
  </Multon_Everypay>
7
  </modules>
8
  <global>
2
  <config>
3
  <modules>
4
  <Multon_Everypay>
5
+ <version>1.2.0</version>
6
  </Multon_Everypay>
7
  </modules>
8
  <global>
package.xml CHANGED
@@ -1,14 +1,21 @@
1
  <?xml version="1.0"?>
2
  <package>
3
  <name>multon_everypay</name>
4
- <version>1.1.0</version>
5
  <stability>stable</stability>
6
  <license>OSL</license>
7
  <channel>community</channel>
8
  <extends/>
9
  <summary>Multon Everypay</summary>
10
  <description>Multon Everypay</description>
11
- <notes>1.1.0&#xD;
 
 
 
 
 
 
 
12
  Converted to stand-alone community extension&#xD;
13
  &#xD;
14
  1.0.6&#xD;
@@ -34,9 +41,9 @@ FIX: redirect template&#xD;
34
  1.0.0&#xD;
35
  Stable release</notes>
36
  <authors><author><name>Multon</name><user>eepohs</user><email>magento@multon.ee</email></author><author><name>Jaanus Vapper</name><user>hullkuri</user><email>hullkuri@gmail.com</email></author><author><name>Tanel Raja</name><user>Pronto</user><email>tanel.raja@gmail.com</email></author></authors>
37
- <date>2015-05-19</date>
38
- <time>11:27:25</time>
39
- <contents><target name="magecommunity"><dir name="Multon"><dir name="Everypay"><dir name="Block"><dir name="Adminhtml"><file name="Fieldset.php" hash="324c82a14594133019deef5c98e8ec78"/><dir name="System"><dir name="Config"><file name="Intro.php" hash="25a5c87ee274de259ede0decc040f643"/><file name="Outro.php" hash="21e9865c5f85cc0c8a601cc171d3f5d0"/><file name="Version.php" hash="63d888085e44f1b99e77aec70f12f62a"/></dir></dir></dir><file name="Everypay.php" hash="f3283cf8916de80d740e2ad722ae69f5"/><file name="Info.php" hash="4755af2b544c9f5de39098046e6da0fb"/></dir><dir name="Model"><file name="Everypay.php" hash="dcbcb043e7874c21f2ef93e79f4add90"/><dir name="Source"><file name="PaymentAction.php" hash="27787205d1886997aeccecb4028d488f"/></dir></dir><dir name="controllers"><file name="EverypayController.php" hash="4d70fc06e227af4e6fcf920be2e89ec1"/></dir><dir name="etc"><file name="config.xml" hash="95b8d791da82f544b8c1d661a760bbb3"/><file name="system.xml" hash="c337dd813b2f7bc4a162ac624e0499c2"/></dir><dir name="sql"><dir name="everypay_setup"><file name="install-1.0.0.php" hash="201924647c609f33835712ab2c81e4d4"/></dir></dir></dir></dir></target><target name="mageetc"><dir name="modules"><file name="Multon_Everypay.xml" hash="99a2dd0a396a3a1b937d767e48ce237f"/></dir></target><target name="magedesign"><dir name="frontend"><dir name="base"><dir name="default"><dir name="layout"><dir name="multon"><file name="everypay.xml" hash="d85234989ed7853a5f29e10e82945056"/></dir></dir><dir name="template"><dir name="multon"><dir name="everypay"><file name="everypay.phtml" hash="1e168f001770918f4d4fa934767854d8"/><file name="info.phtml" hash="91eb9c88527bc6b0076f382df0f6809c"/></dir></dir></dir></dir></dir></dir></target><target name="mageskin"><dir name="frontend"><dir name="base"><dir name="default"><dir name="images"><dir name="multon"><dir name="everypay"><file name="everypay_logo_220x44.png" hash="be48db5df549b24058f4e5c889791f6b"/><file name="mastercard_visa_acceptance.jpg" hash="2e7bf5940eeab9863caf8d641ac6f1e9"/></dir></dir></dir></dir></dir></dir><dir name="adminhtml"><dir name="default"><dir name="default"><dir name="images"><file name="everypay-logo.jpg" hash="909c46f5e89be9de1d0d2ad7fdfb8bc6"/></dir></dir></dir></dir></target></contents>
40
  <compatible/>
41
- <dependencies><required><php><min>5.2.0</min><max>6.0.0</max></php></required></dependencies>
42
  </package>
1
  <?xml version="1.0"?>
2
  <package>
3
  <name>multon_everypay</name>
4
+ <version>1.2.0</version>
5
  <stability>stable</stability>
6
  <license>OSL</license>
7
  <channel>community</channel>
8
  <extends/>
9
  <summary>Multon Everypay</summary>
10
  <description>Multon Everypay</description>
11
+ <notes>1.2.0&#xD;
12
+ API protocol update&#xD;
13
+ FIX: remove SID from callback_url&#xD;
14
+ &#xD;
15
+ 1.1.1&#xD;
16
+ Use billing address if shipping address not present (downloadable products)&#xD;
17
+ &#xD;
18
+ 1.1.0&#xD;
19
  Converted to stand-alone community extension&#xD;
20
  &#xD;
21
  1.0.6&#xD;
41
  1.0.0&#xD;
42
  Stable release</notes>
43
  <authors><author><name>Multon</name><user>eepohs</user><email>magento@multon.ee</email></author><author><name>Jaanus Vapper</name><user>hullkuri</user><email>hullkuri@gmail.com</email></author><author><name>Tanel Raja</name><user>Pronto</user><email>tanel.raja@gmail.com</email></author></authors>
44
+ <date>2015-08-26</date>
45
+ <time>09:13:49</time>
46
+ <contents><target name="magecommunity"><dir name="Multon"><dir name="Everypay"><dir name="Block"><dir name="Adminhtml"><file name="Fieldset.php" hash="324c82a14594133019deef5c98e8ec78"/><dir name="System"><dir name="Config"><file name="Intro.php" hash="25a5c87ee274de259ede0decc040f643"/><file name="Outro.php" hash="21e9865c5f85cc0c8a601cc171d3f5d0"/><file name="Version.php" hash="63d888085e44f1b99e77aec70f12f62a"/></dir></dir></dir><file name="Everypay.php" hash="1cfdfa0e4bbf6ce982eef838109bb5ce"/><file name="Info.php" hash="4755af2b544c9f5de39098046e6da0fb"/></dir><dir name="Model"><file name="Everypay.php" hash="13b66cd6daa91592992d0a9be5b67382"/><dir name="Source"><file name="PaymentAction.php" hash="27787205d1886997aeccecb4028d488f"/></dir></dir><dir name="controllers"><file name="EverypayController.php" hash="4d70fc06e227af4e6fcf920be2e89ec1"/></dir><dir name="etc"><file name="config.xml" hash="3b9ed7ae94be4ecea5d1ca5305fe1b57"/><file name="system.xml" hash="c337dd813b2f7bc4a162ac624e0499c2"/></dir><dir name="sql"><dir name="everypay_setup"><file name="install-1.0.0.php" hash="201924647c609f33835712ab2c81e4d4"/></dir></dir></dir></dir></target><target name="mageetc"><dir name="modules"><file name="Multon_Everypay.xml" hash="99a2dd0a396a3a1b937d767e48ce237f"/></dir></target><target name="magedesign"><dir name="frontend"><dir name="base"><dir name="default"><dir name="layout"><dir name="multon"><file name="everypay.xml" hash="d85234989ed7853a5f29e10e82945056"/></dir></dir><dir name="template"><dir name="multon"><dir name="everypay"><file name="everypay.phtml" hash="1e168f001770918f4d4fa934767854d8"/><file name="info.phtml" hash="91eb9c88527bc6b0076f382df0f6809c"/></dir></dir></dir></dir></dir></dir></target><target name="mageskin"><dir name="frontend"><dir name="base"><dir name="default"><dir name="images"><dir name="multon"><dir name="everypay"><file name="everypay_logo_220x44.png" hash="be48db5df549b24058f4e5c889791f6b"/><file name="mastercard_visa_acceptance.jpg" hash="2e7bf5940eeab9863caf8d641ac6f1e9"/></dir></dir></dir></dir></dir></dir><dir name="adminhtml"><dir name="default"><dir name="default"><dir name="images"><file name="everypay-logo.jpg" hash="909c46f5e89be9de1d0d2ad7fdfb8bc6"/></dir></dir></dir></dir></target></contents>
47
  <compatible/>
48
+ <dependencies><required><php><min>5.4.0</min><max>6.0.0</max></php></required></dependencies>
49
  </package>