SimplePay_Payments - Version 1.0.0

Version Notes

First stable release

Download this release

Release Info

Developer SimplePay
Extension SimplePay_Payments
Version 1.0.0
Comparing to
See all releases


Version 1.0.0

app/code/community/SimplePay/Payments/Block/Payment.php ADDED
@@ -0,0 +1,58 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Payment Block
5
+ *
6
+ * @category Block
7
+ * @package SimplePay_Payments
8
+ * @author SimplePay
9
+ */
10
+ class SimplePay_Payments_Block_Payment extends Mage_Core_Block_Template
11
+ {
12
+
13
+ /**
14
+ * Get checkout session namespace
15
+ *
16
+ * @return Mage_Checkout_Model_Session
17
+ */
18
+ protected function _getCheckout()
19
+ {
20
+ return Mage::getSingleton('checkout/session');
21
+ }
22
+
23
+ /**
24
+ * Get SimplePay config
25
+ *
26
+ * @return SimplePay_Payments_Model_Config
27
+ */
28
+ public function getConfig()
29
+ {
30
+ return Mage::getSingleton('simplepay/config');
31
+ }
32
+
33
+ protected function getPaymentModel()
34
+ {
35
+ return Mage::getSingleton('simplepay/payment');
36
+ }
37
+
38
+ public function getFormUrl($storeId = 0)
39
+ {
40
+ return $this->getConfig()->getFormUrl($storeId);
41
+ }
42
+
43
+ public function getResponseUrl()
44
+ {
45
+ return $this->getConfig()->getResponseUrl();
46
+ }
47
+
48
+ public function getCancelUrl()
49
+ {
50
+ return $this->getConfig()->getCancelUrl();
51
+ }
52
+
53
+ public function getAcceptedBrandsForForm($storeId = 0)
54
+ {
55
+ return $this->getConfig()->getAcceptedBrandsForForm();
56
+ }
57
+
58
+ }
app/code/community/SimplePay/Payments/Helper/Data.php ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Helper
5
+ *
6
+ * @category Helper
7
+ * @package SimplePay_Payments
8
+ * @author SimplePay
9
+ */
10
+ class SimplePay_Payments_Helper_Data extends Mage_Core_Helper_Abstract
11
+ {
12
+
13
+ // Brand name to values array
14
+ protected $brandNames = array(
15
+ 'American Express' => 'AMEX',
16
+ 'Diners' => 'DINERS',
17
+ 'JCB' => 'JCB',
18
+ 'MasterCard' => 'MASTER',
19
+ 'Visa' => 'VISA',
20
+ );
21
+
22
+ /**
23
+ * Returns config model
24
+ *
25
+ * @return SimplePay_Payments_Model_Config
26
+ */
27
+ public function getConfig()
28
+ {
29
+ return Mage::getSingleton('simplepay/config');
30
+ }
31
+
32
+ public function brandToValue($brand)
33
+ {
34
+ return $this->brandNames[$brand];
35
+ }
36
+
37
+ }
app/code/community/SimplePay/Payments/Model/Brands.php ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Brands
5
+ */
6
+ class SimplePay_Payments_Model_Brands
7
+ {
8
+ /**
9
+ * @return array
10
+ */
11
+ public function toOptionArray()
12
+ {
13
+ $options = array();
14
+
15
+ $brands = Mage::getModel('simplepay/config')->getAllBrands();
16
+
17
+ $translatedBrands = array();
18
+
19
+ foreach ($brands as $brand) {
20
+ $translatedBrands[$brand] = Mage::helper('simplepay')->brandToValue($brand);
21
+ }
22
+
23
+ foreach ($translatedBrands as $label => $value) {
24
+ $options[] = array(
25
+ 'label' => $label,
26
+ 'value' => $value,
27
+ );
28
+ }
29
+
30
+ return $options;
31
+ }
32
+ }
app/code/community/SimplePay/Payments/Model/Config.php ADDED
@@ -0,0 +1,210 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Config Model
5
+ *
6
+ * @category Model
7
+ * @package SimplePay_Payments
8
+ * @author SimplePay
9
+ */
10
+ class SimplePay_Payments_Model_Config extends Mage_Payment_Model_Config
11
+ {
12
+ const SIMPLEPAY_PATH = 'payment_services/simplepay/';
13
+ const SIMPLEPAY_CONTROLLER_ROUTE = 'simplepay/payment/';
14
+
15
+ /**
16
+ * Token generation URLs
17
+ */
18
+ const TOKEN_URL = 'https://simplepays.com/frontend/GenerateToken';
19
+ const TOKEN_TEST_URL = 'https://test.simplepays.com/frontend/GenerateToken';
20
+
21
+ /**
22
+ * Payment form URLs
23
+ */
24
+ const FORM_URL = 'https://simplepays.com/frontend/widget/v3/widget.js?language=en&style=card';
25
+ const FORM_TEST_URL = 'https://test.simplepays.com/frontend/widget/v3/widget.js?language=en&style=card';
26
+
27
+ /**
28
+ * Transaction status URLs
29
+ */
30
+ const STATUS_URL = 'https://simplepays.com/frontend/GetStatus;jsessionid=';
31
+ const STATUS_TEST_URL = 'https://test.simplepays.com/frontend/GetStatus;jsessionid=';
32
+
33
+ /**
34
+ * Return SimplePay config information
35
+ *
36
+ * @param string $path
37
+ * @param int $storeId
38
+ * @return Simple_Xml
39
+ */
40
+ public function getConfigData($path, $storeId = null)
41
+ {
42
+ if (!empty($path)) {
43
+ return Mage::getStoreConfig(self::SIMPLEPAY_PATH . $path, $storeId);
44
+ }
45
+ return false;
46
+ }
47
+
48
+ /**
49
+ * Return security sender from config
50
+ *
51
+ * @param int $storeId
52
+ * @return string
53
+ */
54
+ public function getSecuritySender($storeId = null)
55
+ {
56
+ return Mage::helper('core')->decrypt($this->getConfigData('security_sender', $storeId));
57
+ }
58
+
59
+ /**
60
+ * Return transaction channel from config
61
+ *
62
+ * @param int $storeId
63
+ * @return string
64
+ */
65
+ public function getTransactionChannel($storeId = null)
66
+ {
67
+ return Mage::helper('core')->decrypt($this->getConfigData('transaction_channel', $storeId));
68
+ }
69
+
70
+ /**
71
+ * Return transaction mode from config
72
+ *
73
+ * @param int $storeId
74
+ * @return string
75
+ */
76
+ public function getTransactionMode($storeId = null)
77
+ {
78
+ return Mage::helper('core')->decrypt($this->getConfigData('transaction_mode', $storeId));
79
+ }
80
+
81
+ /**
82
+ * Return user login from config
83
+ *
84
+ * @param int $storeId
85
+ * @return string
86
+ */
87
+ public function getUserLogin($storeId = null)
88
+ {
89
+ return Mage::helper('core')->decrypt($this->getConfigData('user_login', $storeId));
90
+ }
91
+
92
+ /**
93
+ * Return user pwd from config
94
+ *
95
+ * @param int $storeId
96
+ * @return string
97
+ */
98
+ public function getUserPwd($storeId = null)
99
+ {
100
+ return Mage::helper('core')->decrypt($this->getConfigData('user_pwd', $storeId));
101
+ }
102
+
103
+ /**
104
+ * Return user pwd from config
105
+ *
106
+ * @param int $storeId
107
+ * @return string
108
+ */
109
+ public function getPaymentType($storeId = null)
110
+ {
111
+ return Mage::helper('core')->decrypt($this->getConfigData('payment_type', $storeId));
112
+ }
113
+
114
+ /**
115
+ * Check whether in test mode or not
116
+ *
117
+ * @return boolean
118
+ */
119
+ public function inTestMode($storeId = null)
120
+ {
121
+ return $this->getConfigData('test_mode_flag', $storeId);
122
+ }
123
+
124
+ public function getTokenUrl($storeId = 0)
125
+ {
126
+ if ($this->inTestMode($storeId)) {
127
+ return self::TOKEN_TEST_URL;
128
+ } else {
129
+ return self::TOKEN_URL;
130
+ }
131
+ }
132
+
133
+ public function getFormUrl($storeId = 0)
134
+ {
135
+ if ($this->inTestMode($storeId)) {
136
+ return self::FORM_TEST_URL;
137
+ } else {
138
+ return self::FORM_URL;
139
+ }
140
+ }
141
+
142
+ public function getStatusUrl($storeId = 0)
143
+ {
144
+ if ($this->inTestMode($storeId)) {
145
+ return self::STATUS_TEST_URL;
146
+ } else {
147
+ return self::STATUS_URL;
148
+ }
149
+ }
150
+
151
+ /**
152
+ * Returns the accepted brands
153
+ */
154
+ public function getAcceptedBrands()
155
+ {
156
+ return Mage::getStoreConfig('payment/simplepay/brands');
157
+ }
158
+
159
+ /**
160
+ * Return all accepted brands
161
+ */
162
+ public function getAllBrands()
163
+ {
164
+ return explode(',', Mage::getStoreConfig('payment/simplepay/availableBrands'));
165
+ }
166
+
167
+ public function getAcceptedBrandsForForm()
168
+ {
169
+ return implode(' ', explode(',', $this->getAcceptedBrands()));
170
+ }
171
+
172
+ /**
173
+ * Return URL to redirect after placing an order
174
+ *
175
+ * @return string
176
+ */
177
+ public function getPaymentRedirectUrl()
178
+ {
179
+ return Mage::getUrl(
180
+ self::SIMPLEPAY_CONTROLLER_ROUTE . 'pay',
181
+ array('_secure' => true, '_nosid' => true)
182
+ );
183
+ }
184
+
185
+ /**
186
+ * Return URL to return to after submitting the payment form
187
+ *
188
+ * @return string
189
+ */
190
+ public function getResponseUrl()
191
+ {
192
+ return Mage::getUrl(
193
+ self::SIMPLEPAY_CONTROLLER_ROUTE . 'response',
194
+ array('_secure' => true, '_nosid' => true)
195
+ );
196
+ }
197
+
198
+ /**
199
+ * Return the cancel URL
200
+ *
201
+ * @return string
202
+ */
203
+ public function getCancelUrl()
204
+ {
205
+ return Mage::getUrl(
206
+ self::SIMPLEPAY_CONTROLLER_ROUTE . 'cancel',
207
+ array('_secure' => true, '_nosid' => true)
208
+ );
209
+ }
210
+ }
app/code/community/SimplePay/Payments/Model/Payment.php ADDED
@@ -0,0 +1,69 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Payment Model
5
+ *
6
+ * @category Model
7
+ * @package SimplePay_Payments
8
+ * @author SimplePay
9
+ */
10
+ class SimplePay_Payments_Model_Payment extends Mage_Payment_Model_Method_Abstract
11
+ {
12
+
13
+ /**
14
+ * Unique internal payment method identifier
15
+ */
16
+ protected $_code = 'simplepay';
17
+
18
+ /**
19
+ * Availability options
20
+ */
21
+ protected $_isGateway = true;
22
+ protected $_canAuthorize = false;
23
+ protected $_canCapture = false;
24
+ protected $_canCapturePartial = false;
25
+ protected $_canRefund = false;
26
+ protected $_canRefundInvoicePartial = false;
27
+ protected $_canVoid = false;
28
+ protected $_canUseInternal = false;
29
+ protected $_canUseCheckout = true;
30
+ protected $_canUseForMultishipping = false;
31
+ protected $_canSaveCc = false;
32
+ protected $_canFetchTransactionInfo = false;
33
+
34
+ protected function getConfig()
35
+ {
36
+ return Mage::getModel('simplepay/config');
37
+ }
38
+
39
+ public function getTokenUrl($storeId = 0)
40
+ {
41
+ return $this->getConfig()->getTokenUrl($storeId);
42
+ }
43
+
44
+ public function getFormUrl($storeId = 0)
45
+ {
46
+ return $this->getConfig()->getFormUrl($storeId);
47
+ }
48
+
49
+ public function getStatusUrl($storeId = 0)
50
+ {
51
+ return $this->getConfig()->getStatusUrl($storeId);
52
+ }
53
+
54
+ public function getAcceptedBrandsForForm()
55
+ {
56
+ return $this->getConfig()->getAcceptedBrandsForForm();
57
+ }
58
+
59
+ /**
60
+ * Redirect URL to payment form
61
+ *
62
+ * @return string
63
+ */
64
+ public function getOrderPlaceRedirectUrl()
65
+ {
66
+ return $this->getConfig()->getPaymentRedirectUrl();
67
+ }
68
+
69
+ }
app/code/community/SimplePay/Payments/controllers/PaymentController.php ADDED
@@ -0,0 +1,317 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Payment Controller
5
+ *
6
+ * @category Controller
7
+ * @package SimplePay_Payments
8
+ * @author SimplePay
9
+ */
10
+ class SimplePay_Payments_PaymentController extends Mage_Core_Controller_Front_Action {
11
+
12
+ /**
13
+ * Get checkout session namespace
14
+ *
15
+ * @return Mage_Checkout_Model_Session
16
+ */
17
+ protected function _getCheckout()
18
+ {
19
+ return Mage::getSingleton('checkout/session');
20
+ }
21
+
22
+ protected function getConfig()
23
+ {
24
+ return Mage::getSingleton('simplepay/config');
25
+ }
26
+
27
+ protected function getPaymentModel()
28
+ {
29
+ return Mage::getSingleton('simplepay/payment');
30
+ }
31
+
32
+ protected function generatePaymentToken($storeId = 0)
33
+ {
34
+
35
+ // Get the token generation URL
36
+ $tokenUrl = $this->getConfig()->getTokenUrl($storeId);
37
+
38
+ // Get the order ID from the session data
39
+ $lastIncrementId = $this->_getCheckout()->getLastRealOrderId();
40
+
41
+ if ($lastIncrementId) {
42
+
43
+ // Load the order using the order ID
44
+ $order = Mage::getModel('sales/order');
45
+ $order->loadByIncrementId($lastIncrementId);
46
+
47
+ // Prepare the data for generating a payment token
48
+ $data = array(
49
+ 'SECURITY.SENDER' => $this->getConfig()->getSecuritySender($storeId),
50
+ 'TRANSACTION.CHANNEL' => $this->getConfig()->getTransactionChannel($storeId),
51
+ 'TRANSACTION.MODE' => $this->getConfig()->getTransactionMode($storeId),
52
+ 'USER.LOGIN' => $this->getConfig()->getUserLogin($storeId),
53
+ 'USER.PWD' => $this->getConfig()->getUserPwd($storeId),
54
+ 'PAYMENT.TYPE' => $this->getConfig()->getPaymentType($storeId),
55
+ 'PRESENTATION.AMOUNT' => $order->getGrandTotal(),
56
+ 'PRESENTATION.CURRENCY' => $order->getOrderCurrencyCode(),
57
+ 'IDENTIFICATION.INVOICEID' => $lastIncrementId,
58
+ );
59
+
60
+ $options = array(
61
+ 'http' => array(
62
+ 'header' => "Content-type: application/x-www-form-urlencoded\r\n",
63
+ 'method' => 'POST',
64
+ 'content' => http_build_query($data),
65
+ )
66
+ );
67
+
68
+ $context = stream_context_create($options);
69
+ $response = file_get_contents($tokenUrl, false, $context);
70
+
71
+ // Check if the response is valid, return null if no response was received
72
+ if ($response === false) {
73
+ return null;
74
+ }
75
+
76
+ $resultJson = json_decode($response, true);
77
+
78
+ // Return the payment token
79
+ if (isset($resultJson['transaction']['token'])) {
80
+ return $resultJson['transaction']['token'];
81
+ }
82
+ }
83
+
84
+ // Did not find an order ID in the session data, return null
85
+ return null;
86
+
87
+ }
88
+
89
+ /**
90
+ * Called when an order is submitted, generates the payment form
91
+ */
92
+ public function payAction()
93
+ {
94
+
95
+ $lastIncrementId = $this->_getCheckout()->getLastRealOrderId();
96
+
97
+ if ($lastIncrementId) {
98
+
99
+ $order = Mage::getModel('sales/order');
100
+ $order->loadByIncrementId($lastIncrementId);
101
+
102
+ // Get a new payment token
103
+ $paymentToken = $this->generatePaymentToken($order->getStoreId());
104
+
105
+ // Check if a payment token was generated
106
+ if (is_null($paymentToken)) {
107
+ $this->_getCheckout()->addError('Could not connect to payment server, please try again later.');
108
+ $this->_redirect('checkout/cart');
109
+ return;
110
+ } else {
111
+ // Store the payment token in the payment model for later access
112
+ $this->getPaymentModel()->setData('paymentToken', $paymentToken);
113
+ }
114
+
115
+ // Update the order status
116
+ if ($order->getState() == Mage_Sales_Model_Order::STATE_NEW) {
117
+
118
+ if ($order->getId()) {
119
+ $order->setState(
120
+ Mage_Sales_Model_Order::STATE_PENDING_PAYMENT
121
+ );
122
+ $order->save();
123
+ }
124
+
125
+ }
126
+
127
+ } else {
128
+ // No order ID was found, redirect to the home page
129
+ $this->_redirect('/');
130
+ return;
131
+ }
132
+
133
+ // Load the payment page
134
+ $this->loadLayout();
135
+ $this->renderLayout();
136
+ }
137
+
138
+ /**
139
+ * Called when a user cancels an order
140
+ */
141
+ public function cancelAction() {
142
+
143
+ $lastIncrementId = $this->_getCheckout()->getLastRealOrderId();
144
+
145
+ if ($lastIncrementId) {
146
+
147
+ $order = Mage::getModel('sales/order');
148
+ $order->loadByIncrementId($lastIncrementId);
149
+
150
+ if ($order->getId()) {
151
+ $order->setState(
152
+ Mage_Sales_Model_Order::STATE_CANCELED,
153
+ true,
154
+ 'This order was cancelled before a payment was made.'
155
+ );
156
+ $order->cancel();
157
+ $order->save();
158
+
159
+ }
160
+
161
+ }
162
+
163
+ // Display a message
164
+ Mage::getSingleton('core/session')->addNotice('Order cancelled.');
165
+ // Redirect to the shopping cart
166
+ $this->_redirect('checkout/cart', array('_secure' => true));
167
+ }
168
+
169
+ /**
170
+ * Called after submitting the payment form
171
+ * Check the returned token to see if the payment was successful
172
+ */
173
+ public function responseAction()
174
+ {
175
+ $token = Mage::app()->getRequest()->getParam('token');
176
+
177
+ // If the token is not present, redirect to the home page
178
+ if (is_null($token)) {
179
+ $this->_redirect('/');
180
+ return;
181
+ }
182
+
183
+ $lastIncrementId = $this->_getCheckout()->getLastRealOrderId();
184
+
185
+ if ($lastIncrementId) {
186
+
187
+ $order = Mage::getModel('sales/order');
188
+ $order->loadByIncrementId($lastIncrementId);
189
+
190
+ $statusUrl = $this->getConfig()->getStatusUrl($order->getStoreId()) . $token;
191
+
192
+ // Check the status of the payment
193
+ $ch = curl_init();
194
+ curl_setopt($ch, CURLOPT_URL, $statusUrl);
195
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
196
+ curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
197
+ $resultPayment = curl_exec($ch);
198
+ curl_close($ch);
199
+
200
+ // Check if the response is valid
201
+ if ($resultPayment === false) {
202
+ // Could not get a response from the payment server
203
+
204
+ // Set the order as payment review
205
+ $order->setState(
206
+ Mage_Sales_Model_Order::STATE_PAYMENT_REVIEW,
207
+ true,
208
+ 'Could not contact payment server to check payment status.'
209
+ );
210
+ $order->save();
211
+
212
+ // Redirect to the checkout failure page
213
+ $this->_redirect('checkout/onepage/failure', array('_secure' => true));
214
+ return;
215
+ }
216
+
217
+ $resultJson = json_decode($resultPayment, true);
218
+
219
+ // Check if the payment was successful
220
+ if (isset($resultJson['errorMessage']) ||
221
+ (isset($resultJson['transaction']) && $resultJson['transaction']['processing']['result'] === 'NOK'))
222
+ {
223
+
224
+ // Payment was unsuccessful
225
+ // Display an error message to the user
226
+ // Also list the error in the order comments
227
+ $errorMsg = 'Payment unsuccessful.';
228
+
229
+ // Append an error message if set
230
+ if (isset($resultJson['errorMessage'])) {
231
+
232
+ $errorMsg .= '<br>Error: ' . $resultJson['errorMessage'];
233
+
234
+ } else if (isset($resultJson['transaction']['processing']['return']['message'])) {
235
+
236
+ $errorMsg .= '<br>Error: ' . $resultJson['transaction']['processing']['return']['message'];
237
+
238
+ }
239
+
240
+ Mage::getSingleton('core/session')->addError($errorMsg);
241
+
242
+ $order->setState(
243
+ Mage_Sales_Model_Order::STATE_PENDING_PAYMENT,
244
+ true,
245
+ $errorMsg
246
+ );
247
+ $order->save();
248
+
249
+ // Redirect back to the payment page to retry payment
250
+ $this->_redirect('*/*/pay', array('_secure' => true));
251
+ return;
252
+
253
+ } else if (isset($resultJson['transaction']) &&
254
+ isset($resultJson['transaction']['processing']['result']) &&
255
+ $resultJson['transaction']['processing']['result'] === 'ACK')
256
+ {
257
+
258
+ // Payment was successful
259
+
260
+ // Prepare a success message
261
+ $successMsg = 'Payment has been authorised.';
262
+
263
+ // Append the transaction ID
264
+ if (isset($resultJson['transaction']['identification']['uniqueId'])) {
265
+ $successMsg .= '<br>Transaction ID: ' . $resultJson['transaction']['identification']['uniqueId'];
266
+ }
267
+
268
+ // Append the response message
269
+ if (isset($resultJson['transaction']['processing']['return']['message'])) {
270
+ $successMsg .= '<br>Response: ' . $resultJson['transaction']['processing']['return']['message'];
271
+ }
272
+
273
+ // Update the order
274
+ $order->setState(
275
+ Mage_Sales_Model_Order::STATE_PROCESSING,
276
+ true,
277
+ $successMsg
278
+ );
279
+ $order->save();
280
+
281
+ // Send an order email to the customer
282
+ $order->sendNewOrderEmail();
283
+ $order->setEmailSent(true);
284
+
285
+ // Set the last completed order
286
+ $this->_getCheckout()->setLastSuccessQuoteId($order->getQuoteId());
287
+
288
+ // Redirect to the checkout success page
289
+ $this->_redirect('checkout/onepage/success', array('_secure' => true));
290
+ return;
291
+
292
+ } else {
293
+
294
+ // Unknown transaction status
295
+
296
+ // Set the order as payment review
297
+ $order->setState(
298
+ Mage_Sales_Model_Order::STATE_PAYMENT_REVIEW,
299
+ true,
300
+ 'Could not verify payment.'
301
+ );
302
+ $order->save();
303
+
304
+ // Redirect to the checkout failure page
305
+ $this->_redirect('checkout/onepage/failure', array('_secure' => true));
306
+ return;
307
+
308
+ }
309
+
310
+ }
311
+
312
+ // No order ID was found, redirect to home page
313
+ $this->_redirect('/');
314
+ return;
315
+ }
316
+
317
+ }
app/code/community/SimplePay/Payments/etc/config.xml ADDED
@@ -0,0 +1,73 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <config>
3
+ <modules>
4
+ <SimplePay_Payments>
5
+ <version>1.0.0</version>
6
+ </SimplePay_Payments>
7
+ </modules>
8
+ <global>
9
+ <helpers>
10
+ <simplepay>
11
+ <class>SimplePay_Payments_Helper</class>
12
+ </simplepay>
13
+ </helpers>
14
+ <models>
15
+ <simplepay>
16
+ <class>SimplePay_Payments_Model</class>
17
+ <resourceModel>simplepay_resource</resourceModel>
18
+ </simplepay>
19
+ <simplepay_resource>
20
+ <class>SimplePay_Payments_Model_Resource</class>
21
+ <entities>
22
+ <alias>
23
+ <table>simplepay</table>
24
+ </alias>
25
+ </entities>
26
+ </simplepay_resource>
27
+ </models>
28
+ <blocks>
29
+ <simplepay>
30
+ <class>SimplePay_Payments_Block</class>
31
+ </simplepay>
32
+ </blocks>
33
+ </global>
34
+
35
+ <default>
36
+ <payment_services>
37
+ <simplepay>
38
+ <title>SimplePay</title>
39
+ <model>simplepay/payment</model>
40
+ <payment_action>authorize</payment_action>
41
+ <enable_test_mode>1</enable_test_mode>
42
+ </simplepay>
43
+ </payment_services>
44
+ <payment>
45
+ <simplepay>
46
+ <active>0</active>
47
+ <title>Credit Card (SimplePay)</title>
48
+ <model>simplepay/payment</model>
49
+ <order_status>pending</order_status>
50
+ <availableBrands>MasterCard,Visa,American Express,Diners,JCB</availableBrands>
51
+ </simplepay>
52
+ </payment>
53
+ </default>
54
+
55
+ <frontend>
56
+ <layout>
57
+ <updates>
58
+ <simplepay>
59
+ <file>simplepay.xml</file>
60
+ </simplepay>
61
+ </updates>
62
+ </layout>
63
+ <routers>
64
+ <simplepay>
65
+ <use>standard</use>
66
+ <args>
67
+ <module>SimplePay_Payments</module>
68
+ <frontName>simplepay</frontName>
69
+ </args>
70
+ </simplepay>
71
+ </routers>
72
+ </frontend>
73
+ </config>
app/code/community/SimplePay/Payments/etc/system.xml ADDED
@@ -0,0 +1,137 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <config>
3
+ <sections>
4
+ <payment_services>
5
+ <label>Payment Services</label>
6
+ <tab>sales</tab>
7
+ <frontend_type>text</frontend_type>
8
+ <sort_order>450</sort_order>
9
+ <show_in_default>1</show_in_default>
10
+ <show_in_website>1</show_in_website>
11
+ <show_in_store>1</show_in_store>
12
+ <groups>
13
+ <simplepay translate="label" module="simplepay">
14
+ <label>SimplePay</label>
15
+ <frontend_type>text</frontend_type>
16
+ <sort_order>1</sort_order>
17
+ <show_in_default>1</show_in_default>
18
+ <show_in_website>1</show_in_website>
19
+ <show_in_store>1</show_in_store>
20
+ <fields>
21
+ <security_sender translate="label">
22
+ <label>Security Sender</label>
23
+ <backend_model>adminhtml/system_config_backend_encrypted</backend_model>
24
+ <frontend_type>text</frontend_type>
25
+ <sort_order>30</sort_order>
26
+ <show_in_default>1</show_in_default>
27
+ <show_in_website>1</show_in_website>
28
+ <show_in_store>1</show_in_store>
29
+ </security_sender>
30
+ <transaction_channel translate="label">
31
+ <label>Transaction Channel</label>
32
+ <backend_model>adminhtml/system_config_backend_encrypted</backend_model>
33
+ <frontend_type>text</frontend_type>
34
+ <sort_order>40</sort_order>
35
+ <show_in_default>1</show_in_default>
36
+ <show_in_website>1</show_in_website>
37
+ <show_in_store>1</show_in_store>
38
+ </transaction_channel>
39
+ <transaction_mode translate="label">
40
+ <label>Transaction Mode</label>
41
+ <backend_model>adminhtml/system_config_backend_encrypted</backend_model>
42
+ <frontend_type>text</frontend_type>
43
+ <sort_order>50</sort_order>
44
+ <show_in_default>1</show_in_default>
45
+ <show_in_website>1</show_in_website>
46
+ <show_in_store>1</show_in_store>
47
+ </transaction_mode>
48
+ <user_login translate="label">
49
+ <label>User Login</label>
50
+ <backend_model>adminhtml/system_config_backend_encrypted</backend_model>
51
+ <frontend_type>text</frontend_type>
52
+ <sort_order>60</sort_order>
53
+ <show_in_default>1</show_in_default>
54
+ <show_in_website>1</show_in_website>
55
+ <show_in_store>1</show_in_store>
56
+ </user_login>
57
+ <user_pwd translate="label">
58
+ <label>User Password</label>
59
+ <backend_model>adminhtml/system_config_backend_encrypted</backend_model>
60
+ <frontend_type>text</frontend_type>
61
+ <sort_order>70</sort_order>
62
+ <show_in_default>1</show_in_default>
63
+ <show_in_website>1</show_in_website>
64
+ <show_in_store>1</show_in_store>
65
+ </user_pwd>
66
+ <payment_type translate="label">
67
+ <label>Payment Type</label>
68
+ <backend_model>adminhtml/system_config_backend_encrypted</backend_model>
69
+ <frontend_type>text</frontend_type>
70
+ <sort_order>80</sort_order>
71
+ <show_in_default>1</show_in_default>
72
+ <show_in_website>1</show_in_website>
73
+ <show_in_store>1</show_in_store>
74
+ </payment_type>
75
+ <test_mode_flag translate="label">
76
+ <label>Test Mode</label>
77
+ <frontend_type>select</frontend_type>
78
+ <source_model>adminhtml/system_config_source_yesno</source_model>
79
+ <sort_order>200</sort_order>
80
+ <show_in_default>1</show_in_default>
81
+ <show_in_website>1</show_in_website>
82
+ <show_in_store>0</show_in_store>
83
+ </test_mode_flag>
84
+ </fields>
85
+ </simplepay>
86
+ </groups>
87
+ </payment_services>
88
+ <payment>
89
+ <groups>
90
+ <simplepay translate="label">
91
+ <label>SimplePay</label>
92
+ <sort_order>40</sort_order>
93
+ <show_in_default>1</show_in_default>
94
+ <show_in_website>1</show_in_website>
95
+ <show_in_store>1</show_in_store>
96
+ <fields>
97
+ <active translate="label">
98
+ <label>Enabled</label>
99
+ <frontend_type>select</frontend_type>
100
+ <source_model>adminhtml/system_config_source_yesno</source_model>
101
+ <sort_order>0</sort_order>
102
+ <show_in_default>1</show_in_default>
103
+ <show_in_website>1</show_in_website>
104
+ <show_in_store>0</show_in_store>
105
+ </active>
106
+ <title translate="label">
107
+ <label>Title</label>
108
+ <frontend_type>text</frontend_type>
109
+ <sort_order>10</sort_order>
110
+ <show_in_default>1</show_in_default>
111
+ <show_in_website>1</show_in_website>
112
+ <show_in_store>1</show_in_store>
113
+ <validate>required-entry</validate>
114
+ </title>
115
+ <sort_order translate="label">
116
+ <label>Sort Order</label>
117
+ <frontend_type>text</frontend_type>
118
+ <sort_order>20</sort_order>
119
+ <show_in_default>1</show_in_default>
120
+ <show_in_website>1</show_in_website>
121
+ <show_in_store>1</show_in_store>
122
+ </sort_order>
123
+ <brands translate="label">
124
+ <label>Accepted Brands</label>
125
+ <frontend_type>multiselect</frontend_type>
126
+ <sort_order>30</sort_order>
127
+ <source_model>simplepay/brands</source_model>
128
+ <show_in_default>1</show_in_default>
129
+ <show_in_website>1</show_in_website>
130
+ <show_in_store>1</show_in_store>
131
+ </brands>
132
+ </fields>
133
+ </simplepay>
134
+ </groups>
135
+ </payment>
136
+ </sections>
137
+ </config>
app/design/frontend/base/default/layout/simplepay.xml ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <layout version="1.0.0">
3
+ <simplepay_payment_pay>
4
+ <reference name="head">
5
+ <action method="addCss">
6
+ <stylesheet>css/simplepay.css</stylesheet>
7
+ </action>
8
+ </reference>
9
+ <remove name="right"/>
10
+ <remove name="left"/>
11
+ <remove name="catalog.topnav"/>
12
+ <reference name="header">
13
+ <remove name="top.links"/>
14
+ <remove name="top.search"/>
15
+ <remove name="store_language"/>
16
+ <remove name="top.container"/>
17
+ </reference>
18
+ <reference name="footer">
19
+ <remove name="cms_footer_links"/>
20
+ <remove name="footer_links"/>
21
+ <remove name="store_switcher"/>
22
+ </reference>
23
+ <reference name="root">
24
+ <action method="setTemplate">
25
+ <template>page/1column.phtml</template>
26
+ </action>
27
+ </reference>
28
+ <reference name="content">
29
+ <block type="simplepay/payment" name="simplepay_pay" template="simplepay/pay.phtml"/>
30
+ </reference>
31
+ </simplepay_payment_pay>
32
+ </layout>
app/design/frontend/base/default/template/simplepay/pay.phtml ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Payment View
5
+ *
6
+ * @category View
7
+ * @package SimplePay_Payments
8
+ * @author SimplePay
9
+ */
10
+
11
+ // Retrieve the order
12
+ $orderId = $this->_getCheckout()->getLastRealOrderId();
13
+ $order = Mage::getModel('sales/order');
14
+ $order->loadByIncrementId($orderId);
15
+
16
+ ?>
17
+
18
+ <div class="simplepay-payment-container">
19
+
20
+ <script type="text/javascript" src="<?php echo $this->getFormUrl($order->getStoreId()) ?>"></script>
21
+
22
+ <div class="simplepay-payment-text">
23
+ <p>Please pay for your order using the form below.</p>
24
+ </div>
25
+
26
+ <div class="simplepay-payment-form">
27
+
28
+ <form action="<?php echo $this->getResponseUrl() ?>"
29
+ id="<?php echo $this->getPaymentModel()->getData('paymentToken') ?>">
30
+ <?php echo $this->getAcceptedBrandsForForm() ?>
31
+ </form>
32
+
33
+ </div>
34
+
35
+ <div class="simplepay-payment-cancel">
36
+ <a href="<?php echo $this->getCancelUrl() ?>">Cancel</a>
37
+ </div>
38
+
39
+ </div>
app/etc/modules/SimplePay_Payments.xml ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <config>
3
+ <modules>
4
+ <SimplePay_Payments>
5
+ <active>true</active>
6
+ <codePool>community</codePool>
7
+ <depends>
8
+ <Mage_Sales/>
9
+ <Mage_Payment/>
10
+ </depends>
11
+ </SimplePay_Payments>
12
+ </modules>
13
+ </config>
package.xml ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <package>
3
+ <name>SimplePay_Payments</name>
4
+ <version>1.0.0</version>
5
+ <stability>stable</stability>
6
+ <license uri="http://opensource.org/licenses/mit-license.html">MIT</license>
7
+ <channel>community</channel>
8
+ <extends/>
9
+ <summary>Accept payments using SimplePay.</summary>
10
+ <description>Accept payments using SimplePay.</description>
11
+ <notes>First stable release</notes>
12
+ <authors><author><name>SimplePay</name><user>simplepay</user><email>glenm@simplepay.com.au</email></author></authors>
13
+ <date>2013-11-06</date>
14
+ <time>04:53:35</time>
15
+ <contents><target name="magecommunity"><dir name="SimplePay"><dir name="Payments"><dir name="Block"><file name="Payment.php" hash="2649d5d95b0f2d78aeaef26b8295a92d"/></dir><dir name="Helper"><file name="Data.php" hash="f616e5862cc3f86da89e2650f2917aa1"/></dir><dir name="Model"><file name="Brands.php" hash="503fbf04f874089d1750c1e50171d0ab"/><file name="Config.php" hash="d709d80ae2074a1a1f08237f0a487321"/><file name="Payment.php" hash="83a36460d51d13e6b0699cc4716ce679"/></dir><dir name="controllers"><file name="PaymentController.php" hash="4393a5cdb47a60eb62742578bedd6c08"/></dir><dir name="etc"><file name="config.xml" hash="260a26eb6cf2519ddd4995d4a6b50931"/><file name="system.xml" hash="b7d39a5fb50628a6bb0629f1cf275634"/></dir></dir></dir></target><target name="magedesign"><dir name="frontend"><dir name="base"><dir name="default"><dir name="layout"><file name="simplepay.xml" hash="af565e90e944b87b4b4bc12e21d996ff"/></dir><dir name="template"><dir name="simplepay"><file name="pay.phtml" hash="598f185ca2c340a3d6087051317b19c5"/></dir></dir></dir></dir></dir></target><target name="mageetc"><dir name="modules"><file name="SimplePay_Payments.xml" hash="f5776cc64ab1ef8e3dc093852dd0e3a1"/></dir></target><target name="mageskin"><dir name="frontend"><dir name="base"><dir name="default"><dir name="css"><file name="simplepay.css" hash="f198c7cf0e69b740a2eb2595f434832a"/></dir></dir></dir></dir></target></contents>
16
+ <compatible/>
17
+ <dependencies><required><php><min>5.2.0</min><max>6.0.0</max></php><package><name>Mage_Sales</name><channel>core</channel><min></min><max></max></package><package><name>Mage_Payment</name><channel>core</channel><min></min><max></max></package><extension><name>curl</name><min></min><max></max></extension></required></dependencies>
18
+ </package>
skin/frontend/base/default/css/simplepay.css ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .simplepay-payment-container {
2
+ margin-top: 40px;
3
+ }
4
+
5
+ .simplepay-payment-container .simplepay-payment-text {
6
+ text-align: center;
7
+ font-size: 16px;
8
+ font-weight: bold;
9
+ margin-bottom: 40px;
10
+ }
11
+
12
+ .simplepay-payment-container .simplepay-payment-form form {
13
+ display: block;
14
+ }
15
+
16
+ .simplepay-payment-container .simplepay-payment-cancel {
17
+ margin-left: 240px;
18
+ }