Apruve_B2B_Payment_Gateway - Version 1.0.0

Version Notes

First release.

Download this release

Release Info

Developer Apruve
Extension Apruve_B2B_Payment_Gateway
Version 1.0.0
Comparing to
See all releases


Version 1.0.0

Files changed (32) hide show
  1. app/code/community/Apruve/ApruvePayment/Block/Admin/Webhook.php +29 -0
  2. app/code/community/Apruve/ApruvePayment/Block/Payment/Form.php +40 -0
  3. app/code/community/Apruve/ApruvePayment/Block/Review.php +47 -0
  4. app/code/community/Apruve/ApruvePayment/Block/Review/Billing.php +28 -0
  5. app/code/community/Apruve/ApruvePayment/Block/Review/Details.php +32 -0
  6. app/code/community/Apruve/ApruvePayment/Block/Review/Result.php +13 -0
  7. app/code/community/Apruve/ApruvePayment/Block/Review/Shipping.php +22 -0
  8. app/code/community/Apruve/ApruvePayment/Helper/Data.php +23 -0
  9. app/code/community/Apruve/ApruvePayment/Model/Api/Abstract.php +94 -0
  10. app/code/community/Apruve/ApruvePayment/Model/Api/PaymentRequest.php +233 -0
  11. app/code/community/Apruve/ApruvePayment/Model/Api/Rest.php +113 -0
  12. app/code/community/Apruve/ApruvePayment/Model/Mysql4/Setup.php +6 -0
  13. app/code/community/Apruve/ApruvePayment/Model/PaymentMethod.php +94 -0
  14. app/code/community/Apruve/ApruvePayment/Model/Session.php +9 -0
  15. app/code/community/Apruve/ApruvePayment/controllers/PaymentController.php +175 -0
  16. app/code/community/Apruve/ApruvePayment/controllers/WebhookController.php +108 -0
  17. app/code/community/Apruve/ApruvePayment/etc/config.xml +74 -0
  18. app/code/community/Apruve/ApruvePayment/etc/system.xml +77 -0
  19. app/design/frontend/default/default/layout/apruvepayment.xml +48 -0
  20. app/design/frontend/default/default/template/apruvepayment/head.phtml +6 -0
  21. app/design/frontend/default/default/template/apruvepayment/payment/form.phtml +4 -0
  22. app/design/frontend/default/default/template/apruvepayment/payment/mark.phtml +13 -0
  23. app/design/frontend/default/default/template/apruvepayment/review.phtml +70 -0
  24. app/design/frontend/default/default/template/apruvepayment/review/address.phtml +398 -0
  25. app/design/frontend/default/default/template/apruvepayment/review/details.phtml +64 -0
  26. app/design/frontend/default/default/template/apruvepayment/review/result.phtml +1 -0
  27. app/design/frontend/default/default/template/apruvepayment/review/shipping/method.phtml +53 -0
  28. app/design/frontend/default/default/template/apruvepayment/review/shipping_method.phtml +17 -0
  29. app/design/frontend/default/default/template/apruvepayment/shortcut.phtml +11 -0
  30. app/etc/modules/Apruve_ApruvePayment.xml +8 -0
  31. js/Apruve/ApruvePayment.js +88 -0
  32. package.xml +18 -0
app/code/community/Apruve/ApruvePayment/Block/Admin/Webhook.php ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Created by JetBrains PhpStorm.
4
+ * User: Saa
5
+ * Date: 14.10.13
6
+ * Time: 12:08
7
+ * To change this template use File | Settings | File Templates.
8
+ */
9
+
10
+ class Apruve_ApruvePayment_Block_Admin_Webhook extends Mage_Adminhtml_Block_System_Config_Form_Field
11
+ {
12
+ protected function _getElementHtml(Varien_Data_Form_Element_Abstract $element)
13
+ {
14
+ $merchantKey = Mage::getStoreConfig('payment/apruvepayment/merchant');
15
+ $apiKey = Mage::getStoreConfig('payment/apruvepayment/api');
16
+ $baseFrontUrl = Mage::getBaseUrl(Mage_Core_Model_Store::URL_TYPE_WEB);
17
+ $moduleControllerAction = 'apruvepayment/webhook/updateOrderStatus?';
18
+ if(!is_null($merchantKey) && !is_null($apiKey)) {
19
+ $data = $apiKey.$merchantKey;
20
+ $q = hash('sha256', $data);
21
+ $url = $baseFrontUrl.$moduleControllerAction.$q;
22
+ return $url;
23
+ } else {
24
+
25
+ $message = 'Please, specify merchant and api key';
26
+ return $message;
27
+ }
28
+ }
29
+ }
app/code/community/Apruve/ApruvePayment/Block/Payment/Form.php ADDED
@@ -0,0 +1,40 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Created by JetBrains PhpStorm.
4
+ * User: Saa
5
+ * Date: 24.09.13
6
+ * Time: 13:37
7
+ * To change this template use File | Settings | File Templates.
8
+ */
9
+
10
+ class Apruve_ApruvePayment_Block_Payment_Form extends Mage_Payment_Block_Form
11
+ {
12
+ protected function _construct()
13
+ {
14
+ parent::_construct();
15
+ $this->setTemplate('apruvepayment/payment/form.phtml');
16
+ }
17
+
18
+ /**
19
+ * Check if payment method has title
20
+ * @return bool
21
+ */
22
+ public function hasMethodTitle()
23
+ {
24
+ return true;
25
+ }
26
+
27
+ /**
28
+ * Set Mark template
29
+ */
30
+ public function getMethodTitle()
31
+ {
32
+ $locale = Mage::app()->getLocale();
33
+
34
+ $mark = Mage::getConfig()->getBlockClassName('core/template');
35
+ $mark = new $mark;
36
+ $mark->setTemplate('apruvepayment/payment/mark.phtml');
37
+
38
+ $this->setMethodLabelAfterHtml($mark->toHtml());
39
+ }
40
+ }
app/code/community/Apruve/ApruvePayment/Block/Review.php ADDED
@@ -0,0 +1,47 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Created by JetBrains PhpStorm.
4
+ * User: Saa
5
+ * Date: 01.10.13
6
+ * Time: 13:09
7
+ * To change this template use File | Settings | File Templates.
8
+ */
9
+
10
+ class Apruve_ApruvePayment_Block_Review extends Mage_Core_Block_Template
11
+ {
12
+ /**
13
+ * Get url for place order action
14
+ * @return string
15
+ */
16
+ public function getPlaceOrderUrl()
17
+ {
18
+ return $this->getUrl('apruvepayment/payment/placeOrder');
19
+ }
20
+
21
+
22
+ private function _getCheckoutSession()
23
+ {
24
+ return Mage::getSingleton('checkout/session');
25
+ }
26
+
27
+ /**
28
+ * Get error
29
+ * @return mixed
30
+ */
31
+ public function getErrors()
32
+ {
33
+ $errors = $this->getApruveSession()->getErrors();
34
+ $this->getApruveSession()->unsetData('errors');
35
+ return $errors;
36
+ }
37
+
38
+
39
+ /**
40
+ * @return Apruve_ApruvePayment_Model_Session
41
+ */
42
+ public function getApruveSession()
43
+ {
44
+ return Mage::getSingleton('apruvepayment/session');
45
+ }
46
+
47
+ }
app/code/community/Apruve/ApruvePayment/Block/Review/Billing.php ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Apruve_ApruvePayment_Block_Review_Billing extends Mage_Checkout_Block_Onepage_Billing
4
+ {
5
+ /**
6
+ * Return Sales Quote Address model
7
+ *
8
+ * @return Mage_Sales_Model_Quote_Address
9
+ */
10
+ public function getAddress()
11
+ {
12
+ if (is_null($this->_address)) {
13
+ if ($this->isCustomerLoggedIn() || $this->getQuote()->getBillingAddress()) {
14
+ $this->_address = $this->getQuote()->getBillingAddress();
15
+ if (!$this->_address->getFirstname()) {
16
+ $this->_address->setFirstname($this->getQuote()->getCustomer()->getFirstname());
17
+ }
18
+ if (!$this->_address->getLastname()) {
19
+ $this->_address->setLastname($this->getQuote()->getCustomer()->getLastname());
20
+ }
21
+ } else {
22
+ $this->_address = Mage::getModel('sales/quote_address');
23
+ }
24
+ }
25
+
26
+ return $this->_address;
27
+ }
28
+ }
app/code/community/Apruve/ApruvePayment/Block/Review/Details.php ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Apruve_ApruvePayment_Block_Review_Details extends Mage_Checkout_Block_Cart_Totals
4
+ {
5
+ /**
6
+ * @var Mage_Sales_Model_Order_Address
7
+ */
8
+ protected $_address;
9
+
10
+ /**
11
+ * Return review shipping address
12
+ *
13
+ * @return Mage_Sales_Model_Order_Address
14
+ */
15
+ public function getAddress()
16
+ {
17
+ if (empty($this->_address)) {
18
+ $this->_address = $this->getQuote()->getShippingAddress();
19
+ }
20
+ return $this->_address;
21
+ }
22
+
23
+ /**
24
+ * Return review quote totals
25
+ *
26
+ * @return array
27
+ */
28
+ public function getTotals()
29
+ {
30
+ return $this->getQuote()->getTotals();
31
+ }
32
+ }
app/code/community/Apruve/ApruvePayment/Block/Review/Result.php ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Created by JetBrains PhpStorm.
4
+ * User: Saa
5
+ * Date: 02.10.13
6
+ * Time: 18:06
7
+ * To change this template use File | Settings | File Templates.
8
+ */
9
+
10
+ class Apruve_ApruvePayment_Block_Review_Result extends Mage_Core_Block_Template
11
+ {
12
+
13
+ }
app/code/community/Apruve/ApruvePayment/Block/Review/Shipping.php ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Apruve_ApruvePayment_Block_Review_Shipping extends Mage_Checkout_Block_Onepage_Shipping
4
+ {
5
+ /**
6
+ * Return Sales Quote Address model (shipping address)
7
+ *
8
+ * @return Mage_Sales_Model_Quote_Address
9
+ */
10
+ public function getAddress()
11
+ {
12
+ if (is_null($this->_address)) {
13
+ if ($this->isCustomerLoggedIn() || $this->getQuote()->getShippingAddress()) {
14
+ $this->_address = $this->getQuote()->getShippingAddress();
15
+ } else {
16
+ $this->_address = Mage::getModel('sales/quote_address');
17
+ }
18
+ }
19
+
20
+ return $this->_address;
21
+ }
22
+ }
app/code/community/Apruve/ApruvePayment/Helper/Data.php ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+
4
+ class Apruve_ApruvePayment_Helper_Data extends Mage_Core_Helper_Abstract
5
+ {
6
+ /**
7
+ * @return Apruve_ApruvePayment_Model_Api_PaymentRequest
8
+ */
9
+ public function getPaymentRequestApiModel()
10
+ {
11
+ return Mage::getModel('apruvepayment/api_PaymentRequest');
12
+ }
13
+
14
+
15
+ /**
16
+ * @return string url
17
+ */
18
+ public function getAjaxAddressUpdatedUrl()
19
+ {
20
+ $secure = Mage::app()->getStore()->isCurrentlySecure() ? true : false;
21
+ return Mage::getUrl('apruvepayment/payment/ajaxSetAddressUpdated', array('_secure' => $secure));
22
+ }
23
+ }
app/code/community/Apruve/ApruvePayment/Model/Api/Abstract.php ADDED
@@ -0,0 +1,94 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+
4
+ abstract class Apruve_ApruvePayment_Model_Api_Abstract
5
+ {
6
+ /**
7
+ * @var string
8
+ */
9
+ protected $_version = 'v3';
10
+ //protected $_testMode;
11
+
12
+
13
+ /**
14
+ * Generate headers for rest request
15
+ * @return array
16
+ */
17
+ protected function _getHeaders()
18
+ {
19
+ return array(
20
+ 'Content-type: application/json',
21
+ 'Apruve-Api-Key: ' . $this->_getApiKey(),
22
+ );
23
+ }
24
+
25
+ /**
26
+ * Get Merchant key from module configuration
27
+ * @return string|null
28
+ */
29
+ protected function _getMerchantKey()
30
+ {
31
+ $id = Mage::getStoreConfig('payment/apruvepayment/merchant');
32
+ return $id ? $id : null;
33
+ }
34
+
35
+ /**
36
+ * Get Api key from module configuration
37
+ * @return string|null
38
+ */
39
+ protected function _getApiKey()
40
+ {
41
+ $api = Mage::getStoreConfig('payment/apruvepayment/api');
42
+ return $api ? $api : null;
43
+
44
+ }
45
+
46
+
47
+ /**
48
+ * Check whether payment works in test mode
49
+ * @return bool
50
+ */
51
+ protected function _getIsTestMode()
52
+ {
53
+ return true;
54
+ }
55
+
56
+
57
+ /**
58
+ * Get Apruve base url based on mode
59
+ * @param bool $secure
60
+ * @return string
61
+ */
62
+ public function getBaseUrl($secure = false)
63
+ {
64
+ $http = $secure ? 'https://' : 'http://';
65
+ if($this->_getIsTestMode()) {
66
+ return $http.'test.apruve.com/';
67
+ } else {
68
+ return $http.'apruve.com/';
69
+ }
70
+ }
71
+
72
+
73
+ /**
74
+ * Get api url part based on version
75
+ * @return string
76
+ */
77
+ protected function _getApiUrl()
78
+ {
79
+ return 'api/'.$this->_version.'/';
80
+ }
81
+
82
+
83
+ /**
84
+ * Convert price to needed value
85
+ * As current version supports only USD, convert price to cents
86
+ * @param float $price
87
+ * @return float
88
+ */
89
+ protected function _convertPrice($price)
90
+ {
91
+ return $price * 100;
92
+ }
93
+
94
+ }
app/code/community/Apruve/ApruvePayment/Model/Api/PaymentRequest.php ADDED
@@ -0,0 +1,233 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Class Apruve_ApruvePayment_Model_Api_PaymentRequest
4
+ * Provide methods to build paymentRequest
5
+ * @see https://apruvit.atlassian.net/wiki/display/DOCCO/payment_request
6
+ */
7
+ class Apruve_ApruvePayment_Model_Api_PaymentRequest extends Apruve_ApruvePayment_Model_Api_Abstract
8
+ {
9
+ /**
10
+ * Post request general fields
11
+ * @var array
12
+ */
13
+ protected $_postFields = array(
14
+ //required
15
+ 'merchant_id',
16
+ 'amount_cents',
17
+ 'line_items' => array(),
18
+ //optional
19
+ 'tax_cents',
20
+ 'shipping_cents',
21
+ 'currency', // current only USD
22
+ );
23
+
24
+ /**
25
+ * Line Items Fields
26
+ * @var array
27
+ */
28
+ protected $_lineItemFields = array(
29
+ //required
30
+ 'title',
31
+ 'amount_cents', // if qty -> should chanfe
32
+ 'description',
33
+ 'variant_info',
34
+ 'sku',
35
+ 'vendor',
36
+ 'price_ea_cents',
37
+ 'view_product_url',
38
+ );
39
+
40
+ /**
41
+ * @var array
42
+ */
43
+ protected $_paymentRequest;
44
+
45
+
46
+ public function __construct()
47
+ {
48
+ $this->_paymentRequest = $this->_setPaymentRequest();
49
+ }
50
+
51
+ /**
52
+ * Get json encoded payment request
53
+ * @return string
54
+ */
55
+ public function getPaymentRequestJSON()
56
+ {
57
+ return json_encode($this->_paymentRequest);
58
+ }
59
+
60
+ /**
61
+ * Get secure hash
62
+ * @see https://apruvit.atlassian.net/wiki/display/DOCCO/Checkout+Page+Tutorial#CheckoutPageTutorial-1b:CreatingaSecureHash
63
+ * @return string
64
+ */
65
+ public function getSecureHash()
66
+ {
67
+ $concatString = $this->_getApiKey();
68
+
69
+ foreach ($this->_paymentRequest as $val) {
70
+ if(!is_array($val)) {
71
+ $concatString .= $val;
72
+ } else {
73
+ foreach($val as $v) {
74
+ foreach ($v as $s) {
75
+ $concatString .= $s;
76
+ }
77
+
78
+ }
79
+ }
80
+ }
81
+
82
+ return hash('sha256', $concatString);
83
+ }
84
+
85
+
86
+ /**
87
+ * Build Payment Request Array
88
+ * @return array
89
+ */
90
+ protected function _setPaymentRequest()
91
+ {
92
+ $quote = Mage::getSingleton('checkout/session')->getQuote();
93
+ $paymentRequest = array(
94
+ 'merchant_id' => $this->_getMerchantKey(),
95
+ 'amount_cents' => $this->_convertPrice($quote->getGrandTotal()),
96
+ 'currency' => 'USD',
97
+ 'tax_cents' => $this->_convertPrice($quote->getShippingAddress()->getTaxAmount()),
98
+ 'shipping_cents' => $this->_convertPrice($quote->getShippingAddress()->getShippingAmount()),
99
+ 'line_items' => $this->_getLineItems($quote),
100
+ );
101
+
102
+ return $paymentRequest;
103
+ }
104
+
105
+ /**
106
+ * Build Line items array
107
+ * @param Mage_Sales_Model_Quote $quote
108
+ * @return array
109
+ */
110
+ protected function _getLineItems($quote)
111
+ {
112
+ $line_items = array();
113
+ foreach ($quote->getAllVisibleItems() as $item) {
114
+ $qty = $item->getQty();
115
+ $title = $item->getName();
116
+ $amount_cents = $this->_convertPrice($item->getPrice()) * $qty;
117
+ $shortDescription = $item->getShortDescription();
118
+ $viewUrl = $item->getProduct()->getProductUrl(false);
119
+ $priceEaCents = $this->_convertPrice($item->getPrice());
120
+
121
+ $line_item = array(
122
+ 'title' => $title,
123
+ 'amount_cents' => $amount_cents,
124
+ 'description' => $shortDescription,
125
+ 'view_product_url' => $viewUrl,
126
+ 'price_ea_cents' => $priceEaCents,
127
+ 'quantity' => $qty,
128
+
129
+ );
130
+
131
+ $variantInfo = $this->_getVariantInfo($item);
132
+ if($variantInfo) {
133
+ $line_item['variant_info'] = $variantInfo;
134
+ }
135
+
136
+ $line_items[] = $line_item;
137
+ }
138
+
139
+ return $line_items;
140
+ }
141
+
142
+
143
+ /**
144
+ * Get Product configuration if exits
145
+ * @param Mage_Sales_Model_Quote_Item $item
146
+ * @return string
147
+ */
148
+ protected function _getVariantInfo($item)
149
+ {
150
+ $result = '';
151
+ $variantInfo = array();
152
+ $options = $item->getProduct()->getTypeInstance(true)->getOrderOptions($item->getProduct());
153
+ if(isset($options['options'])) {
154
+ $opt = $this->_getProductCustomOptions($options['options']);
155
+ $variantInfo = array_merge($variantInfo, $opt);
156
+ }
157
+ if(isset($options['attributes_info'])) {
158
+ $opt = $this->_getConfigurableOptions($options['attributes_info']);
159
+ $variantInfo = array_merge($variantInfo, $opt);
160
+ }
161
+
162
+ if(isset($options['bundle_options'])) {
163
+ $opt = $this->_getBundleOptions($options['bundle_options']);
164
+ $variantInfo = array_merge($variantInfo, $opt);
165
+ }
166
+
167
+ if(!empty($variantInfo)) {
168
+ $result = $this->_getFormatedVariantInfo($variantInfo);
169
+ }
170
+
171
+ return $result;
172
+
173
+ }
174
+
175
+ /**
176
+ * @param array $options
177
+ * @return array
178
+ */
179
+ protected function _getProductCustomOptions($options)
180
+ {
181
+ $arr = array();
182
+ foreach ($options as $option) {
183
+ $arr[] = $option['label'].': '.$option['value'];
184
+ }
185
+
186
+ return $arr;
187
+ }
188
+
189
+ /**
190
+ * @param array $attributesInfo
191
+ * @return array
192
+ */
193
+ protected function _getConfigurableOptions($attributesInfo)
194
+ {
195
+ $arr = array();
196
+ foreach ($attributesInfo as $option) {
197
+ $arr[] = $option['label'].': '.$option['value'];
198
+ }
199
+ return $arr;
200
+ }
201
+
202
+ /**
203
+ * @param array $bundleOptions
204
+ * @return array
205
+ */
206
+ protected function _getBundleOptions($bundleOptions)
207
+ {
208
+ $arr = array();
209
+ foreach($bundleOptions as $option) {
210
+ $arr[] = $option['label'].': '.$option['value'][0]['title'];
211
+ }
212
+ return $arr;
213
+ }
214
+
215
+ /**
216
+ * Concatenate all options to string
217
+ * @param array $arr
218
+ * @return string
219
+ */
220
+ //todo: new line symbol
221
+ protected function _getFormatedVariantInfo($arr)
222
+ {
223
+ if(count($arr) == 1) {
224
+ $result = $arr[0];
225
+ } else {
226
+ $result = implode(', ', $arr);
227
+ }
228
+
229
+ return $result;
230
+ }
231
+
232
+ }
233
+
app/code/community/Apruve/ApruvePayment/Model/Api/Rest.php ADDED
@@ -0,0 +1,113 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Class Apruve_ApruvePayment_Model_Api_Rest
4
+ *
5
+ * Provide rest methods to communicate with apruve
6
+ */
7
+
8
+ class Apruve_ApruvePayment_Model_Api_Rest extends Apruve_ApruvePayment_Model_Api_Abstract
9
+ {
10
+ /**
11
+ * Send Payment object
12
+ * @param string $paymentRequestId
13
+ * @param float $amount
14
+ * @return bool
15
+ */
16
+ public function postPayment($paymentRequestId, $amount)
17
+ {
18
+ $data = json_encode(array('amount_cents' => $this->_convertPrice($amount)));
19
+
20
+ $c = curl_init($this->_getPaymentUrl($paymentRequestId));
21
+
22
+ curl_setopt($c, CURLOPT_HTTPHEADER, $this->_getHeaders());
23
+ curl_setopt($c, CURLOPT_POST, true);
24
+ curl_setopt($c, CURLOPT_RETURNTRANSFER, true );
25
+ curl_setopt($c, CURLOPT_HEADER, true);
26
+ curl_setopt($c, CURLOPT_POSTFIELDS, $data );
27
+ $response = curl_exec($c);
28
+ $http_status = curl_getinfo($c, CURLINFO_HTTP_CODE);
29
+ curl_close($c);
30
+
31
+ if($http_status == '201') {
32
+ return true;
33
+ } else {
34
+ return false;
35
+ }
36
+
37
+ }
38
+
39
+ /**
40
+ * Update paymentRequest object
41
+ * Availible fields to update are: amount_cents, shipping_cents, tax_cents
42
+ * @param string $paymentRequestId
43
+ * @param float $amount
44
+ * @param float $shipping
45
+ * @param float $tax
46
+ * @return bool
47
+ */
48
+ public function updatePaymentRequest($paymentRequestId, $amount, $shipping, $tax)
49
+ {
50
+ $data = json_encode(array(
51
+ 'amount_cents' => $this->_convertPrice($amount),
52
+ 'shipping_cents' => $this->_convertPrice($shipping),
53
+ 'tax_cents' => $this->_convertPrice($tax),
54
+ ));
55
+
56
+ $c = curl_init($this->_getUpdatePaymentRequestUrl($paymentRequestId));
57
+
58
+ curl_setopt($c, CURLOPT_HTTPHEADER, $this->_getHeaders());
59
+ curl_setopt($c, CURLOPT_CUSTOMREQUEST, "PUT");
60
+ curl_setopt($c, CURLOPT_RETURNTRANSFER, true );
61
+ curl_setopt($c, CURLOPT_HEADER, true);
62
+ curl_setopt($c, CURLOPT_POSTFIELDS, $data );
63
+ $response = curl_exec($c);
64
+ $http_status = curl_getinfo($c, CURLINFO_HTTP_CODE);
65
+ curl_close($c);
66
+
67
+
68
+ if($http_status == '200') {
69
+ return true;
70
+ } else {
71
+ return false;
72
+ }
73
+ }
74
+
75
+ /**
76
+ * GET Apruve Payment Status
77
+ * Check whether given status is same as in Apruve.com
78
+ * @param $status
79
+ * @param $apiUrl
80
+ * @return bool
81
+ */
82
+ public function getApruveOrderStatus($apiUrl, $status)
83
+ {
84
+ $c = curl_init($apiUrl);
85
+ curl_setopt($c, CURLOPT_HTTPHEADER, $this->_getHeaders());
86
+ curl_setopt($c, CURLOPT_CUSTOMREQUEST, "GET");
87
+ curl_setopt($c, CURLOPT_RETURNTRANSFER, true );
88
+ curl_setopt($c, CURLOPT_HEADER, true);
89
+
90
+
91
+ }
92
+
93
+ /**
94
+ * Get url for send payment
95
+ * @param string $paymentRequestId
96
+ * @return string
97
+ */
98
+ protected function _getPaymentUrl($paymentRequestId)
99
+ {
100
+ return $this->getBaseUrl(true).$this->_getApiUrl().'payment_requests/'.$paymentRequestId.'/payments';
101
+ }
102
+
103
+
104
+ /**
105
+ * Get url for update paymentRequest
106
+ * @param string $paymentRequestId
107
+ * @return string
108
+ */
109
+ protected function _getUpdatePaymentRequestUrl($paymentRequestId)
110
+ {
111
+ return $this->getBaseUrl(true).$this->_getApiUrl().'payment_requests/'.$paymentRequestId;
112
+ }
113
+ }
app/code/community/Apruve/ApruvePayment/Model/Mysql4/Setup.php ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Apruve_ApruvePayment_Model_Mysql4_Setup extends Mage_Catalog_Model_Resource_Eav_Mysql4_Setup
4
+ {
5
+
6
+ }
app/code/community/Apruve/ApruvePayment/Model/PaymentMethod.php ADDED
@@ -0,0 +1,94 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Apruve_ApruvePayment_Model_PaymentMethod extends Mage_Payment_Model_Method_Abstract
4
+ {
5
+ protected $_code = 'apruvepayment';
6
+ protected $_formBlockType = 'apruvepayment/payment_form';
7
+
8
+ protected $_isGateway = false;
9
+ protected $_canOrder = true;
10
+ protected $_canAuthorize = true;
11
+ protected $_canCapture = true;
12
+ protected $_canCapturePartial = false;
13
+ protected $_canRefund = false;
14
+ protected $_canRefundInvoicePartial = false;
15
+ protected $_canVoid = true;
16
+ protected $_canUseInternal = false;
17
+ protected $_canUseCheckout = true;
18
+ protected $_canUseForMultishipping = false;
19
+ protected $_canFetchTransactionInfo = true;
20
+ protected $_canCreateBillingAgreement = true;
21
+ protected $_canReviewPayment = true;
22
+
23
+ public function getCheckoutRedirectUrl()
24
+ {
25
+ return Mage::getUrl('apruvepayment/payment/review');
26
+ }
27
+
28
+
29
+ /**
30
+ * Assign data to info model instance
31
+ *
32
+ * @param mixed $data
33
+ * @return Mage_Payment_Model_Info
34
+ */
35
+ public function assignData($data)
36
+ {
37
+ //$result = parent::assignData($data);
38
+ if (is_array($data)) {
39
+ $this->getInfoInstance()->setAdditionalInformation('aprt', isset($data['aprt']) ? $data['aprt'] : null);
40
+ }
41
+ elseif ($data instanceof Varien_Object) {
42
+ $aprt = $data->getAprt();
43
+ $this->getInfoInstance()->setAdditionalInformation('aprt', isset($aprt) ? $aprt : null);
44
+ }
45
+ return $this;
46
+ }
47
+
48
+ /**
49
+ * Check whether apruve payment request id(aprt) is exitst
50
+ * @return Mage_Payment_Model_Abstract|void
51
+ */
52
+ public function validate()
53
+ {
54
+ if(!$this->getInfoInstance()->getAdditionalInformation('aprt')) {
55
+ Mage::throwException('Smth going wrong, try again to post order with apruve');
56
+ }
57
+ }
58
+
59
+ /**
60
+ * @return string
61
+ */
62
+ public function getConfigPaymentAction()
63
+ {
64
+ return 'order';
65
+ }
66
+
67
+ /**
68
+ * Get token and create transaction
69
+ * @param Varien_Object $payment
70
+ * @param float $amount
71
+ * @return Mage_Payment_Model_Abstract|void
72
+ */
73
+ public function order(Varien_Object $payment, $amount)
74
+ {
75
+ $additionalInformation = $payment->getAdditionalInformation();
76
+ $token = $additionalInformation['aprt'];
77
+
78
+ //$amount = $payment->getBaseAmountOrdered() * 100; //cents
79
+ //$rest = Mage::getModel('apruvepayment/api_rest');
80
+ //$rest->postPayment($token, $amount); //return true or false
81
+ //$payment->setSkipOrderProcessing(true);
82
+ //echo 1;exit;
83
+
84
+ $payment->setTransactionId($token);
85
+ $payment->setIsTransactionClosed(0);
86
+ $payment->resetTransactionAdditionalInfo();
87
+ }
88
+
89
+
90
+ public function capture(Varien_Object $payment, $amount)
91
+ {
92
+
93
+ }
94
+ }
app/code/community/Apruve/ApruvePayment/Model/Session.php ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Apruve_ApruvePayment_Model_Session extends Mage_Core_Model_Session_Abstract
4
+ {
5
+ public function __construct()
6
+ {
7
+ $this->init('apruvepayment');
8
+ }
9
+ }
app/code/community/Apruve/ApruvePayment/controllers/PaymentController.php ADDED
@@ -0,0 +1,175 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Apruve_ApruvePayment_PaymentController extends Mage_Core_Controller_Front_Action
4
+ {
5
+ public function reviewAction()
6
+ {
7
+ $this->loadLayout();
8
+ $this->renderLayout();
9
+ }
10
+
11
+ /**
12
+ * Return checkout session object
13
+ *
14
+ * @return Mage_Checkout_Model_Session
15
+ */
16
+ private function _getCheckoutSession()
17
+ {
18
+ return Mage::getSingleton('checkout/session');
19
+ }
20
+
21
+
22
+ public function placeOrderAction()
23
+ {
24
+ $checkoutSession = $this->_getCheckoutSession();
25
+ $errors = array();
26
+ //call rest api and get result if its ok, proceed
27
+ $quote = $checkoutSession->getQuote();
28
+
29
+ $payment = $quote->getPayment();
30
+ $method = $payment->getMethodInstance();
31
+ $infoIstance = $method->getInfoInstance();
32
+
33
+ $token = $infoIstance->getAdditionalInformation('aprt');
34
+ $amount = $quote->getBaseGrandTotal();
35
+
36
+ $rest = Mage::getModel('apruvepayment/api_rest');
37
+
38
+ $session = Mage::getSingleton('apruvepayment/session');
39
+ if($session->getAddressUpdated()) {
40
+ $tax = $quote->getShippingAddress()->getTaxAmount();
41
+ $shipping = $quote->getShippingAddress()->getShippingAmount();
42
+ if(!$rest->updatePaymentRequest($token, $amount, $shipping, $tax))
43
+ {
44
+ //show errors
45
+ $errors['couldnt_update'] = 'Couldn\'t update order totals to Apruve';
46
+ $session->setErrors($errors);
47
+ return $this->_redirect("*/*/review");
48
+ }
49
+ }
50
+
51
+ if(!$rest->postPayment($token, $amount)) {
52
+ //show errors
53
+ $errors['couldnt_rest_payment'] = 'Apruve couldn\'t process order information';
54
+ $session->setErrors($errors);
55
+ return $this->_redirect("*/*/review");
56
+ }
57
+
58
+ $quote = $checkoutSession->getQuote();
59
+ $quote->collectTotals();
60
+
61
+ $service = Mage::getModel('sales/service_quote', $quote);
62
+ $service->submitAll();
63
+
64
+ $quote->save();
65
+
66
+ $checkoutSession->clearHelperData();
67
+
68
+ // last successful quote
69
+ $quoteId = $quote->getId();
70
+
71
+ $checkoutSession->setLastQuoteId($quoteId)->setLastSuccessQuoteId($quoteId);
72
+
73
+ $order = $service->getOrder();
74
+ if ($order) {
75
+ $checkoutSession->setLastOrderId($order->getId())
76
+ ->setLastRealOrderId($order->getIncrementId());
77
+ } else {
78
+ //error
79
+ }
80
+
81
+ $session->unsetData('address_updated');
82
+ return $this->_redirect('checkout/onepage/success');
83
+ }
84
+
85
+
86
+ /*public function detailsAction()
87
+ {
88
+ $session = $this->_getCheckoutSession();
89
+ if (!$session->getLastSuccessQuoteId()) {
90
+ $this->_redirect('checkout/cart');
91
+ return;
92
+ }
93
+
94
+ $lastQuoteId = $session->getLastQuoteId();
95
+ $lastOrderId = $session->getLastOrderId();
96
+ $lastRecurringProfiles = $session->getLastRecurringProfileIds();
97
+ if (!$lastQuoteId || (!$lastOrderId && empty($lastRecurringProfiles))) {
98
+ $this->_redirect('checkout/cart');
99
+ return;
100
+ }
101
+
102
+ //$session->clear();
103
+ $this->loadLayout();
104
+ //$this->_initLayoutMessages('checkout/session');
105
+ $this->renderLayout();
106
+ }*/
107
+
108
+
109
+ public function updateBillingAddressAction()
110
+ {
111
+ $data = $this->getRequest()->getPost('billing', array());
112
+ $customerAddressId = '';//$data['address_id'];
113
+
114
+ if (isset($data['email'])) {
115
+ $data['email'] = trim($data['email']);
116
+ }
117
+ $onePage = Mage::getSingleton('checkout/type_onepage');
118
+ $result = $onePage->saveBilling($data, $customerAddressId);
119
+
120
+ if(!empty($result)) {
121
+ Mage::getSingleton('apruvepayment/session')->setErrors($result['message']);
122
+ } else {
123
+ $this->_setAddressUpdated();
124
+ }
125
+
126
+ $this->_redirect('*/*/review');
127
+ }
128
+
129
+ public function updateShippingAddressAction()
130
+ {
131
+ $data = $this->getRequest()->getPost('shipping', array());
132
+ $customerAddressId = '';//$data['address_id'];
133
+ $onePage = Mage::getSingleton('checkout/type_onepage');
134
+
135
+ $result = $onePage->saveShipping($data, $customerAddressId);
136
+
137
+ if(!empty($result)) {
138
+ Mage::getSingleton('apruvepayment/session')->setErrors($result['message']);
139
+ } else {
140
+ $this->_setAddressUpdated();
141
+ }
142
+
143
+
144
+ $this->_redirect('*/*/review');
145
+ }
146
+
147
+
148
+ public function updateShippingMethodAction()
149
+ {
150
+ if ($this->getRequest()->isPost()) {
151
+ $data = $this->getRequest()->getPost('shipping_method', '');
152
+ $onePage = Mage::getSingleton('checkout/type_onepage');
153
+ $result = $onePage->saveShippingMethod($data);
154
+ $onePage->getQuote()->collectTotals()->save();
155
+ }
156
+
157
+ $this->_setAddressUpdated();
158
+ $this->_redirect('*/*/review');
159
+ }
160
+
161
+
162
+ private function _setAddressUpdated()
163
+ {
164
+ $session = Mage::getSingleton('apruvepayment/session');
165
+ $session->setAddressUpdated(1);
166
+ }
167
+
168
+
169
+ public function ajaxSetAddressUpdatedAction()
170
+ {
171
+ $this->_setAddressUpdated();
172
+ die(true);
173
+ }
174
+ }
175
+
app/code/community/Apruve/ApruvePayment/controllers/WebhookController.php ADDED
@@ -0,0 +1,108 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Created by JetBrains PhpStorm.
4
+ * User: Saa
5
+ * Date: 14.10.13
6
+ * Time: 13:07
7
+ * To change this template use File | Settings | File Templates.
8
+ */
9
+
10
+ class Apruve_ApruvePayment_WebhookController extends Mage_Core_Controller_Front_Action
11
+ {
12
+ public function updateOrderStatusAction()
13
+ {
14
+ $q = $this->_getHashedQueryString();
15
+
16
+ if(!isset($_GET[$q])) {
17
+ //do nothing
18
+ header("HTTP/1.1 404 Not Found");
19
+ exit;
20
+ }
21
+
22
+ $input = file_get_contents('php://input');
23
+ $data = json_decode($input);
24
+
25
+ $status = $data->status;
26
+ $paymentRequestId = $data->payment_request_id; //transaciton id
27
+
28
+ //todo: compare status by rest request
29
+ if($status == 'rejected') {
30
+ if(!$this->_cancelOrder($paymentRequestId)) {
31
+ header("HTTP/1.1 404 Not Found");
32
+ exit;
33
+ };
34
+ } elseif($status == 'captured' ) {
35
+ if(!$this->_addPayed($paymentRequestId)) {
36
+ header("HTTP/1.1 404 Not Found");
37
+ exit;
38
+ };
39
+ }
40
+
41
+
42
+ header("HTTP/1.1 200");
43
+ exit;
44
+ }
45
+
46
+
47
+ protected function _addPayed($paymentRequestId)
48
+ {
49
+ $transaction = Mage::getModel('sales/order_payment_transaction')->getCollection()
50
+ ->addAttributeToFilter('txn_id', array('eq' => $paymentRequestId))
51
+ ->getFirstItem();
52
+ if(!$transaction->getId()) {
53
+ return false;
54
+ }
55
+
56
+ $order = $transaction->getOrder();
57
+ if(!$order->getId()) {
58
+ return false;
59
+ }
60
+
61
+ $payment = $transaction->getOrder()->getPayment();
62
+ if(!$payment->getId()) {
63
+ exit;
64
+ }
65
+ $payment->capture(null);
66
+ $order->save();
67
+
68
+ $transaction->setOrderPaymentObject($payment);
69
+ $transaction->setIsClosed(true);
70
+ $transaction->save();
71
+ return true;
72
+ }
73
+
74
+
75
+ protected function _cancelOrder($paymentRequestId)
76
+ {
77
+ $transaction = Mage::getModel('sales/order_payment_transaction')->getCollection()
78
+ ->addAttributeToFilter('txn_id', array('eq' => $paymentRequestId))
79
+ ->getFirstItem();
80
+ if(!$transaction->getId()) {
81
+ return false;
82
+ }
83
+
84
+ //todo: add customer notification
85
+ $order = $transaction->getOrder();
86
+ if(!$order->getId()) {
87
+ return false;
88
+ }
89
+ $order->cancel();
90
+ $order->save();
91
+
92
+ $payment = $transaction->getOrder()->getPayment();
93
+ $transaction->setOrderPaymentObject($payment);
94
+ $transaction->setIsClosed(true);
95
+ $transaction->save();
96
+ return true;
97
+ }
98
+
99
+
100
+ protected function _getHashedQueryString()
101
+ {
102
+ $merchantKey = Mage::getStoreConfig('payment/apruvepayment/merchant');
103
+ $apiKey = Mage::getStoreConfig('payment/apruvepayment/api');
104
+ $data = $apiKey.$merchantKey;
105
+ $q = hash('sha256', $data);
106
+ return $q;
107
+ }
108
+ }
app/code/community/Apruve/ApruvePayment/etc/config.xml ADDED
@@ -0,0 +1,74 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <config>
3
+ <modules>
4
+ <Apruve_ApruvePayment>
5
+ <version>1.0.0</version>
6
+ </Apruve_ApruvePayment>
7
+ </modules>
8
+ <frontend>
9
+ <routers>
10
+ <apruvepayment>
11
+ <use>standard</use>
12
+ <args>
13
+ <module>Apruve_ApruvePayment</module>
14
+ <frontName>apruvepayment</frontName>
15
+ </args>
16
+ </apruvepayment>
17
+ </routers>
18
+ <layout>
19
+ <updates>
20
+ <apruvepayment>
21
+ <file>apruvepayment.xml</file>
22
+ </apruvepayment>
23
+ </updates>
24
+ </layout>
25
+ </frontend>
26
+ <global>
27
+ <blocks>
28
+ <apruvepayment>
29
+ <class>Apruve_ApruvePayment_Block</class>
30
+ </apruvepayment>
31
+ </blocks>
32
+ <models>
33
+ <apruvepayment>
34
+ <class>Apruve_ApruvePayment_Model</class>
35
+ </apruvepayment>
36
+ </models>
37
+ <resources>
38
+ <apruvepayment_setup>
39
+ <setup>
40
+ <module>Apruve_ApruvePayment</module>
41
+ <class>Apruve_ApruvePayment_Model_Mysql4_Setup</class>
42
+ </setup>
43
+ <connection>
44
+ <use>core_setup</use>
45
+ </connection>
46
+ </apruvepayment_setup>
47
+ <apruvepayment_write>
48
+ <connection>
49
+ <use>core_write</use>
50
+ </connection>
51
+ </apruvepayment_write>
52
+ <apruvepayment_read>
53
+ <connection>
54
+ <use>core_read</use>
55
+ </connection>
56
+ </apruvepayment_read>
57
+ </resources>
58
+ <helpers>
59
+ <apruvepayment>
60
+ <class>Apruve_ApruvePayment_Helper</class>
61
+ </apruvepayment>
62
+ </helpers>
63
+ </global>
64
+ <default>
65
+ <payment>
66
+ <apruvepayment>
67
+ <active>1</active>
68
+ <model>apruvepayment/paymentMethod</model>
69
+ <order_status>pending_payment</order_status>
70
+ <title>Apruve</title>
71
+ </apruvepayment>
72
+ </payment>
73
+ </default>
74
+ </config>
app/code/community/Apruve/ApruvePayment/etc/system.xml ADDED
@@ -0,0 +1,77 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <config>
3
+ <sections>
4
+ <payment>
5
+ <groups>
6
+ <apruvepayment translate="label">
7
+ <label>Apruve Payment</label>
8
+ <sort_order>670</sort_order>
9
+ <show_in_default>1</show_in_default>
10
+ <show_in_website>1</show_in_website>
11
+ <show_in_store>0</show_in_store>
12
+ <fields>
13
+ <active translate="label">
14
+ <label>Enabled</label>
15
+ <frontend_type>select</frontend_type>
16
+ <source_model>adminhtml/system_config_source_yesno</source_model>
17
+ <sort_order>1</sort_order>
18
+ <show_in_default>1</show_in_default>
19
+ <show_in_website>1</show_in_website>
20
+ <show_in_store>0</show_in_store>
21
+ </active>
22
+ <testmode translate="label">
23
+ <label>Test Mode</label>
24
+ <frontend_type>select</frontend_type>
25
+ <source_model>adminhtml/system_config_source_yesno</source_model>
26
+ <sort_order>2</sort_order>
27
+ <show_in_default>1</show_in_default>
28
+ <show_in_website>1</show_in_website>
29
+ <show_in_store>0</show_in_store>
30
+ </testmode>
31
+ <order_status translate="label">
32
+ <label>New order status</label>
33
+ <frontend_type>select</frontend_type>
34
+ <source_model>adminhtml/system_config_source_order_status_new</source_model>
35
+ <sort_order>6</sort_order>
36
+ <show_in_default>1</show_in_default>
37
+ <show_in_website>1</show_in_website>
38
+ <show_in_store>0</show_in_store>
39
+ </order_status>
40
+ <title translate="label">
41
+ <label>Title</label>
42
+ <frontend_type>text</frontend_type>
43
+ <sort_order>3</sort_order>
44
+ <show_in_default>1</show_in_default>
45
+ <show_in_website>1</show_in_website>
46
+ <show_in_store>0</show_in_store>
47
+ </title>
48
+ <merchant translate="label">
49
+ <label>Merchant Key</label>
50
+ <frontend_type>text</frontend_type>
51
+ <sort_order>4</sort_order>
52
+ <show_in_default>1</show_in_default>
53
+ <show_in_website>1</show_in_website>
54
+ <show_in_store>0</show_in_store>
55
+ </merchant>
56
+ <api translate="label">
57
+ <label>API Key</label>
58
+ <frontend_type>text</frontend_type>
59
+ <sort_order>5</sort_order>
60
+ <show_in_default>1</show_in_default>
61
+ <show_in_website>1</show_in_website>
62
+ <show_in_store>0</show_in_store>
63
+ </api>
64
+ <webhook_url translate="label">
65
+ <label>Webhook Url</label>
66
+ <frontend_model>apruvepayment/admin_webhook</frontend_model>
67
+ <sort_order>10</sort_order>
68
+ <show_in_default>1</show_in_default>
69
+ <show_in_website>1</show_in_website>
70
+ <show_in_store>0</show_in_store>
71
+ </webhook_url>
72
+ </fields>
73
+ </apruvepayment>
74
+ </groups>
75
+ </payment>
76
+ </sections>
77
+ </config>
app/design/frontend/default/default/layout/apruvepayment.xml ADDED
@@ -0,0 +1,48 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <layout version="0.1.0">
2
+ <default>
3
+ <reference name="head">
4
+ <block type="core/template" name="apruve_js" template="apruvepayment/head.phtml" output="toHtml" />
5
+ </reference>
6
+ </default>
7
+
8
+ <apruvepayment_payment_review translate="label">
9
+ <label>Apruve Express Order Review Form</label>
10
+ <remove name="right"/>
11
+ <remove name="left"/>
12
+
13
+ <reference name="root">
14
+ <action method="setTemplate"><template>page/1column.phtml</template></action>
15
+ </reference>
16
+
17
+ <reference name="content">
18
+ <block type="apruvepayment/review" name="apruvepayment.review" template="apruvepayment/review.phtml">
19
+ <block type="apruvepayment/review_billing" name="apruve.review.billing" as="billing" template="apruvepayment/review/address.phtml"/>
20
+ <block type="apruvepayment/review_shipping" name="apruve.review.shipping" as="shipping" template="apruvepayment/review/address.phtml"/>
21
+ <!--<block type="paypal/express_review_shipping" name="express.review.shipping" as="shipping" template="paypal/express/review/address.phtml"/>-->
22
+ <block type="checkout/onepage_shipping_method" name="checkout.onepage.shipping_method" as="shipping_method" template="apruvepayment/review/shipping_method.phtml">
23
+ <block type="checkout/onepage_shipping_method_available" name="checkout.onepage.shipping_method.available" as="available" template="checkout/onepage/shipping_method/available.phtml"/>
24
+ <block type="checkout/onepage_shipping_method_additional" name="checkout.onepage.shipping_method.additional" as="additional" template="checkout/onepage/shipping_method/additional.phtml"/>
25
+ </block>
26
+ <block type="apruvepayment/review_details" name="apruvepayment.review.details" as="details" template="apruvepayment/review/details.phtml">
27
+ <action method="addItemRender"><type>default</type><block>checkout/cart_item_renderer</block><template>checkout/onepage/review/item.phtml</template></action>
28
+ <action method="addItemRender"><type>grouped</type><block>checkout/cart_item_renderer_grouped</block><template>checkout/onepage/review/item.phtml</template></action>
29
+ <action method="addItemRender"><type>configurable</type><block>checkout/cart_item_renderer_configurable</block><template>checkout/onepage/review/item.phtml</template></action>
30
+ <block type="checkout/cart_totals" name="apruvepayment.review.details.totals" as="totals" template="checkout/onepage/review/totals.phtml"/>
31
+ </block>
32
+ <block type="checkout/agreements" name="apruvepayment.review.details.agreements" as="agreements" template="checkout/onepage/agreements.phtml"/>
33
+ </block>
34
+ </reference>
35
+ </apruvepayment_payment_review>
36
+
37
+ <apruvepayment_payment_details>
38
+ <label>One Page Checkout Success</label>
39
+ <reference name="root">
40
+ <action method="setTemplate"><template>page/2columns-right.phtml</template></action>
41
+ </reference>
42
+ <reference name="content">
43
+ <block type="checkout/onepage_success" name="checkout.success" template="checkout/success.phtml"/>
44
+ </reference>
45
+ </apruvepayment_payment_details>
46
+
47
+
48
+ </layout>
app/design/frontend/default/default/template/apruvepayment/head.phtml ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
1
+ <?php if(Mage::getStoreConfig('payment/apruvepayment/testmode')):?>
2
+ <script type="text/javascript" src="https://test.apruve.com/js/apruve.js"></script>
3
+ <?php else: ?>
4
+ <script type="text/javascript" src="https://www.apruve.com/js/apruve.js"></script>
5
+ <?php endif; ?>
6
+ <script type="text/javascript" src="/js/Apruve/ApruvePayment.js"></script>
app/design/frontend/default/default/template/apruvepayment/payment/form.phtml ADDED
@@ -0,0 +1,4 @@
 
 
 
 
1
+ <div id="payment_form_apruvepayment">
2
+ Press continue to review order.
3
+ <input type="hidden" id="aprt" value="" name="payment[aprt]"/>
4
+ </div>
app/design/frontend/default/default/template/apruvepayment/payment/mark.phtml ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $helper = Mage::helper('apruvepayment');
3
+ $paymentRequestModel = $helper->getPaymentRequestApiModel();
4
+ ?>
5
+
6
+ <div id="apruveDiv" style="display: inline-block;"></div>
7
+
8
+ <script type="test/javascript">
9
+ var sh = '<?php echo $paymentRequestModel->getSecureHash();?>';
10
+ var pr = <?php echo $paymentRequestModel->getPaymentRequestJSON();?>;
11
+ var updatedShippingUrl = '<?php echo $helper->getAjaxAddressUpdatedUrl() ?>'
12
+ var oApruvePayment = new ApruvePayment(sh, pr, updatedShippingUrl);
13
+ </script>
app/design/frontend/default/default/template/apruvepayment/review.phtml ADDED
@@ -0,0 +1,70 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php $errors = $this->getErrors();?>
2
+ <div class="page-title">
3
+ <h1><?php echo $this->__('Review Order') ?></h1>
4
+ </div>
5
+ <?php if($errors): ?>
6
+ <div class="error-msg">
7
+ <?php foreach($errors as $error) {
8
+ echo $error.'<br/>';
9
+ }
10
+ ?>
11
+
12
+ </div>
13
+ <br/>
14
+ <?php endif;?>
15
+ <script type="text/javascript">
16
+ var form = new VarienForm('order_review_form');
17
+ </script>
18
+
19
+ <div class="addresses" style="width: 100%; text-align: left;">
20
+ <div class="col-1 info-set" style="width:45%; display: inline-block; float: left;">
21
+ <h2 class="legend"> Billing Info</h2>
22
+ <?php echo $this->getChild('billing')->setFieldNamePrefix('billing')->toHtml(); ?>
23
+ </div>
24
+ <div class="col-2 info-set" style="width:45%; display: inline-block; float: right;">
25
+ <h2 class="legend"> Shipping Info</h2>
26
+ <?php echo $this->getChild('shipping')->setFieldNamePrefix('shipping')->toHtml(); ?>
27
+ </div>
28
+ </div>
29
+ <div style="clear: both;"></div>
30
+
31
+ <div><?php echo $this->getChildHtml('shipping_method'); ?></div>
32
+
33
+
34
+ <?php //echo $this->getChildHtml('shipping_method');?>
35
+ <div class="apruve-review-order">
36
+ <form method="post" id="order_review_form" action="<?php echo $this->getPlaceOrderUrl() ?>">
37
+ <div class="info-set">
38
+ <h2 class="legend"><?php echo $this->__('Items in Your Shopping Cart') ?><span class="separator"> | </span><a href="<?php echo $this->getUrl('checkout/cart') ?>"><?php echo $this->__('Edit Shopping Cart') ?></a></h2>
39
+ <div id="details-reload">
40
+ <?php echo $this->getChildHtml('details') ?>
41
+ </div>
42
+ </div>
43
+ <?php echo $this->getChildHtml('agreements'); ?>
44
+ <div class="buttons-set buttons-set-order" id="review-buttons-container">
45
+ <button type="button" id="review_button" value="<?php echo $this->__('Place Order') ?>" class="button btn-checkout" onclick="form.submit();"><span><span><?php echo $this->__('Place Order') ?></span></span></button>
46
+ <span class="please-wait" id="review-please-wait" style="display:none;">
47
+ <img src="<?php echo $this->getSkinUrl('images/opc-ajax-loader.gif') ?>" alt="<?php echo $this->__('Submitting order information...') ?>" title="<?php echo $this->__('Submitting order information...') ?>" class="v-middle" /> <?php echo $this->__('Submitting order information...') ?>
48
+ </span>
49
+ </div>
50
+ </form>
51
+ </div>
52
+
53
+ <script type="text/javascript">
54
+ //<![CDATA[
55
+ function switchAddressBlockView(prefix) {
56
+ var idAddressForm = prefix+'-address-form';
57
+ var idAddressInfo = prefix+'-address-info';
58
+ var form = $(idAddressForm);
59
+
60
+ if(!form.visible()) {
61
+ form.show();
62
+ $(idAddressInfo).hide();
63
+ } else {
64
+ form.hide();
65
+ $(idAddressInfo).show();
66
+ }
67
+ }
68
+
69
+ //]]>
70
+ </script>
app/design/frontend/default/default/template/apruvepayment/review/address.phtml ADDED
@@ -0,0 +1,398 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Magento
4
+ *
5
+ * NOTICE OF LICENSE
6
+ *
7
+ * This source file is subject to the Academic Free License (AFL 3.0)
8
+ * that is bundled with this package in the file LICENSE_AFL.txt.
9
+ * It is also available through the world-wide-web at this URL:
10
+ * http://opensource.org/licenses/afl-3.0.php
11
+ * If you did not receive a copy of the license and are unable to
12
+ * obtain it through the world-wide-web, please send an email
13
+ * to license@magentocommerce.com so we can send you a copy immediately.
14
+ *
15
+ * DISCLAIMER
16
+ *
17
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
18
+ * versions in the future. If you wish to customize Magento for your
19
+ * needs please refer to http://www.magentocommerce.com for more information.
20
+ *
21
+ * @category design
22
+ * @package base_default
23
+ * @copyright Copyright (c) 2012 Magento Inc. (http://www.magentocommerce.com)
24
+ * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0)
25
+ */
26
+ ?>
27
+ <?php
28
+ $prefix = $this->getFieldNamePrefix();
29
+ $actionUrl = $this->getUrl('apruvepayment/payment/update' . $prefix . 'address');
30
+
31
+ ?>
32
+ <?php if (Mage::getVersion() >= '1.7.0.0') : ?>
33
+ <div class="<?php echo $prefix; ?>-address-info" id="<?php echo $prefix; ?>-address-info">
34
+ <?php echo $this->getAddress()->getFormated(true); ?>
35
+ <br/>
36
+ <a href="#" title="Edit Billing Information" onclick="switchAddressBlockView('<?php echo $prefix; ?>')">Edit</a>
37
+ </div>
38
+
39
+ <form method="post" action="<?php echo $actionUrl; ?>" class="address-form" style="display: none;"
40
+ id="<?php echo $prefix . '-address-form'; ?>">
41
+ <ul class="form-list form-list-narrow">
42
+ <li id="<?php echo $prefix ?>-address-form" class="address-form">
43
+ <fieldset>
44
+ <input type="hidden" name="<?php echo $prefix ?>[address_id]"
45
+ value="<?php echo $this->getAddress()->getId() ?>" id="<?php echo $prefix ?>:address_id"/>
46
+ <ul>
47
+ <li class="fields"><?php echo $this->getLayout()->createBlock('customer/widget_name')->setObject($this->getAddress()->getFirstname() ? $this->getAddress() : $this->getQuote()->getCustomer())->setForceUseCustomerRequiredAttributes(!$this->isCustomerLoggedIn())->setFieldIdFormat($prefix . ':%s')->setFieldNameFormat($prefix . '[%s]')->toHtml() ?></li>
48
+ <li class="fields">
49
+ <div class="field">
50
+ <label for="<?php echo $prefix ?>:company"><?php echo $this->__('Company') ?></label>
51
+
52
+ <div class="input-box">
53
+ <input type="text" id="<?php echo $prefix ?>:company"
54
+ name="<?php echo $prefix ?>[company]"
55
+ value="<?php echo $this->escapeHtml($this->getAddress()->getCompany()) ?>"
56
+ title="<?php echo $this->__('Company') ?>"
57
+ class="input-text <?php echo $this->helper('customer/address')->getAttributeValidationClass('company') ?>"/>
58
+ </div>
59
+ </div>
60
+ <?php if (!$this->isCustomerLoggedIn() && !$this->getHideEmailAddress()): ?>
61
+ <div class="field">
62
+ <label for="<?php echo $prefix ?>:email"
63
+ class="required"><em>*</em><?php echo $this->__('Email Address') ?></label>
64
+
65
+ <div class="input-box">
66
+ <input type="text" name="<?php echo $prefix ?>[email]"
67
+ id="<?php echo $prefix ?>:email"
68
+ value="<?php echo $this->escapeHtml($this->getAddress()->getEmail()) ?>"
69
+ title="<?php echo $this->__('Email Address') ?>"
70
+ class="input-text validate-email required-entry"/>
71
+ </div>
72
+ </div>
73
+ <?php endif; ?>
74
+ </li>
75
+ <?php $_streetValidationClass = $this->helper('customer/address')->getAttributeValidationClass('street'); ?>
76
+ <li class="wide">
77
+ <label for="<?php echo $prefix ?>:street1"
78
+ class="required"><em>*</em><?php echo $this->__('Address') ?></label>
79
+
80
+ <div class="input-box">
81
+ <input type="text" title="<?php echo $this->__('Street Address') ?>"
82
+ name="<?php echo $prefix ?>[street][]" id="<?php echo $prefix ?>:street1"
83
+ value="<?php echo $this->escapeHtml($this->getAddress()->getStreet(1)) ?>"
84
+ class="input-text <?php echo $_streetValidationClass ?>"/>
85
+ </div>
86
+ </li>
87
+ <?php $_streetValidationClass = trim(str_replace('required-entry', '', $_streetValidationClass)); ?>
88
+ <?php for ($_i = 2, $_n = $this->helper('customer/address')->getStreetLines(); $_i <= $_n; $_i++): ?>
89
+ <li class="add-field">
90
+ <div class="input-box">
91
+ <input type="text" title="<?php echo $this->__('Street Address %s', $_i) ?>"
92
+ name="<?php echo $prefix ?>[street][]"
93
+ id="<?php echo $prefix ?>:street<?php echo $_i ?>"
94
+ value="<?php echo $this->escapeHtml($this->getAddress()->getStreet($_i)) ?>"
95
+ class="input-text <?php echo $_streetValidationClass ?>"/>
96
+ </div>
97
+ </li>
98
+ <?php endfor; ?>
99
+ <?php if ($this->helper('customer/address')->isVatAttributeVisible()) : ?>
100
+ <li class="wide">
101
+ <label for="<?php echo $prefix ?>:vat_id"><?php echo $this->__('VAT Number') ?></label>
102
+
103
+ <div class="input-box">
104
+ <input type="text" id="<?php echo $prefix ?>:vat_id"
105
+ name="<?php echo $prefix ?>[vat_id]"
106
+ value="<?php echo $this->escapeHtml($this->getAddress()->getVatId()) ?>"
107
+ title="<?php echo $this->__('VAT Number') ?>"
108
+ class="input-text <?php echo $this->helper('customer/address')->getAttributeValidationClass('vat_id') ?>"/>
109
+ </div>
110
+ </li>
111
+ <?php endif; ?>
112
+ <li class="fields">
113
+ <div class="field">
114
+ <label for="<?php echo $prefix ?>:city"
115
+ class="required"><em>*</em><?php echo $this->__('City') ?></label>
116
+
117
+ <div class="input-box">
118
+ <input type="text" title="<?php echo $this->__('City') ?>"
119
+ name="<?php echo $prefix ?>[city]"
120
+ value="<?php echo $this->escapeHtml($this->getAddress()->getCity()) ?>"
121
+ class="input-text <?php echo $this->helper('customer/address')->getAttributeValidationClass('city') ?>"
122
+ id="<?php echo $prefix ?>:city"/>
123
+ </div>
124
+ </div>
125
+ <div class="field">
126
+ <label for="<?php echo $prefix ?>:region_id"
127
+ class="required"><em>*</em><?php echo $this->__('State/Province') ?></label>
128
+
129
+ <div class="input-box">
130
+ <select id="<?php echo $prefix ?>:region_id" name="<?php echo $prefix ?>[region_id]"
131
+ title="<?php echo $this->__('State/Province') ?>" class="validate-select"
132
+ style="display:none;">
133
+ <option
134
+ value=""><?php echo $this->__('Please select region, state or province') ?></option>
135
+ </select>
136
+ <script type="text/javascript">
137
+ //<![CDATA[
138
+ $('<?php echo $prefix ?>:region_id').setAttribute('defaultValue', "<?php echo $this->getAddress()->getRegionId() ?>");
139
+ //]]>
140
+ </script>
141
+ <input type="text" id="<?php echo $prefix ?>:region"
142
+ name="<?php echo $prefix ?>[region]"
143
+ value="<?php echo $this->escapeHtml($this->getAddress()->getRegion()) ?>"
144
+ title="<?php echo $this->__('State/Province') ?>"
145
+ class="input-text <?php echo $this->helper('customer/address')->getAttributeValidationClass('region') ?>"
146
+ style="display:none;"/>
147
+ </div>
148
+ </div>
149
+ </li>
150
+ <li class="fields">
151
+ <div class="field">
152
+ <label for="<?php echo $prefix ?>:postcode"
153
+ class="required"><em>*</em><?php echo $this->__('Zip/Postal Code') ?></label>
154
+
155
+ <div class="input-box">
156
+ <input type="text" title="<?php echo $this->__('Zip/Postal Code') ?>"
157
+ name="<?php echo $prefix ?>[postcode]" id="<?php echo $prefix ?>:postcode"
158
+ value="<?php echo $this->escapeHtml($this->getAddress()->getPostcode()) ?>"
159
+ class="input-text validate-zip-international <?php echo $this->helper('customer/address')->getAttributeValidationClass('postcode') ?>"/>
160
+ </div>
161
+ </div>
162
+ <div class="field">
163
+ <label for="<?php echo $prefix ?>:country_id"
164
+ class="required"><em>*</em><?php echo $this->__('Country') ?></label>
165
+
166
+ <div class="input-box">
167
+ <?php echo $this->getCountryHtmlSelect($prefix) ?>
168
+ </div>
169
+ </div>
170
+ </li>
171
+ <li class="fields">
172
+ <div class="field">
173
+ <label for="<?php echo $prefix ?>:telephone"
174
+ class="required"><em>*</em><?php echo $this->__('Telephone') ?></label>
175
+
176
+ <div class="input-box">
177
+ <input type="text" name="<?php echo $prefix ?>[telephone]"
178
+ value="<?php echo $this->escapeHtml($this->getAddress()->getTelephone()) ?>"
179
+ title="<?php echo $this->__('Telephone') ?>"
180
+ class="input-text <?php echo $this->helper('customer/address')->getAttributeValidationClass('telephone') ?>"
181
+ id="<?php echo $prefix ?>:telephone"/>
182
+ </div>
183
+ </div>
184
+ <div class="field">
185
+ <label for="<?php echo $prefix ?>:fax"><?php echo $this->__('Fax') ?></label>
186
+
187
+ <div class="input-box">
188
+ <input type="text" name="<?php echo $prefix ?>[fax]"
189
+ value="<?php echo $this->escapeHtml($this->getAddress()->getFax()) ?>"
190
+ title="<?php echo $this->__('Fax') ?>"
191
+ class="input-text <?php echo $this->helper('customer/address')->getAttributeValidationClass('fax') ?>"
192
+ id="<?php echo $prefix ?>:fax"/>
193
+ </div>
194
+ </div>
195
+ </li>
196
+ <?php echo $this->getChildHtml('form.additional.info'); ?>
197
+ <?php if ($this->getShowAsShippingCheckbox()): ?>
198
+ <li class="control">
199
+ <div class="field">
200
+ <div class="input-box">
201
+ <input type="checkbox" name="<?php echo $prefix ?>[as_shipping]"
202
+ class="checkbox" value="1"
203
+ title="<?php echo $this->__('Same as shipping') ?>"
204
+ id="<?php echo $prefix ?>:as_shipping"
205
+ <?php if ($this->getAddress()->getSameAsBilling()): ?>checked="checked"<?php endif; ?>/>
206
+ </div>
207
+ <label
208
+ for="<?php echo $prefix ?>:as_shipping"><?php echo $this->__('Same as shipping') ?></label>
209
+ </div>
210
+ </li>
211
+ <?php endif; ?>
212
+ </ul>
213
+ </fieldset>
214
+ </li>
215
+ </ul>
216
+
217
+ <button type="submit" class="button" style="float: left; margin-top: 10px;"><span><span>Update</span></span>
218
+ </button>
219
+ <button type="button" class="button" style="float: left; margin-top: 10px; margin-left: 10px;"
220
+ onclick="switchAddressBlockView('<?php echo $prefix; ?>')"><span><span>Cancel</span></span></button>
221
+ </form>
222
+ <?php else : ?>
223
+ <div class="<?php echo $prefix; ?>-address-info" id="<?php echo $prefix; ?>-address-info">
224
+ <?php echo $this->getAddress()->getFormated(true); ?>
225
+ <br/>
226
+ <a href="#" title="Edit Billing Information" onclick="switchAddressBlockView('<?php echo $prefix; ?>')">Edit</a>
227
+ </div>
228
+
229
+ <form method="post" action="<?php echo $actionUrl; ?>" class="address-form" style="display: none;"
230
+ id="<?php echo $prefix . '-address-form'; ?>">
231
+ <ul class="form-list form-list-narrow">
232
+ <li id="<?php echo $prefix ?>-address-form" class="address-form">
233
+ <fieldset>
234
+ <input type="hidden" name="<?php echo $prefix ?>[address_id]"
235
+ value="<?php echo $this->getAddress()->getId() ?>" id="<?php echo $prefix ?>:address_id"/>
236
+ <ul>
237
+ <li class="fields"><?php echo $this->getLayout()->createBlock('customer/widget_name')->setObject($this->getAddress()->getFirstname() ? $this->getAddress() : $this->getQuote()->getCustomer())->setForceUseCustomerRequiredAttributes(!$this->isCustomerLoggedIn())->setFieldIdFormat($prefix . ':%s')->setFieldNameFormat($prefix . '[%s]')->toHtml() ?></li>
238
+ <li class="fields">
239
+ <div class="field">
240
+ <label for="<?php echo $prefix ?>:company"><?php echo $this->__('Company') ?></label>
241
+
242
+ <div class="input-box">
243
+ <input type="text" id="<?php echo $prefix ?>:company"
244
+ name="<?php echo $prefix ?>[company]"
245
+ value="<?php echo $this->escapeHtml($this->getAddress()->getCompany()) ?>"
246
+ title="<?php echo $this->__('Company') ?>" class="input-text"/>
247
+ </div>
248
+ </div>
249
+ <?php if (!$this->isCustomerLoggedIn() && !$this->getHideEmailAddress()): ?>
250
+ <div class="field">
251
+ <label for="<?php echo $prefix ?>:email"
252
+ class="required"><em>*</em><?php echo $this->__('Email Address') ?></label>
253
+
254
+ <div class="input-box">
255
+ <input type="text" name="<?php echo $prefix ?>[email]"
256
+ id="<?php echo $prefix ?>:email"
257
+ value="<?php echo $this->escapeHtml($this->getAddress()->getEmail()) ?>"
258
+ title="<?php echo $this->__('Email Address') ?>"
259
+ class="input-text validate-email required-entry"/>
260
+ </div>
261
+ </div>
262
+ <?php endif; ?>
263
+ </li>
264
+ <li class="field">
265
+ <label for="<?php echo $prefix ?>:street1"
266
+ class="required"><em>*</em><?php echo $this->__('Address') ?></label>
267
+
268
+ <div class="input-box">
269
+ <input type="text" title="<?php echo $this->__('Street Address') ?>"
270
+ name="<?php echo $prefix ?>[street][]" id="<?php echo $prefix ?>:street1"
271
+ value="<?php echo $this->escapeHtml($this->getAddress()->getStreet(1)) ?>"
272
+ class="input-text required-entry"/>
273
+ </div>
274
+ </li>
275
+ <?php for ($_i = 2, $_n = $this->helper('customer/address')->getStreetLines(); $_i <= $_n; $_i++): ?>
276
+ <li class="add-field">
277
+ <div class="input-box">
278
+ <input type="text" title="<?php echo $this->__('Street Address %s', $_i) ?>"
279
+ name="<?php echo $prefix ?>[street][]"
280
+ id="<?php echo $prefix ?>:street<?php echo $_i ?>"
281
+ value="<?php echo $this->escapeHtml($this->getAddress()->getStreet($_i)) ?>"
282
+ class="input-text"/>
283
+ </div>
284
+ </li>
285
+ <?php endfor; ?>
286
+ <li class="fields">
287
+ <div class="field">
288
+ <label for="<?php echo $prefix ?>:city"
289
+ class="required"><em>*</em><?php echo $this->__('City') ?></label>
290
+
291
+ <div class="input-box">
292
+ <input type="text" title="<?php echo $this->__('City') ?>"
293
+ name="<?php echo $prefix ?>[city]"
294
+ value="<?php echo $this->escapeHtml($this->getAddress()->getCity()) ?>"
295
+ class="input-text required-entry" id="<?php echo $prefix ?>:city"/>
296
+ </div>
297
+ </div>
298
+ <div class="field">
299
+ <label for="<?php echo $prefix ?>:region_id"
300
+ class="required"><em>*</em><?php echo $this->__('State/Province') ?></label>
301
+
302
+ <div class="input-box">
303
+ <select id="<?php echo $prefix ?>:region_id" name="<?php echo $prefix ?>[region_id]"
304
+ title="<?php echo $this->__('State/Province') ?>" class="validate-select"
305
+ style="display:none;">
306
+ <option
307
+ value=""><?php echo $this->__('Please select region, state or province') ?></option>
308
+ </select>
309
+ <script type="text/javascript">
310
+ //<![CDATA[
311
+ $('<?php echo $prefix ?>:region_id').setAttribute('defaultValue', "<?php echo $this->getAddress()->getRegionId() ?>");
312
+ //]]>
313
+ </script>
314
+ <input type="text" id="<?php echo $prefix ?>:region"
315
+ name="<?php echo $prefix ?>[region]"
316
+ value="<?php echo $this->escapeHtml($this->getAddress()->getRegion()) ?>"
317
+ title="<?php echo $this->__('State/Province') ?>" class="input-text"
318
+ style="display:none;"/>
319
+ </div>
320
+ </div>
321
+ </li>
322
+ <li class="fields">
323
+ <div class="field">
324
+ <label for="<?php echo $prefix ?>:postcode"
325
+ class="required"><em>*</em><?php echo $this->__('Zip/Postal Code') ?></label>
326
+
327
+ <div class="input-box">
328
+ <input type="text" title="<?php echo $this->__('Zip/Postal Code') ?>"
329
+ name="<?php echo $prefix ?>[postcode]" id="<?php echo $prefix ?>:postcode"
330
+ value="<?php echo $this->escapeHtml($this->getAddress()->getPostcode()) ?>"
331
+ class="input-text validate-zip-international"/>
332
+ </div>
333
+ </div>
334
+ <div class="field">
335
+ <label for="<?php echo $prefix ?>:country_id"
336
+ class="required"><em>*</em><?php echo $this->__('Country') ?></label>
337
+
338
+ <div class="input-box">
339
+ <?php echo $this->getCountryHtmlSelect($prefix) ?>
340
+ </div>
341
+ </div>
342
+ </li>
343
+ <li class="fields">
344
+ <div class="field">
345
+ <label for="<?php echo $prefix ?>:telephone"
346
+ class="required"><em>*</em><?php echo $this->__('Telephone') ?></label>
347
+
348
+ <div class="input-box">
349
+ <input type="text" name="<?php echo $prefix ?>[telephone]"
350
+ value="<?php echo $this->escapeHtml($this->getAddress()->getTelephone()) ?>"
351
+ title="<?php echo $this->__('Telephone') ?>" class="input-text"
352
+ id="<?php echo $prefix ?>:telephone"/>
353
+ </div>
354
+ </div>
355
+ <div class="field">
356
+ <label for="<?php echo $prefix ?>:fax"><?php echo $this->__('Fax') ?></label>
357
+
358
+ <div class="input-box">
359
+ <input type="text" name="<?php echo $prefix ?>[fax]"
360
+ value="<?php echo $this->escapeHtml($this->getAddress()->getFax()) ?>"
361
+ title="<?php echo $this->__('Fax') ?>" class="input-text"
362
+ id="<?php echo $prefix ?>:fax"/>
363
+ </div>
364
+ </div>
365
+ </li>
366
+ <?php echo $this->getChildHtml('form.additional.info'); ?>
367
+ <?php if ($this->getShowAsShippingCheckbox()): ?>
368
+ <li class="control">
369
+ <div class="field">
370
+ <div class="input-box">
371
+ <input type="checkbox" name="<?php echo $prefix ?>[as_shipping]"
372
+ class="checkbox" value="1"
373
+ title="<?php echo $this->__('Same as shipping') ?>"
374
+ id="<?php echo $prefix ?>:as_shipping"
375
+ <?php if ($this->getAddress()->getSameAsBilling()): ?>checked="checked"<?php endif; ?>/>
376
+ </div>
377
+ <label
378
+ for="<?php echo $prefix ?>:as_shipping"><?php echo $this->__('Same as shipping') ?></label>
379
+ </div>
380
+ </li>
381
+ <?php endif; ?>
382
+ </ul>
383
+ </fieldset>
384
+ </li>
385
+ </ul>
386
+
387
+ <button type="submit" class="button" style="float: left; margin-top: 10px;"><span><span>Update</span></span>
388
+ </button>
389
+ <button type="button" class="button" style="float: left; margin-top: 10px; margin-left: 10px;"
390
+ onclick="switchAddressBlockView('<?php echo $prefix; ?>')"><span><span>Cancel</span></span></button>
391
+ </form>
392
+ <?php endif; ?>
393
+ <script type="text/javascript">
394
+ //<![CDATA[
395
+ var <?php echo $prefix ?>RegionUpdater = new RegionUpdater('<?php echo $prefix ?>:country_id', '<?php echo $prefix ?>:region', '<?php echo $prefix ?>:region_id', <?php echo $this->helper('directory')->getRegionJson() ?>, undefined, '<?php echo $prefix ?>:postcode');
396
+ <?php echo $prefix ?>RegionUpdater.update();
397
+ //]]>
398
+ </script>
app/design/frontend/default/default/template/apruvepayment/review/details.phtml ADDED
@@ -0,0 +1,64 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Magento
4
+ *
5
+ * NOTICE OF LICENSE
6
+ *
7
+ * This source file is subject to the Academic Free License (AFL 3.0)
8
+ * that is bundled with this package in the file LICENSE_AFL.txt.
9
+ * It is also available through the world-wide-web at this URL:
10
+ * http://opensource.org/licenses/afl-3.0.php
11
+ * If you did not receive a copy of the license and are unable to
12
+ * obtain it through the world-wide-web, please send an email
13
+ * to license@magentocommerce.com so we can send you a copy immediately.
14
+ *
15
+ * DISCLAIMER
16
+ *
17
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
18
+ * versions in the future. If you wish to customize Magento for your
19
+ * needs please refer to http://www.magentocommerce.com for more information.
20
+ *
21
+ * @category design
22
+ * @package base_default
23
+ * @copyright Copyright (c) 2012 Magento Inc. (http://www.magentocommerce.com)
24
+ * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0)
25
+ */
26
+
27
+ /**
28
+ * @see Mage_Paypal_Block_Express_Review_Details
29
+ */
30
+ ?>
31
+ <table id="details-table" class="data-table">
32
+ <?php if ($this->helper('tax')->displayCartBothPrices()): $colspan = $rowspan = 2; else: $colspan = $rowspan = 1; endif; ?>
33
+ <col />
34
+ <col width="1" />
35
+ <col width="1" />
36
+ <col width="1" />
37
+ <?php if ($this->helper('tax')->displayCartBothPrices()): ?>
38
+ <col width="1" />
39
+ <col width="1" />
40
+ <?php endif; ?>
41
+ <thead>
42
+ <tr>
43
+ <th rowspan="<?php echo $rowspan ?>"><?php echo $this->__('Product Name') ?></th>
44
+ <th colspan="<?php echo $colspan ?>" class="a-center"><?php echo $this->__('Price') ?></th>
45
+ <th rowspan="<?php echo $rowspan ?>" class="a-center"><?php echo $this->__('Qty') ?></th>
46
+ <th colspan="<?php echo $colspan ?>" class="a-center"><?php echo $this->__('Subtotal') ?></th>
47
+ </tr>
48
+ <?php if ($this->helper('tax')->displayCartBothPrices()): ?>
49
+ <tr>
50
+ <th class="a-right"><?php echo $this->helper('tax')->getIncExcTaxLabel(false) ?></th>
51
+ <th><?php echo $this->helper('tax')->getIncExcTaxLabel(true) ?></th>
52
+ <th class="a-right"><?php echo $this->helper('tax')->getIncExcTaxLabel(false) ?></th>
53
+ <th><?php echo $this->helper('tax')->getIncExcTaxLabel(true) ?></th>
54
+ </tr>
55
+ <?php endif; ?>
56
+ </thead>
57
+ <?php echo $this->getChildHtml('totals'); ?>
58
+ <tbody>
59
+ <?php foreach($this->getItems() as $_item): ?>
60
+ <?php echo $this->getItemHtml($_item) ?>
61
+ <?php endforeach ?>
62
+ </tbody>
63
+ </table>
64
+ <script type="text/javascript">decorateTable('details-table');</script>
app/design/frontend/default/default/template/apruvepayment/review/result.phtml ADDED
@@ -0,0 +1 @@
 
1
+ Thank you for your order.
app/design/frontend/default/default/template/apruvepayment/review/shipping/method.phtml ADDED
@@ -0,0 +1,53 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Magento
4
+ *
5
+ * NOTICE OF LICENSE
6
+ *
7
+ * This source file is subject to the Academic Free License (AFL 3.0)
8
+ * that is bundled with this package in the file LICENSE_AFL.txt.
9
+ * It is also available through the world-wide-web at this URL:
10
+ * http://opensource.org/licenses/afl-3.0.php
11
+ * If you did not receive a copy of the license and are unable to
12
+ * obtain it through the world-wide-web, please send an email
13
+ * to license@magentocommerce.com so we can send you a copy immediately.
14
+ *
15
+ * DISCLAIMER
16
+ *
17
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
18
+ * versions in the future. If you wish to customize Magento for your
19
+ * needs please refer to http://www.magentocommerce.com for more information.
20
+ *
21
+ * @category design
22
+ * @package base_default
23
+ * @copyright Copyright (c) 2012 Magento Inc. (http://www.magentocommerce.com)
24
+ * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0)
25
+ */
26
+ /** @var $this Mage_Paypal_Block_Express_Review */
27
+ ?>
28
+ <fieldset id="shipping-method-container">
29
+ <?php if ($this->getCanEditShippingMethod() || !$this->getCurrentShippingRate()):?>
30
+ <?php if ($groups = $this->getShippingRateGroups()):?>
31
+ <?php $currentRate = $this->getCurrentShippingRate(); ?>
32
+ <select name="shipping_method" id="shipping_method" style="width:250px;" class="required-entry">
33
+ <?php if (!$currentRate):?>
34
+ <option value=""><?php echo $this->__('Please select a shipping method...') ?></option>
35
+ <?php endif;?>
36
+ <?php foreach ($groups as $code => $rates):?>
37
+ <optgroup label="<?php echo $this->escapeHtml($this->getCarrierName($code)) ?>" style="font-style:normal;">
38
+ <?php foreach ($rates as $rate):?>
39
+ <option value="<?php echo $this->renderShippingRateValue($rate)?>"<?php echo ($currentRate === $rate) ? ' selected="selected"' : '' ;?>>
40
+ <?php echo $this->renderShippingRateOption($rate)?>
41
+ </option>
42
+ <?php endforeach;?>
43
+ </optgroup>
44
+ <?php endforeach;?>
45
+ </select>
46
+ <?php else: ?>
47
+ <p><strong><?php echo $this->__('Sorry, no quotes are available for this order at this time.') ?></strong></p>
48
+ <?php endif;?>
49
+ <?php else: ?>
50
+ <p><strong><?php echo $this->renderShippingRateOption($this->getCurrentShippingRate())?></strong></p>
51
+ <?php endif; ?>
52
+ </fieldset>
53
+ <div style="display:none" id="shipping_method_update"><p><?php echo $this->__('Please update order data to get shipping methods and rates') ?></p></div>
app/design/frontend/default/default/template/apruvepayment/review/shipping_method.phtml ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <div class="info-set">
2
+ <h2 class="legend">Shipping Method</h2>
3
+ <form method="post" action="<?php echo $this->getUrl('apruvepayment/payment/updateShippingMethod');?>">
4
+ <div id="checkout-shipping-method-load">
5
+ <?php echo $this->getChildHtml('available') ?>
6
+ </div>
7
+ <script type="text/javascript">
8
+ //<![CDATA[
9
+ //var shippingMethod = new ShippingMethod('co-shipping-method-form', "<?php echo $this->getUrl('checkout/onepage/saveShippingMethod') ?>");
10
+ //]]>
11
+ </script>
12
+ <div id="onepage-checkout-shipping-method-additional-load">
13
+ <?php echo $this->getChildHtml('additional') ?>
14
+ </div>
15
+ <button type="submit" class="button"><span><span>Update</span></span></button>
16
+ </form>
17
+ </div>
app/design/frontend/default/default/template/apruvepayment/shortcut.phtml ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php $helper = Mage::helper('apruvepayment'); ?>
2
+
3
+ <script src="https://test.apruve.com/js/apruve.js" type="text/javascript"></script>
4
+ <script type="text/javascript">
5
+ apruve.logoSrc = '/img/generic-logo.png';
6
+ apruve.secureHash = '<?php echo $helper->getSecureHash();?>';
7
+ apruve.paymentRequest = <?php echo $helper->getPaymentRequestJson();?>;
8
+ </script>
9
+
10
+ <div id="apruveDiv"/>
11
+
app/etc/modules/Apruve_ApruvePayment.xml ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
1
+ <config>
2
+ <modules>
3
+ <Apruve_ApruvePayment>
4
+ <active>true</active>
5
+ <codePool>community</codePool>
6
+ </Apruve_ApruvePayment>
7
+ </modules>
8
+ </config>
js/Apruve/ApruvePayment.js ADDED
@@ -0,0 +1,88 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ var ApruvePayment = Class.create();
2
+
3
+ ApruvePayment.prototype = {
4
+ initialize: function (hash, pr, updatedShippingUrl) {
5
+ if (!apruve) {
6
+ return false;
7
+ }
8
+
9
+ this._checkShipping(pr, updatedShippingUrl);
10
+
11
+ apruve.logoSrc = '';
12
+ apruve.secureHash = hash;
13
+ apruve.paymentRequest = pr;
14
+ this._onLoad();
15
+ },
16
+
17
+ _onLoad: function () {
18
+ if ($('apruveDiv') && !$('apruveBtn') && typeof(apruve) == 'object') {
19
+ apruve.loadButton();
20
+ this._resetApruveRadio();
21
+ this._prepareApruve();
22
+ this._registerCallbacks();
23
+
24
+ }
25
+ },
26
+
27
+ _prepareApruve: function () {
28
+ $('p_method_apruvepayment').observe('click', function () {
29
+ apruve.startCheckout();
30
+ });
31
+
32
+ },
33
+
34
+ _registerCallbacks: function () {
35
+ var self = this;
36
+ apruve.registerApruveCallback(apruve.APRUVE_COMPLETE_EVENT, function () {
37
+ self._resetApruveRadio();
38
+ });
39
+
40
+ apruve.registerApruveCallback(apruve.APRUVE_CLOSED_EVENT, function () {
41
+ self._resetApruveRadio();
42
+ });
43
+ },
44
+
45
+
46
+ _resetApruveRadio: function () {
47
+ if (!apruve.paymentRequestId) {
48
+ document.getElementById("p_method_apruvepayment").checked = false;
49
+ document.getElementById("payment_form_apruvepayment").style.display = 'none';
50
+ document.getElementById("aprt").value = '';
51
+ } else {
52
+ document.getElementById("aprt").value = apruve.paymentRequestId;
53
+ var radio = document.getElementById("p_method_apruvepayment");
54
+ if (!radio.checked) {
55
+ radio.checked = true;
56
+ document.getElementById("payment_form_apruvepayment").style.display = '';
57
+ document.getElementById("aprt").disabled = false;
58
+ }
59
+ }
60
+ },
61
+
62
+
63
+ _checkShipping: function (pr, updatedShippingUrl) {
64
+ if (apruve.paymentRequestId && !(apruve.paymentRequest.shipping_cents == pr.shipping_cents)) {
65
+ this._setShippingUpdated(updatedShippingUrl);
66
+ }
67
+ },
68
+
69
+ _setShippingUpdated: function (updatedShippingUrl) {
70
+ var self = this;
71
+ new Ajax.Request(
72
+ updatedShippingUrl,
73
+ {
74
+ method: 'post',
75
+ onSuccess: function(response) {
76
+ if (!response.responseText) {
77
+ apruve.paymentRequestId = '';
78
+ self._resetApruveRadio();
79
+ alert('Failed to update shipping cost. Please try to resubmit your order with apruve');
80
+ }
81
+ },
82
+ onFailure: function() {
83
+ self._resetApruveRadio();
84
+ }
85
+ }
86
+ )
87
+ }
88
+ };
package.xml ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <package>
3
+ <name>Apruve_B2B_Payment_Gateway</name>
4
+ <version>1.0.0</version>
5
+ <stability>stable</stability>
6
+ <license uri="http://www.apache.org/licenses/LICENSE-2.0">Apache License, 2.0</license>
7
+ <channel>community</channel>
8
+ <extends/>
9
+ <summary>Payments designed for business spending. Increase sales and reduce cart abandonment by allowing your shoppers to send purchases directly to their company or client for payment, simply by using an email address instead of a credit card. Learn more and sign up for a free merchant account at http://www.apruve.com.</summary>
10
+ <description>Payments designed for business spending. Increase sales and reduce cart abandonment by allowing your shoppers to send purchases directly to their company or client for payment, simply by using an email address instead of a credit card. Learn more and sign up for a free merchant account at http://www.apruve.com.</description>
11
+ <notes>First release.</notes>
12
+ <authors><author><name>Apruve</name><user>apruve</user><email>magento@apruve.com</email></author></authors>
13
+ <date>2013-12-11</date>
14
+ <time>11:00:36</time>
15
+ <contents><target name="magecommunity"><dir name="Apruve"><dir name="ApruvePayment"><dir name="Block"><dir name="Admin"><file name="Webhook.php" hash="7d177e854e1f11abf4bf2f2e7961f23c"/></dir><dir name="Payment"><file name="Form.php" hash="9165ecf944750bb0945bfd92e8e6aa37"/></dir><dir name="Review"><file name="Billing.php" hash="a5b5ae0eb3c462e254cd17836cd0c322"/><file name="Details.php" hash="0098c3c32cfe7b3b88b2f3c282b386ba"/><file name="Result.php" hash="30e178df0f289a60615e3e5d1593f9de"/><file name="Shipping.php" hash="69cbea66dfe1ef0b15ff1a9fe02e84e6"/></dir><file name="Review.php" hash="5997c4fd7a53db047daaaca156ab634d"/></dir><dir name="Helper"><file name="Data.php" hash="aa55449aa48b32b6ad429630742301e7"/></dir><dir name="Model"><dir name="Api"><file name="Abstract.php" hash="52a9387e00e6146a3f530a6efba29e15"/><file name="PaymentRequest.php" hash="238f4670b7b302b335833c330f538cd6"/><file name="Rest.php" hash="bedde3a67c7f50baf7c0b9a76cfb84de"/></dir><dir name="Mysql4"><file name="Setup.php" hash="8b3e5b033dac91b47e59c024e16c04ec"/></dir><file name="PaymentMethod.php" hash="20c873a5621dae7e2c7e291967e2fdd5"/><file name="Session.php" hash="c48c70cec29137079926f304007569a6"/></dir><dir name="controllers"><file name="PaymentController.php" hash="c28f9e11f9794f3ce2664740a24f1f76"/><file name="WebhookController.php" hash="a609157048ab0fa542f08bc6d336daa3"/></dir><dir name="etc"><file name="config.xml" hash="ba9a92a6ffce62962f0b79a059ef53f0"/><file name="system.xml" hash="edea825e239bc173d092d86cb940fe4d"/></dir></dir></dir></target><target name="mageetc"><dir name="modules"><file name="Apruve_ApruvePayment.xml" hash="68277872189de89c07b32651805c0cfd"/></dir></target><target name="magedesign"><dir name="frontend"><dir name="default"><dir name="default"><dir name="layout"><file name="apruvepayment.xml" hash="1d52df076454609594100f4f34410335"/></dir><dir name="template"><dir name="apruvepayment"><file name="head.phtml" hash="84ac2a40701192e2570f911c29700a35"/><dir name="payment"><file name="form.phtml" hash="a25aa81654842c663049f6fde95fea96"/><file name="mark.phtml" hash="53bef0ba7c446f46eaef3b1ce43c0daf"/></dir><dir name="review"><file name="address.phtml" hash="2d1c8a3ab36d35626c34e3a85466cedf"/><file name="details.phtml" hash="131bb43940d21196dd5067f4526e2ee5"/><file name="result.phtml" hash="a053fc9952a7dfc79282eba56ab8ad3a"/><dir name="shipping"><file name="method.phtml" hash="b3d255b8567f88996b2ed7cc36895a6e"/></dir><file name="shipping_method.phtml" hash="612a34af37ed0f2dc74a4e740663e519"/></dir><file name="review.phtml" hash="3563a6076a4185404dbdf409a2897735"/><file name="shortcut.phtml" hash="3199f72c2a48e96d3f0b38da6b841c36"/></dir></dir></dir></dir></dir></target><target name="mageweb"><dir name="js"><dir name="Apruve"><file name="ApruvePayment.js" hash="e6f1716e3e0668963dffff0d1ab04fb1"/></dir></dir></target></contents>
16
+ <compatible/>
17
+ <dependencies><required><php><min>5.2.0</min><max>6.0.0</max></php></required></dependencies>
18
+ </package>