aboutsummaryrefslogtreecommitdiffstats
path: root/public/catalog/controller/extension/payment/squareup.php
diff options
context:
space:
mode:
Diffstat (limited to 'public/catalog/controller/extension/payment/squareup.php')
-rw-r--r--public/catalog/controller/extension/payment/squareup.php251
1 files changed, 251 insertions, 0 deletions
diff --git a/public/catalog/controller/extension/payment/squareup.php b/public/catalog/controller/extension/payment/squareup.php
new file mode 100644
index 0000000..0b7205e
--- /dev/null
+++ b/public/catalog/controller/extension/payment/squareup.php
@@ -0,0 +1,251 @@
+<?php
+
+class ControllerExtensionPaymentSquareup extends Controller {
+ public function index() {
+ $this->load->language('extension/payment/squareup');
+
+ $this->load->library('squareup');
+
+ $data['action'] = $this->url->link('extension/payment/squareup/checkout', '', true);
+ $data['squareup_js_api'] = Squareup::PAYMENT_FORM_URL;
+
+ if (!empty($this->session->data['payment_address']['postcode'])) {
+ $data['payment_zip'] = $this->session->data['payment_address']['postcode'];
+ } else {
+ $data['payment_zip'] = '';
+ }
+
+ if ($this->config->get('payment_squareup_enable_sandbox')) {
+ $data['app_id'] = $this->config->get('payment_squareup_sandbox_client_id');
+ $data['sandbox_message'] = $this->language->get('warning_test_mode');
+ } else {
+ $data['app_id'] = $this->config->get('payment_squareup_client_id');
+ $data['sandbox_message'] = '';
+ }
+
+ $data['cards'] = array();
+
+ if ($this->customer->isLogged()) {
+ $data['is_logged'] = true;
+
+ $this->load->model('extension/credit_card/squareup');
+
+ $cards = $this->model_extension_credit_card_squareup->getCards($this->customer->getId(), $this->config->get('payment_squareup_enable_sandbox'));
+
+ foreach ($cards as $card) {
+ $data['cards'][] = array(
+ 'id' => $card['squareup_token_id'],
+ 'text' => sprintf($this->language->get('text_card_ends_in'), $card['brand'], $card['ends_in'])
+ );
+ }
+ } else {
+ $data['is_logged'] = false;
+ }
+
+ return $this->load->view('extension/payment/squareup', $data);
+ }
+
+ public function checkout() {
+ $this->load->language('extension/payment/squareup');
+
+ $this->load->model('extension/payment/squareup');
+ $this->load->model('extension/credit_card/squareup');
+ $this->load->model('checkout/order');
+ $this->load->model('localisation/country');
+
+ $this->load->library('squareup');
+
+ $order_info = $this->model_checkout_order->getOrder($this->session->data['order_id']);
+
+ $shipping_country_info = $this->model_localisation_country->getCountry($order_info['shipping_country_id']);
+
+ $billing_country_info = $this->model_localisation_country->getCountry($order_info['payment_country_id']);
+
+ if (!empty($billing_country_info)) {
+ $billing_address = array(
+ 'first_name' => $order_info['payment_firstname'],
+ 'last_name' => $order_info['payment_lastname'],
+ 'address_line_1' => $order_info['payment_address_1'],
+ 'address_line_2' => $order_info['payment_address_2'],
+ 'locality' => $order_info['payment_city'],
+ 'sublocality' => $order_info['payment_zone'],
+ 'postal_code' => $order_info['payment_postcode'],
+ 'country' => $billing_country_info['iso_code_2'],
+ 'organization' => $order_info['payment_company']
+ );
+ } else {
+ $billing_address = array();
+ }
+
+ if (!empty($shipping_country_info)) {
+ $shipping_address = array(
+ 'first_name' => $order_info['shipping_firstname'],
+ 'last_name' => $order_info['shipping_lastname'],
+ 'address_line_1' => $order_info['shipping_address_1'],
+ 'address_line_2' => $order_info['shipping_address_2'],
+ 'locality' => $order_info['shipping_city'],
+ 'sublocality' => $order_info['shipping_zone'],
+ 'postal_code' => $order_info['shipping_postcode'],
+ 'country' => $shipping_country_info['iso_code_2'],
+ 'organization' => $order_info['shipping_company']
+ );
+ } else {
+ $shipping_address = array();
+ }
+
+ $json = array();
+
+ try {
+ // Ensure we have registered the customer with Square
+ $square_customer = $this->model_extension_credit_card_squareup->getCustomer($this->customer->getId(), $this->config->get('payment_squareup_enable_sandbox'));
+
+ if (!$square_customer && $this->customer->isLogged()) {
+ $square_customer = $this->squareup->addLoggedInCustomer();
+
+ $this->model_extension_credit_card_squareup->addCustomer($square_customer);
+ }
+
+ $use_saved = false;
+ $square_card_id = null;
+
+ // check if user is logged in and wanted to save this card
+ if ($this->customer->isLogged() && !empty($this->request->post['squareup_select_card'])) {
+ $card_verified = $this->model_extension_credit_card_squareup->verifyCardCustomer($this->request->post['squareup_select_card'], $this->customer->getId());
+
+ if (!$card_verified) {
+ throw new \Squareup\Exception($this->registry, $this->language->get('error_card_invalid'));
+ }
+
+ $card = $this->model_extension_credit_card_squareup->getCard($this->request->post['squareup_select_card']);
+
+ $use_saved = true;
+ $square_card_id = $card['token'];
+ } else if ($this->customer->isLogged() && isset($this->request->post['squareup_save_card'])) {
+ // Save the card
+ $card_data = array(
+ 'card_nonce' => $this->request->post['squareup_nonce'],
+ 'billing_address' => $billing_address,
+ 'cardholder_name' => $order_info['payment_firstname'] . ' ' . $order_info['payment_lastname']
+ );
+
+ $square_card = $this->squareup->addCard($square_customer['square_customer_id'], $card_data);
+
+ if (!$this->model_extension_credit_card_squareup->cardExists($this->customer->getId(), $square_card)) {
+ $this->model_extension_credit_card_squareup->addCard($this->customer->getId(), $this->config->get('payment_squareup_enable_sandbox'), $square_card);
+ }
+
+ $use_saved = true;
+ $square_card_id = $square_card['id'];
+ }
+
+ // Prepare Transaction
+ $transaction_data = array(
+ 'idempotency_key' => uniqid(),
+ 'amount_money' => array(
+ 'amount' => $this->squareup->lowestDenomination($order_info['total'], $order_info['currency_code']),
+ 'currency' => $order_info['currency_code']
+ ),
+ 'billing_address' => $billing_address,
+ 'buyer_email_address' => $order_info['email'],
+ 'delay_capture' => !$this->cart->hasRecurringProducts() && $this->config->get('payment_squareup_delay_capture'),
+ 'integration_id' => Squareup::SQUARE_INTEGRATION_ID
+ );
+
+ if (!empty($shipping_address)) {
+ $transaction_data['shipping_address'] = $shipping_address;
+ }
+
+ if ($use_saved) {
+ $transaction_data['customer_card_id'] = $square_card_id;
+ $transaction_data['customer_id'] = $square_customer['square_customer_id'];
+ } else {
+ $transaction_data['card_nonce'] = $this->request->post['squareup_nonce'];
+ }
+
+ $transaction = $this->squareup->addTransaction($transaction_data);
+
+ if (isset($this->request->server['HTTP_USER_AGENT'])) {
+ $user_agent = $this->request->server['HTTP_USER_AGENT'];
+ } else {
+ $user_agent = '';
+ }
+
+ if (isset($this->request->server['REMOTE_ADDR'])) {
+ $ip = $this->request->server['REMOTE_ADDR'];
+ } else {
+ $ip = '';
+ }
+
+ $this->model_extension_payment_squareup->addTransaction($transaction, $this->config->get('payment_squareup_merchant_id'), $billing_address, $this->session->data['order_id'], $user_agent, $ip);
+
+ if (!empty($transaction['tenders'][0]['card_details']['status'])) {
+ $transaction_status = strtolower($transaction['tenders'][0]['card_details']['status']);
+ } else {
+ $transaction_status = '';
+ }
+
+ $order_status_id = $this->config->get('payment_squareup_status_' . $transaction_status);
+
+ if ($order_status_id) {
+ if ($this->cart->hasRecurringProducts() && $transaction_status == 'captured') {
+ foreach ($this->cart->getRecurringProducts() as $item) {
+ if ($item['recurring']['trial']) {
+ $trial_price = $this->tax->calculate($item['recurring']['trial_price'] * $item['quantity'], $item['tax_class_id']);
+ $trial_amt = $this->currency->format($trial_price, $this->session->data['currency']);
+ $trial_text = sprintf($this->language->get('text_trial'), $trial_amt, $item['recurring']['trial_cycle'], $item['recurring']['trial_frequency'], $item['recurring']['trial_duration']);
+
+ $item['recurring']['trial_price'] = $trial_price;
+ } else {
+ $trial_text = '';
+ }
+
+ $recurring_price = $this->tax->calculate($item['recurring']['price'] * $item['quantity'], $item['tax_class_id']);
+ $recurring_amt = $this->currency->format($recurring_price, $this->session->data['currency']);
+ $recurring_description = $trial_text . sprintf($this->language->get('text_recurring'), $recurring_amt, $item['recurring']['cycle'], $item['recurring']['frequency']);
+
+ $item['recurring']['price'] = $recurring_price;
+
+ if ($item['recurring']['duration'] > 0) {
+ $recurring_description .= sprintf($this->language->get('text_length'), $item['recurring']['duration']);
+ }
+
+ if (!$item['recurring']['trial']) {
+ // We need to override this value for the proper calculation in updateRecurringExpired
+ $item['recurring']['trial_duration'] = 0;
+ }
+
+
+ $this->model_extension_payment_squareup->createRecurring($item, $this->session->data['order_id'], $recurring_description, $transaction['id']);
+ }
+ }
+
+ $order_status_comment = $this->language->get('squareup_status_comment_' . $transaction_status);
+
+ $this->model_checkout_order->addOrderHistory($this->session->data['order_id'], $order_status_id, $order_status_comment, true);
+ }
+
+ $json['redirect'] = $this->url->link('checkout/success', '', true);
+ } catch (\Squareup\Exception $e) {
+ if ($e->isCurlError()) {
+ $json['error'] = $this->language->get('text_token_issue_customer_error');
+ } else if ($e->isAccessTokenRevoked()) {
+ // Send reminder e-mail to store admin to refresh the token
+ $this->model_extension_payment_squareup->tokenRevokedEmail();
+
+ $json['error'] = $this->language->get('text_token_issue_customer_error');
+ } else if ($e->isAccessTokenExpired()) {
+ // Send reminder e-mail to store admin to refresh the token
+ $this->model_extension_payment_squareup->tokenExpiredEmail();
+
+ $json['error'] = $this->language->get('text_token_issue_customer_error');
+ } else {
+ $json['error'] = $e->getMessage();
+ }
+ }
+
+ $this->response->addHeader('Content-Type: application/json');
+ $this->response->setOutput(json_encode($json));
+ }
+
+
+}