Version Notes
This extension has been in production for six months with many websites. Many cross-platform (Windows vs. Linux) bugs were fixed during this process and the module has proved stable.
Download this release
Release Info
Developer | Heartland Payment Systems |
Extension | Hps_Securesubmit |
Version | 1.0.0 |
Comparing to | |
See all releases |
Version 1.0.0
- app/code/community/Hps/Securesubmit/Block/Form.php +9 -0
- app/code/community/Hps/Securesubmit/Block/Info.php +15 -0
- app/code/community/Hps/Securesubmit/Helper/Data.php +47 -0
- app/code/community/Hps/Securesubmit/Model/Payment.php +387 -0
- app/code/community/Hps/Securesubmit/Model/Resource/Setup.php +5 -0
- app/code/community/Hps/Securesubmit/Model/Resource/Storedcard.php +16 -0
- app/code/community/Hps/Securesubmit/Model/Resource/Storedcard/Collection.php +8 -0
- app/code/community/Hps/Securesubmit/Model/Source/Cctype.php +6 -0
- app/code/community/Hps/Securesubmit/Model/Source/PaymentAction.php +17 -0
- app/code/community/Hps/Securesubmit/Model/Storedcard.php +33 -0
- app/code/community/Hps/Securesubmit/Model/System/Config/Backend/Proxy.php +17 -0
- app/code/community/Hps/Securesubmit/controllers/StoredcardController.php +83 -0
- app/code/community/Hps/Securesubmit/etc/config.xml +79 -0
- app/code/community/Hps/Securesubmit/etc/system.xml +153 -0
- app/code/community/Hps/Securesubmit/sql/hps_securesubmit_setup/install-1.0.0.php +69 -0
- app/design/adminhtml/default/default/template/securesubmit/form.phtml +79 -0
- app/design/frontend/base/default/layout/securesubmit.xml +30 -0
- app/design/frontend/base/default/template/securesubmit/form.phtml +178 -0
- app/design/frontend/base/default/template/securesubmit/storedcards.phtml +40 -0
- app/etc/modules/Hps_Securesubmit.xml +9 -0
- js/securesubmit/secure.submit-1.0.1.js +115 -0
- lib/SecureSubmit/Hps.php +42 -0
- lib/SecureSubmit/entities/HpsAccountVerify.php +7 -0
- lib/SecureSubmit/entities/HpsAddress.php +9 -0
- lib/SecureSubmit/entities/HpsAuthorization.php +18 -0
- lib/SecureSubmit/entities/HpsBatch.php +8 -0
- lib/SecureSubmit/entities/HpsCardHolder.php +9 -0
- lib/SecureSubmit/entities/HpsCharge.php +7 -0
- lib/SecureSubmit/entities/HpsChargeExceptions.php +6 -0
- lib/SecureSubmit/entities/HpsCreditCard.php +27 -0
- lib/SecureSubmit/entities/HpsItemChoiceTypePosResponseVer10Transaction.php +63 -0
- lib/SecureSubmit/entities/HpsRefund.php +7 -0
- lib/SecureSubmit/entities/HpsReportTransactionDetails.php +14 -0
- lib/SecureSubmit/entities/HpsReportTransactionSummary.php +10 -0
- lib/SecureSubmit/entities/HpsReversal.php +13 -0
- lib/SecureSubmit/entities/HpsTokenData.php +11 -0
- lib/SecureSubmit/entities/HpsTransaction.php +111 -0
- lib/SecureSubmit/entities/HpsTransactionDetails.php +8 -0
- lib/SecureSubmit/entities/HpsTransactionHeader.php +9 -0
- lib/SecureSubmit/entities/HpsTransactionType.php +15 -0
- lib/SecureSubmit/entities/HpsVoid.php +7 -0
- lib/SecureSubmit/infrastructure/AVSResponseCodeHandler.php +49 -0
- lib/SecureSubmit/infrastructure/ApiConnectionException.php +4 -0
- lib/SecureSubmit/infrastructure/AuthenticationException.php +9 -0
- lib/SecureSubmit/infrastructure/CardException.php +13 -0
- lib/SecureSubmit/infrastructure/Exceptions.json +469 -0
- lib/SecureSubmit/infrastructure/HpsConfiguration.php +17 -0
- lib/SecureSubmit/infrastructure/HpsException.php +21 -0
- lib/SecureSubmit/infrastructure/HpsExceptionMapper.php +109 -0
- lib/SecureSubmit/infrastructure/HpsSdkCodes.php +14 -0
- lib/SecureSubmit/infrastructure/InvalidRequestException.php +10 -0
- lib/SecureSubmit/services/HpsBatchService.php +26 -0
- lib/SecureSubmit/services/HpsChargeService.php +602 -0
- lib/SecureSubmit/services/HpsService.php +129 -0
- lib/SecureSubmit/services/HpsTokenService.php +59 -0
- package.xml +20 -0
app/code/community/Hps/Securesubmit/Block/Form.php
ADDED
@@ -0,0 +1,9 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
class Hps_Securesubmit_Block_Form extends Mage_Payment_Block_Form_Ccsave
|
3 |
+
{
|
4 |
+
protected function _construct()
|
5 |
+
{
|
6 |
+
parent::_construct();
|
7 |
+
$this->setTemplate('securesubmit/form.phtml');
|
8 |
+
}
|
9 |
+
}
|
app/code/community/Hps/Securesubmit/Block/Info.php
ADDED
@@ -0,0 +1,15 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
class Hps_Securesubmit_Block_Info extends Mage_Payment_Block_Info
|
3 |
+
{
|
4 |
+
protected function _prepareSpecificInformation($transport = null)
|
5 |
+
{
|
6 |
+
$transport = parent::_prepareSpecificInformation($transport);
|
7 |
+
$data = array();
|
8 |
+
$info = $this->getInfo();
|
9 |
+
|
10 |
+
$data[Mage::helper("payment")->__("Payment Type")] = "Secure Token";
|
11 |
+
|
12 |
+
return $transport->setData(array_merge($data, $transport->getData()));
|
13 |
+
}
|
14 |
+
}
|
15 |
+
|
app/code/community/Hps/Securesubmit/Helper/Data.php
ADDED
@@ -0,0 +1,47 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
class Hps_Securesubmit_Helper_Data extends Mage_Core_Helper_Abstract
|
3 |
+
{
|
4 |
+
const XML_PATH_PAYMENT_HPS_SECURESUBMIT_USE_HTTP_PROXY = 'payment/hps_securesubmit/use_http_proxy';
|
5 |
+
const XML_PATH_PAYMENT_HPS_SECURESUBMIT_HTTP_PROXY_HOST = 'payment/hps_securesubmit/http_proxy_host';
|
6 |
+
const XML_PATH_PAYMENT_HPS_SECURESUBMIT_HTTP_PROXY_PORT = 'payment/hps_securesubmit/http_proxy_port';
|
7 |
+
|
8 |
+
/**
|
9 |
+
* @param $customerId
|
10 |
+
* @return Hps_Securesubmit_Model_Storedcard[]|Hps_Securesubmit_Model_Resource_Storedcard_Collection
|
11 |
+
*/
|
12 |
+
public function getStoredCards($customerId)
|
13 |
+
{
|
14 |
+
$cardCollection = Mage::getResourceModel('hps_securesubmit/storedcard_collection')
|
15 |
+
->addFieldToFilter('customer_id', $customerId);
|
16 |
+
return $cardCollection;
|
17 |
+
}
|
18 |
+
|
19 |
+
public function saveMultiToken($token,$cardData,$cardType)
|
20 |
+
{
|
21 |
+
$_session = Mage::getSingleton('customer/session');
|
22 |
+
$_loggedIn = $_session->isLoggedIn();
|
23 |
+
|
24 |
+
if($_loggedIn){
|
25 |
+
$_customerId = $_session->getCustomer()->getId();
|
26 |
+
|
27 |
+
$storedCard = Mage::getModel('hps_securesubmit/storedcard');
|
28 |
+
$storedCard->setDt(Varien_Date::now())
|
29 |
+
->setCustomerId($_customerId)
|
30 |
+
->setTokenValue($token)
|
31 |
+
->setCcType($cardType)
|
32 |
+
->setCcLast4($cardData->number)
|
33 |
+
->setCcExpMonth(str_pad($cardData->expMonth, 2, '0', STR_PAD_LEFT))
|
34 |
+
->setCcExpYear($cardData->expYear);
|
35 |
+
try{
|
36 |
+
$storedCard->removeDuplicates();
|
37 |
+
$storedCard->save();
|
38 |
+
return $storedCard;
|
39 |
+
}catch (Exception $e){
|
40 |
+
if($e->getCode() == '23000'){
|
41 |
+
Mage::throwException($this->__('Customer Not Found : Card could not be saved.'));
|
42 |
+
}
|
43 |
+
Mage::throwException($e->getMessage());
|
44 |
+
}
|
45 |
+
}
|
46 |
+
}
|
47 |
+
}
|
app/code/community/Hps/Securesubmit/Model/Payment.php
ADDED
@@ -0,0 +1,387 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
require_once Mage::getBaseDir('lib').DS.'SecureSubmit'.DS.'Hps.php';
|
4 |
+
|
5 |
+
class Hps_Securesubmit_Model_Payment extends Mage_Payment_Model_Method_Cc
|
6 |
+
{
|
7 |
+
protected $_code = 'hps_securesubmit';
|
8 |
+
protected $_isGateway = true;
|
9 |
+
protected $_canCapture = true;
|
10 |
+
protected $_canCapturePartial = true;
|
11 |
+
protected $_canRefund = true;
|
12 |
+
protected $_canRefundInvoicePartial = true;
|
13 |
+
protected $_canVoid = true;
|
14 |
+
protected $_canAuthorize = true;
|
15 |
+
|
16 |
+
protected $_supportedCurrencyCodes = array('USD');
|
17 |
+
protected $_minOrderTotal = 0.5;
|
18 |
+
|
19 |
+
protected $_formBlockType = 'hps_securesubmit/form';
|
20 |
+
protected $_infoBlockType = 'hps_securesubmit/info';
|
21 |
+
|
22 |
+
/**
|
23 |
+
* Fields that should be replaced in debug with '***'
|
24 |
+
*
|
25 |
+
* @var array
|
26 |
+
*/
|
27 |
+
protected $_debugReplacePrivateDataKeys = array('SecretAPIKey');
|
28 |
+
|
29 |
+
public function validate()
|
30 |
+
{
|
31 |
+
$info = $this->getInfoInstance();
|
32 |
+
$additionalData = new Varien_Object($info->getAdditionalData() ? unserialize($info->getAdditionalData()) : null);
|
33 |
+
|
34 |
+
// Only validate when not using token
|
35 |
+
if ($additionalData->getUseCreditCard()) {
|
36 |
+
parent::validate();
|
37 |
+
}
|
38 |
+
|
39 |
+
return $this;
|
40 |
+
}
|
41 |
+
|
42 |
+
/**
|
43 |
+
* Capture payment
|
44 |
+
*
|
45 |
+
* @param Varien_Object $payment
|
46 |
+
* @param float $amount
|
47 |
+
* @return $this
|
48 |
+
*/
|
49 |
+
public function capture(Varien_Object $payment, $amount)
|
50 |
+
{
|
51 |
+
$this->_authorize($payment, $amount, true);
|
52 |
+
}
|
53 |
+
|
54 |
+
/**
|
55 |
+
* Authorize payment
|
56 |
+
*
|
57 |
+
* @param Varien_Object $payment
|
58 |
+
* @param float $amount
|
59 |
+
* @return $this
|
60 |
+
*/
|
61 |
+
public function authorize(Varien_Object $payment, $amount)
|
62 |
+
{
|
63 |
+
$this->_authorize($payment, $amount, false);
|
64 |
+
}
|
65 |
+
|
66 |
+
/**
|
67 |
+
* Authorize or Capture payment
|
68 |
+
*
|
69 |
+
* @param Varien_Object $payment
|
70 |
+
* @param float $amount
|
71 |
+
* @param bool $capture
|
72 |
+
* @return $this
|
73 |
+
*/
|
74 |
+
private function _authorize(Varien_Object $payment, $amount, $capture)
|
75 |
+
{
|
76 |
+
$order = $payment->getOrder(); /* @var $order Mage_Sales_Model_Order */
|
77 |
+
$billing = $order->getBillingAddress();
|
78 |
+
$multiToken = false;
|
79 |
+
$cardData = null;
|
80 |
+
$cardType = null;
|
81 |
+
$additionalData = new Varien_Object($payment->getAdditionalData() ? unserialize($payment->getAdditionalData()) : null);
|
82 |
+
$secureToken = $additionalData->getSecuresubmitToken() ? $additionalData->getSecuresubmitToken() : null;
|
83 |
+
$saveCreditCard = !! $additionalData->getCcSaveFuture();
|
84 |
+
$useCreditCard = !! $additionalData->getUseCreditCard();
|
85 |
+
|
86 |
+
if ($saveCreditCard && ! $useCreditCard) {
|
87 |
+
$multiToken = true;
|
88 |
+
$cardData = new HpsCreditCard();
|
89 |
+
$cardData->number = $payment->getCcLast4();
|
90 |
+
$cardData->expYear = $payment->getCcExpYear();
|
91 |
+
$cardData->expMonth = $payment->getCcExpMonth();
|
92 |
+
}
|
93 |
+
|
94 |
+
$config = new HpsConfiguration();
|
95 |
+
// Use HTTP proxy
|
96 |
+
if (Mage::getStoreConfig('payment/hps_securesubmit/use_http_proxy')) {
|
97 |
+
$config->useProxy = true;
|
98 |
+
$config->proxyOptions = array(
|
99 |
+
'proxy_host' => Mage::getStoreConfig('payment/hps_securesubmit/http_proxy_host'),
|
100 |
+
'proxy_port' => Mage::getStoreConfig('payment/hps_securesubmit/http_proxy_port'),
|
101 |
+
);
|
102 |
+
}
|
103 |
+
|
104 |
+
$config->secretApiKey = $this->getConfigData('secretapikey');
|
105 |
+
$config->versionNumber = '1573';
|
106 |
+
$config->developerId = '002914';
|
107 |
+
|
108 |
+
$chargeService = new HpsChargeService($config);
|
109 |
+
|
110 |
+
$address = new HpsAddress();
|
111 |
+
$address->address = $billing->getStreet(1);
|
112 |
+
$address->city = $billing->getCity();
|
113 |
+
$address->state = $billing->getRegion();
|
114 |
+
$address->zip = preg_replace('/[^0-9]/', '', $billing->getPostcode());
|
115 |
+
$address->country = $billing->getCountry();
|
116 |
+
|
117 |
+
$cardHolder = new HpsCardHolder();
|
118 |
+
$cardHolder->firstName = $billing->getData('firstname');
|
119 |
+
$cardHolder->lastName = $billing->getData('lastname');
|
120 |
+
$cardHolder->phone = preg_replace('/[^0-9]/', '', $billing->getTelephone());
|
121 |
+
$cardHolder->emailAddress = $billing->getData('email');
|
122 |
+
$cardHolder->address = $address;
|
123 |
+
|
124 |
+
if ($useCreditCard) {
|
125 |
+
$cardOrToken = new HpsCreditCard();
|
126 |
+
$cardOrToken->number = $payment->getCcNumber();
|
127 |
+
$cardOrToken->expYear = $payment->getCcExpYear();
|
128 |
+
$cardOrToken->expMonth = $payment->getCcExpMonth();
|
129 |
+
$cardOrToken->cvv = $payment->getCcCid();
|
130 |
+
} else {
|
131 |
+
$cardOrToken = new HpsTokenData();
|
132 |
+
$cardOrToken->tokenValue = $secureToken;
|
133 |
+
}
|
134 |
+
|
135 |
+
$details = new HpsTransactionDetails();
|
136 |
+
$details->invoiceNumber = $order->getIncrementId();
|
137 |
+
|
138 |
+
try
|
139 |
+
{
|
140 |
+
if ($capture)
|
141 |
+
{
|
142 |
+
if ($payment->getCcTransId())
|
143 |
+
{
|
144 |
+
$response = $chargeService->capture(
|
145 |
+
$payment->getCcTransId(),
|
146 |
+
$amount);
|
147 |
+
}
|
148 |
+
else
|
149 |
+
{
|
150 |
+
$response = $chargeService->charge(
|
151 |
+
$amount,
|
152 |
+
strtolower($order->getBaseCurrencyCode()),
|
153 |
+
$cardOrToken,
|
154 |
+
$cardHolder,
|
155 |
+
$multiToken,
|
156 |
+
$details);
|
157 |
+
}
|
158 |
+
}
|
159 |
+
else
|
160 |
+
{
|
161 |
+
$response = $chargeService->authorize(
|
162 |
+
$amount,
|
163 |
+
strtolower($order->getBaseCurrencyCode()),
|
164 |
+
$cardOrToken,
|
165 |
+
$cardHolder,
|
166 |
+
$multiToken,
|
167 |
+
$details);
|
168 |
+
}
|
169 |
+
}
|
170 |
+
catch (CardException $e) {
|
171 |
+
$this->_debugChargeService($chargeService, $e);
|
172 |
+
$payment->setStatus(self::STATUS_DECLINED);
|
173 |
+
$this->throwUserError($e->getMessage(), $e->ResultText, TRUE);
|
174 |
+
}
|
175 |
+
catch (Exception $e)
|
176 |
+
{
|
177 |
+
$this->_debugChargeService($chargeService, $e);
|
178 |
+
Mage::logException($e);
|
179 |
+
$payment->setStatus(self::STATUS_ERROR);
|
180 |
+
$this->throwUserError($e->getMessage());
|
181 |
+
}
|
182 |
+
|
183 |
+
// No exception thrown so action was a success
|
184 |
+
$this->_debugChargeService($chargeService);
|
185 |
+
$payment->setStatus(self::STATUS_APPROVED);
|
186 |
+
$payment->setAmount($amount);
|
187 |
+
$payment->setLastTransId($response->transactionId);
|
188 |
+
$payment->setCcTransId($response->transactionId);
|
189 |
+
$payment->setTransactionId($response->transactionId);
|
190 |
+
$payment->setIsTransactionClosed(0);
|
191 |
+
if($multiToken){
|
192 |
+
if ($response->tokenData->responseCode == '0') {
|
193 |
+
Mage::helper('hps_securesubmit')->saveMultiToken($response->tokenData->tokenValue,$cardData,$response->cardType);
|
194 |
+
} else {
|
195 |
+
Mage::log(Mage::helper('hps_securesubmit')->__('Requested multi token has not been generated for the transaction # %s.', $response->transactionId), Zend_Log::WARN);
|
196 |
+
}
|
197 |
+
}
|
198 |
+
return $this;
|
199 |
+
}
|
200 |
+
|
201 |
+
public function refund(Varien_Object $payment, $amount)
|
202 |
+
{
|
203 |
+
if ($this->canVoid($payment)) {
|
204 |
+
// First try to void the payment and if the batch is already closed - try to refund the payment.
|
205 |
+
try {
|
206 |
+
$this->void($payment);
|
207 |
+
} catch (Mage_Core_Exception $e) {
|
208 |
+
$this->_refund($payment, $amount);
|
209 |
+
}
|
210 |
+
} else {
|
211 |
+
$this->_refund($payment, $amount);
|
212 |
+
}
|
213 |
+
return $this;
|
214 |
+
}
|
215 |
+
|
216 |
+
/**
|
217 |
+
* Void payment abstract method
|
218 |
+
*
|
219 |
+
* @param Varien_Object $payment
|
220 |
+
*
|
221 |
+
* @return Hps_Securesubmit_Model_Payment
|
222 |
+
*/
|
223 |
+
public function void(Varien_Object $payment)
|
224 |
+
{
|
225 |
+
$transactionId = $payment->getCcTransId();
|
226 |
+
|
227 |
+
$config = new HpsServicesConfig();
|
228 |
+
$config->secretAPIKey = $this->getConfigData('secretapikey');
|
229 |
+
$config->versionNbr = '1509';
|
230 |
+
$config->developerId = '002914';
|
231 |
+
|
232 |
+
$chargeService = new HpsChargeService($config);
|
233 |
+
try {
|
234 |
+
$voidResponse = $chargeService->void($transactionId);
|
235 |
+
}
|
236 |
+
catch (HpsException $e)
|
237 |
+
{
|
238 |
+
$this->_debugChargeService($chargeService, $e);
|
239 |
+
Mage::throwException($e->getMessage());
|
240 |
+
}
|
241 |
+
catch (Exception $e) {
|
242 |
+
$this->_debugChargeService($chargeService, $e);
|
243 |
+
Mage::logException($e);
|
244 |
+
Mage::throwException(Mage::helper('hps_securesubmit')->__('An unexpected error occurred. Please try again or contact a system administrator.'));
|
245 |
+
}
|
246 |
+
$this->_debugChargeService($chargeService);
|
247 |
+
|
248 |
+
$payment
|
249 |
+
->setTransactionId($voidResponse->TransactionId)
|
250 |
+
->setParentTransactionId($transactionId)
|
251 |
+
->setIsTransactionClosed(1)
|
252 |
+
->setShouldCloseParentTransaction(1);
|
253 |
+
|
254 |
+
return $this;
|
255 |
+
}
|
256 |
+
|
257 |
+
protected function _refund(Varien_Object $payment, $amount)
|
258 |
+
{
|
259 |
+
$transactionId = $payment->getCcTransId();
|
260 |
+
$order = $payment->getOrder();
|
261 |
+
|
262 |
+
$config = new HpsConfiguration();
|
263 |
+
$config->secretApiKey = $this->getConfigData('secretapikey');
|
264 |
+
$config->versionNumber = '1573';
|
265 |
+
$config->developerId = '002914';
|
266 |
+
|
267 |
+
$chargeService = new HpsChargeService($config);
|
268 |
+
try {
|
269 |
+
$refundResponse = $chargeService->refundTransaction(
|
270 |
+
$amount,
|
271 |
+
strtolower($order->getBaseCurrencyCode()),
|
272 |
+
$transactionId);
|
273 |
+
|
274 |
+
}
|
275 |
+
catch (HpsException $e)
|
276 |
+
{
|
277 |
+
$this->_debugChargeService($chargeService, $e);
|
278 |
+
$this->throwUserError($e->getMessage());
|
279 |
+
}
|
280 |
+
catch (Exception $e) {
|
281 |
+
$this->_debugChargeService($chargeService, $e);
|
282 |
+
Mage::logException($e);
|
283 |
+
$this->throwUserError($e->getMessage());
|
284 |
+
}
|
285 |
+
$this->_debugChargeService($chargeService);
|
286 |
+
|
287 |
+
$payment
|
288 |
+
->setTransactionId($refundResponse->transactionId)
|
289 |
+
->setParentTransactionId($transactionId)
|
290 |
+
->setIsTransactionClosed(1)
|
291 |
+
->setShouldCloseParentTransaction(1);
|
292 |
+
|
293 |
+
return $this;
|
294 |
+
}
|
295 |
+
|
296 |
+
public function isAvailable($quote = null)
|
297 |
+
{
|
298 |
+
if($quote && $quote->getBaseGrandTotal()<$this->_minOrderTotal) {
|
299 |
+
return false;
|
300 |
+
}
|
301 |
+
|
302 |
+
return $this->getConfigData('secretapikey', ($quote ? $quote->getStoreId() : null))
|
303 |
+
&& parent::isAvailable($quote);
|
304 |
+
}
|
305 |
+
|
306 |
+
public function canUseForCurrency($currencyCode)
|
307 |
+
{
|
308 |
+
if (!in_array($currencyCode, $this->_supportedCurrencyCodes)) {
|
309 |
+
return false;
|
310 |
+
}
|
311 |
+
|
312 |
+
return true;
|
313 |
+
}
|
314 |
+
|
315 |
+
public function assignData($data)
|
316 |
+
{
|
317 |
+
parent::assignData($data);
|
318 |
+
|
319 |
+
if ( ! ($data instanceof Varien_Object)) {
|
320 |
+
$data = new Varien_Object($data);
|
321 |
+
}
|
322 |
+
$info = $this->getInfoInstance();
|
323 |
+
|
324 |
+
if ( ! $info->getCcLast4() && $data->getCcLastFour()) {
|
325 |
+
$info->setCcLast4($data->getCcLastFour());
|
326 |
+
}
|
327 |
+
|
328 |
+
$details = array();
|
329 |
+
if ($data->getData('cc_save_future')) {
|
330 |
+
$details['cc_save_future'] = 1;
|
331 |
+
}
|
332 |
+
if ($data->getData('securesubmit_token')) {
|
333 |
+
$details['securesubmit_token'] = $data->getData('securesubmit_token');
|
334 |
+
}
|
335 |
+
if ($data->getData('use_credit_card')) {
|
336 |
+
$details['use_credit_card'] = 1;
|
337 |
+
}
|
338 |
+
if ( ! empty($details)) {
|
339 |
+
$this->getInfoInstance()->setAdditionalData(serialize($details));
|
340 |
+
}
|
341 |
+
|
342 |
+
return $this;
|
343 |
+
}
|
344 |
+
|
345 |
+
/**
|
346 |
+
* @param string $error
|
347 |
+
* @param string $detailedError
|
348 |
+
* @param bool $goToPaymentSection
|
349 |
+
* @throws Mage_Core_Exception
|
350 |
+
*/
|
351 |
+
public function throwUserError($error, $detailedError = NULL, $goToPaymentSection = FALSE)
|
352 |
+
{
|
353 |
+
// Register detailed error for error reporting elsewhere
|
354 |
+
$detailedError = $detailedError ? $error.' ['.$detailedError.']' : $error;
|
355 |
+
Mage::unregister('payment_detailed_error');
|
356 |
+
Mage::register('payment_detailed_error', $detailedError);
|
357 |
+
|
358 |
+
// Replace gateway error with custom error message for customers
|
359 |
+
$error = Mage::helper('hps_securesubmit')->__($error);
|
360 |
+
if ($customMessage = $this->getConfigData('custom_message')) {
|
361 |
+
$error = sprintf($customMessage, $error);
|
362 |
+
}
|
363 |
+
|
364 |
+
// Send checkout session back to payment section to avoid double-attempt to charge single-use token
|
365 |
+
if ($goToPaymentSection && Mage::app()->getRequest()->getOriginalPathInfo() == '/checkout/onepage/saveOrder') {
|
366 |
+
Mage::getSingleton('checkout/session')->setGotoSection('payment');
|
367 |
+
}
|
368 |
+
throw new Mage_Core_Exception($error);
|
369 |
+
}
|
370 |
+
|
371 |
+
/**
|
372 |
+
* @param HpsChargeService $chargeService
|
373 |
+
* @param Exception|null $exception
|
374 |
+
*/
|
375 |
+
public function _debugChargeService(HpsChargeService $chargeService, $exception = NULL)
|
376 |
+
{
|
377 |
+
if ($this->getDebugFlag()) {
|
378 |
+
$this->_debug(array(
|
379 |
+
'store' => Mage::app()->getStore($this->getStore())->getFrontendName(),
|
380 |
+
'exception_message' => $exception ? get_class($exception).': '.$exception->getMessage() : '',
|
381 |
+
'last_request' => $chargeService->lastRequest,
|
382 |
+
'last_response' => $chargeService->lastResponse,
|
383 |
+
));
|
384 |
+
}
|
385 |
+
}
|
386 |
+
|
387 |
+
}
|
app/code/community/Hps/Securesubmit/Model/Resource/Setup.php
ADDED
@@ -0,0 +1,5 @@
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
class Hps_Securesubmit_Model_Resource_Setup extends Mage_Core_Model_Resource_Setup{
|
4 |
+
|
5 |
+
}
|
app/code/community/Hps/Securesubmit/Model/Resource/Storedcard.php
ADDED
@@ -0,0 +1,16 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
class Hps_Securesubmit_Model_Resource_Storedcard extends Mage_Core_Model_Resource_Db_Abstract{
|
4 |
+
protected function _construct()
|
5 |
+
{
|
6 |
+
$this->_init('hps_securesubmit/storedcard', 'storedcard_id');
|
7 |
+
}
|
8 |
+
|
9 |
+
public function removeDuplicates(Hps_Securesubmit_Model_Storedcard $storedcard)
|
10 |
+
{
|
11 |
+
$this->_getWriteAdapter()->delete($this->getMainTable(), array(
|
12 |
+
'customer_id = ?' => $storedcard->getCustomerId(),
|
13 |
+
'token_value = ?' => $storedcard->getTokenValue()
|
14 |
+
));
|
15 |
+
}
|
16 |
+
}
|
app/code/community/Hps/Securesubmit/Model/Resource/Storedcard/Collection.php
ADDED
@@ -0,0 +1,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
class Hps_Securesubmit_Model_Resource_Storedcard_Collection extends Mage_Core_Model_Resource_Db_Collection_Abstract {
|
4 |
+
protected function _construct()
|
5 |
+
{
|
6 |
+
$this->_init('hps_securesubmit/storedcard');
|
7 |
+
}
|
8 |
+
}
|
app/code/community/Hps/Securesubmit/Model/Source/Cctype.php
ADDED
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
class Hps_Securesubmit_Model_Source_Cctype extends Mage_Payment_Model_Source_Cctype
|
3 |
+
{
|
4 |
+
protected $_allowedTypes = array('AE','VI','MC','DI','JCB','OT');
|
5 |
+
|
6 |
+
}
|
app/code/community/Hps/Securesubmit/Model/Source/PaymentAction.php
ADDED
@@ -0,0 +1,17 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
class Hps_Securesubmit_Model_Source_PaymentAction
|
3 |
+
{
|
4 |
+
public function toOptionArray()
|
5 |
+
{
|
6 |
+
return array(
|
7 |
+
array(
|
8 |
+
'value' => Mage_Payment_Model_Method_Abstract::ACTION_AUTHORIZE,
|
9 |
+
'label' => 'Authorize'
|
10 |
+
),
|
11 |
+
array(
|
12 |
+
'value' => Mage_Payment_Model_Method_Abstract::ACTION_AUTHORIZE_CAPTURE,
|
13 |
+
'label' => 'Authorize and Capture'
|
14 |
+
),
|
15 |
+
);
|
16 |
+
}
|
17 |
+
}
|
app/code/community/Hps/Securesubmit/Model/Storedcard.php
ADDED
@@ -0,0 +1,33 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* @method Hps_Securesubmit_Model_Resource_Storedcard getResource()
|
4 |
+
* @method string getDt()
|
5 |
+
* @method Hps_Securesubmit_Model_Storedcard setDt(string $value)
|
6 |
+
* @method int getCustomerId()
|
7 |
+
* @method Hps_Securesubmit_Model_Storedcard setCustomerId(int $value)
|
8 |
+
* @method string getTokenValue()
|
9 |
+
* @method Hps_Securesubmit_Model_Storedcard setTokenValue(string $value)
|
10 |
+
* @method string getCcType()
|
11 |
+
* @method Hps_Securesubmit_Model_Storedcard setCcType(string $value)
|
12 |
+
* @method string getCcLast4()
|
13 |
+
* @method Hps_Securesubmit_Model_Storedcard setCcLast4(string $value)
|
14 |
+
* @method string getCcExpMonth()
|
15 |
+
* @method Hps_Securesubmit_Model_Storedcard setCcExpMonth(string $value)
|
16 |
+
* @method string getCcExpYear()
|
17 |
+
* @method Hps_Securesubmit_Model_Storedcard setCcExpYear(string $value)
|
18 |
+
*/
|
19 |
+
class Hps_Securesubmit_Model_Storedcard extends Mage_Core_Model_Abstract
|
20 |
+
{
|
21 |
+
|
22 |
+
protected function _construct()
|
23 |
+
{
|
24 |
+
$this->_init('hps_securesubmit/storedcard');
|
25 |
+
}
|
26 |
+
|
27 |
+
public function removeDuplicates()
|
28 |
+
{
|
29 |
+
$this->getResource()->removeDuplicates($this);
|
30 |
+
return $this;
|
31 |
+
}
|
32 |
+
|
33 |
+
}
|
app/code/community/Hps/Securesubmit/Model/System/Config/Backend/Proxy.php
ADDED
@@ -0,0 +1,17 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
class Hps_Securesubmit_Model_System_Config_Backend_Proxy extends Mage_Core_Model_Config_Data
|
3 |
+
{
|
4 |
+
protected function _beforeSave()
|
5 |
+
{
|
6 |
+
if ($this->getFieldsetDataValue('use_http_proxy')) {
|
7 |
+
$httpProxyHost = $this->getFieldsetDataValue('http_proxy_host');
|
8 |
+
if (empty($httpProxyHost)) {
|
9 |
+
Mage::throwException(Mage::helper('hps_securesubmit')->__('HTTP Proxy Host is required for using proxy.'));
|
10 |
+
}
|
11 |
+
$httpProxyPort = $this->getFieldsetDataValue('http_proxy_port');
|
12 |
+
if (empty($httpProxyPort)) {
|
13 |
+
Mage::throwException(Mage::helper('hps_securesubmit')->__('HTTP Proxy Port is required for using proxy.'));
|
14 |
+
}
|
15 |
+
}
|
16 |
+
}
|
17 |
+
}
|
app/code/community/Hps/Securesubmit/controllers/StoredcardController.php
ADDED
@@ -0,0 +1,83 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
class Hps_Securesubmit_StoredcardController extends Mage_core_Controller_Front_Action
|
4 |
+
{
|
5 |
+
|
6 |
+
public function preDispatch()
|
7 |
+
{
|
8 |
+
parent::preDispatch();
|
9 |
+
|
10 |
+
if (!Mage::getSingleton('customer/session')->authenticate($this)) {
|
11 |
+
$this->setFlag('', self::FLAG_NO_DISPATCH, true);
|
12 |
+
}
|
13 |
+
}
|
14 |
+
|
15 |
+
/*
|
16 |
+
* Customer Account > Manage Cards
|
17 |
+
*
|
18 |
+
* Shows customer list of their stored cards
|
19 |
+
*/
|
20 |
+
public function indexAction()
|
21 |
+
{
|
22 |
+
$this->loadLayout();
|
23 |
+
$this->renderLayout();
|
24 |
+
}
|
25 |
+
|
26 |
+
/*
|
27 |
+
* Customer can delete their stored cards
|
28 |
+
*/
|
29 |
+
public function deleteAction()
|
30 |
+
{
|
31 |
+
try{
|
32 |
+
$storedCard = Mage::getModel('hps_securesubmit/storedcard');
|
33 |
+
$storedCard->load($this->getRequest()->getParam('storedcard_id'));
|
34 |
+
if ( ! $storedCard->getId() || $storedCard->getCustomerId() != Mage::getSingleton('customer/session')->getCustomerId()) {
|
35 |
+
throw new Mage_Core_Exception($this->__('Stored card no longer exists.'));
|
36 |
+
}
|
37 |
+
$storedCard->delete();
|
38 |
+
Mage::getSingleton('customer/session')->addSuccess($this->__('Stored card has been deleted.'));
|
39 |
+
}
|
40 |
+
catch (Mage_Core_Exception $e) {
|
41 |
+
Mage::getSingleton('customer/session')->addError($e->getMessage());
|
42 |
+
}
|
43 |
+
catch (Exception $e) {
|
44 |
+
Mage::logException($e);
|
45 |
+
Mage::getSingleton('customer/session')->addError($this->__('An unexpected error occurred deleting your stored card. We apologize for the inconvenience, please contact us for further support.'));
|
46 |
+
}
|
47 |
+
$this->_redirect('*/*');
|
48 |
+
}
|
49 |
+
|
50 |
+
/*
|
51 |
+
* Get token data during checkout
|
52 |
+
*/
|
53 |
+
public function getTokenDataAction()
|
54 |
+
{
|
55 |
+
try {
|
56 |
+
$storedCard = Mage::getModel('hps_securesubmit/storedcard');
|
57 |
+
$storedCard->load($this->getRequest()->getParam('storedcard_id'));
|
58 |
+
if ( ! $storedCard->getId() || $storedCard->getCustomerId() != Mage::getSingleton('customer/session')->getCustomerId()) {
|
59 |
+
throw new Mage_Core_Exception($this->__('Stored card no longer exists.'));
|
60 |
+
}
|
61 |
+
$result = array(
|
62 |
+
'error' => FALSE,
|
63 |
+
'token' => array(
|
64 |
+
'token_value' => $storedCard->getTokenValue(),
|
65 |
+
'cc_last4' => $storedCard->getCcLast4(),
|
66 |
+
'cc_exp_month' => $storedCard->getCcExpMonth(),
|
67 |
+
'cc_exp_year' => $storedCard->getCcExpYear(),
|
68 |
+
'cc_type' => $storedCard->getCcType(),
|
69 |
+
)
|
70 |
+
);
|
71 |
+
}
|
72 |
+
catch (Mage_Core_Exception $e) {
|
73 |
+
$result = array('error' => TRUE, 'message' => $e->getMessage());
|
74 |
+
}
|
75 |
+
catch (Exception $e) {
|
76 |
+
Mage::logException($e);
|
77 |
+
$result = array('error' => TRUE, 'message' => $this->__('An unexpected error occurred retrieving your stored card. We apologize for the inconvenience, please contact us for further support.'));
|
78 |
+
}
|
79 |
+
$this->getResponse()->setHeader('Content-Type', 'application/json', TRUE);
|
80 |
+
$this->getResponse()->setBody(json_encode($result));
|
81 |
+
}
|
82 |
+
|
83 |
+
}
|
app/code/community/Hps/Securesubmit/etc/config.xml
ADDED
@@ -0,0 +1,79 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?xml version="1.0" encoding="UTF-8"?>
|
2 |
+
<config>
|
3 |
+
<modules>
|
4 |
+
<Hps_Securesubmit>
|
5 |
+
<version>1.0.0</version>
|
6 |
+
</Hps_Securesubmit>
|
7 |
+
</modules>
|
8 |
+
<global>
|
9 |
+
<resources>
|
10 |
+
<hps_securesubmit_setup>
|
11 |
+
<setup>
|
12 |
+
<module>Hps_Securesubmit</module>
|
13 |
+
<class>Hps_Securesubmit_Model_Resource_Setup</class>
|
14 |
+
</setup>
|
15 |
+
</hps_securesubmit_setup>
|
16 |
+
</resources>
|
17 |
+
<models>
|
18 |
+
<hps_securesubmit>
|
19 |
+
<class>Hps_Securesubmit_Model</class>
|
20 |
+
<resourceModel>hps_securesubmit_resource</resourceModel>
|
21 |
+
</hps_securesubmit>
|
22 |
+
<hps_securesubmit_resource>
|
23 |
+
<class>Hps_Securesubmit_Model_Resource</class>
|
24 |
+
<entities>
|
25 |
+
<storedcard>
|
26 |
+
<table>storedcard</table>
|
27 |
+
</storedcard>
|
28 |
+
</entities>
|
29 |
+
</hps_securesubmit_resource>
|
30 |
+
</models>
|
31 |
+
<helpers>
|
32 |
+
<hps_securesubmit>
|
33 |
+
<class>Hps_Securesubmit_Helper</class>
|
34 |
+
</hps_securesubmit>
|
35 |
+
</helpers>
|
36 |
+
<blocks>
|
37 |
+
<hps_securesubmit>
|
38 |
+
<class>Hps_Securesubmit_Block</class>
|
39 |
+
</hps_securesubmit>
|
40 |
+
</blocks>
|
41 |
+
</global>
|
42 |
+
<default>
|
43 |
+
<payment>
|
44 |
+
<hps_securesubmit>
|
45 |
+
<model>hps_securesubmit/payment</model>
|
46 |
+
<payment_action>authorize_capture</payment_action>
|
47 |
+
<title>Credit Card (SecureSubmit)</title>
|
48 |
+
<cctypes>AE,VI,MC,DI,JCB</cctypes>
|
49 |
+
<useccv>1</useccv>
|
50 |
+
<min_order_total>0.50</min_order_total>
|
51 |
+
<secretapikey backend_model="adminhtml/system_config_backend_encrypted" />
|
52 |
+
<publicapikey backend_model="adminhtml/system_config_backend_encrypted" />
|
53 |
+
<use_http_proxy>0</use_http_proxy>
|
54 |
+
<debug>0</debug>
|
55 |
+
</hps_securesubmit>
|
56 |
+
</payment>
|
57 |
+
</default>
|
58 |
+
<frontend>
|
59 |
+
<secure_url>
|
60 |
+
<securesubmit>/securesubmit/</securesubmit>
|
61 |
+
</secure_url>
|
62 |
+
<layout>
|
63 |
+
<updates>
|
64 |
+
<hps_securesubmit module="Hps_Securesubmit">
|
65 |
+
<file>securesubmit.xml</file>
|
66 |
+
</hps_securesubmit>
|
67 |
+
</updates>
|
68 |
+
</layout>
|
69 |
+
<routers>
|
70 |
+
<hps_securesubmit>
|
71 |
+
<use>standard</use>
|
72 |
+
<args>
|
73 |
+
<module>Hps_Securesubmit</module>
|
74 |
+
<frontName>securesubmit</frontName>
|
75 |
+
</args>
|
76 |
+
</hps_securesubmit>
|
77 |
+
</routers>
|
78 |
+
</frontend>
|
79 |
+
</config>
|
app/code/community/Hps/Securesubmit/etc/system.xml
ADDED
@@ -0,0 +1,153 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?xml version="1.0" encoding="UTF-8"?>
|
2 |
+
<config>
|
3 |
+
<sections>
|
4 |
+
<payment>
|
5 |
+
<groups>
|
6 |
+
<hps_securesubmit translate="label" module="hps_securesubmit">
|
7 |
+
<label>Secure Submit</label>
|
8 |
+
<frontend_type>text</frontend_type>
|
9 |
+
<sort_order>20</sort_order>
|
10 |
+
<show_in_default>1</show_in_default>
|
11 |
+
<show_in_website>1</show_in_website>
|
12 |
+
<show_in_store>1</show_in_store>
|
13 |
+
<comment><![CDATA[<a href="http://developer.heartlandpaymentsystems.com/SecureSubmit" target="_blank">Click here to sign up for SecureSubmit account</a>]]></comment>
|
14 |
+
<fields>
|
15 |
+
<active translate="label">
|
16 |
+
<label>Enabled</label>
|
17 |
+
<frontend_type>select</frontend_type>
|
18 |
+
<source_model>adminhtml/system_config_source_yesno</source_model>
|
19 |
+
<sort_order>10</sort_order>
|
20 |
+
<show_in_default>1</show_in_default>
|
21 |
+
<show_in_website>1</show_in_website>
|
22 |
+
<show_in_store>0</show_in_store>
|
23 |
+
</active>
|
24 |
+
<order_status translate="label">
|
25 |
+
<label>New order status</label>
|
26 |
+
<frontend_type>select</frontend_type>
|
27 |
+
<source_model>adminhtml/system_config_source_order_status_processing</source_model>
|
28 |
+
<sort_order>4</sort_order>
|
29 |
+
<show_in_default>1</show_in_default>
|
30 |
+
<show_in_website>1</show_in_website>
|
31 |
+
<show_in_store>0</show_in_store>
|
32 |
+
</order_status>
|
33 |
+
<title translate="label">
|
34 |
+
<label>Title</label>
|
35 |
+
<frontend_type>text</frontend_type>
|
36 |
+
<sort_order>20</sort_order>
|
37 |
+
<show_in_default>1</show_in_default>
|
38 |
+
<show_in_website>1</show_in_website>
|
39 |
+
<show_in_store>1</show_in_store>
|
40 |
+
</title>
|
41 |
+
<secretapikey translate="label">
|
42 |
+
<label>Secret Api Key</label>
|
43 |
+
<frontend_type>obscure</frontend_type>
|
44 |
+
<backend_model>adminhtml/system_config_backend_encrypted</backend_model>
|
45 |
+
<sort_order>30</sort_order>
|
46 |
+
<show_in_default>1</show_in_default>
|
47 |
+
<show_in_website>1</show_in_website>
|
48 |
+
<show_in_store>1</show_in_store>
|
49 |
+
</secretapikey>
|
50 |
+
<publicapikey translate="label">
|
51 |
+
<label>Public Api Key</label>
|
52 |
+
<frontend_type>obscure</frontend_type>
|
53 |
+
<backend_model>adminhtml/system_config_backend_encrypted</backend_model>
|
54 |
+
<sort_order>40</sort_order>
|
55 |
+
<show_in_default>1</show_in_default>
|
56 |
+
<show_in_website>1</show_in_website>
|
57 |
+
<show_in_store>1</show_in_store>
|
58 |
+
</publicapikey>
|
59 |
+
<cctypes translate="label">
|
60 |
+
<label>Credit Card Types</label>
|
61 |
+
<frontend_type>multiselect</frontend_type>
|
62 |
+
<source_model>hps_securesubmit/source_cctype</source_model>
|
63 |
+
<sort_order>50</sort_order>
|
64 |
+
<show_in_default>1</show_in_default>
|
65 |
+
<show_in_website>1</show_in_website>
|
66 |
+
<show_in_store>0</show_in_store>
|
67 |
+
</cctypes>
|
68 |
+
<payment_action translate="label">
|
69 |
+
<label>Payment Action</label>
|
70 |
+
<frontend_type>select</frontend_type>
|
71 |
+
<source_model>hps_securesubmit/source_paymentAction</source_model>
|
72 |
+
<sort_order>60</sort_order>
|
73 |
+
<show_in_default>1</show_in_default>
|
74 |
+
<show_in_website>1</show_in_website>
|
75 |
+
<show_in_store>0</show_in_store>
|
76 |
+
</payment_action>
|
77 |
+
<allow_card_saving translate="label">
|
78 |
+
<label>Allow Card Saving</label>
|
79 |
+
<frontend_type>select</frontend_type>
|
80 |
+
<source_model>adminhtml/system_config_source_yesno</source_model>
|
81 |
+
<sort_order>60</sort_order>
|
82 |
+
<show_in_default>1</show_in_default>
|
83 |
+
<show_in_website>1</show_in_website>
|
84 |
+
<show_in_store>1</show_in_store>
|
85 |
+
<comment><![CDATA[
|
86 |
+
Heartland Account must be configured for multi-use tokenization.]]>
|
87 |
+
</comment>
|
88 |
+
</allow_card_saving>
|
89 |
+
<custom_message>
|
90 |
+
<label>Custom Error Message</label>
|
91 |
+
<frontend_type>textarea</frontend_type>
|
92 |
+
<sort_order>65</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 |
+
<comment><![CDATA[
|
97 |
+
To use the default Secure Submit error message use %s in the custom message text, ex.
|
98 |
+
My message. %s -> will be displayed as: My message. Original Secure Submit message.]]>
|
99 |
+
</comment>
|
100 |
+
</custom_message>
|
101 |
+
<sort_order translate="label">
|
102 |
+
<label>Sort Order</label>
|
103 |
+
<frontend_type>text</frontend_type>
|
104 |
+
<sort_order>70</sort_order>
|
105 |
+
<show_in_default>1</show_in_default>
|
106 |
+
<show_in_website>1</show_in_website>
|
107 |
+
<show_in_store>0</show_in_store>
|
108 |
+
</sort_order>
|
109 |
+
<use_http_proxy translate="label">
|
110 |
+
<label>Use HTTP Proxy</label>
|
111 |
+
<frontend_type>select</frontend_type>
|
112 |
+
<source_model>adminhtml/system_config_source_yesno</source_model>
|
113 |
+
<backend_model>hps_securesubmit/system_config_backend_proxy</backend_model>
|
114 |
+
<sort_order>80</sort_order>
|
115 |
+
<show_in_default>1</show_in_default>
|
116 |
+
<show_in_website>1</show_in_website>
|
117 |
+
<show_in_store>0</show_in_store>
|
118 |
+
</use_http_proxy>
|
119 |
+
<http_proxy_host translate="label">
|
120 |
+
<label>HTTP Proxy Host</label>
|
121 |
+
<frontend_type>text</frontend_type>
|
122 |
+
<sort_order>90</sort_order>
|
123 |
+
<show_in_default>1</show_in_default>
|
124 |
+
<show_in_website>1</show_in_website>
|
125 |
+
<show_in_store>0</show_in_store>
|
126 |
+
<depends><use_http_proxy>1</use_http_proxy></depends>
|
127 |
+
<comment>Example: example.com</comment>
|
128 |
+
</http_proxy_host>
|
129 |
+
<http_proxy_port translate="label">
|
130 |
+
<label>HTTP Proxy Port</label>
|
131 |
+
<frontend_type>text</frontend_type>
|
132 |
+
<sort_order>100</sort_order>
|
133 |
+
<show_in_default>1</show_in_default>
|
134 |
+
<show_in_website>1</show_in_website>
|
135 |
+
<show_in_store>0</show_in_store>
|
136 |
+
<comment>Example: 8888</comment>
|
137 |
+
<depends><use_http_proxy>1</use_http_proxy></depends>
|
138 |
+
</http_proxy_port>
|
139 |
+
<debug translate="label">
|
140 |
+
<label>Debug</label>
|
141 |
+
<frontend_type>select</frontend_type>
|
142 |
+
<source_model>adminhtml/system_config_source_yesno</source_model>
|
143 |
+
<sort_order>110</sort_order>
|
144 |
+
<show_in_default>1</show_in_default>
|
145 |
+
<show_in_website>1</show_in_website>
|
146 |
+
<show_in_store>0</show_in_store>
|
147 |
+
</debug>
|
148 |
+
</fields>
|
149 |
+
</hps_securesubmit>
|
150 |
+
</groups>
|
151 |
+
</payment>
|
152 |
+
</sections>
|
153 |
+
</config>
|
app/code/community/Hps/Securesubmit/sql/hps_securesubmit_setup/install-1.0.0.php
ADDED
@@ -0,0 +1,69 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
$installer = $this;
|
3 |
+
$installer->startSetup();
|
4 |
+
|
5 |
+
$table = $installer->getConnection()
|
6 |
+
->newTable($installer->getTable('hps_securesubmit/storedcard'))
|
7 |
+
->addColumn(
|
8 |
+
'storedcard_id',
|
9 |
+
Varien_Db_Ddl_Table::TYPE_INTEGER,
|
10 |
+
null,
|
11 |
+
array('identity' => true, 'unsigned' => true, 'nullable' => false, 'primary' => true)
|
12 |
+
)
|
13 |
+
->addColumn(
|
14 |
+
'dt',
|
15 |
+
Varien_Db_Ddl_Table::TYPE_DATETIME,
|
16 |
+
null,
|
17 |
+
array())
|
18 |
+
->addColumn(
|
19 |
+
'customer_id',
|
20 |
+
Varien_Db_Ddl_Table::TYPE_INTEGER,
|
21 |
+
null,
|
22 |
+
array('unsigned' => true, 'nullable' => false, 'default' => '0')
|
23 |
+
)
|
24 |
+
->addColumn(
|
25 |
+
'token_value',
|
26 |
+
Varien_Db_Ddl_Table::TYPE_VARCHAR,
|
27 |
+
255,
|
28 |
+
array('nullable' => false)
|
29 |
+
)
|
30 |
+
->addColumn(
|
31 |
+
'cc_type',
|
32 |
+
Varien_Db_Ddl_Table::TYPE_VARCHAR,
|
33 |
+
25,
|
34 |
+
array('nullable' => false)
|
35 |
+
)
|
36 |
+
->addColumn(
|
37 |
+
'cc_last4',
|
38 |
+
Varien_Db_Ddl_Table::TYPE_VARCHAR,
|
39 |
+
4,
|
40 |
+
array('nullable' => false)
|
41 |
+
)
|
42 |
+
->addColumn(
|
43 |
+
'cc_exp_month',
|
44 |
+
Varien_Db_Ddl_Table::TYPE_VARCHAR,
|
45 |
+
2,
|
46 |
+
array('nullable' => false)
|
47 |
+
)
|
48 |
+
->addColumn(
|
49 |
+
'cc_exp_year',
|
50 |
+
Varien_Db_Ddl_Table::TYPE_VARCHAR,
|
51 |
+
4,
|
52 |
+
array('nullable' => false)
|
53 |
+
)
|
54 |
+
->addForeignKey(
|
55 |
+
$installer->getFkName(
|
56 |
+
'hps_securesubmit/storedcard',
|
57 |
+
'customer_id',
|
58 |
+
'customer/entity',
|
59 |
+
'entity_id'),
|
60 |
+
'customer_id',
|
61 |
+
$installer->getTable(
|
62 |
+
'customer/entity'),
|
63 |
+
'entity_id',
|
64 |
+
Varien_Db_Ddl_Table::ACTION_CASCADE,
|
65 |
+
Varien_Db_Ddl_Table::ACTION_CASCADE
|
66 |
+
);
|
67 |
+
|
68 |
+
$installer->getConnection()->createTable($table);
|
69 |
+
$installer->endSetup();
|
app/design/adminhtml/default/default/template/securesubmit/form.phtml
ADDED
@@ -0,0 +1,79 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php $_code=$this->getMethodCode() ?>
|
2 |
+
<ul id="payment_form_<?php echo $_code ?>" style="display:none">
|
3 |
+
<input type="hidden" name="payment[use_credit_card]" value="1" />
|
4 |
+
<li>
|
5 |
+
<div class="input-box">
|
6 |
+
<label for="<?php echo $_code ?>_cc_number"><?php echo Mage::helper('payment')->__('Credit Card Number') ?> <span class="required">*</span></label><br/>
|
7 |
+
<input type="text" id="<?php echo $_code ?>_cc_number" name="payment[cc_number]" title="<?php echo Mage::helper('payment')->__('Credit Card Number') ?>" class="input-text validate-cc-number" value="<?php echo $this->getInfoData('cc_number')?>"/>
|
8 |
+
</div>
|
9 |
+
</li>
|
10 |
+
<li>
|
11 |
+
<div class="input-box">
|
12 |
+
<label for="<?php echo $_code ?>_expiration"><?php echo Mage::helper('payment')->__('Expiration Date') ?> <span class="required">*</span></label><br/>
|
13 |
+
<select id="<?php echo $_code ?>_expiration" style="width:140px;" name="payment[cc_exp_month]" class="validate-cc-exp required-entry">
|
14 |
+
<?php $_ccExpMonth = $this->getInfoData('cc_exp_month') ?>
|
15 |
+
<?php foreach ($this->getCcMonths() as $k=>$v): ?>
|
16 |
+
<option value="<?php echo $k ?>" <?php if($k==$_ccExpMonth): ?>selected="selected"<?php endif ?>><?php echo $v ?></option>
|
17 |
+
<?php endforeach ?>
|
18 |
+
</select>
|
19 |
+
<?php $_ccExpYear = $this->getInfoData('cc_exp_year') ?>
|
20 |
+
<select id="<?php echo $_code ?>_expiration_yr" style="width:103px;" name="payment[cc_exp_year]" class="required-entry">
|
21 |
+
<?php foreach ($this->getCcYears() as $k=>$v): ?>
|
22 |
+
<option value="<?php echo $k ? $k : '' ?>" <?php if($k==$_ccExpYear): ?>selected="selected"<?php endif ?>><?php echo $v ?></option>
|
23 |
+
<?php endforeach ?>
|
24 |
+
</select>
|
25 |
+
</div>
|
26 |
+
</li>
|
27 |
+
<?php if($this->hasVerification()): ?>
|
28 |
+
<li>
|
29 |
+
<div class="input-box">
|
30 |
+
<label for="<?php echo $_code ?>_cc_cid"><?php echo Mage::helper('payment')->__('Card Verification Number') ?> <span class="required">*</span></label><br/>
|
31 |
+
<input type="text" title="<?php echo Mage::helper('payment')->__('Card Verification Number') ?>" class="required-entry input-text validate-cc-cvn" id="<?php echo $_code ?>_cc_cid" name="payment[cc_cid]" style="width:3em;" value="<?php echo $this->getInfoData('cc_cid')?>"/>
|
32 |
+
</div>
|
33 |
+
</li>
|
34 |
+
<?php endif; ?>
|
35 |
+
<?php if ($this->hasSsCardType()): ?>
|
36 |
+
<li id="<?php echo $_code ?>_cc_type_ss_div">
|
37 |
+
<ul class="inner-form">
|
38 |
+
<li class="form-alt"><label for="<?php echo $_code ?>_cc_issue" class="required"><em>*</em><?php echo $this->__('Switch/Solo/Maestro Only') ?></label></li>
|
39 |
+
<li>
|
40 |
+
<label for="<?php echo $_code ?>_cc_issue"><?php echo $this->__('Issue Number') ?>:</label>
|
41 |
+
<span class="input-box">
|
42 |
+
<input type="text" title="<?php echo $this->__('Issue Number') ?>" class="input-text validate-cc-ukss cvv" id="<?php echo $_code ?>_cc_issue" name="payment[cc_ss_issue]" value="" />
|
43 |
+
</span>
|
44 |
+
</li>
|
45 |
+
|
46 |
+
<li>
|
47 |
+
<label for="<?php echo $_code ?>_start_month"><?php echo $this->__('Start Date') ?>:</label>
|
48 |
+
<div class="input-box">
|
49 |
+
<select id="<?php echo $_code ?>_start_month" name="payment[cc_ss_start_month]" class="validate-cc-ukss month">
|
50 |
+
<?php foreach ($this->getCcMonths() as $k=>$v): ?>
|
51 |
+
<option value="<?php echo $k?$k:'' ?>"<?php if($k==$this->getInfoData('cc_ss_start_month')): ?> selected="selected"<?php endif ?>><?php echo $v ?></option>
|
52 |
+
<?php endforeach ?>
|
53 |
+
</select>
|
54 |
+
<select id="<?php echo $_code ?>_start_year" name="payment[cc_ss_start_year]" class="validate-cc-ukss year">
|
55 |
+
<?php foreach ($this->getSsStartYears() as $k=>$v): ?>
|
56 |
+
<option value="<?php echo $k?$k:'' ?>"<?php if($k==$this->getInfoData('cc_ss_start_year')): ?> selected="selected"<?php endif ?>><?php echo $v ?></option>
|
57 |
+
<?php endforeach ?>
|
58 |
+
</select>
|
59 |
+
</div>
|
60 |
+
</li>
|
61 |
+
<li class="adv-container"> </li>
|
62 |
+
</ul>
|
63 |
+
<script type="text/javascript">
|
64 |
+
//<![CDATA[
|
65 |
+
var SSChecked<?php echo $_code ?> = function() {
|
66 |
+
var elm = $('<?php echo $_code ?>_cc_type');
|
67 |
+
if (['SS','SM','SO'].indexOf(elm.value) != -1) {
|
68 |
+
$('<?php echo $_code ?>_cc_type_ss_div').show();
|
69 |
+
} else {
|
70 |
+
$('<?php echo $_code ?>_cc_type_ss_div').hide();
|
71 |
+
}
|
72 |
+
};
|
73 |
+
Event.observe($('<?php echo $_code ?>_cc_type'), 'change', SSChecked<?php echo $_code ?>);
|
74 |
+
SSChecked<?php echo $_code ?>();
|
75 |
+
//]]>
|
76 |
+
</script>
|
77 |
+
</li>
|
78 |
+
<?php endif; ?>
|
79 |
+
</ul>
|
app/design/frontend/base/default/layout/securesubmit.xml
ADDED
@@ -0,0 +1,30 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?xml version="1.0"?>
|
2 |
+
|
3 |
+
<layout version="0.1.0">
|
4 |
+
<onestepcheckout_index_index>
|
5 |
+
<reference name="head">
|
6 |
+
<action method="addJs"><file>securesubmit/secure.submit-1.0.1.js</file></action>
|
7 |
+
</reference>
|
8 |
+
</onestepcheckout_index_index>
|
9 |
+
<checkout_onepage_index>
|
10 |
+
<reference name="head">
|
11 |
+
<action method="addJs"><file>securesubmit/secure.submit-1.0.1.js</file></action>
|
12 |
+
</reference>
|
13 |
+
</checkout_onepage_index>
|
14 |
+
<customer_account>
|
15 |
+
<reference name="customer_account_navigation">
|
16 |
+
<action method="addLink" >
|
17 |
+
<name>save_token</name>
|
18 |
+
<path>securesubmit/storedcard/index</path>
|
19 |
+
<label>Manage Cards</label>
|
20 |
+
</action>
|
21 |
+
</reference>
|
22 |
+
</customer_account>
|
23 |
+
|
24 |
+
<hps_securesubmit_storedcard_index>
|
25 |
+
<update handle="customer_account" />
|
26 |
+
<reference name="my.account.wrapper">
|
27 |
+
<block type="core/template" name="hps_securesubmit_content" template="securesubmit/storedcards.phtml"/>
|
28 |
+
</reference>
|
29 |
+
</hps_securesubmit_storedcard_index>
|
30 |
+
</layout>
|
app/design/frontend/base/default/template/securesubmit/form.phtml
ADDED
@@ -0,0 +1,178 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php /* @var $this Hps_Securesubmit_Block_Form */
|
2 |
+
$_code = $this->getMethodCode();
|
3 |
+
$public_key = Mage::getModel('hps_securesubmit/payment')->getConfigData('publicapikey');
|
4 |
+
$allow_card_saving = Mage::getModel('hps_securesubmit/payment')->getConfigData('allow_card_saving');
|
5 |
+
$_loggedIn = Mage::getSingleton('customer/session')->isLoggedIn();
|
6 |
+
if ($_loggedIn && $allow_card_saving) {
|
7 |
+
$customerStoredCards = Mage::helper('hps_securesubmit')->getStoredCards( Mage::getSingleton('customer/session')->getCustomerId());
|
8 |
+
}
|
9 |
+
?>
|
10 |
+
<ul class="form-list" id="payment_form_<?php echo $_code ?>" style="display:none">
|
11 |
+
<?php if($_loggedIn && $allow_card_saving && count($customerStoredCards)): ?>
|
12 |
+
<li>
|
13 |
+
<label for="<?php echo $_code ?>_stored_card_checkbox"><?php echo $this->__('Use a stored card') ?></label>
|
14 |
+
<div class="input-box">
|
15 |
+
<input type="checkbox" id="<?php echo $_code ?>_stored_card_checkbox" />
|
16 |
+
</div>
|
17 |
+
</li>
|
18 |
+
<li id="<?php echo $_code ?>_stored_cards" style="display: none">
|
19 |
+
<label for="<?php echo $_code ?>_stored_card_select"><?php echo $this->__('Stored Card') ?></label>
|
20 |
+
<div class="input-box">
|
21 |
+
<select id="<?php echo $_code ?>_stored_card_select" autocomplete="off">
|
22 |
+
<?php foreach ($customerStoredCards as $key => $card): ?>
|
23 |
+
<option value="<?php echo $card->getId() ?>"><?php echo $card->getCcType().' ************'.$card->getCcLast4().' ('.$card->getCcExpMonth().'/'.$card->getCcExpYear().')' ?></option>
|
24 |
+
<?php endforeach ?>
|
25 |
+
</select>
|
26 |
+
</div>
|
27 |
+
</li>
|
28 |
+
<?php endif ?>
|
29 |
+
<li class="stored_cards_selected">
|
30 |
+
<label for="<?php echo $_code ?>_cc_number"><?php echo $this->__('Credit Card Number') ?> <span class="required">*</span></label>
|
31 |
+
<div class="input-box">
|
32 |
+
<input type="text" id="<?php echo $_code ?>_cc_number" title="<?php echo $this->__('Credit Card Number') ?>" class="input-text validate-cc-number validate-cc-type" value="" autocomplete="off" />
|
33 |
+
<input type="hidden" id="<?php echo $_code ?>_token" name="payment[securesubmit_token]" value="">
|
34 |
+
<input type="hidden" id="<?php echo $_code ?>_cc_last_four" name="payment[cc_last_four]" value="">
|
35 |
+
</div>
|
36 |
+
</li>
|
37 |
+
<li class="stored_cards_selected">
|
38 |
+
<label for="<?php echo $_code ?>_expiration"><?php echo $this->__('Expiration Date') ?> <span class="required">*</span></label>
|
39 |
+
<div class="input-box">
|
40 |
+
<div class="v-fix">
|
41 |
+
<select id="<?php echo $_code ?>_expiration" name="payment[cc_exp_month]" class="month required-entry validate-cc-exp" autocomplete="off">
|
42 |
+
<?php $_ccExpMonth = $this->getInfoData('cc_exp_month') ?>
|
43 |
+
<?php foreach ($this->getCcMonths() as $k=>$v): ?>
|
44 |
+
<option value="<?php echo $k?$k:'' ?>" <?php if($k==$_ccExpMonth): ?> selected="selected"<?php endif ?>><?php echo $v ?></option>
|
45 |
+
<?php endforeach ?>
|
46 |
+
</select>
|
47 |
+
</div>
|
48 |
+
<div class="v-fix">
|
49 |
+
<select id="<?php echo $_code ?>_expiration_yr" name="payment[cc_exp_year]" class="year required-entry" autocomplete="off">
|
50 |
+
<?php foreach ($this->getCcYears() as $k=>$v): ?>
|
51 |
+
<option value="<?php echo $k?$k:'' ?>" <?php if($k==$this->getInfoData('cc_exp_year')):?> selected="selected"<?php endif ?>><?php echo $v ?></option>
|
52 |
+
<?php endforeach ?>
|
53 |
+
</select>
|
54 |
+
</div>
|
55 |
+
</div>
|
56 |
+
</li>
|
57 |
+
<li class="stored_cards_selected">
|
58 |
+
<label for="<?php echo $_code ?>_cc_cid"><?php echo $this->__('Card Verification Number') ?> <span class="required">*</span></label>
|
59 |
+
<div class="input-box">
|
60 |
+
<div class="v-fix">
|
61 |
+
<input type="text" title="<?php echo $this->__('Card Verification Number') ?>" class="cvv required-entry input-text validate-cc-cvn" id="<?php echo $_code ?>_cc_cid" value="" autocomplete="off" />
|
62 |
+
</div>
|
63 |
+
<a href="#" class="cvv-what-is-this"><?php echo $this->__('What is this?') ?></a>
|
64 |
+
</div>
|
65 |
+
</li>
|
66 |
+
<?php if ($_loggedIn && $allow_card_saving && $public_key): ?>
|
67 |
+
<li class="stored_cards_selected">
|
68 |
+
<label for="<?php echo $_code ?>_cc_save_future"><?php echo $this->__('Save this card for future use?') ?></label>
|
69 |
+
<div class="input-box">
|
70 |
+
<input type="checkbox" id="<?php echo $_code ?>_cc_save_future" name="payment[cc_save_future]" value="Y" autocomplete="off" />
|
71 |
+
</div>
|
72 |
+
</li>
|
73 |
+
<?php endif ?>
|
74 |
+
</ul>
|
75 |
+
<script type="text/javascript">
|
76 |
+
//<![CDATA[
|
77 |
+
<?php if($_loggedIn && $allow_card_saving && count($customerStoredCards)): ?>
|
78 |
+
$('<?php echo $_code ?>_stored_card_checkbox').observe('click',function() {
|
79 |
+
$$('.stored_cards_selected').invoke('toggle');
|
80 |
+
$('<?php echo $_code ?>_stored_cards').toggle();
|
81 |
+
$('<?php echo $_code ?>_cc_number').toggleClassName('validate-cc-number');
|
82 |
+
});
|
83 |
+
<?php endif ?>
|
84 |
+
|
85 |
+
Payment.prototype._secureSubmitOldSave = Payment.prototype.save;
|
86 |
+
Object.extend(Payment.prototype, {
|
87 |
+
save: function() {
|
88 |
+
if (this.currentMethod != 'hps_securesubmit') {
|
89 |
+
this._secureSubmitOldSave();
|
90 |
+
return;
|
91 |
+
}
|
92 |
+
|
93 |
+
if (checkout.loadWaiting != false) return;
|
94 |
+
|
95 |
+
// Use stored card checked, get existing token data
|
96 |
+
if (this.secureSubmitUseStoredCard()) {
|
97 |
+
var storedcardId = $('hps_securesubmit_stored_card_select').value;
|
98 |
+
checkout.setLoadWaiting('payment');
|
99 |
+
new Ajax.Request(this.secureSubmitGetTokenDataUrl, {
|
100 |
+
method: 'post',
|
101 |
+
parameters: {storedcard_id: storedcardId},
|
102 |
+
onSuccess: function(response) {
|
103 |
+
var data = response.responseJSON;
|
104 |
+
if (data && data.token) {
|
105 |
+
$('hps_securesubmit_expiration').value = parseInt(data.token.cc_exp_month);
|
106 |
+
$('hps_securesubmit_expiration_yr').value = data.token.cc_exp_year;
|
107 |
+
}
|
108 |
+
this.secureSubmitResponseHandler({
|
109 |
+
token_value: data.token.token_value,
|
110 |
+
token_type: null, // 'supt'?
|
111 |
+
token_expire: new Date().toISOString(),
|
112 |
+
card: {
|
113 |
+
number: data.token.cc_last4
|
114 |
+
}
|
115 |
+
});
|
116 |
+
}.bind(this),
|
117 |
+
onFailure: function() {
|
118 |
+
alert('Unknown error. Please try again.');
|
119 |
+
checkout.setLoadWaiting(false);
|
120 |
+
}
|
121 |
+
});
|
122 |
+
}
|
123 |
+
// Use stored card not checked, get new token
|
124 |
+
else {
|
125 |
+
var validator = new Validation(this.form);
|
126 |
+
if (this.validate() && validator.validate()) {
|
127 |
+
checkout.setLoadWaiting('payment');
|
128 |
+
|
129 |
+
hps.tokenize({
|
130 |
+
data: {
|
131 |
+
public_key: this.secureSubmitPublicKey,
|
132 |
+
number: $('hps_securesubmit_cc_number').value,
|
133 |
+
cvc: $('hps_securesubmit_cc_cid').value,
|
134 |
+
exp_month: $('hps_securesubmit_expiration').value,
|
135 |
+
exp_year: $('hps_securesubmit_expiration_yr').value
|
136 |
+
},
|
137 |
+
success: this.secureSubmitResponseHandler.bind(this),
|
138 |
+
error: this.secureSubmitResponseHandler.bind(this)
|
139 |
+
});
|
140 |
+
}
|
141 |
+
}
|
142 |
+
},
|
143 |
+
secureSubmitUseStoredCard: function () {
|
144 |
+
var storedCheckbox = $('hps_securesubmit_stored_card_checkbox');
|
145 |
+
return storedCheckbox && storedCheckbox.checked;
|
146 |
+
},
|
147 |
+
secureSubmitResponseHandler: function (response) {
|
148 |
+
var tokenField = $('hps_securesubmit_token'),
|
149 |
+
lastFourField = $('hps_securesubmit_cc_last_four');
|
150 |
+
tokenField.value = lastFourField.value = null;
|
151 |
+
|
152 |
+
if (response && response.error) {
|
153 |
+
if (response.message) {
|
154 |
+
alert(response.message);
|
155 |
+
}
|
156 |
+
checkout.setLoadWaiting(false);
|
157 |
+
} else if (response && response.token_value) {
|
158 |
+
tokenField.value = response.token_value;
|
159 |
+
lastFourField.value = response.card.number.substr(-4);
|
160 |
+
|
161 |
+
// Continue Magento checkout steps
|
162 |
+
new Ajax.Request(this.saveUrl, {
|
163 |
+
method:'post',
|
164 |
+
onComplete: this.onComplete,
|
165 |
+
onSuccess: this.onSave,
|
166 |
+
onFailure: checkout.ajaxFailure.bind(checkout),
|
167 |
+
parameters: Form.serialize(this.form)
|
168 |
+
});
|
169 |
+
} else {
|
170 |
+
alert('Unexpected error.')
|
171 |
+
}
|
172 |
+
}
|
173 |
+
});
|
174 |
+
|
175 |
+
payment.secureSubmitPublicKey = '<?php echo $public_key ?>';
|
176 |
+
payment.secureSubmitGetTokenDataUrl = '<?php echo Mage::getUrl('securesubmit/storedcard/getTokenData', array('_secure' => TRUE)) ?>';
|
177 |
+
//]]>
|
178 |
+
</script>
|
app/design/frontend/base/default/template/securesubmit/storedcards.phtml
ADDED
@@ -0,0 +1,40 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
$_storedCards = Mage::helper('hps_securesubmit')->getStoredCards(Mage::getSingleton('customer/session')->getCustomerId());
|
3 |
+
?>
|
4 |
+
|
5 |
+
<h1><?php echo $this->__('Manage Saved Cards') ?></h1>
|
6 |
+
<div class="box-account">
|
7 |
+
<div class="box-head">
|
8 |
+
<h2><?php echo $this->__('Saved Credit Cards') ?></h2>
|
9 |
+
</div>
|
10 |
+
<?php if (count($_storedCards)): ?>
|
11 |
+
<table class="data-table" id="stored-cards-table">
|
12 |
+
<col width="1" />
|
13 |
+
<col width="1" />
|
14 |
+
<col width="1" />
|
15 |
+
<col width="1" />
|
16 |
+
<thead>
|
17 |
+
<tr>
|
18 |
+
<th><?php echo $this->__('Card Type') ?></th>
|
19 |
+
<th><?php echo $this->__('Card Number') ?></th>
|
20 |
+
<th><?php echo $this->__('Expiration Date') ?></th>
|
21 |
+
<th> </th>
|
22 |
+
</tr>
|
23 |
+
</thead>
|
24 |
+
<tbody>
|
25 |
+
<?php foreach ($_storedCards->getData() as $card): ?>
|
26 |
+
<tr id="credit_cards">
|
27 |
+
<td class="a-center"><span class="nobr"><?php echo $card['cc_type'] ?></span></td>
|
28 |
+
<td class="a-center"><span class="nobr"><?php echo "************".$card['cc_last4'] ?></span></td>
|
29 |
+
<td class="a-center"><span class="nobr"><?php echo $card['cc_exp_month'] ."-".$card['cc_exp_year'] ?></span></td>
|
30 |
+
<td><a href="<?php echo Mage::getUrl('securesubmit/storedcard/delete', array('storedcard_id' => $card['storedcard_id'], '_secure' => TRUE)) ?>">Delete</a></td>
|
31 |
+
</tr>
|
32 |
+
<?php endforeach; ?>
|
33 |
+
</tbody>
|
34 |
+
</table>
|
35 |
+
<?php else: ?>
|
36 |
+
<p>
|
37 |
+
<?php echo $this->__('You do not have any saved credit cards.') ?>
|
38 |
+
</p>
|
39 |
+
<?php endif; ?>
|
40 |
+
</div>
|
app/etc/modules/Hps_Securesubmit.xml
ADDED
@@ -0,0 +1,9 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?xml version="1.0"?>
|
2 |
+
<config>
|
3 |
+
<modules>
|
4 |
+
<Hps_Securesubmit>
|
5 |
+
<active>true</active>
|
6 |
+
<codePool>community</codePool>
|
7 |
+
</Hps_Securesubmit>
|
8 |
+
</modules>
|
9 |
+
</config>
|
js/securesubmit/secure.submit-1.0.1.js
ADDED
@@ -0,0 +1,115 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/*global $ */
|
2 |
+
var hps = (function () {
|
3 |
+
"use strict";
|
4 |
+
|
5 |
+
var HPS = {
|
6 |
+
|
7 |
+
Tag: "SecureSubmit",
|
8 |
+
|
9 |
+
Urls: {
|
10 |
+
CERT: "https://posgateway.cert.secureexchange.net/Hps.Exchange.PosGateway.Hpf.v1/api/token",
|
11 |
+
PROD: "https://api.heartlandportico.com/SecureSubmit.v1/api/token"
|
12 |
+
},
|
13 |
+
|
14 |
+
tokenize: function (options) {
|
15 |
+
var gateway_url, params, env, getter_impl;
|
16 |
+
|
17 |
+
// add additional service parameters
|
18 |
+
params = $H({
|
19 |
+
"api_key": options.data.public_key,
|
20 |
+
"object": "token",
|
21 |
+
"token_type": "supt",
|
22 |
+
"_method": "post",
|
23 |
+
"card[number]": HPS.trim(options.data.number),
|
24 |
+
"card[cvc]": HPS.trim(options.data.cvc),
|
25 |
+
"card[exp_month]": HPS.trim(options.data.exp_month),
|
26 |
+
"card[exp_year]": HPS.trim(options.data.exp_year)
|
27 |
+
});
|
28 |
+
|
29 |
+
env = options.data.public_key.split("_")[1];
|
30 |
+
|
31 |
+
if (env === "uat") {
|
32 |
+
gateway_url = HPS.Urls.UAT;
|
33 |
+
} else if (env === "cert") {
|
34 |
+
gateway_url = HPS.Urls.CERT;
|
35 |
+
} else {
|
36 |
+
gateway_url = HPS.Urls.PROD;
|
37 |
+
}
|
38 |
+
|
39 |
+
new Ajax.JSONP(gateway_url, {
|
40 |
+
parameters: params,
|
41 |
+
onComplete: function(json) {
|
42 |
+
|
43 |
+
// Request failed, handle error
|
44 |
+
if (typeof json.error === 'object') {
|
45 |
+
// call error handler if provided and valid
|
46 |
+
if (typeof options.error === 'function') {
|
47 |
+
options.error(json.error);
|
48 |
+
} else {
|
49 |
+
// handle exception
|
50 |
+
HPS.error(json.error.message);
|
51 |
+
}
|
52 |
+
} else if (typeof options.success === 'function') {
|
53 |
+
options.success(json);
|
54 |
+
}
|
55 |
+
}
|
56 |
+
});
|
57 |
+
|
58 |
+
},
|
59 |
+
|
60 |
+
trim: function (string) {
|
61 |
+
if (string !== undefined && typeof string === "string" ) {
|
62 |
+
string = string.toString().replace(/^\s\s*/, '').replace(/\s\s*$/, '');
|
63 |
+
}
|
64 |
+
return string;
|
65 |
+
},
|
66 |
+
|
67 |
+
empty: function (val) {
|
68 |
+
return val === undefined || val.length === 0;
|
69 |
+
},
|
70 |
+
|
71 |
+
error: function (message) {
|
72 |
+
if (console && console.log) {
|
73 |
+
console.log([HPS.Tag, ": ", message].join(""));
|
74 |
+
}
|
75 |
+
}
|
76 |
+
};
|
77 |
+
|
78 |
+
return HPS;
|
79 |
+
}());
|
80 |
+
|
81 |
+
Ajax.JSONP = Class.create(Ajax.Base, (function() {
|
82 |
+
var id = 0,
|
83 |
+
head = document.getElementsByTagName('head')[0];
|
84 |
+
|
85 |
+
return {
|
86 |
+
initialize: function($super, url, options) {
|
87 |
+
$super(options);
|
88 |
+
this.request(url);
|
89 |
+
},
|
90 |
+
|
91 |
+
request: function(url) {
|
92 |
+
var callbackName = '_prototypeJSONPCallback_' + (id++),
|
93 |
+
self = this,
|
94 |
+
script;
|
95 |
+
|
96 |
+
this.options.parameters["callback"] = callbackName;
|
97 |
+
|
98 |
+
url += (url.include('?') ? '&' : '?') + Object.toQueryString(this.options.parameters);
|
99 |
+
|
100 |
+
window[callbackName] = function(json) {
|
101 |
+
script.remove();
|
102 |
+
script = null;
|
103 |
+
window[callbackName] = undefined;
|
104 |
+
if (self.options.onComplete) {
|
105 |
+
self.options.onComplete.call(self, json);
|
106 |
+
}
|
107 |
+
}
|
108 |
+
script = new Element('script', {
|
109 |
+
type: 'text/javascript',
|
110 |
+
src: url
|
111 |
+
});
|
112 |
+
head.appendChild(script);
|
113 |
+
}
|
114 |
+
};
|
115 |
+
})());
|
lib/SecureSubmit/Hps.php
ADDED
@@ -0,0 +1,42 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
if ( ! defined('DS')) define('DS', DIRECTORY_SEPARATOR);
|
3 |
+
if ( ! defined('PS')) define('PS', PATH_SEPARATOR);
|
4 |
+
|
5 |
+
// Infrastructure
|
6 |
+
require_once(dirname(__FILE__).DS.'infrastructure/HpsConfiguration.php');
|
7 |
+
require_once(dirname(__FILE__).DS.'infrastructure/HpsException.php');
|
8 |
+
require_once(dirname(__FILE__).DS.'infrastructure/ApiConnectionException.php');
|
9 |
+
require_once(dirname(__FILE__).DS.'infrastructure/AuthenticationException.php');
|
10 |
+
require_once(dirname(__FILE__).DS.'infrastructure/AVSResponseCodeHandler.php');
|
11 |
+
require_once(dirname(__FILE__).DS.'infrastructure/CardException.php');
|
12 |
+
require_once(dirname(__FILE__).DS.'infrastructure/HpsExceptionMapper.php');
|
13 |
+
require_once(dirname(__FILE__).DS.'infrastructure/HpsSdkCodes.php');
|
14 |
+
require_once(dirname(__FILE__).DS.'infrastructure/InvalidRequestException.php');
|
15 |
+
|
16 |
+
// Entities
|
17 |
+
require_once(dirname(__FILE__).DS.'entities/HpsTransaction.php');
|
18 |
+
require_once(dirname(__FILE__).DS.'entities/HpsAuthorization.php');
|
19 |
+
require_once(dirname(__FILE__).DS.'entities/HpsAccountVerify.php');
|
20 |
+
require_once(dirname(__FILE__).DS.'entities/HpsAddress.php');
|
21 |
+
require_once(dirname(__FILE__).DS.'entities/HpsTransactionType.php');
|
22 |
+
require_once(dirname(__FILE__).DS.'entities/HpsBatch.php');
|
23 |
+
require_once(dirname(__FILE__).DS.'entities/HpsCardHolder.php');
|
24 |
+
require_once(dirname(__FILE__).DS.'entities/HpsCharge.php');
|
25 |
+
require_once(dirname(__FILE__).DS.'entities/HpsChargeExceptions.php');
|
26 |
+
require_once(dirname(__FILE__).DS.'entities/HpsCreditCard.php');
|
27 |
+
require_once(dirname(__FILE__).DS.'entities/HpsItemChoiceTypePosResponseVer10Transaction.php');
|
28 |
+
require_once(dirname(__FILE__).DS.'entities/HpsRefund.php');
|
29 |
+
require_once(dirname(__FILE__).DS.'entities/HpsReportTransactionDetails.php');
|
30 |
+
require_once(dirname(__FILE__).DS.'entities/HpsReportTransactionSummary.php');
|
31 |
+
require_once(dirname(__FILE__).DS.'entities/HpsReversal.php');
|
32 |
+
require_once(dirname(__FILE__).DS.'entities/HpsTokenData.php');
|
33 |
+
require_once(dirname(__FILE__).DS.'entities/HpsTransactionDetails.php');
|
34 |
+
require_once(dirname(__FILE__).DS.'entities/HpsTransactionHeader.php');
|
35 |
+
require_once(dirname(__FILE__).DS.'entities/HpsVoid.php');
|
36 |
+
|
37 |
+
|
38 |
+
// Services
|
39 |
+
require_once(dirname(__FILE__).DS.'services/HpsTokenService.php');
|
40 |
+
require_once(dirname(__FILE__).DS.'services/HpsService.php');
|
41 |
+
require_once(dirname(__FILE__).DS.'services/HpsChargeService.php');
|
42 |
+
require_once(dirname(__FILE__).DS.'services/HpsBatchService.php');
|
lib/SecureSubmit/entities/HpsAccountVerify.php
ADDED
@@ -0,0 +1,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
class HpsAccountVerify extends HpsAuthorization{
|
4 |
+
public function __construct($header){
|
5 |
+
parent::__construct($header);
|
6 |
+
}
|
7 |
+
}
|
lib/SecureSubmit/entities/HpsAddress.php
ADDED
@@ -0,0 +1,9 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
class HpsAddress {
|
4 |
+
public $address = null,
|
5 |
+
$city = null,
|
6 |
+
$state = null,
|
7 |
+
$zip = null,
|
8 |
+
$country = null;
|
9 |
+
}
|
lib/SecureSubmit/entities/HpsAuthorization.php
ADDED
@@ -0,0 +1,18 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
|
4 |
+
class HpsAuthorization extends HpsTransaction {
|
5 |
+
public $avsResultCode = null,
|
6 |
+
$avsResultText = null,
|
7 |
+
$cvvResultCode = null,
|
8 |
+
$cvvResultText = null,
|
9 |
+
$cpcIndicator = null,
|
10 |
+
$authorizationCode = null,
|
11 |
+
$authorizedAmount = null,
|
12 |
+
$cardType = null,
|
13 |
+
$tokenData = null;
|
14 |
+
|
15 |
+
public function __construct($header){
|
16 |
+
parent::__construct($header);
|
17 |
+
}
|
18 |
+
}
|
lib/SecureSubmit/entities/HpsBatch.php
ADDED
@@ -0,0 +1,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
class HpsBatch {
|
4 |
+
public $id = null,
|
5 |
+
$transactionCount = null,
|
6 |
+
$totalAmount = null,
|
7 |
+
$sequenceNumber = null;
|
8 |
+
}
|
lib/SecureSubmit/entities/HpsCardHolder.php
ADDED
@@ -0,0 +1,9 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
class HpsCardHolder {
|
4 |
+
public $firstName = null,
|
5 |
+
$lastName = null,
|
6 |
+
$phone = null,
|
7 |
+
$emailAddress = null,
|
8 |
+
$address = null;
|
9 |
+
}
|
lib/SecureSubmit/entities/HpsCharge.php
ADDED
@@ -0,0 +1,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
class HpsCharge extends HpsAuthorization{
|
4 |
+
public function __construct($header){
|
5 |
+
parent::__construct($header);
|
6 |
+
}
|
7 |
+
}
|
lib/SecureSubmit/entities/HpsChargeExceptions.php
ADDED
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
class HpsChargeExceptions {
|
4 |
+
public $cardException = null,
|
5 |
+
$hpsException = null;
|
6 |
+
}
|
lib/SecureSubmit/entities/HpsCreditCard.php
ADDED
@@ -0,0 +1,27 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
|
4 |
+
class HpsCreditCard {
|
5 |
+
public $number = null,
|
6 |
+
$cvv = null,
|
7 |
+
$expMonth = null,
|
8 |
+
$expYear = null;
|
9 |
+
|
10 |
+
function cardType(){
|
11 |
+
$regexMap = array(
|
12 |
+
'Amex' => '/^3[47][0-9]{13}$/',
|
13 |
+
'MasterCard' => '/^5[1-5][0-9]{14}$/',
|
14 |
+
'Visa' => '/^4[0-9]{12}(?:[0-9]{3})?$/',
|
15 |
+
'DinersClub' => '/^3(?:0[0-5]|[68][0-9])[0-9]{11}$/',
|
16 |
+
'EnRoute' => '/^(2014|2149)/',
|
17 |
+
'Discover' => '/^6(?:011|5[0-9]{2})[0-9]{12}$/',
|
18 |
+
'Jcb' => '/^(?:2131|1800|35\d{3})\d{11}$/',
|
19 |
+
);
|
20 |
+
foreach($regexMap as $card=>$rx){
|
21 |
+
if(preg_match($rx, $this->number)){
|
22 |
+
return $card;
|
23 |
+
}
|
24 |
+
}
|
25 |
+
return "Unknown";
|
26 |
+
}
|
27 |
+
}
|
lib/SecureSubmit/entities/HpsItemChoiceTypePosResponseVer10Transaction.php
ADDED
@@ -0,0 +1,63 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
class HpsItemChoiceTypePosResponseVer10Transaction{
|
4 |
+
static public $AddAttachment = "AddAttachment";
|
5 |
+
static public $Authenticate = "Authenticate";
|
6 |
+
static public $BatchClose = "BatchClose";
|
7 |
+
static public $CancelImpersonation = "CancelImpersonation";
|
8 |
+
static public $CheckSale = "CheckSale";
|
9 |
+
static public $CheckVoid = "CheckVoid";
|
10 |
+
static public $CreditAccountVerify = "CreditAccountVerify";
|
11 |
+
static public $CreditAddToBatch = "CreditAddToBatch";
|
12 |
+
static public $CreditAuth = "CreditAuth";
|
13 |
+
static public $CreditCPCEdit = "CreditCPCEdit";
|
14 |
+
static public $CreditIncrementalAuth = "CreditIncrementalAuth";
|
15 |
+
static public $CreditOfflineAuth = "CreditOfflineAuth";
|
16 |
+
static public $CreditOfflineSale = "CreditOfflineSale";
|
17 |
+
static public $CreditReturn = "CreditReturn";
|
18 |
+
static public $CreditReversal = "CreditReversal";
|
19 |
+
static public $CreditSale = "CreditSale";
|
20 |
+
static public $CreditTxnEdit = "CreditTxnEdit";
|
21 |
+
static public $CreditVoid = "CreditVoid";
|
22 |
+
static public $DebitAddValue = "DebitAddValue";
|
23 |
+
static public $DebitReturn = "DebitReturn";
|
24 |
+
static public $DebitReversal = "DebitReversal";
|
25 |
+
static public $DebitSale = "DebitSale";
|
26 |
+
static public $EBTBalanceInquiry = "EBTBalanceInquiry";
|
27 |
+
static public $EBTCashBackPurchase = "EBTCashBackPurchase";
|
28 |
+
static public $EBTCashBenefitWithdrawal = "EBTCashBenefitWithdrawal";
|
29 |
+
static public $EBTFSPurchase = "EBTFSPurchase";
|
30 |
+
static public $EBTFSReturn = "EBTFSReturn";
|
31 |
+
static public $EBTVoucherPurchase = "EBTVoucherPurchase";
|
32 |
+
static public $EndToEndTest = "EndToEndTest";
|
33 |
+
static public $FindTransactions = "FindTransactions";
|
34 |
+
static public $GetAttachments = "GetAttachments";
|
35 |
+
static public $GetUserDeviceSettings = "GetUserDeviceSettings";
|
36 |
+
static public $GetUserSettings = "GetUserSettings";
|
37 |
+
static public $GiftCardActivate = "GiftCardActivate";
|
38 |
+
static public $GiftCardAddValue = "GiftCardAddValue";
|
39 |
+
static public $GiftCardBalance = "GiftCardBalance";
|
40 |
+
static public $GiftCardCurrentDayTotals = "GiftCardCurrentDayTotals";
|
41 |
+
static public $GiftCardDeactivate = "GiftCardDeactivate";
|
42 |
+
static public $GiftCardPreviousDayTotals = "GiftCardPreviousDayTotals";
|
43 |
+
static public $GiftCardReplace = "GiftCardReplace";
|
44 |
+
static public $GiftCardReversal = "GiftCardReversal";
|
45 |
+
static public $GiftCardSale = "GiftCardSale";
|
46 |
+
static public $GiftCardVoid = "GiftCardVoid";
|
47 |
+
static public $Impersonate = "Impersonate";
|
48 |
+
static public $InvalidateAuthentication = "InvalidateAuthentication";
|
49 |
+
static public $ManageSettings = "ManageSettings";
|
50 |
+
static public $ManageUsers = "ManageUsers";
|
51 |
+
static public $PrePaidAddValue = "PrePaidAddValue";
|
52 |
+
static public $PrePaidBalanceInquiry = "PrePaidBalanceInquiry";
|
53 |
+
static public $RecurringBilling = "RecurringBilling";
|
54 |
+
static public $ReportActivity = "ReportActivity";
|
55 |
+
static public $ReportBatchDetail = "ReportBatchDetail";
|
56 |
+
static public $ReportBatchHistory = "ReportBatchHistory";
|
57 |
+
static public $ReportBatchSummary = "ReportBatchSummary";
|
58 |
+
static public $ReportOpenAuths = "ReportOpenAuths";
|
59 |
+
static public $ReportSearch = "ReportSearch";
|
60 |
+
static public $ReportTxnDetail = "ReportTxnDetail";
|
61 |
+
static public $SendReceipt = "SendReceipt";
|
62 |
+
static public $TestCredentials = "TestCredentials";
|
63 |
+
}
|
lib/SecureSubmit/entities/HpsRefund.php
ADDED
@@ -0,0 +1,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
class HpsRefund extends HpsTransaction{
|
4 |
+
public function __construct($header){
|
5 |
+
parent::__construct($header);
|
6 |
+
}
|
7 |
+
}
|
lib/SecureSubmit/entities/HpsReportTransactionDetails.php
ADDED
@@ -0,0 +1,14 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
|
4 |
+
class HpsReportTransactionDetails extends HpsAuthorization {
|
5 |
+
public $originalTransactionId = null,
|
6 |
+
$maskedCardNumber = null,
|
7 |
+
$transactionType = null,
|
8 |
+
$transactionDate = null,
|
9 |
+
$exceptions = null;
|
10 |
+
|
11 |
+
public function __construct($header){
|
12 |
+
parent::__construct($header);
|
13 |
+
}
|
14 |
+
}
|
lib/SecureSubmit/entities/HpsReportTransactionSummary.php
ADDED
@@ -0,0 +1,10 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
class HpsReportTransactionSummary extends HpsTransaction{
|
4 |
+
public $amount = null,
|
5 |
+
$originalTransactionId = null,
|
6 |
+
$maskedCardNumber = null,
|
7 |
+
$transactionType = null,
|
8 |
+
$transactionDate = null,
|
9 |
+
$exceptions = null;
|
10 |
+
}
|
lib/SecureSubmit/entities/HpsReversal.php
ADDED
@@ -0,0 +1,13 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
class HpsReversal extends HpsTransaction{
|
4 |
+
public $avsResultCode = null,
|
5 |
+
$avsResultText = null,
|
6 |
+
$cvvResultCode = null,
|
7 |
+
$cvvResultText = null,
|
8 |
+
$cpcIndicator = null;
|
9 |
+
|
10 |
+
public function __construct($header){
|
11 |
+
parent::__construct($header);
|
12 |
+
}
|
13 |
+
}
|
lib/SecureSubmit/entities/HpsTokenData.php
ADDED
@@ -0,0 +1,11 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
class HpsTokenData {
|
4 |
+
public $tokenValue = null,
|
5 |
+
$responseCode = null,
|
6 |
+
$responseMessage = null;
|
7 |
+
|
8 |
+
public function __construct($responseMessage = null){
|
9 |
+
$this->responseMessage = $responseMessage;
|
10 |
+
}
|
11 |
+
}
|
lib/SecureSubmit/entities/HpsTransaction.php
ADDED
@@ -0,0 +1,111 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
class HpsTransaction {
|
4 |
+
public $transactionHeader = null,
|
5 |
+
$transactionId = null,
|
6 |
+
$responseCode = null,
|
7 |
+
$responseText = null,
|
8 |
+
$referenceNumber = null;
|
9 |
+
|
10 |
+
public function __construct($transactionHeader=null){
|
11 |
+
$this->transactionHeader = $transactionHeader;
|
12 |
+
}
|
13 |
+
|
14 |
+
static public function transactionTypeToServiceName($transactionType){
|
15 |
+
switch ($transactionType){
|
16 |
+
case HpsTransactionType::$AUTHORIZE :
|
17 |
+
return HpsItemChoiceTypePosResponseVer10Transaction::$CreditAuth;
|
18 |
+
break;
|
19 |
+
|
20 |
+
case HpsTransactionType::$CAPTURE:
|
21 |
+
return HpsItemChoiceTypePosResponseVer10Transaction::$CreditAddToBatch;
|
22 |
+
break;
|
23 |
+
|
24 |
+
case HpsTransactionType::$CHARGE:
|
25 |
+
return HpsItemChoiceTypePosResponseVer10Transaction::$CreditSale;
|
26 |
+
break;
|
27 |
+
|
28 |
+
case HpsTransactionType::$REFUND:
|
29 |
+
return HpsItemChoiceTypePosResponseVer10Transaction::$CreditReturn;
|
30 |
+
break;
|
31 |
+
|
32 |
+
case HpsTransactionType::$REVERSE:
|
33 |
+
return HpsItemChoiceTypePosResponseVer10Transaction::$CreditReversal;
|
34 |
+
break;
|
35 |
+
|
36 |
+
case HpsTransactionType::$VERIFY:
|
37 |
+
return HpsItemChoiceTypePosResponseVer10Transaction::$CreditAccountVerify;
|
38 |
+
break;
|
39 |
+
|
40 |
+
case HpsTransactionType::$LIST:
|
41 |
+
return HpsItemChoiceTypePosResponseVer10Transaction::$ReportActivity;
|
42 |
+
break;
|
43 |
+
|
44 |
+
case HpsTransactionType::$GET:
|
45 |
+
return HpsItemChoiceTypePosResponseVer10Transaction::$ReportTxnDetail;
|
46 |
+
break;
|
47 |
+
|
48 |
+
case HpsTransactionType::$VOID:
|
49 |
+
return HpsItemChoiceTypePosResponseVer10Transaction::$CreditVoid;
|
50 |
+
break;
|
51 |
+
|
52 |
+
case HpsTransactionType::$BATCH_CLOSE:
|
53 |
+
return HpsItemChoiceTypePosResponseVer10Transaction::$BatchClose;
|
54 |
+
break;
|
55 |
+
|
56 |
+
case HpsTransactionType::$SECURITY_ERROR:
|
57 |
+
return "SecurityError";
|
58 |
+
break;
|
59 |
+
|
60 |
+
default:
|
61 |
+
return "";
|
62 |
+
}
|
63 |
+
}
|
64 |
+
|
65 |
+
static public function serviceNameToTransactionType($serviceName){
|
66 |
+
switch ($serviceName){
|
67 |
+
case HpsItemChoiceTypePosResponseVer10Transaction::$CreditAuth:
|
68 |
+
return HpsTransactionType::$CAPTURE;
|
69 |
+
break;
|
70 |
+
|
71 |
+
case HpsItemChoiceTypePosResponseVer10Transaction::$CreditAddToBatch:
|
72 |
+
return HpsTransactionType::$CAPTURE;
|
73 |
+
break;
|
74 |
+
|
75 |
+
case HpsItemChoiceTypePosResponseVer10Transaction::$CreditSale:
|
76 |
+
return HpsTransactionType::$CHARGE;
|
77 |
+
break;
|
78 |
+
|
79 |
+
case HpsItemChoiceTypePosResponseVer10Transaction::$CreditReturn:
|
80 |
+
return HpsTransactionType::$REFUND;
|
81 |
+
break;
|
82 |
+
|
83 |
+
case HpsItemChoiceTypePosResponseVer10Transaction::$CreditReversal:
|
84 |
+
return HpsTransactionType::$REVERSE;
|
85 |
+
break;
|
86 |
+
|
87 |
+
case HpsItemChoiceTypePosResponseVer10Transaction::$CreditAccountVerify:
|
88 |
+
return HpsTransactionType::$VERIFY;
|
89 |
+
break;
|
90 |
+
|
91 |
+
case HpsItemChoiceTypePosResponseVer10Transaction::$ReportActivity:
|
92 |
+
return HpsTransactionType::$LIST;
|
93 |
+
break;
|
94 |
+
|
95 |
+
case HpsItemChoiceTypePosResponseVer10Transaction::$ReportTxnDetail:
|
96 |
+
return HpsTransactionType::$GET;
|
97 |
+
break;
|
98 |
+
|
99 |
+
case HpsItemChoiceTypePosResponseVer10Transaction::$CreditVoid:
|
100 |
+
return HpsTransactionType::$VOID;
|
101 |
+
break;
|
102 |
+
|
103 |
+
case HpsItemChoiceTypePosResponseVer10Transaction::$BatchClose:
|
104 |
+
return HpsTransactionType::$BATCH_CLOSE;
|
105 |
+
break;
|
106 |
+
|
107 |
+
default:
|
108 |
+
return null;
|
109 |
+
}
|
110 |
+
}
|
111 |
+
}
|
lib/SecureSubmit/entities/HpsTransactionDetails.php
ADDED
@@ -0,0 +1,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
class HpsTransactionDetails {
|
4 |
+
public $memo = null,
|
5 |
+
$invoiceNumber = null,
|
6 |
+
$customerId = null,
|
7 |
+
$clientTransactionId = null;
|
8 |
+
}
|
lib/SecureSubmit/entities/HpsTransactionHeader.php
ADDED
@@ -0,0 +1,9 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
|
4 |
+
class HpsTransactionHeader {
|
5 |
+
public $gatewayResponseCode = null,
|
6 |
+
$gatewayResponseMessage = null,
|
7 |
+
$responseDt = null,
|
8 |
+
$clientTxnId = null;
|
9 |
+
}
|
lib/SecureSubmit/entities/HpsTransactionType.php
ADDED
@@ -0,0 +1,15 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
class HpsTransactionType {
|
4 |
+
static public $AUTHORIZE = 0;
|
5 |
+
static public $CAPTURE = 1;
|
6 |
+
static public $CHARGE = 2;
|
7 |
+
static public $REFUND = 3;
|
8 |
+
static public $REVERSE = 4;
|
9 |
+
static public $VERIFY = 5;
|
10 |
+
static public $LIST = 6;
|
11 |
+
static public $GET = 7;
|
12 |
+
static public $VOID = 8;
|
13 |
+
static public $SECURITY_ERROR = 9;
|
14 |
+
static public $BATCH_CLOSE = 10;
|
15 |
+
}
|
lib/SecureSubmit/entities/HpsVoid.php
ADDED
@@ -0,0 +1,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
class HpsVoid extends HpsTransaction{
|
4 |
+
public function __construct($header){
|
5 |
+
parent::__construct($header);
|
6 |
+
}
|
7 |
+
}
|
lib/SecureSubmit/infrastructure/AVSResponseCodeHandler.php
ADDED
@@ -0,0 +1,49 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
|
4 |
+
class AVSResponseCodeHandler {
|
5 |
+
private $avsResultCode;
|
6 |
+
private $config;
|
7 |
+
private $response;
|
8 |
+
private $transaction;
|
9 |
+
private $transactionId;
|
10 |
+
private $ver;
|
11 |
+
|
12 |
+
function __construct($response, $hpsChargeService=null, $config=null)
|
13 |
+
{
|
14 |
+
$this->config = $config;
|
15 |
+
if(count($this->config->avsResponseErrors) == 0){
|
16 |
+
return;
|
17 |
+
}
|
18 |
+
|
19 |
+
$this->transaction = $response->Transaction;
|
20 |
+
$this->transactionId = $response->Header->GatewayTxnId;
|
21 |
+
|
22 |
+
if(isset($this->transaction->CreditSale) && is_object($this->transaction->CreditSale)){
|
23 |
+
$this->avsResultCode = $this->transaction->CreditSale->AVSRsltCode;
|
24 |
+
$this->evaluate($hpsChargeService,'sale');
|
25 |
+
}else if(isset($this->transaction->CreditAuth) && is_object($this->transaction->CreditAuth)){
|
26 |
+
$this->avsResultCode = $this->transaction->CreditAuth->AVSRsltCode;
|
27 |
+
$this->evaluate($hpsChargeService,'auth');
|
28 |
+
}
|
29 |
+
}
|
30 |
+
|
31 |
+
function evaluate($hpsChargeService,$type){
|
32 |
+
$exceptionFound = false;
|
33 |
+
$code = "";
|
34 |
+
$message = "";
|
35 |
+
|
36 |
+
foreach ($this->config->avsResponseErrors as $c=>$m) {
|
37 |
+
if($this->avsResultCode == $c){
|
38 |
+
$code = $c;
|
39 |
+
$message = $m;
|
40 |
+
$exceptionFound = true;
|
41 |
+
}
|
42 |
+
}
|
43 |
+
|
44 |
+
if($exceptionFound){
|
45 |
+
$hpsChargeService->void($this->transactionId);
|
46 |
+
throw new HpsException($message,$code);
|
47 |
+
}
|
48 |
+
}
|
49 |
+
}
|
lib/SecureSubmit/infrastructure/ApiConnectionException.php
ADDED
@@ -0,0 +1,4 @@
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
class ApiConnectionException extends HpsException{
|
3 |
+
|
4 |
+
}
|
lib/SecureSubmit/infrastructure/AuthenticationException.php
ADDED
@@ -0,0 +1,9 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
class AuthenticationException extends HpsException{
|
4 |
+
|
5 |
+
public function __construct($message){
|
6 |
+
parent::__construct($message, null);
|
7 |
+
}
|
8 |
+
|
9 |
+
}
|
lib/SecureSubmit/infrastructure/CardException.php
ADDED
@@ -0,0 +1,13 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
class CardException extends HpsException{
|
4 |
+
public $TransactionId = null;
|
5 |
+
public $ResultText = null;
|
6 |
+
|
7 |
+
public function __construct($transactionId, $code, $message, $resultText = null) {
|
8 |
+
$this->TransactionId = $transactionId;
|
9 |
+
$this->ResultText = $resultText;
|
10 |
+
parent::__construct($message, $code);
|
11 |
+
}
|
12 |
+
|
13 |
+
}
|
lib/SecureSubmit/infrastructure/Exceptions.json
ADDED
@@ -0,0 +1,469 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"version": "1.0.0",
|
3 |
+
|
4 |
+
"exception_mappings":[
|
5 |
+
{
|
6 |
+
"object":"exception_mapping",
|
7 |
+
"category":"issuer",
|
8 |
+
"exception_codes":[
|
9 |
+
"02",
|
10 |
+
"03",
|
11 |
+
"04",
|
12 |
+
"05",
|
13 |
+
"41",
|
14 |
+
"43",
|
15 |
+
"44",
|
16 |
+
"51",
|
17 |
+
"56",
|
18 |
+
"61",
|
19 |
+
"62",
|
20 |
+
"63",
|
21 |
+
"65",
|
22 |
+
"78"
|
23 |
+
],
|
24 |
+
"mapping_type":"CardException",
|
25 |
+
"mapping_code":"card_declined",
|
26 |
+
"mapping_message":"Exception_Message_CardDeclined"
|
27 |
+
},
|
28 |
+
{
|
29 |
+
"object":"exception_mapping",
|
30 |
+
"category":"issuer",
|
31 |
+
"exception_codes":[
|
32 |
+
"06",
|
33 |
+
"07",
|
34 |
+
"12",
|
35 |
+
"15",
|
36 |
+
"19",
|
37 |
+
"12",
|
38 |
+
"52",
|
39 |
+
"53",
|
40 |
+
"57",
|
41 |
+
"58",
|
42 |
+
"76",
|
43 |
+
"77",
|
44 |
+
"91",
|
45 |
+
"96",
|
46 |
+
"EC"
|
47 |
+
],
|
48 |
+
"mapping_type":"CardException",
|
49 |
+
"mapping_code":"processing_error",
|
50 |
+
"mapping_message":"Exception_Message_ProcessingError"
|
51 |
+
},
|
52 |
+
{
|
53 |
+
"object":"exception_mapping",
|
54 |
+
"category":"issuer",
|
55 |
+
"exception_codes":[
|
56 |
+
"13"
|
57 |
+
],
|
58 |
+
"mapping_type":"CardException",
|
59 |
+
"mapping_code":"invalid_amount",
|
60 |
+
"mapping_message":"Exception_Message_ChargeAmount"
|
61 |
+
},
|
62 |
+
{
|
63 |
+
"object":"exception_mapping",
|
64 |
+
"category":"issuer",
|
65 |
+
"exception_codes":[
|
66 |
+
"14"
|
67 |
+
],
|
68 |
+
"mapping_type":"CardException",
|
69 |
+
"mapping_code":"incorrect_number",
|
70 |
+
"mapping_message":"Exception_Message_IncorrectNumber"
|
71 |
+
},
|
72 |
+
{
|
73 |
+
"object":"exception_mapping",
|
74 |
+
"category":"issuer",
|
75 |
+
"exception_codes":[
|
76 |
+
"54"
|
77 |
+
],
|
78 |
+
"mapping_type":"CardException",
|
79 |
+
"mapping_code":"expired_card",
|
80 |
+
"mapping_message":"Exception_Message_CardExpired"
|
81 |
+
},
|
82 |
+
{
|
83 |
+
"object":"exception_mapping",
|
84 |
+
"category":"issuer",
|
85 |
+
"exception_codes":[
|
86 |
+
"55"
|
87 |
+
],
|
88 |
+
"mapping_type":"CardException",
|
89 |
+
"mapping_code":"invalid_pin",
|
90 |
+
"mapping_message":"Exception_Message_InvalidPin"
|
91 |
+
},
|
92 |
+
{
|
93 |
+
"object":"exception_mapping",
|
94 |
+
"category":"issuer",
|
95 |
+
"exception_codes":[
|
96 |
+
"75"
|
97 |
+
],
|
98 |
+
"mapping_type":"CardException",
|
99 |
+
"mapping_code":"pin_retries_exceeded",
|
100 |
+
"mapping_message":"Exception_Message_PinExceeded"
|
101 |
+
},
|
102 |
+
{
|
103 |
+
"object":"exception_mapping",
|
104 |
+
"category":"issuer",
|
105 |
+
"exception_codes":[
|
106 |
+
"80"
|
107 |
+
],
|
108 |
+
"mapping_type":"CardException",
|
109 |
+
"mapping_code":"invalid_expiry",
|
110 |
+
"mapping_message":"Exception_Message_InvalidExpiry"
|
111 |
+
},
|
112 |
+
{
|
113 |
+
"object":"exception_mapping",
|
114 |
+
"category":"issuer",
|
115 |
+
"exception_codes":[
|
116 |
+
"80"
|
117 |
+
],
|
118 |
+
"mapping_type":"CardException",
|
119 |
+
"mapping_code":"invalid_expiry",
|
120 |
+
"mapping_message":"Exception_Message_InvalidExpiry"
|
121 |
+
},
|
122 |
+
{
|
123 |
+
"object":"exception_mapping",
|
124 |
+
"category":"issuer",
|
125 |
+
"exception_codes":[
|
126 |
+
"86"
|
127 |
+
],
|
128 |
+
"mapping_type":"CardException",
|
129 |
+
"mapping_code":"pin_verification",
|
130 |
+
"mapping_message":"Exception_Message_PinVerification"
|
131 |
+
},
|
132 |
+
{
|
133 |
+
"object":"exception_mapping",
|
134 |
+
"category":"issuer",
|
135 |
+
"exception_codes":[
|
136 |
+
"EB",
|
137 |
+
"N7"
|
138 |
+
],
|
139 |
+
"mapping_type":"CardException",
|
140 |
+
"mapping_code":"incorrect_cvc",
|
141 |
+
"mapping_message":"Exception_Message_IncorrectCvc"
|
142 |
+
},
|
143 |
+
{
|
144 |
+
"object":"exception_mapping",
|
145 |
+
"category":"gateway",
|
146 |
+
"exception_codes":[
|
147 |
+
"-2"
|
148 |
+
],
|
149 |
+
"mapping_type":"AuthenticationException",
|
150 |
+
"mapping_message":"Exception_Message_AuthenticationError"
|
151 |
+
},
|
152 |
+
{
|
153 |
+
"object":"exception_mapping",
|
154 |
+
"category":"gateway",
|
155 |
+
"exception_codes":[
|
156 |
+
"1"
|
157 |
+
],
|
158 |
+
"mapping_type":"HpsException"
|
159 |
+
},
|
160 |
+
{
|
161 |
+
"object":"exception_mapping",
|
162 |
+
"category":"gateway",
|
163 |
+
"exception_codes":[
|
164 |
+
"3"
|
165 |
+
],
|
166 |
+
"mapping_type":"HpsException",
|
167 |
+
"mapping_code":"invalid_original_transaction"
|
168 |
+
},
|
169 |
+
{
|
170 |
+
"object":"exception_mapping",
|
171 |
+
"category":"gateway",
|
172 |
+
"exception_codes":[
|
173 |
+
"5"
|
174 |
+
],
|
175 |
+
"mapping_type":"HpsException",
|
176 |
+
"mapping_code":"no_open_batch"
|
177 |
+
},
|
178 |
+
{
|
179 |
+
"object":"exception_mapping",
|
180 |
+
"category":"gateway",
|
181 |
+
"param":"card",
|
182 |
+
"exception_codes":[
|
183 |
+
"12"
|
184 |
+
],
|
185 |
+
"mapping_type":"InvalidRequestException",
|
186 |
+
"mapping_code":"invalid_cpc_data",
|
187 |
+
"mapping_message":"Exception_Message_InvalidCpcData"
|
188 |
+
},
|
189 |
+
{
|
190 |
+
"object":"exception_mapping",
|
191 |
+
"category":"gateway",
|
192 |
+
"param":"card",
|
193 |
+
"exception_codes":[
|
194 |
+
"13"
|
195 |
+
],
|
196 |
+
"mapping_type":"InvalidRequestException",
|
197 |
+
"mapping_code":"invalid_card_data",
|
198 |
+
"mapping_message":"Exception_Message_InvalidCardData"
|
199 |
+
},
|
200 |
+
{
|
201 |
+
"object":"exception_mapping",
|
202 |
+
"category":"gateway",
|
203 |
+
"exception_codes":[
|
204 |
+
"14"
|
205 |
+
],
|
206 |
+
"mapping_type":"CardException",
|
207 |
+
"mapping_code":"invalid_number",
|
208 |
+
"mapping_message":"Exception_Message_InvalidNumber"
|
209 |
+
},
|
210 |
+
{
|
211 |
+
"object":"exception_mapping",
|
212 |
+
"category":"gateway",
|
213 |
+
"exception_codes":[
|
214 |
+
"30"
|
215 |
+
],
|
216 |
+
"mapping_type":"HpsException",
|
217 |
+
"mapping_message":"Exception_Message_GatewayTimedOut"
|
218 |
+
},
|
219 |
+
{
|
220 |
+
"object":"exception_mapping",
|
221 |
+
"category":"sdk",
|
222 |
+
"param":"gatewayTransactionId",
|
223 |
+
"exception_codes":[
|
224 |
+
"0"
|
225 |
+
],
|
226 |
+
"mapping_type":"InvalidRequestException",
|
227 |
+
"mapping_code":"invalid_transaction_id",
|
228 |
+
"mapping_message":"Exception_Message_TransactionIdLessThanEqualZero"
|
229 |
+
},
|
230 |
+
{
|
231 |
+
"object":"exception_mapping",
|
232 |
+
"category":"sdk",
|
233 |
+
"param":"HpsServiceUri",
|
234 |
+
"exception_codes":[
|
235 |
+
"1"
|
236 |
+
],
|
237 |
+
"mapping_type":"InvalidRequestException",
|
238 |
+
"mapping_code":"sdk_exception",
|
239 |
+
"mapping_message":"Exception_Message_InvalidGatewayUrl"
|
240 |
+
},
|
241 |
+
{
|
242 |
+
"object":"exception_mapping",
|
243 |
+
"category":"sdk",
|
244 |
+
"exception_codes":[
|
245 |
+
"2"
|
246 |
+
],
|
247 |
+
"mapping_type":"ApiConnectionException",
|
248 |
+
"mapping_code":"sdk_exception",
|
249 |
+
"mapping_message":"Exception_Message_UnableToProcessTransaction"
|
250 |
+
},
|
251 |
+
{
|
252 |
+
"object":"exception_mapping",
|
253 |
+
"category":"sdk",
|
254 |
+
"param":"start",
|
255 |
+
"exception_codes":[
|
256 |
+
"3"
|
257 |
+
],
|
258 |
+
"mapping_type":"InvalidRequestException",
|
259 |
+
"mapping_code":"invalid_date",
|
260 |
+
"mapping_message":"Exception_Message_FutureDate"
|
261 |
+
},
|
262 |
+
{
|
263 |
+
"object":"exception_mapping",
|
264 |
+
"category":"sdk",
|
265 |
+
"param":"end",
|
266 |
+
"exception_codes":[
|
267 |
+
"4"
|
268 |
+
],
|
269 |
+
"mapping_type":"InvalidRequestException",
|
270 |
+
"mapping_code":"invalid_date",
|
271 |
+
"mapping_message":"Exception_Message_FutureDate"
|
272 |
+
},
|
273 |
+
{
|
274 |
+
"object":"exception_mapping",
|
275 |
+
"category":"sdk",
|
276 |
+
"param":"currency",
|
277 |
+
"exception_codes":[
|
278 |
+
"5"
|
279 |
+
],
|
280 |
+
"mapping_type":"InvalidRequestException",
|
281 |
+
"mapping_code":"missing_currency",
|
282 |
+
"mapping_message":"Exception_Message_ArgumentNull"
|
283 |
+
},
|
284 |
+
{
|
285 |
+
"object":"exception_mapping",
|
286 |
+
"category":"sdk",
|
287 |
+
"param":"currency",
|
288 |
+
"exception_codes":[
|
289 |
+
"6"
|
290 |
+
],
|
291 |
+
"mapping_type":"InvalidRequestException",
|
292 |
+
"mapping_code":"invalid_currency",
|
293 |
+
"mapping_message":"Exception_Message_InvalidCurrency"
|
294 |
+
},
|
295 |
+
{
|
296 |
+
"object":"exception_mapping",
|
297 |
+
"category":"sdk",
|
298 |
+
"param":"amount",
|
299 |
+
"exception_codes":[
|
300 |
+
"7"
|
301 |
+
],
|
302 |
+
"mapping_type":"InvalidRequestException",
|
303 |
+
"mapping_code":"invalid_amount",
|
304 |
+
"mapping_message":"Exception_Message_ChargeAmount"
|
305 |
+
},
|
306 |
+
{
|
307 |
+
"object":"exception_mapping",
|
308 |
+
"category":"sdk",
|
309 |
+
"exception_codes":[
|
310 |
+
"8"
|
311 |
+
],
|
312 |
+
"mapping_type":"HpsException",
|
313 |
+
"mapping_code":"gateway_timeout",
|
314 |
+
"mapping_message":"Exception_Message_UnableToReverseTransactionAfterGatewayTimeout"
|
315 |
+
},
|
316 |
+
{
|
317 |
+
"object":"exception_mapping",
|
318 |
+
"category":"sdk",
|
319 |
+
"exception_codes":[
|
320 |
+
"9"
|
321 |
+
],
|
322 |
+
"mapping_type":"HpsException",
|
323 |
+
"mapping_code":"issuer_timeout",
|
324 |
+
"mapping_message":"Exception_Message_UnableToReverseTransactionAfterIssuerTimeout"
|
325 |
+
},
|
326 |
+
{
|
327 |
+
"object":"exception_mapping",
|
328 |
+
"category":"sdk",
|
329 |
+
"exception_codes":[
|
330 |
+
"10"
|
331 |
+
],
|
332 |
+
"mapping_type":"CardException",
|
333 |
+
"mapping_code":"processing_error",
|
334 |
+
"mapping_message":"Exception_Message_ProcessingError"
|
335 |
+
}
|
336 |
+
],
|
337 |
+
"exception_messages":[
|
338 |
+
{
|
339 |
+
"object":"exception_message",
|
340 |
+
"code":"Exception_Message_ArgumentNull",
|
341 |
+
"message":"Argument can't be null."
|
342 |
+
},
|
343 |
+
{
|
344 |
+
"object":"exception_message",
|
345 |
+
"code":"Exception_Message_AuthenticationError",
|
346 |
+
"message":"Authentication error. Please double check your service configuration."
|
347 |
+
},
|
348 |
+
{
|
349 |
+
"object":"exception_message",
|
350 |
+
"code":"Exception_Message_CardDeclined",
|
351 |
+
"message":"The card was declined."
|
352 |
+
},
|
353 |
+
{
|
354 |
+
"object":"exception_message",
|
355 |
+
"code":"Exception_Message_CardExpired",
|
356 |
+
"message":"The card has expired."
|
357 |
+
},
|
358 |
+
{
|
359 |
+
"object":"exception_message",
|
360 |
+
"code":"Exception_Message_ChargeAmount",
|
361 |
+
"message":"Must be greater than or equal 0."
|
362 |
+
},
|
363 |
+
{
|
364 |
+
"object":"exception_message",
|
365 |
+
"code":"Exception_Message_FutureDate",
|
366 |
+
"message":"Date can not be in the future."
|
367 |
+
},
|
368 |
+
{
|
369 |
+
"object":"exception_message",
|
370 |
+
"code":"Exception_Message_IncorrectCvc",
|
371 |
+
"message":"The card's security code is incorrect."
|
372 |
+
},
|
373 |
+
{
|
374 |
+
"object":"exception_message",
|
375 |
+
"code":"Exception_Message_IncorrectNumber",
|
376 |
+
"message":"The card number is incorrect."
|
377 |
+
},
|
378 |
+
{
|
379 |
+
"object":"exception_message",
|
380 |
+
"code":"Exception_Message_InvalidConfig",
|
381 |
+
"message":"The HPS SDK has not been properly configured. Please make sure to initialize the config either in a service constructor or in your App.config or Web.config file."
|
382 |
+
},
|
383 |
+
{
|
384 |
+
"object":"exception_message",
|
385 |
+
"code":"Exception_Message_InvalidCurrency",
|
386 |
+
"message":"The only supported currency is \"usd\""
|
387 |
+
},
|
388 |
+
{
|
389 |
+
"object":"exception_message",
|
390 |
+
"code":"Exception_Message_InvalidExpiry",
|
391 |
+
"message":"Card expiration date is invalid."
|
392 |
+
},
|
393 |
+
{
|
394 |
+
"object":"exception_message",
|
395 |
+
"code":"Exception_Message_InvalidNumber",
|
396 |
+
"message":"The card number is not a valid credit card number."
|
397 |
+
},
|
398 |
+
{
|
399 |
+
"object":"exception_message",
|
400 |
+
"code":"Exception_Message_InvalidPin",
|
401 |
+
"message":"The 4-digit pin is invalid."
|
402 |
+
},
|
403 |
+
{
|
404 |
+
"object":"exception_message",
|
405 |
+
"code":"Exception_Message_PinExceeded",
|
406 |
+
"message":"Maximum number of pin retries exceeded."
|
407 |
+
},
|
408 |
+
{
|
409 |
+
"object":"exception_message",
|
410 |
+
"code":"Exception_Message_PinVerification",
|
411 |
+
"message":"Can't verify card pin number."
|
412 |
+
},
|
413 |
+
{
|
414 |
+
"object":"exception_message",
|
415 |
+
"code":"Exception_Message_ProcessingError",
|
416 |
+
"message":"An error occurred while processing the card."
|
417 |
+
},
|
418 |
+
{
|
419 |
+
"object":"exception_message",
|
420 |
+
"code":"Exception_Message_TransactionIdLessThanEqualZero",
|
421 |
+
"message":"Transaction ID must be greater than zero."
|
422 |
+
},
|
423 |
+
{
|
424 |
+
"object":"exception_message",
|
425 |
+
"code":"Exception_Message_UnexpectedResponseCode",
|
426 |
+
"message":"Unsuccessful response code ({0}) received from HPS Gateway."
|
427 |
+
},
|
428 |
+
{
|
429 |
+
"object":"exception_message",
|
430 |
+
"code":"Exception_Message_UnexpectedResponseType",
|
431 |
+
"message":"Received unexpected response from POS Gateway. (Request and response transaction types don't match)."
|
432 |
+
},
|
433 |
+
{
|
434 |
+
"object":"exception_message",
|
435 |
+
"code":"Exception_Message_InvalidCpcData",
|
436 |
+
"message":"Invalid CPC data."
|
437 |
+
},
|
438 |
+
{
|
439 |
+
"object":"exception_message",
|
440 |
+
"code":"Exception_Message_InvalidCardData",
|
441 |
+
"message":"Invalid card data."
|
442 |
+
},
|
443 |
+
{
|
444 |
+
"object":"exception_message",
|
445 |
+
"code":"Exception_Message_GatewayTimedOut",
|
446 |
+
"message":"Gateway timed out."
|
447 |
+
},
|
448 |
+
{
|
449 |
+
"object":"exception_message",
|
450 |
+
"code":"Exception_Message_InvalidGatewayUrl",
|
451 |
+
"message":"Invalid HpsServiceUri."
|
452 |
+
},
|
453 |
+
{
|
454 |
+
"object":"exception_message",
|
455 |
+
"code":"Exception_Message_UnableToProcessTransaction",
|
456 |
+
"message":"Unable to process the payment transaction."
|
457 |
+
},
|
458 |
+
{
|
459 |
+
"object":"exception_message",
|
460 |
+
"code":"Exception_Message_UnableToReverseTransactionAfterGatewayTimeout",
|
461 |
+
"message":"Error occurred while reversing a charge due to HPS gateway time-out."
|
462 |
+
},
|
463 |
+
{
|
464 |
+
"object":"exception_message",
|
465 |
+
"code":"Exception_Message_UnableToReverseTransactionAfterIssuerTimeout",
|
466 |
+
"message":"Error occurred while reversing a charge due to issuer time-out."
|
467 |
+
}
|
468 |
+
]
|
469 |
+
}
|
lib/SecureSubmit/infrastructure/HpsConfiguration.php
ADDED
@@ -0,0 +1,17 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
class HpsConfiguration {
|
4 |
+
public $secretApiKey = null,
|
5 |
+
$licenseId = null,
|
6 |
+
$siteId = null,
|
7 |
+
$deviceId = null,
|
8 |
+
$versionNumber = null,
|
9 |
+
$userName = null,
|
10 |
+
$password = null,
|
11 |
+
$developerId = null,
|
12 |
+
$siteTrace = null,
|
13 |
+
$useProxy = null,
|
14 |
+
$proxyOptions = null,
|
15 |
+
$avsResponseErrors = null,
|
16 |
+
$serviceUri = "https://posgateway.cert.secureexchange.net/Hps.Exchange.PosGateway/PosGatewayService.asmx";
|
17 |
+
}
|
lib/SecureSubmit/infrastructure/HpsException.php
ADDED
@@ -0,0 +1,21 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
class HpsException extends Exception{
|
3 |
+
public $code = null,
|
4 |
+
$innerException = null,
|
5 |
+
$responseCode = null,
|
6 |
+
$responseText = null;
|
7 |
+
|
8 |
+
public function __construct($message, $code, $innerException = null){
|
9 |
+
$this->code = $code;
|
10 |
+
$this->innerException = $innerException;
|
11 |
+
parent::__construct($message, 0, $innerException);
|
12 |
+
}
|
13 |
+
|
14 |
+
public function code(){
|
15 |
+
if($this->code == null){
|
16 |
+
return "unknown";
|
17 |
+
}else{
|
18 |
+
return $this->code;
|
19 |
+
}
|
20 |
+
}
|
21 |
+
}
|
lib/SecureSubmit/infrastructure/HpsExceptionMapper.php
ADDED
@@ -0,0 +1,109 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
class HpsExceptionMapper{
|
4 |
+
public $exceptions = null;
|
5 |
+
|
6 |
+
public function __construct(){
|
7 |
+
$path = realpath(dirname(__FILE__));
|
8 |
+
$fileName = $path .'/Exceptions.json';
|
9 |
+
$fh = fopen($fileName,'r');
|
10 |
+
$jsonString = fread($fh, filesize($fileName));
|
11 |
+
$this->exceptions = json_decode($jsonString);
|
12 |
+
}
|
13 |
+
|
14 |
+
public function version_number(){
|
15 |
+
return $this->exceptions->version;
|
16 |
+
}
|
17 |
+
|
18 |
+
public function map_issuer_exception($transaction_id, $response_code, $response_text, $result_text = null){
|
19 |
+
$mapping = $this->exception_for_category_and_code('issuer', $response_code);
|
20 |
+
|
21 |
+
if(isset($mapping)){
|
22 |
+
$message = $this->message_for_mapping($mapping, $response_text);
|
23 |
+
$code = $mapping->mapping_code;
|
24 |
+
return new CardException($transaction_id, $code, $message, $result_text);
|
25 |
+
}else{
|
26 |
+
return new CardException($transaction_id, 'unknown_card_exception', $response_text, $result_text);
|
27 |
+
}
|
28 |
+
}
|
29 |
+
|
30 |
+
public function map_gateway_exception($transaction_id, $response_code, $response_text){
|
31 |
+
$mapping = $this->exception_for_category_and_code('gateway',$response_code);
|
32 |
+
|
33 |
+
if(isset($mapping)){
|
34 |
+
$message = $this->message_for_mapping($mapping, $response_text);
|
35 |
+
$code = $mapping->exception_codes[0];
|
36 |
+
$exception_type = $mapping->mapping_type;
|
37 |
+
|
38 |
+
if($exception_type == 'AuthenticationException'){
|
39 |
+
return new AuthenticationException($message);
|
40 |
+
}else if($exception_type == "CardException"){
|
41 |
+
return new CardException($transaction_id, $code, $message);
|
42 |
+
}else if($exception_type == "InvalidRequestException"){
|
43 |
+
return new InvalidRequestException($message, $mapping->param, $code);
|
44 |
+
}else if(isset($code)){
|
45 |
+
return new HpsException($response_text,$code);
|
46 |
+
}
|
47 |
+
|
48 |
+
}
|
49 |
+
return new HpsException($response_text,"unknown");
|
50 |
+
}
|
51 |
+
|
52 |
+
public function map_sdk_exception($error_code, $inner_exception = null){
|
53 |
+
$mapping = $this->exception_for_category_and_code('sdk', $error_code);
|
54 |
+
$sdk_codes = get_class_vars('HpsSdkCodes');
|
55 |
+
foreach($sdk_codes as $code_name=>$code_value){
|
56 |
+
if($code_value == $error_code){
|
57 |
+
$sdk_code_name = $code_name;
|
58 |
+
break;
|
59 |
+
}
|
60 |
+
}
|
61 |
+
|
62 |
+
if(isset($sdk_code_name)){
|
63 |
+
$response_text = $sdk_code_name;
|
64 |
+
}else{
|
65 |
+
$response_text = 'unknown';
|
66 |
+
}
|
67 |
+
|
68 |
+
if(isset($mapping)){
|
69 |
+
$message = $this->message_for_mapping($mapping, $response_text);
|
70 |
+
$code = $mapping->mapping_code;
|
71 |
+
$exception_type = $mapping->mapping_type;
|
72 |
+
|
73 |
+
if($exception_type == "InvalidRequestException"){
|
74 |
+
return new InvalidRequestException($message, $mapping->param, $code, $inner_exception);
|
75 |
+
}else if($exception_type == "ApiConnectionException"){
|
76 |
+
return new ApiConnectionException($message, $code, $inner_exception);
|
77 |
+
}else if(isset($code)){
|
78 |
+
return new HpsException($message, $code, $inner_exception);
|
79 |
+
}
|
80 |
+
}
|
81 |
+
|
82 |
+
return new HpsException('unknown', 'unknown', $inner_exception);
|
83 |
+
}
|
84 |
+
|
85 |
+
private function exception_for_category_and_code($category, $code){
|
86 |
+
foreach($this->exceptions->exception_mappings as $key=>$mapping){
|
87 |
+
if($mapping->category == $category && in_array($code,$mapping->exception_codes)){
|
88 |
+
return $mapping;
|
89 |
+
}
|
90 |
+
}
|
91 |
+
}
|
92 |
+
|
93 |
+
private function message_for_mapping($mapping, $original_message){
|
94 |
+
if(isset($mapping) && $mapping != null && $mapping != ""){
|
95 |
+
if(isset($mapping->mapping_message)){
|
96 |
+
$message = $mapping->mapping_message;
|
97 |
+
if(isset($message)){
|
98 |
+
foreach($this->exceptions->exception_messages as $key=>$exception_mapping){
|
99 |
+
if($exception_mapping->code == $message){
|
100 |
+
return $exception_mapping->message;
|
101 |
+
}
|
102 |
+
}
|
103 |
+
}
|
104 |
+
}
|
105 |
+
}
|
106 |
+
return $original_message;
|
107 |
+
}
|
108 |
+
|
109 |
+
}
|
lib/SecureSubmit/infrastructure/HpsSdkCodes.php
ADDED
@@ -0,0 +1,14 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
class HpsSdkCodes {
|
3 |
+
public static $invalidTransactionId = "0",
|
4 |
+
$invalidGatewayUrl = "1",
|
5 |
+
$unableToProcessTransaction = "2",
|
6 |
+
$invalidStartDate = "3",
|
7 |
+
$invalidEndDate = "4",
|
8 |
+
$missingCurrency = "5",
|
9 |
+
$invalidCurrency = "6",
|
10 |
+
$invalidAmount = "7",
|
11 |
+
$reversalErrorAfterGatewayTimeout = "8",
|
12 |
+
$reversalErrorAfterIssuerTimeout = "9",
|
13 |
+
$processingError = "10";
|
14 |
+
}
|
lib/SecureSubmit/infrastructure/InvalidRequestException.php
ADDED
@@ -0,0 +1,10 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
class InvalidRequestException extends HpsException{
|
3 |
+
public $param = null;
|
4 |
+
|
5 |
+
public function __construct($message, $param = null, $code = null, $innerException = null){
|
6 |
+
$this->param = $param;
|
7 |
+
parent::__construct($message, $code, $innerException);
|
8 |
+
}
|
9 |
+
|
10 |
+
}
|
lib/SecureSubmit/services/HpsBatchService.php
ADDED
@@ -0,0 +1,26 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
class HpsBatchService extends HpsService{
|
4 |
+
public function closeBatch(){
|
5 |
+
$xml = new DOMDocument();
|
6 |
+
$hpsTransaction = $xml->createElement('hps:Transaction');
|
7 |
+
$hpsBatchClose = $xml->createElement('hps:BatchClose');
|
8 |
+
$hpsTransaction->appendChild($hpsBatchClose);
|
9 |
+
|
10 |
+
$response = $this->doTransaction($hpsTransaction);
|
11 |
+
$header = $response->Header;
|
12 |
+
|
13 |
+
if($header->GatewayRspCode != "0"){
|
14 |
+
throw $this->exceptionMapper->map_gateway_exception($header->GatewayTxnId,$header->GatewayRspCode,$header->GatewayRspMsg);
|
15 |
+
}
|
16 |
+
|
17 |
+
$batchClose = $response->Transaction->BatchClose;
|
18 |
+
$result = new HpsBatch();
|
19 |
+
$result->id = (isset($batchClose->BatchId) ? $batchClose->BatchId : null);
|
20 |
+
$result->sequenceNumber = (isset($batchClose->BatchSeqNbr) ? $batchClose->BatchSeqNbr : null);
|
21 |
+
$result->totalAmount = (isset($batchClose->TotalAmt) ? $batchClose->TotalAmt : null);
|
22 |
+
$result->transactionCount = (isset($batchClose->TxnCnt) ? $batchClose->TxnCnt : null);
|
23 |
+
|
24 |
+
return $result;
|
25 |
+
}
|
26 |
+
}
|
lib/SecureSubmit/services/HpsChargeService.php
ADDED
@@ -0,0 +1,602 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
class HpsChargeService extends HpsService{
|
4 |
+
|
5 |
+
public function authorize($amount, $currency, $cardOrToken, $cardHolder=null, $requestMultiUseToken=false, $details=null){
|
6 |
+
$this->_checkAmount($amount);
|
7 |
+
$this->_checkCurrency($currency);
|
8 |
+
$amount = sprintf("%0.2f",round($amount,3));
|
9 |
+
|
10 |
+
$xml = new DOMDocument();
|
11 |
+
$hpsTransaction = $xml->createElement('hps:Transaction');
|
12 |
+
$hpsCreditAuth = $xml->createElement('hps:CreditAuth');
|
13 |
+
$hpsBlock1 = $xml->createElement('hps:Block1');
|
14 |
+
$hpsBlock1->appendChild($xml->createElement('hps:AllowDup','Y'));
|
15 |
+
$hpsBlock1->appendChild($xml->createElement('hps:Amt',$amount));
|
16 |
+
if($cardHolder != null){
|
17 |
+
$hpsBlock1->appendChild($this->_hydrateCardHolderData($cardHolder,$xml));
|
18 |
+
}
|
19 |
+
|
20 |
+
if($details != null){
|
21 |
+
$hpsBlock1->appendChild($this->_hydrateAdditionalTxnFields($details,$xml));
|
22 |
+
}
|
23 |
+
$cardData = $xml->createElement('hps:CardData');
|
24 |
+
if($cardOrToken instanceOf HpsCreditCard){
|
25 |
+
$cardData->appendChild($this->_hydrateManualEntry($cardOrToken,$xml));
|
26 |
+
}else{
|
27 |
+
$tokenData = $xml->createElement('hps:TokenData');
|
28 |
+
$tokenData->appendChild($xml->createElement('hps:TokenValue',$cardOrToken->tokenValue));
|
29 |
+
$cardData->appendChild($tokenData);
|
30 |
+
}
|
31 |
+
$cardData->appendChild($xml->createElement('hps:TokenRequest',($requestMultiUseToken) ? 'Y' : 'N'));
|
32 |
+
$hpsBlock1->appendChild($cardData);
|
33 |
+
$hpsCreditAuth->appendChild($hpsBlock1);
|
34 |
+
$hpsTransaction->appendChild($hpsCreditAuth);
|
35 |
+
return $this->_submitAuthorize($hpsTransaction, $amount, $currency);
|
36 |
+
}
|
37 |
+
|
38 |
+
public function capture($transactionId, $amount=null, $gratuity=null){
|
39 |
+
$xml = new DOMDocument();
|
40 |
+
$hpsTransaction = $xml->createElement('hps:Transaction');
|
41 |
+
$hpsCreditAddToBatch = $xml->createElement('hps:CreditAddToBatch');
|
42 |
+
$hpsCreditAddToBatch->appendChild($xml->createElement('hps:GatewayTxnId',$transactionId));
|
43 |
+
if($amount != null){
|
44 |
+
$amount = sprintf("%0.2f",round($amount,3));
|
45 |
+
$hpsCreditAddToBatch->appendChild($xml->createElement('hps:Amt',$amount));
|
46 |
+
}
|
47 |
+
if($gratuity != null){
|
48 |
+
$hpsCreditAddToBatch->appendChild($xml->createElement('hps:GratuityAmtInfo',$gratuity));
|
49 |
+
}
|
50 |
+
$hpsTransaction->appendChild($hpsCreditAddToBatch);
|
51 |
+
$response = $this->doTransaction($hpsTransaction);
|
52 |
+
$header = $response->Header;
|
53 |
+
|
54 |
+
if($header->GatewayRspCode != 0){
|
55 |
+
throw $this->exceptionMapper->map_gateway_exception($transactionId,$header->GatewayRspCode,$header->GatewayRspMsg);
|
56 |
+
}
|
57 |
+
|
58 |
+
return $this->get($transactionId);
|
59 |
+
}
|
60 |
+
|
61 |
+
public function charge($amount, $currency, $cardOrToken, $cardHolder=null, $requestMultiUseToken=false, $details=null){
|
62 |
+
$this->_checkAmount($amount);
|
63 |
+
$this->_checkCurrency($currency);
|
64 |
+
$amount = sprintf("%0.2f",round($amount,3));
|
65 |
+
|
66 |
+
$xml = new DOMDocument();
|
67 |
+
$hpsTransaction = $xml->createElement('hps:Transaction');
|
68 |
+
$hpsCreditSale = $xml->createElement('hps:CreditSale');
|
69 |
+
$hpsBlock1 = $xml->createElement('hps:Block1');
|
70 |
+
$hpsBlock1->appendChild($xml->createElement('hps:AllowDup','Y'));
|
71 |
+
$hpsBlock1->appendChild($xml->createElement('hps:Amt',$amount));
|
72 |
+
if($cardHolder != null){
|
73 |
+
$hpsBlock1->appendChild($this->_hydrateCardHolderData($cardHolder,$xml));
|
74 |
+
}
|
75 |
+
|
76 |
+
if($details != null){
|
77 |
+
$hpsBlock1->appendChild($this->_hydrateAdditionalTxnFields($details,$xml));
|
78 |
+
}
|
79 |
+
$cardData = $xml->createElement('hps:CardData');
|
80 |
+
if($cardOrToken instanceOf HpsCreditCard){
|
81 |
+
$cardData->appendChild($this->_hydrateManualEntry($cardOrToken,$xml));
|
82 |
+
}else{
|
83 |
+
$tokenData = $xml->createElement('hps:TokenData');
|
84 |
+
$tokenData->appendChild($xml->createElement('hps:TokenValue',$cardOrToken->tokenValue));
|
85 |
+
$cardData->appendChild($tokenData);
|
86 |
+
}
|
87 |
+
$cardData->appendChild($xml->createElement('hps:TokenRequest',($requestMultiUseToken) ? 'Y' : 'N'));
|
88 |
+
$hpsBlock1->appendChild($cardData);
|
89 |
+
$hpsCreditSale->appendChild($hpsBlock1);
|
90 |
+
$hpsTransaction->appendChild($hpsCreditSale);
|
91 |
+
|
92 |
+
return $this->_submitCharge($hpsTransaction,$amount,$currency);
|
93 |
+
}
|
94 |
+
|
95 |
+
public function get($transactionId){
|
96 |
+
if($transactionId <= 0){
|
97 |
+
throw $this->exceptionMapper->map_sdk_exception(HpsSdkCodes::$invalidTransactionId);
|
98 |
+
}
|
99 |
+
|
100 |
+
$xml = new DOMDocument();
|
101 |
+
$hpsTransaction = $xml->createElement('hps:Transaction');
|
102 |
+
$hpsReportTxnDetail = $xml->createElement('hps:ReportTxnDetail');
|
103 |
+
$hpsReportTxnDetail->appendChild($xml->createElement('hps:TxnId',$transactionId));
|
104 |
+
$hpsTransaction->appendChild($hpsReportTxnDetail);
|
105 |
+
|
106 |
+
$response = $this->doTransaction($hpsTransaction);
|
107 |
+
$detail = $response->Transaction->ReportTxnDetail;
|
108 |
+
|
109 |
+
$header = $this->hydrateTransactionHeader($response->Header);
|
110 |
+
$result = new HpsReportTransactionDetails($header);
|
111 |
+
$result->transactionId = $detail->GatewayTxnId;
|
112 |
+
$result->originalTransactionId = (isset($detail->OriginalGatewayTxnId) ? $detail->OriginalGatewayTxnId : null);
|
113 |
+
$result->authorizedAmount = (isset($detail->Data->AuthAmt) ? $detail->Data->AuthAmt : null);
|
114 |
+
$result->authorizationCode = (isset($detail->Data->AuthCode) ? $detail->Data->AuthCode : null);
|
115 |
+
$result->avsResultCode = (isset($detail->Data->AVSRsltCode) ? $detail->Data->AVSRsltCode : null);
|
116 |
+
$result->avsResultText = (isset($detail->Data->AVSRsltText) ? $detail->Data->AVSRsltText : null);
|
117 |
+
$result->cardType = (isset($detail->Data->CardType) ? $detail->Data->CardType : null);
|
118 |
+
$result->maskedCardNumber = (isset($detail->Data->MaskedCardNbr) ? $detail->Data->MaskedCardNbr : null);
|
119 |
+
$result->transactionType = (isset($detail->ServiceName) ? HpsTransaction::serviceNameToTransactionType($detail->ServiceName) : null);
|
120 |
+
$result->transactionDate = (isset($detail->RspUtcDT) ? $detail->RspUtcDT : null);
|
121 |
+
$result->cpcIndicator = (isset($detail->Data->CPCInd) ? $detail->Data->CPCInd : null);
|
122 |
+
$result->cvvResultCode = (isset($detail->Data->CVVRsltCode) ? $detail->Data->CVVRsltCode : null);
|
123 |
+
$result->cvvResultText = (isset($detail->Data->CVVRsltText) ? $detail->Data->CVVRsltText : null);
|
124 |
+
$result->referenceNumber = (isset($detail->Data->RefNbr) ? $detail->Data->RefNbr : null);
|
125 |
+
$result->responseCode = (isset($detail->Data->RspCode) ? $detail->Data->RspCode : null);
|
126 |
+
$result->responseText = (isset($detail->Data->RspText) ? $detail->Data->RspText : null);
|
127 |
+
|
128 |
+
$tokenizationMessage = (isset($detail->Data->TokenizationMsg) ? $detail->Data->TokenizationMsg : null);
|
129 |
+
if($tokenizationMessage != null){
|
130 |
+
$result->tokenData = new HpsTokenData($tokenizationMessage);
|
131 |
+
}
|
132 |
+
|
133 |
+
$headerResponseCode = (isset($response->Header->GatewayRspCode) ? $response->Header->GatewayRspCode : null);
|
134 |
+
$dataResponseCode = (isset($detail->Data->RspCode) ? $detail->Data->RspCode : null);
|
135 |
+
|
136 |
+
if($headerResponseCode != "0" || $dataResponseCode != "00"){
|
137 |
+
$exceptions = new HpsChargeExceptions();
|
138 |
+
|
139 |
+
if($headerResponseCode != "0"){
|
140 |
+
$message = $response->Header->GatewayRspMsg;
|
141 |
+
$exceptions->hpsException = $this->exceptionMapper->map_gateway_exception($result->transactionId,$headerResponseCode,$message);
|
142 |
+
}
|
143 |
+
if($dataResponseCode != "00"){
|
144 |
+
$message = $detail->Data->RspText;
|
145 |
+
$exceptions->cardException = $this->exceptionMapper->map_issuer_exception($transactionId,$dataResponseCode,$message);
|
146 |
+
}
|
147 |
+
$result->exceptions = $exceptions;
|
148 |
+
}
|
149 |
+
return $result;
|
150 |
+
}
|
151 |
+
|
152 |
+
public function listTransactions($startDate, $endDate, $filterBy=null){
|
153 |
+
date_default_timezone_set("UTC");
|
154 |
+
$dateFormat = 'Y-m-d\TH:i:s.00\Z';
|
155 |
+
$current = new DateTime();
|
156 |
+
$currentTime = $current->format($dateFormat);
|
157 |
+
|
158 |
+
if($startDate > $currentTime){
|
159 |
+
throw $this->exceptionMapper->map_sdk_exception(HpsSdkCodes::$invalidStartDate);
|
160 |
+
}
|
161 |
+
else if($endDate > $currentTime){
|
162 |
+
throw $this->exceptionMapper->map_sdk_exception(HpsSdkCodes::$invalidEndDate);
|
163 |
+
}
|
164 |
+
|
165 |
+
$xml = new DOMDocument();
|
166 |
+
$hpsTransaction = $xml->createElement('hps:Transaction');
|
167 |
+
$hpsReportActivity = $xml->createElement('hps:ReportActivity');
|
168 |
+
$hpsReportActivity->appendChild($xml->createElement('hps:RptStartUtcDT',$startDate));
|
169 |
+
$hpsReportActivity->appendChild($xml->createElement('hps:RptEndUtcDT',$endDate));
|
170 |
+
$hpsTransaction->appendChild($hpsReportActivity);
|
171 |
+
|
172 |
+
$response = $this->doTransaction($hpsTransaction);
|
173 |
+
|
174 |
+
// Gateway Exception
|
175 |
+
if($response->Header->GatewayRspCode !=0){
|
176 |
+
$transactionId = $response->Header->GatewayTxnId;
|
177 |
+
$responseCode = $response->Header->GatewayRspCode;
|
178 |
+
$responseMessage = $response->Header->GatewayRspMessage;
|
179 |
+
throw $this->exceptionMapper->map_gateway_exception($transactionId,$responseCode,$responseMessage);
|
180 |
+
}
|
181 |
+
$result = array();
|
182 |
+
if($response->Transaction->ReportActivity->Header->TxnCnt == "0"){
|
183 |
+
return $result;
|
184 |
+
}
|
185 |
+
|
186 |
+
foreach ($response->Transaction->ReportActivity->Details as $charge) {
|
187 |
+
if($filterBy != null && $charge->ServiceName != HpsTransaction::transactionTypeToServiceName($filterBy)){
|
188 |
+
continue;
|
189 |
+
}else{
|
190 |
+
$summary = new HpsReportTransactionSummary();
|
191 |
+
$summary->transactionId = (isset($charge->GatewayTxnId) ? $charge->GatewayTxnId : null);
|
192 |
+
$summary->originalTransactionId = (isset($charge->OriginalGatewayTxnId) ? $charge->OriginalGatewayTxnId : null);
|
193 |
+
$summary->maskedCardNumber = (isset($charge->MaskedCardNbr) ? $charge->MaskedCardNbr : null);
|
194 |
+
$summary->responseCode = (isset($charge->IssuerRspCode) ? $charge->IssuerRspCode : null);
|
195 |
+
$summary->responseText = (isset($charge->IssuerRspText) ? $charge->IssuerRspText : null);
|
196 |
+
|
197 |
+
if($filterBy != null ){
|
198 |
+
$summary->transactionType = (isset($charge->ServiceName) ? HpsTransaction::transactionTypeToServiceName($charge->ServiceName) : null);
|
199 |
+
}
|
200 |
+
|
201 |
+
$gwResponseCode = (isset($charge->GatewayRspCode) ? $charge->GatewayRspCode : null);
|
202 |
+
$issuerResponseCode = (isset($charge->IssuerRspCode) ? $charge->IssuerRspCode : null);
|
203 |
+
|
204 |
+
if($gwResponseCode != "0" || $issuerResponseCode != "00"){
|
205 |
+
$exceptions = new HpsChargeExceptions();
|
206 |
+
if($gwResponseCode != "0"){
|
207 |
+
$message = $charge->GatewayRspMsg;
|
208 |
+
$exceptions->hpsException = $this->exceptionMapper->map_gateway_exception($charge->GatewayTxnId, $gwResponseCode, $message);
|
209 |
+
}
|
210 |
+
if($issuerResponseCode != "00"){
|
211 |
+
$message = $charge->IssuerRspText;
|
212 |
+
$exceptions->cardException = $this->exceptionMapper->map_issuer_exception($charge->GatewayTxnId, $issuerResponseCode, $message);
|
213 |
+
}
|
214 |
+
$summary->exceptions = $exceptions;
|
215 |
+
}
|
216 |
+
}
|
217 |
+
$result = $summary;
|
218 |
+
}
|
219 |
+
return $result;
|
220 |
+
}
|
221 |
+
|
222 |
+
public function refund($amount, $currency, $cardOrToken, $cardHolder=null, $details=null){
|
223 |
+
$this->_checkAmount($amount);
|
224 |
+
$this->_checkCurrency($currency);
|
225 |
+
$amount = sprintf("%0.2f",round($amount,3));
|
226 |
+
|
227 |
+
$xml = new DOMDocument();
|
228 |
+
$hpsTransaction = $xml->createElement('hps:Transaction');
|
229 |
+
$hpsCreditReturn = $xml->createElement('hps:CreditReturn');
|
230 |
+
$hpsBlock1 = $xml->createElement('hps:Block1');
|
231 |
+
$hpsBlock1->appendChild($xml->createElement('hps:AllowDup','Y'));
|
232 |
+
$hpsBlock1->appendChild($xml->createElement('hps:Amt',$amount));
|
233 |
+
if($cardHolder != null){
|
234 |
+
$hpsBlock1->appendChild($this->_hydrateCardHolderData($cardHolder,$xml));
|
235 |
+
}
|
236 |
+
if($details != null){
|
237 |
+
$hpsBlock1->appendChild($this->_hydrateAdditionalTxnFields($details,$xml));
|
238 |
+
}
|
239 |
+
$cardData = $xml->createElement('hps:CardData');
|
240 |
+
if($cardOrToken instanceOf HpsCreditCard){
|
241 |
+
$cardData->appendChild($this->_hydrateManualEntry($cardOrToken,$xml));
|
242 |
+
}else{
|
243 |
+
$tokenData = $xml->createElement('hps:TokenData');
|
244 |
+
$tokenData->appendChild($xml->createElement('hps:TokenValue',$cardOrToken->tokenValue));
|
245 |
+
$cardData->appendChild($tokenData);
|
246 |
+
}
|
247 |
+
$hpsBlock1->appendChild($cardData);
|
248 |
+
$hpsCreditReturn->appendChild($hpsBlock1);
|
249 |
+
$hpsTransaction->appendChild($hpsCreditReturn);
|
250 |
+
return $this->_submitRefund($hpsTransaction);
|
251 |
+
}
|
252 |
+
|
253 |
+
public function refundTransaction($amount,$currency,$transactionId, $cardHolder=null, $details=null){
|
254 |
+
$this->_checkAmount($amount);
|
255 |
+
$this->_checkCurrency($currency);
|
256 |
+
$amount = sprintf("%0.2f",round($amount,3));
|
257 |
+
|
258 |
+
$xml = new DOMDocument();
|
259 |
+
$hpsTransaction = $xml->createElement('hps:Transaction');
|
260 |
+
$hpsCreditReturn = $xml->createElement('hps:CreditReturn');
|
261 |
+
$hpsBlock1 = $xml->createElement('hps:Block1');
|
262 |
+
$hpsBlock1->appendChild($xml->createElement('hps:AllowDup','Y'));
|
263 |
+
$hpsBlock1->appendChild($xml->createElement('hps:Amt',$amount));
|
264 |
+
$hpsBlock1->appendChild($xml->createElement('hps:GatewayTxnId',$transactionId));
|
265 |
+
if($cardHolder != null){
|
266 |
+
$hpsBlock1->appendChild($this->_hydrateCardHolderData($cardHolder,$xml));
|
267 |
+
}
|
268 |
+
if($details != null){
|
269 |
+
$hpsBlock1->appendChild($this->_hydrateAdditionalTxnFields($details,$xml));
|
270 |
+
}
|
271 |
+
$hpsCreditReturn->appendChild($hpsBlock1);
|
272 |
+
$hpsTransaction->appendChild($hpsCreditReturn);
|
273 |
+
return $this->_submitRefund($hpsTransaction);
|
274 |
+
}
|
275 |
+
|
276 |
+
public function reverse($cardOrToken, $amount, $currency, $details=null){
|
277 |
+
$this->_checkAmount($amount);
|
278 |
+
$this->_checkCurrency($currency);
|
279 |
+
$amount = sprintf("%0.2f",round($amount,3));
|
280 |
+
|
281 |
+
$xml = new DOMDocument();
|
282 |
+
$hpsTransaction = $xml->createElement('hps:Transaction');
|
283 |
+
$hpsCreditReversal = $xml->createElement('hps:CreditReversal');
|
284 |
+
$hpsBlock1 = $xml->createElement('hps:Block1');
|
285 |
+
$hpsBlock1->appendChild($xml->createElement('hps:Amt',$amount));
|
286 |
+
if($details != null){
|
287 |
+
$hpsBlock1->appendChild($this->_hydrateAdditionalTxnFields($details,$xml));
|
288 |
+
}
|
289 |
+
$cardData = $xml->createElement('hps:CardData');
|
290 |
+
if($cardOrToken instanceOf HpsCreditCard){
|
291 |
+
$cardData->appendChild($this->_hydrateManualEntry($cardOrToken,$xml));
|
292 |
+
}else{
|
293 |
+
$tokenData = $xml->createElement('hps:TokenData');
|
294 |
+
$tokenData->appendChild($xml->createElement('hps:TokenValue',$cardOrToken->tokenValue));
|
295 |
+
$cardData->appendChild($tokenData);
|
296 |
+
}
|
297 |
+
$hpsBlock1->appendChild($cardData);
|
298 |
+
$hpsCreditReversal->appendChild($hpsBlock1);
|
299 |
+
$hpsTransaction->appendChild($hpsCreditReversal);
|
300 |
+
|
301 |
+
return $this->_submitReverse($hpsTransaction);
|
302 |
+
}
|
303 |
+
|
304 |
+
public function reverseTransaction($transactionId, $amount,$currency, $details=null){
|
305 |
+
$this->_checkAmount($amount);
|
306 |
+
$this->_checkCurrency($currency);
|
307 |
+
$amount = sprintf("%0.2f",round($amount,3));
|
308 |
+
|
309 |
+
$xml = new DOMDocument();
|
310 |
+
$hpsTransaction = $xml->createElement('hps:Transaction');
|
311 |
+
$hpsCreditReversal = $xml->createElement('hps:CreditReversal');
|
312 |
+
$hpsBlock1 = $xml->createElement('hps:Block1');
|
313 |
+
$hpsBlock1->appendChild($xml->createElement('hps:Amt',$amount));
|
314 |
+
$hpsBlock1->appendChild($xml->createElement('hps:GatewayTxnId',$transactionId));
|
315 |
+
if($details != null){
|
316 |
+
$hpsBlock1->appendChild($this->_hydrateAdditionalTxnFields($details,$xml));
|
317 |
+
}
|
318 |
+
$hpsCreditReversal->appendChild($hpsBlock1);
|
319 |
+
$hpsTransaction->appendChild($hpsCreditReversal);
|
320 |
+
|
321 |
+
return $this->_submitReverse($hpsTransaction);
|
322 |
+
}
|
323 |
+
|
324 |
+
public function verify($cardOrToken, $cardHolder=null, $requestMultiUseToken=false){
|
325 |
+
$xml = new DOMDocument();
|
326 |
+
$hpsTransaction = $xml->createElement('hps:Transaction');
|
327 |
+
$hpsCreditAccountVerify = $xml->createElement('hps:CreditAccountVerify');
|
328 |
+
$hpsBlock1 = $xml->createElement('hps:Block1');
|
329 |
+
if($cardHolder != null){
|
330 |
+
$hpsBlock1->appendChild($this->_hydrateCardHolderData($cardHolder,$xml));
|
331 |
+
}
|
332 |
+
$cardData = $xml->createElement('hps:CardData');
|
333 |
+
if($cardOrToken instanceOf HpsCreditCard){
|
334 |
+
$cardData->appendChild($this->_hydrateManualEntry($cardOrToken,$xml));
|
335 |
+
}else{
|
336 |
+
$tokenData = $xml->createElement('hps:TokenData');
|
337 |
+
$tokenData->appendChild($xml->createElement('hps:TokenValue',$cardOrToken->tokenValue));
|
338 |
+
$cardData->appendChild($tokenData);
|
339 |
+
}
|
340 |
+
$cardData->appendChild($xml->createElement('hps:TokenRequest',($requestMultiUseToken) ? 'Y' : 'N'));
|
341 |
+
$hpsBlock1->appendChild($cardData);
|
342 |
+
$hpsCreditAccountVerify->appendChild($hpsBlock1);
|
343 |
+
$hpsTransaction->appendChild($hpsCreditAccountVerify);
|
344 |
+
|
345 |
+
$response = $this->doTransaction($hpsTransaction);
|
346 |
+
$header = $response->Header;
|
347 |
+
|
348 |
+
if($header->GatewayRspCode != "0"){
|
349 |
+
throw $this->exceptionMapper->map_gateway_exception($header->GatewayTxnId,$header->GatewayRspCode,$header->GatewayRspMsg);
|
350 |
+
}
|
351 |
+
|
352 |
+
$accountVerify = $response->Transaction->CreditAccountVerify;
|
353 |
+
$result = new HpsAccountVerify($this->hydrateTransactionHeader($header));
|
354 |
+
$result->transactionId = (isset($accountVerify->GatewayTxnId) ? $accountVerify->GatewayTxnId : null);
|
355 |
+
$result->avsResultCode = (isset($accountVerify->AVSRsltCode) ? $accountVerify->AVSRsltCode : null);
|
356 |
+
$result->avsResultText = (isset($accountVerify->AVSRsltText) ? $accountVerify->AVSRsltText : null);
|
357 |
+
$result->referenceNumber = (isset($accountVerify->RefNbr) ? $accountVerify->RefNbr : null);
|
358 |
+
$result->responseCode = (isset($accountVerify->RspCode) ? $accountVerify->RspCode : null);
|
359 |
+
$result->responseText = (isset($accountVerify->RspText) ? $accountVerify->RspText : null);
|
360 |
+
$result->cardType = (isset($accountVerify->CardType) ? $accountVerify->CardType : null);
|
361 |
+
$result->cpcIndicator = (isset($accountVerify->CPCInd) ? $accountVerify->CPCInd : null);
|
362 |
+
$result->cvvResultCode = (isset($accountVerify->CVVRsltCode) ? $accountVerify->CVVRsltCode : null);
|
363 |
+
$result->cvvResultText = (isset($accountVerify->CVVRsltText) ? $accountVerify->CVVRsltText : null);
|
364 |
+
$result->authorizationCode = (isset($accountVerify->AuthCode) ? $accountVerify->AuthCode : null);
|
365 |
+
$result->authorizedAmount = (isset($accountVerify->AuthAmt) ? $accountVerify->AuthAmt : null);
|
366 |
+
|
367 |
+
if($result->responseCode != "00" && $result->responseCode != "85"){
|
368 |
+
throw $this->exceptionMapper->map_issuer_exception($result->transactionId, $result->responseCode, $result->responseText);
|
369 |
+
}
|
370 |
+
|
371 |
+
if(isset($header->TokenData) && is_object($header->TokenData)){
|
372 |
+
$result->tokenData = new HpsTokenData();
|
373 |
+
$result->tokenData->responseCode = $header->TokenData->TokenRspCode;
|
374 |
+
$result->tokenData->responseMessage = $header->TokenData->TokenRspMsg;
|
375 |
+
$result->tokenData->tokenValue = $header->TokenData->TokenValue;
|
376 |
+
}
|
377 |
+
|
378 |
+
return $result;
|
379 |
+
}
|
380 |
+
|
381 |
+
public function void($transactionId){
|
382 |
+
$xml = new DOMDocument();
|
383 |
+
$hpsTransaction = $xml->createElement('hps:Transaction');
|
384 |
+
$hpsCreditVoid = $xml->createElement('hps:CreditVoid');
|
385 |
+
$hpsCreditVoid->appendChild($xml->createElement('hps:GatewayTxnId',$transactionId));
|
386 |
+
$hpsTransaction->appendChild($hpsCreditVoid);
|
387 |
+
|
388 |
+
$response = $this->doTransaction($hpsTransaction);
|
389 |
+
$header = $response->Header;
|
390 |
+
|
391 |
+
if($header->GatewayRspCode != "0"){
|
392 |
+
throw $this->exceptionMapper->map_gateway_exception($header->GatewayTxnId,$header->GatewayRspCode,$header->GatewayRspMsg);
|
393 |
+
}
|
394 |
+
|
395 |
+
$creditVoid = $response->Transaction->CreditVoid;
|
396 |
+
$result = new HpsVoid($this->hydrateTransactionHeader($header));
|
397 |
+
$result->transactionId = (isset($creditVoid->GatewayTxnId) ? $creditVoid->GatewayTxnId : null);
|
398 |
+
$result->responseCode = "00";
|
399 |
+
$result->responseText = "";
|
400 |
+
return $result;
|
401 |
+
}
|
402 |
+
|
403 |
+
private function _checkAmount($amount){
|
404 |
+
if ($amount <= 0 || $amount == null){
|
405 |
+
throw $this->exceptionMapper->map_sdk_exception(HpsSdkCodes::$invalidAmount);
|
406 |
+
}
|
407 |
+
}
|
408 |
+
|
409 |
+
private function _checkCurrency($currency){
|
410 |
+
if ($currency == null or $currency == ""){
|
411 |
+
throw $this->exceptionMapper->map_sdk_exception(HpsSdkCodes::$missingCurrency);
|
412 |
+
}
|
413 |
+
if (strtolower($currency) != "usd"){
|
414 |
+
throw $this->exceptionMapper->map_sdk_exception(HpsSdkCodes::$invalidCurrency);
|
415 |
+
}
|
416 |
+
}
|
417 |
+
|
418 |
+
private function _hydrateAdditionalTxnFields($details,DOMDocument $xml){
|
419 |
+
$additionalTxnFields = $xml->createElement('hps:AdditionalTxnFields');
|
420 |
+
if($details->memo != null && $details->memo != ""){
|
421 |
+
$additionalTxnFields->appendChild($xml->createElement('hps:Description',$details->memo));
|
422 |
+
}
|
423 |
+
if($details->invoiceNumber != null && $details->invoiceNumber != ""){
|
424 |
+
$additionalTxnFields->appendChild($xml->createElement('hps:InvoiceNbr',$details->invoiceNumber));
|
425 |
+
}
|
426 |
+
if($details->customerId != null && $details->customerId != ""){
|
427 |
+
$additionalTxnFields->appendChild($xml->createElement('hps:CustomerID',$details->customerId));
|
428 |
+
}
|
429 |
+
return $additionalTxnFields;
|
430 |
+
}
|
431 |
+
|
432 |
+
private function _hydrateCardHolderData(HpsCardHolder $cardHolder, DOMDocument $xml){
|
433 |
+
$cardHolderData = $xml->createElement('hps:CardHolderData');
|
434 |
+
$cardHolderData->appendChild($xml->createElement('hps:CardHolderFirstName',$cardHolder->firstName));
|
435 |
+
$cardHolderData->appendChild($xml->createElement('hps:CardHolderLastName',$cardHolder->lastName));
|
436 |
+
$cardHolderData->appendChild($xml->createElement('hps:CardHolderEmail',$cardHolder->emailAddress));
|
437 |
+
$cardHolderData->appendChild($xml->createElement('hps:CardHolderPhone',$cardHolder->phone));
|
438 |
+
$cardHolderData->appendChild($xml->createElement('hps:CardHolderAddr',$cardHolder->address->address));
|
439 |
+
$cardHolderData->appendChild($xml->createElement('hps:CardHolderCity',$cardHolder->address->city));
|
440 |
+
$cardHolderData->appendChild($xml->createElement('hps:CardHolderState',$cardHolder->address->state));
|
441 |
+
$cardHolderData->appendChild($xml->createElement('hps:CardHolderZip',$cardHolder->address->zip));
|
442 |
+
|
443 |
+
return $cardHolderData;
|
444 |
+
}
|
445 |
+
|
446 |
+
private function _hydrateManualEntry(HpsCreditCard $card,DOMDocument $xml){
|
447 |
+
$manualEntry = $xml->createElement('hps:ManualEntry');
|
448 |
+
$manualEntry->appendChild($xml->createElement('hps:CardNbr',$card->number));
|
449 |
+
$manualEntry->appendChild($xml->createElement('hps:ExpMonth',$card->expMonth));
|
450 |
+
$manualEntry->appendChild($xml->createElement('hps:ExpYear',$card->expYear));
|
451 |
+
$manualEntry->appendChild($xml->createElement('hps:CVV2',$card->cvv));
|
452 |
+
$manualEntry->appendChild($xml->createElement('hps:CardPresent',"N"));
|
453 |
+
$manualEntry->appendChild($xml->createElement('hps:ReaderPresent',"N"));
|
454 |
+
|
455 |
+
return $manualEntry;
|
456 |
+
}
|
457 |
+
|
458 |
+
private function _processChargeGatewayResponse($responseCode, $responseText, $transactionId, $amount, $currency){
|
459 |
+
if($responseCode != 0){
|
460 |
+
if($responseCode == 30){
|
461 |
+
try{
|
462 |
+
$this->reverseTransaction($transactionId, $amount, $currency);
|
463 |
+
}catch (Exception $e){
|
464 |
+
$exception = $this->exceptionMapper->map_sdk_exception(HpsSdkCodes::$reversalErrorAfterGatewayTimeout, $e);
|
465 |
+
$exception->responseCode = $responseCode;
|
466 |
+
$exception->responseText = $responseText;
|
467 |
+
throw $exception;
|
468 |
+
}
|
469 |
+
}
|
470 |
+
$exception = $this->exceptionMapper->map_gateway_exception($transactionId,$responseCode, $responseText);
|
471 |
+
$exception->responseCode = $responseCode;
|
472 |
+
$exception->responseText = $responseText;
|
473 |
+
throw $exception;
|
474 |
+
}
|
475 |
+
}
|
476 |
+
|
477 |
+
private function _processChargeIssuerResponse($responseCode, $responseText, $transactionId, $amount, $currency){
|
478 |
+
if($responseCode == "91"){
|
479 |
+
try{
|
480 |
+
$this->reverseTransaction($transactionId, $amount, $currency);
|
481 |
+
}catch (Exception $e){
|
482 |
+
$exception = $this->exceptionMapper->map_sdk_exception(HpsSdkCodes::$reversalErrorAfterIssuerTimeout, $e);
|
483 |
+
$exception->responseCode = $responseCode;
|
484 |
+
$exception->responseText = $responseText;
|
485 |
+
throw $exception;
|
486 |
+
}
|
487 |
+
$exception = $this->exceptionMapper->map_sdk_exception(HpsSdkCodes::$processingError);
|
488 |
+
$exception->responseCode = $responseCode;
|
489 |
+
$exception->responseText = $responseText;
|
490 |
+
throw $exception;
|
491 |
+
}else if($responseCode != "00"){
|
492 |
+
$exception = $this->exceptionMapper->map_issuer_exception($transactionId, $responseCode, $responseText);
|
493 |
+
$exception->responseCode = $responseCode;
|
494 |
+
$exception->responseText = $responseText;
|
495 |
+
throw $exception;
|
496 |
+
}
|
497 |
+
}
|
498 |
+
|
499 |
+
private function _submitAuthorize($transaction, $amount, $currency){
|
500 |
+
$response = $this->doTransaction($transaction);
|
501 |
+
$avsChecking = new AVSResponseCodeHandler($response,$this,$this->config);
|
502 |
+
$header = $response->Header;
|
503 |
+
$this->_processChargeGatewayResponse($header->GatewayRspCode,$header->GatewayRspMsg,$header->GatewayTxnId,$amount,$currency);
|
504 |
+
|
505 |
+
$authResponse = $response->Transaction->CreditAuth;
|
506 |
+
$this->_processChargeIssuerResponse($authResponse->RspCode,$authResponse->RspText,$authResponse->GatewayTxnId,$amount,$currency);
|
507 |
+
|
508 |
+
$result = new HpsAuthorization($this->hydrateTransactionHeader($header));
|
509 |
+
$result->transactionId = $header->GatewayTxnId;
|
510 |
+
$result->authorizedAmount = (isset($authResponse->AuthAmt) ? $authResponse->AuthAmt : null);
|
511 |
+
$result->authorizationCode = (isset($authResponse->AuthCode) ? $authResponse->AuthCode : null);
|
512 |
+
$result->avsResultCode = (isset($authResponse->AVSRsltCode) ? $authResponse->AVSRsltCode : null);
|
513 |
+
$result->avsResultText = (isset($authResponse->AVSRsltText) ? $authResponse->AVSRsltText : null);
|
514 |
+
$result->cardType = (isset($authResponse->CardType) ? $authResponse->CardType : null);
|
515 |
+
$result->cpcIndicator = (isset($authResponse->CPCInd) ? $authResponse->CPCInd : null);
|
516 |
+
$result->cvvResultCode = (isset($authResponse->CVVRsltCode) ? $authResponse->CVVRsltCode : null);
|
517 |
+
$result->cvvResultText = (isset($authResponse->CVVRsltText) ? $authResponse->CVVRsltText : null);
|
518 |
+
$result->referenceNumber = (isset($authResponse->RefNbr) ? $authResponse->RefNbr : null);
|
519 |
+
$result->responseCode = (isset($authResponse->RspCode) ? $authResponse->RspCode : null);
|
520 |
+
$result->responseText = (isset($authResponse->RspText) ? $authResponse->RspText : null);
|
521 |
+
|
522 |
+
if(isset($header->TokenData) && is_object($header->TokenData)){
|
523 |
+
$result->tokenData = new HpsTokenData();
|
524 |
+
$result->tokenData->responseCode = $header->TokenData->TokenRspCode;
|
525 |
+
$result->tokenData->responseMessage = $header->TokenData->TokenRspMsg;
|
526 |
+
$result->tokenData->tokenValue = $header->TokenData->TokenValue;
|
527 |
+
}
|
528 |
+
|
529 |
+
return $result;
|
530 |
+
}
|
531 |
+
|
532 |
+
private function _submitCharge($transaction, $amount, $currency){
|
533 |
+
$response = $this->doTransaction($transaction);
|
534 |
+
$avsChecking = new AVSResponseCodeHandler($response,$this,$this->config);
|
535 |
+
$header = $response->Header;
|
536 |
+
$this->_processChargeGatewayResponse($header->GatewayRspCode,$header->GatewayRspMsg,$header->GatewayTxnId,$amount,$currency);
|
537 |
+
|
538 |
+
$creditSaleRsp = $response->Transaction->CreditSale;
|
539 |
+
$this->_processChargeIssuerResponse($creditSaleRsp->RspCode,$creditSaleRsp->RspText,$creditSaleRsp->GatewayTxnId,$amount,$currency);
|
540 |
+
|
541 |
+
$result = new HpsCharge($this->hydrateTransactionHeader($header));
|
542 |
+
$result->transactionId = $header->GatewayTxnId;
|
543 |
+
$result->authorizedAmount = (isset($creditSaleRsp->AuthAmt) ? $creditSaleRsp->AuthAmt : null);
|
544 |
+
$result->authorizationCode = (isset($creditSaleRsp->AuthCode) ? $creditSaleRsp->AuthCode : null);
|
545 |
+
$result->avsResultCode = (isset($creditSaleRsp->AVSRsltCode) ? $creditSaleRsp->AVSRsltCode : null);
|
546 |
+
$result->avsResultText = (isset($creditSaleRsp->AVSRsltText) ? $creditSaleRsp->AVSRsltText : null);
|
547 |
+
$result->cardType = (isset($creditSaleRsp->CardType) ? $creditSaleRsp->CardType : null);
|
548 |
+
$result->cpcIndicator = (isset($creditSaleRsp->CPCInd) ? $creditSaleRsp->CPCInd : null);
|
549 |
+
$result->cvvResultCode = (isset($creditSaleRsp->CVVRsltCode) ? $creditSaleRsp->CVVRsltCode : null);
|
550 |
+
$result->cvvResultText = (isset($creditSaleRsp->CVVRsltText) ? $creditSaleRsp->CVVRsltText : null);
|
551 |
+
$result->referenceNumber = (isset($creditSaleRsp->RefNbr) ? $creditSaleRsp->RefNbr : null);
|
552 |
+
$result->responseCode = (isset($creditSaleRsp->RspCode) ? $creditSaleRsp->RspCode : null);
|
553 |
+
$result->responseText = (isset($creditSaleRsp->RspText) ? $creditSaleRsp->RspText : null);
|
554 |
+
|
555 |
+
if(isset($header->TokenData) && is_object($header->TokenData)){
|
556 |
+
$result->tokenData = new HpsTokenData();
|
557 |
+
$result->tokenData->responseCode = $header->TokenData->TokenRspCode;
|
558 |
+
$result->tokenData->responseMessage = $header->TokenData->TokenRspMsg;
|
559 |
+
$result->tokenData->tokenValue = $header->TokenData->TokenValue;
|
560 |
+
}
|
561 |
+
|
562 |
+
return $result;
|
563 |
+
}
|
564 |
+
|
565 |
+
private function _submitRefund($transaction){
|
566 |
+
$response = $this->doTransaction($transaction);
|
567 |
+
$header = $response->Header;
|
568 |
+
|
569 |
+
if($header->GatewayRspCode != "0"){
|
570 |
+
throw $this->exceptionMapper->map_gateway_exception($header->GatewayTxnId,$header->GatewayRspCode,$header->GatewayRspMsg);
|
571 |
+
}
|
572 |
+
|
573 |
+
$result = new HpsRefund($this->hydrateTransactionHeader($header));
|
574 |
+
$result->transactionId = $header->GatewayTxnId;
|
575 |
+
$result->responseCode = "00";
|
576 |
+
$result->responseText = "";
|
577 |
+
|
578 |
+
return $result;
|
579 |
+
}
|
580 |
+
|
581 |
+
private function _submitReverse($transaction){
|
582 |
+
$response = $this->doTransaction($transaction);
|
583 |
+
$header = $response->Header;
|
584 |
+
|
585 |
+
if($header->GatewayRspCode != "0"){
|
586 |
+
throw $this->exceptionMapper->map_gateway_exception($header->GatewayTxnId,$header->GatewayRspCOde,$header->GatewayRspMsg);
|
587 |
+
}
|
588 |
+
|
589 |
+
$reversal = (isset($response->Transaction->CreditReversal) ? $response->Transaction->CreditReversal : null);
|
590 |
+
$result = new HpsReversal($this->hydrateTransactionHeader($header));
|
591 |
+
$result->transactionId = (isset($header->GatewayTxnId) ? $header->GatewayTxnId : null);
|
592 |
+
$result->avsResultCode = (isset($reversal->AVSRsltCode) ? $reversal->AVSRsltCode : null);
|
593 |
+
$result->avsResultText = (isset($reversal->AVSRsltText) ? $reversal->AVSRsltText : null);
|
594 |
+
$result->cpcIndicator = (isset($reversal->CPCInd) ? $reversal->CPCInd : null);
|
595 |
+
$result->cvvResultCode = (isset($reversal->CVVRsltCode) ? $reversal->CVVRsltCode : null);
|
596 |
+
$result->cvvResultText = (isset($reversal->CVVRsltText) ? $reversal->CVVRsltText : null);
|
597 |
+
$result->referenceNumber = (isset($reversal->RefNbr) ? $reversal->RefNbr : null);
|
598 |
+
$result->responseCode = (isset($reversal->RspCode) ? $reversal->RspCode : null);
|
599 |
+
$result->responseText = (isset($reversal->RspText) ? $reversal->RspText : null);
|
600 |
+
return $result;
|
601 |
+
}
|
602 |
+
}
|
lib/SecureSubmit/services/HpsService.php
ADDED
@@ -0,0 +1,129 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
class HpsService {
|
4 |
+
public $exceptionMapper = null,
|
5 |
+
$config = null;
|
6 |
+
|
7 |
+
public function __construct(HpsConfiguration $config=null){
|
8 |
+
if($config != null){
|
9 |
+
$this->config = $config;
|
10 |
+
}
|
11 |
+
$this->exceptionMapper = new HpsExceptionMapper();
|
12 |
+
}
|
13 |
+
|
14 |
+
public function doTransaction($transaction){
|
15 |
+
if($this->_configurationInvalid()){
|
16 |
+
throw $this->exceptionMapper->map_sdk_exception(HpsSdkCodes::$invalidTransactionId);
|
17 |
+
}
|
18 |
+
|
19 |
+
$xml = new DOMDocument('1.0', 'utf-8');
|
20 |
+
$soapEnvelope = $xml->createElement('soapenv:Envelope');
|
21 |
+
$soapEnvelope->setAttribute('xmlns:soapenv', 'http://schemas.xmlsoap.org/soap/envelope/');
|
22 |
+
$soapEnvelope->setAttribute('xmlns:hps', 'http://Hps.Exchange.PosGateway');
|
23 |
+
|
24 |
+
$soapBody = $xml->createElement('soapenv:Body');
|
25 |
+
$hpsRequest = $xml->createElement('hps:PosRequest');
|
26 |
+
$hpsVersion = $xml->createElement('hps:Ver1.0');
|
27 |
+
$hpsHeader = $xml->createElement('hps:Header');
|
28 |
+
|
29 |
+
if ($this->config->secretApiKey != NULL && $this->config->secretApiKey != ""){
|
30 |
+
$hpsHeader->appendChild($xml->createElement('hps:SecretAPIKey',$this->config->secretApiKey));
|
31 |
+
}else{
|
32 |
+
$hpsHeader->appendChild($xml->createElement('hps:UserName',$this->config->userName));
|
33 |
+
$hpsHeader->appendChild($xml->createElement('hps:Password',$this->config->password));
|
34 |
+
$hpsHeader->appendChild($xml->createElement('hps:DeviceId',$this->config->deviceId));
|
35 |
+
$hpsHeader->appendChild($xml->createElement('hps:LicenseId',$this->config->licenseId));
|
36 |
+
$hpsHeader->appendChild($xml->createElement('hps:SiteId',$this->config->siteId));
|
37 |
+
}
|
38 |
+
if ($this->config->developerId != null && $this->config->developerId != ""){
|
39 |
+
$hpsHeader->appendChild($xml->createElement('hps:DeveloperID',$this->config->developerId));
|
40 |
+
$hpsHeader->appendChild($xml->createElement('hps:VersionNbr',$this->config->versionNumber));
|
41 |
+
$hpsHeader->appendChild($xml->createElement('hps:SiteTrace',$this->config->siteTrace));
|
42 |
+
}
|
43 |
+
|
44 |
+
$hpsVersion->appendChild($hpsHeader);
|
45 |
+
$transaction = $xml->importNode($transaction,true);
|
46 |
+
$hpsVersion->appendChild($transaction);
|
47 |
+
$hpsRequest->appendChild($hpsVersion);
|
48 |
+
$soapBody->appendChild($hpsRequest);
|
49 |
+
$soapEnvelope->appendChild($soapBody);
|
50 |
+
$xml->appendChild($soapEnvelope);
|
51 |
+
|
52 |
+
//cURL
|
53 |
+
try{
|
54 |
+
$header = array(
|
55 |
+
"Content-type: text/xml;charset=\"utf-8\"",
|
56 |
+
"Accept: text/xml",
|
57 |
+
"SOAPAction: \"\"",
|
58 |
+
"Content-length: ".strlen($xml->saveXML()),
|
59 |
+
);
|
60 |
+
$soap_do = curl_init();
|
61 |
+
curl_setopt($soap_do, CURLOPT_URL, $this->_gatewayUrlForKey($this->config->secretApiKey));
|
62 |
+
curl_setopt($soap_do, CURLOPT_CONNECTTIMEOUT, 10);
|
63 |
+
curl_setopt($soap_do, CURLOPT_TIMEOUT, 10);
|
64 |
+
curl_setopt($soap_do, CURLOPT_RETURNTRANSFER, true );
|
65 |
+
curl_setopt($soap_do, CURLOPT_SSL_VERIFYPEER, false);
|
66 |
+
curl_setopt($soap_do, CURLOPT_SSL_VERIFYHOST, false);
|
67 |
+
curl_setopt($soap_do, CURLOPT_POST, true);
|
68 |
+
curl_setopt($soap_do, CURLOPT_POSTFIELDS, $xml->saveXML());
|
69 |
+
curl_setopt($soap_do, CURLOPT_HTTPHEADER, $header);
|
70 |
+
|
71 |
+
if($this->config->useProxy){
|
72 |
+
curl_setopt($soap_do, CURLOPT_PROXY, $this->config->proxyOptions['proxy_host']);
|
73 |
+
curl_setopt($soap_do, CURLOPT_PROXYPORT, $this->config->proxyOptions['proxy_port']);
|
74 |
+
}
|
75 |
+
$curlResponse = curl_exec($soap_do);
|
76 |
+
$curlInfo = curl_getinfo($soap_do);
|
77 |
+
|
78 |
+
if($curlInfo['http_code'] == '200'){
|
79 |
+
$responseObject = $this->_XML2Array($curlResponse);
|
80 |
+
$ver = "Ver1.0";
|
81 |
+
return $responseObject->$ver;
|
82 |
+
}else{
|
83 |
+
throw $this->exceptionMapper->map_sdk_exception(HpsSdkCodes::$unableToProcessTransaction);
|
84 |
+
}
|
85 |
+
}catch (Exception $e){
|
86 |
+
throw $this->exceptionMapper->map_sdk_exception(HpsSdkCodes::$unableToProcessTransaction, $e);
|
87 |
+
}
|
88 |
+
}
|
89 |
+
|
90 |
+
private function _configurationInvalid(){
|
91 |
+
if($this->config == null && (
|
92 |
+
$this->config->secretApiKey == null ||
|
93 |
+
$this->config->userName == null ||
|
94 |
+
$this->config->password == null ||
|
95 |
+
$this->config->licenseId == null ||
|
96 |
+
$this->config->deviceId == null ||
|
97 |
+
$this->config->siteId == null)
|
98 |
+
){
|
99 |
+
return true;
|
100 |
+
}
|
101 |
+
return false;
|
102 |
+
}
|
103 |
+
|
104 |
+
private function _gatewayUrlForKey($apiKey){
|
105 |
+
if ($apiKey != NULL && $apiKey != "" && strpos($apiKey, '_cert_') !== false){
|
106 |
+
return "https://posgateway.cert.secureexchange.net/Hps.Exchange.PosGateway/PosGatewayService.asmx";
|
107 |
+
}else{
|
108 |
+
return "https://posgateway.secureexchange.net/Hps.Exchange.PosGateway/PosGatewayService.asmx";
|
109 |
+
}
|
110 |
+
}
|
111 |
+
|
112 |
+
public function hydrateTransactionHeader($header){
|
113 |
+
$result = new HpsTransactionHeader();
|
114 |
+
$result->gatewayResponseCode = $header['GatewayRspCode'];
|
115 |
+
$result->gatewayResponseMessage = $header['GatewayRspMsg'];
|
116 |
+
$result->responseDt = $header['RspDT'];
|
117 |
+
$result->clientTxnId = $header['GatewayTxnId'];
|
118 |
+
return $result;
|
119 |
+
}
|
120 |
+
|
121 |
+
private function _XML2Array($xml){
|
122 |
+
$envelope = simplexml_load_string($xml, "SimpleXMLElement", 0,'http://schemas.xmlsoap.org/soap/envelope/');
|
123 |
+
foreach($envelope->Body as $response) {
|
124 |
+
foreach ($response->children('http://Hps.Exchange.PosGateway') as $item) {
|
125 |
+
return $item;
|
126 |
+
}
|
127 |
+
}
|
128 |
+
}
|
129 |
+
}
|
lib/SecureSubmit/services/HpsTokenService.php
ADDED
@@ -0,0 +1,59 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
// This should only be used for testing tokens.
|
3 |
+
|
4 |
+
class HpsTokenService {
|
5 |
+
private $_publicAPIKey = null;
|
6 |
+
private $_url = null;
|
7 |
+
|
8 |
+
function __construct($publicAPIKey){
|
9 |
+
$this->_publicAPIKey = $publicAPIKey;
|
10 |
+
|
11 |
+
if($publicAPIKey == null || $publicAPIKey == ""){
|
12 |
+
throw new HpsException("Public Key not found","0");
|
13 |
+
}
|
14 |
+
|
15 |
+
$components = explode("_",$publicAPIKey);
|
16 |
+
if(count($components) != 3){
|
17 |
+
throw new HpsException("Public API Key must Contain three underscores","0");
|
18 |
+
}
|
19 |
+
|
20 |
+
if(strtolower($components[1]) == "prod"){
|
21 |
+
$this->_url = "https://api.heartlandportico.com/SecureSubmit.v1/api/token";
|
22 |
+
}else {
|
23 |
+
$this->_url = "https://posgateway.cert.secureexchange.net/Hps.Exchange.PosGateway.Hpf.v1/api/token";
|
24 |
+
}
|
25 |
+
}
|
26 |
+
|
27 |
+
function getToken(HpsCreditCard $cardData){
|
28 |
+
try{
|
29 |
+
$data['api_key'] = $this->_publicAPIKey;
|
30 |
+
$data['object'] = 'token';
|
31 |
+
$data['token_type'] = 'supt';
|
32 |
+
$data['_method'] = 'post';
|
33 |
+
$data['card[number]'] = $cardData->number;
|
34 |
+
$data['card[cvc]'] = $cardData->cvv;
|
35 |
+
$data['card[exp_month]'] = $cardData->expMonth;
|
36 |
+
$data['card[exp_year]'] = $cardData->expYear;
|
37 |
+
|
38 |
+
$header = array('Content-type: application/json');
|
39 |
+
|
40 |
+
$tokenFetch = curl_init();
|
41 |
+
curl_setopt($tokenFetch, CURLOPT_URL, $this->_url ."?". http_build_query($data));
|
42 |
+
curl_setopt($tokenFetch, CURLOPT_CONNECTTIMEOUT, 10);
|
43 |
+
curl_setopt($tokenFetch, CURLOPT_TIMEOUT, 10);
|
44 |
+
curl_setopt($tokenFetch, CURLOPT_RETURNTRANSFER, true );
|
45 |
+
curl_setopt($tokenFetch, CURLOPT_SSL_VERIFYPEER, false);
|
46 |
+
curl_setopt($tokenFetch, CURLOPT_SSL_VERIFYHOST, false);
|
47 |
+
curl_setopt($tokenFetch, CURLOPT_HTTPHEADER, $header);
|
48 |
+
$curlResponse = curl_exec($tokenFetch);
|
49 |
+
|
50 |
+
$response = json_decode($curlResponse);
|
51 |
+
if(isset($response->error) && is_object($response->error)){
|
52 |
+
throw new HpsException($response->error->message,$response->error->code);
|
53 |
+
}
|
54 |
+
return $response;
|
55 |
+
}catch (Exception $e){
|
56 |
+
throw new HpsException($e->getMessage(),$e->getCode());
|
57 |
+
}
|
58 |
+
}
|
59 |
+
}
|
package.xml
ADDED
@@ -0,0 +1,20 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?xml version="1.0"?>
|
2 |
+
<package>
|
3 |
+
<name>Hps_Securesubmit</name>
|
4 |
+
<version>1.0.0</version>
|
5 |
+
<stability>stable</stability>
|
6 |
+
<license uri="https://github.com/SecureSubmit/magento-extension/blob/master/LICENSE">Custom</license>
|
7 |
+
<channel>community</channel>
|
8 |
+
<extends/>
|
9 |
+
<summary>Take credit card payments and store cards in a PCI friendly way.</summary>
|
10 |
+
<description>Use Heartland Payment Systems SecureSubmit platform to charge, authorize, void, refund and partial refund credit cards.
|
11 |
+

|
12 |
+
Allow customers to store their cards for reduced friction at next checkout using our multi-use card tokenization process which helps reduce PCI scope.</description>
|
13 |
+
<notes>This extension has been in production for six months with many websites. Many cross-platform (Windows vs. Linux) bugs were fixed during this process and the module has proved stable.</notes>
|
14 |
+
<authors><author><name>Heartland Payment Systems</name><user>markhagan</user><email>mark.hagan@e-hps.com</email></author></authors>
|
15 |
+
<date>2014-03-20</date>
|
16 |
+
<time>13:29:30</time>
|
17 |
+
<contents><target name="magecommunity"><dir name="Hps"><dir name="Securesubmit"><dir name="Block"><file name="Form.php" hash="2fbc3cb4093c7790992c7091108e8af4"/><file name="Info.php" hash="4a7685fe8e068f7a0621e896c182cb5c"/></dir><dir name="Helper"><file name="Data.php" hash="04aeff6f94f56a49cf7527518c6212a1"/></dir><dir name="Model"><file name="Payment.php" hash="8639797c0fab1bfe57fa3571ef5e3434"/><dir name="Resource"><file name="Setup.php" hash="f568cb09a6a06fc3d52f145684997416"/><dir name="Storedcard"><file name="Collection.php" hash="021134d46837197e800f54a4b90b0048"/></dir><file name="Storedcard.php" hash="f2a993c8e4236bc03b1273a33a03b5d0"/></dir><dir name="Source"><file name="Cctype.php" hash="b5f75e4a3284f79b2cfab926b193c98b"/><file name="PaymentAction.php" hash="9fc55ebaaeaccba6c40597d25a1cf9d3"/></dir><file name="Storedcard.php" hash="82c7228d2182a0cba979dc4c66a2321c"/><dir name="System"><dir name="Config"><dir name="Backend"><file name="Proxy.php" hash="97028069630bddf2b94cb1b5b0886076"/></dir></dir></dir></dir><dir name="controllers"><file name="StoredcardController.php" hash="cb9e5f7de4f52fd7a764a87f0f4699a8"/></dir><dir name="etc"><file name="config.xml" hash="99eeaf1f8ef190601b9554116fb3eee4"/><file name="system.xml" hash="27da99752da25df0cd2186c45261912c"/></dir><dir name="sql"><dir name="hps_securesubmit_setup"><file name="install-1.0.0.php" hash="57917d8b3b29830eb1a219466df4555b"/></dir></dir></dir></dir></target><target name="magedesign"><dir name="adminhtml"><dir name="default"><dir name="default"><dir name="template"><dir name="securesubmit"><file name="form.phtml" hash="beef4bae4a8c5d1040d1afc9800f0a9e"/></dir></dir></dir></dir></dir><dir name="frontend"><dir name="base"><dir name="default"><dir name="layout"><file name="securesubmit.xml" hash="28339d8a8907f0e319fd371d73f211df"/></dir><dir name="template"><dir name="securesubmit"><file name="form.phtml" hash="603c3e7807c55e340a3a730fc259b3de"/><file name="storedcards.phtml" hash="3412f0560d4ba696dc9bc3ed996e0577"/></dir></dir></dir></dir></dir></target><target name="mageetc"><dir name="modules"><file name="Hps_Securesubmit.xml" hash="d5aed3f48a45f8e611b68d1e6f34c959"/></dir></target><target name="mage"><dir name="js"><dir name="securesubmit"><file name="secure.submit-1.0.1.js" hash="a149dc8efcfa3b507d6b2b3c784d9db3"/></dir></dir></target><target name="magelib"><dir name="SecureSubmit"><file name="Hps.php" hash="8855d261c2df0de3fe7ad8e6e59668ad"/><dir name="entities"><file name="HpsAccountVerify.php" hash="a910342548320ba07ebc4c9cda2f7c96"/><file name="HpsAddress.php" hash="2e4554c509e1de8e8cb6b0d1f599d657"/><file name="HpsAuthorization.php" hash="c46f0ad9033d3197e641c1b63bd90c7e"/><file name="HpsBatch.php" hash="46ee0321f3c9f3824fdb930736c8df7e"/><file name="HpsCardHolder.php" hash="f74938b2f53d703c777def01adde5e91"/><file name="HpsCharge.php" hash="5e94b3094db8e4f231a456cedce40985"/><file name="HpsChargeExceptions.php" hash="927b346fdac882cf97fd46b5e740e363"/><file name="HpsCreditCard.php" hash="9394bb9cd123d572d2f3376f3ce52594"/><file name="HpsItemChoiceTypePosResponseVer10Transaction.php" hash="3516bf8acb77af8d4a36d02ed991d09e"/><file name="HpsRefund.php" hash="05a8dae7c7e0faf1e67ae628eca75ea2"/><file name="HpsReportTransactionDetails.php" hash="ad0221581bf4ee24410c1ed4aac4d305"/><file name="HpsReportTransactionSummary.php" hash="1d46cce9a3274f25c092171e034479bc"/><file name="HpsReversal.php" hash="1ffd02ea88816b9a7ef5579d6219d6b8"/><file name="HpsTokenData.php" hash="bfc42e3ed9ff078598d694565d7fd3be"/><file name="HpsTransaction.php" hash="fd2bb80e28f9143bb25a3df1508fb927"/><file name="HpsTransactionDetails.php" hash="ded777de86d2b93882b2779283247b64"/><file name="HpsTransactionHeader.php" hash="114de2d7b3648143d0ef16588dfbc1af"/><file name="HpsTransactionType.php" hash="58a73f5915ff2d3f9d89935232e90796"/><file name="HpsVoid.php" hash="09902616437fd001ec17cde2b6dd9780"/></dir><dir name="infrastructure"><file name="AVSResponseCodeHandler.php" hash="b376458f6bbf14907fd96b6b17566861"/><file name="ApiConnectionException.php" hash="8b6e2d5e4d7e3368adb34e1ab20412b0"/><file name="AuthenticationException.php" hash="4685a4fa0209ed56ef0ee38868f52840"/><file name="CardException.php" hash="09bf8965e0e101dcaf560c0927812306"/><file name="Exceptions.json" hash="8f7cbcb2b18963603ee3a62d6888c36d"/><file name="HpsConfiguration.php" hash="48ed3ba9eed035d5e57d245f5174b5bc"/><file name="HpsException.php" hash="89899dd8d9351d5fd4d198c0560864d4"/><file name="HpsExceptionMapper.php" hash="5f81eacdaea3ccb756a89b04ec4c20d6"/><file name="HpsSdkCodes.php" hash="b827c7268a5743a5fd45e992eeab2450"/><file name="InvalidRequestException.php" hash="a01ca17d036ce2e6410647aa1bd25491"/></dir><dir name="services"><file name="HpsBatchService.php" hash="8e46d58de558258c8af585c0a646b9ea"/><file name="HpsChargeService.php" hash="e1474cade11a45ccf450e182094e0e35"/><file name="HpsService.php" hash="52aefe6d72b1e4118fdd8ec04b75e28c"/><file name="HpsTokenService.php" hash="bfdee5e18ebdc2133f3512040e0da766"/></dir></dir></target></contents>
|
18 |
+
<compatible/>
|
19 |
+
<dependencies><required><php><min>5.2.0</min><max>5.5.10</max></php></required></dependencies>
|
20 |
+
</package>
|