Skip to content
Browse files

Add certified InPay payment module

  • Loading branch information...
1 parent 540cc7d commit f7f7cce7767a330728d42a48b26e531d3c4b4c8b @haraldpdl haraldpdl committed Sep 9, 2010
View
93 catalog/ext/modules/payment/inpay/inpay_functions.php
@@ -0,0 +1,93 @@
+<?php
+
+/*
+ $Id: inpay_functions.php VER: 1.0.3443 $
+ osCommerce, Open Source E-Commerce Solutions
+ http://www.oscommerce.com
+ Copyright (c) 2008 osCommerce
+ Released under the GNU General Public License
+ */
+
+
+/* Ensure the http_build_query is defined */
+
+if (!function_exists('http_build_query')) {
+ function http_build_query($data, $prefix='', $sep='', $key='') {
+ $ret = array();
+ foreach ((array)$data as $k => $v) {
+ if (is_int($k) && $prefix != null) {
+ $k = urlencode($prefix . $k);
+ }
+ if ((!empty($key)) || ($key === 0)) $k = $key.'['.urlencode($k).']';
+ if (is_array($v) || is_object($v)) {
+ array_push($ret, http_build_query($v, '', $sep, $k));
+ } else {
+ array_push($ret, $k.'='.urlencode($v));
+ }
+ }
+ if (empty($sep)) $sep = ini_get('arg_separator.output');
+ return implode($sep, $ret);
+ }// http_build_query
+}//if
+
+function get_invoice_status($pars) {
+ //
+ // prepare parameters
+ //
+ $calc_md5 = calc_inpay_invoice_status_md5key($pars);
+ $q = http_build_query(array("merchant_id"=>MODULE_PAYMENT_INPAY_MERCHANT_ID, "invoice_ref"=>$pars['invoice_reference'], "checksum"=>$calc_md5), "", "&");
+ //
+ // communicate to inpay server
+ //
+ $fsocket = false;
+ $curl = false;
+ $result = false;
+ $fp = false;
+ $server = 'secure.inpay.com';
+ if (MODULE_PAYMENT_INPAY_GATEWAY_SERVER != 'Production') {
+ $server = 'test-secure.inpay.com';
+ }
+
+ if ((PHP_VERSION >= 4.3) && ($fp = @fsockopen('ssl://'.$server, 443, $errno, $errstr, 30))) {
+ $fsocket = true;
+ } elseif (function_exists('curl_exec')) {
+ $curl = true;
+ }
+ if ($fsocket == true) {
+ $header = 'POST /api/get_invoice_status HTTP/1.1'."\r\n".
+ 'Host: '.$server."\r\n".
+ 'Content-Type: application/x-www-form-urlencoded'."\r\n".
+ 'Content-Length: '.strlen($q)."\r\n".
+ 'Connection: close'."\r\n\r\n";
+ @fputs($fp, $header.$q);
+ $str = '';
+ while (!@feof($fp)) {
+ $res = @fgets($fp, 1024);
+ $str .= (string)$res;
+ }
+ @fclose($fp);
+ $result=$str;
+ $result = preg_split('/^\r?$/m', $result, 2);
+ $result = trim($result[1]);
+ } elseif ($curl == true) {
+ $ch = curl_init();
+ curl_setopt($ch, CURLOPT_URL, 'https://'.$server.'/api/get_invoice_status');
+ curl_setopt($ch, CURLOPT_POST, true);
+ curl_setopt($ch, CURLOPT_POSTFIELDS, $q);
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
+ curl_setopt($ch, CURLOPT_HEADER, false);
+ curl_setopt($ch, CURLOPT_TIMEOUT, 30);
+ curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
+ $result = curl_exec($ch);
+ curl_close($ch);
+ }
+ return (string)$result;
+}
+
+function calc_inpay_invoice_status_md5key($pars) {
+ $q = http_build_query(array("invoice_ref"=>$pars['invoice_reference'], "merchant_id"=>MODULE_PAYMENT_INPAY_MERCHANT_ID,
+ "secret_key"=>MODULE_PAYMENT_INPAY_SECRET_KEY), "", "&");
+ $md5v = md5($q);
+ return $md5v;
+}
+?>
View
387 catalog/ext/modules/payment/inpay/pb_handler.php
@@ -0,0 +1,387 @@
+<?php
+/*
+ $Id: pb_handler.php VER: 1.0.3414 $
+ osCommerce, Open Source E-Commerce Solutions
+ http://www.oscommerce.com
+ Copyright (c) 2008 osCommerce
+ Released under the GNU General Public License
+ */
+
+chdir('../../../../');
+require ('includes/application_top.php');
+reset($HTTP_POST_VARS);
+$result = "VERIFIED";
+$ok = true;
+$my_order = null;
+$my_order_query = null;
+//*************************************
+// Validate request
+//
+if (! isset ($HTTP_POST_VARS['order_id']) || !is_numeric($HTTP_POST_VARS['order_id']) || ($HTTP_POST_VARS['order_id'] <= 0))
+{
+ $ok = false;
+ $result = "bad order id";
+}
+if ($ok)
+{
+ if (! isset ($HTTP_POST_VARS["invoice_amount"]))
+ {
+ $ok = false;
+ $result = "bad amount";
+ }
+}
+if ($ok)
+{
+ if (! isset ($HTTP_POST_VARS["invoice_currency"]))
+ {
+ $ok = false;
+ $result = "bad currency";
+ }
+}
+if ($ok)
+{
+ if (! isset ($HTTP_POST_VARS["checksum"]) || ! isset ($HTTP_POST_VARS["invoice_reference"]) || ! isset ($HTTP_POST_VARS["invoice_created_at"]) || ! isset ($HTTP_POST_VARS["invoice_status"]))
+ {
+ $ok = false;
+ $result = "missing vatiables";
+ }
+}
+if ($ok)
+{
+ //
+ // calc checksum
+ //
+ $sk = MODULE_PAYMENT_INPAY_SECRET_KEY;
+ $q = http_build_query( array (
+ "order_id"=>$HTTP_POST_VARS['order_id'],
+ "invoice_reference"=>$HTTP_POST_VARS['invoice_reference'],
+ "invoice_amount"=>$HTTP_POST_VARS['invoice_amount'],
+ "invoice_currency"=>$HTTP_POST_VARS['invoice_currency'],
+ "invoice_created_at"=>$HTTP_POST_VARS['invoice_created_at'],
+ "invoice_status"=>$HTTP_POST_VARS['invoice_status'],
+ "secret_key"=>$sk), "", "&");
+ $md5v = md5($q);
+ if ($md5v != $HTTP_POST_VARS["checksum"])
+ {
+ $ok = false;
+ $result = "bad checksum";
+ }
+}
+if ($ok)
+{
+ $my_order_query = tep_db_query("select orders_status, currency, currency_value from ".TABLE_ORDERS." where orders_id = '".$HTTP_POST_VARS['order_id']."'"); // TODO: fix PB to add all params"' and customers_id = '" . (int)$HTTP_POST_VARS['custom'] . "'");
+ if (tep_db_num_rows($my_order_query) <= 0)
+ {
+ $ok = false;
+ $result = "order not found";
+ }
+}
+if ($ok)
+{
+ $my_order = tep_db_fetch_array($my_order_query);
+ $order = $my_order;
+ $total_query = tep_db_query("select value from ".TABLE_ORDERS_TOTAL." where orders_id = '".$HTTP_POST_VARS['order_id']."' and class = 'ot_total' limit 1");
+ $total = tep_db_fetch_array($total_query);
+ if (number_format($HTTP_POST_VARS['invoice_amount'], $currencies->get_decimal_places($order['currency'])) != number_format($total['value']*$order['currency_value'], $currencies->get_decimal_places($order['currency'])))
+ {
+ $ok = false;
+ $result = 'Inpay transaction value ('.tep_output_string_protected($HTTP_POST_VARS['invoice_amount']).') does not match order value ('.number_format($total['value']*$order['currency_value'], $currencies->get_decimal_places($order['currency'])).')';
+ }
+}
+if ($ok)
+{
+ //
+ // check status
+ //
+ $order = $my_order;
+ $delivered_status = 3;
+ if (($order['orders_status'] == MODULE_PAYMENT_INPAY_COMP_ORDER_STATUS_ID) || ($order['orders_status'] == $delivered_status))
+ {
+ $ok = false;
+ $result = 'Status already in level'.$order['orders_status'];
+ }
+}
+if ($ok) {
+ require_once ('inpay_functions.php');
+ $invoice_status = get_invoice_status($HTTP_POST_VARS);
+ $ok = false;
+ if ((($invoice_status == "pending")||($invoice_status == "created"))&&(($HTTP_POST_VARS["invoice_status"] == "pending")||($HTTP_POST_VARS["invoice_status"] == "created"))) {
+ $ok = true;
+ } else if (($invoice_status == "approved") && ($HTTP_POST_VARS["invoice_status"] == "approved")) {
+ $ok = true;
+ } else if (($invoice_status == "sum_too_low") && ($HTTP_POST_VARS["invoice_status"] == "sum_too_low")) {
+ $ok = true;
+ }
+ if (!$ok)
+ {
+ $result = "Bad invoice status:".$invoice_status;
+ }
+}
+
+//
+// Validate request end
+//************************************
+if ($result == 'VERIFIED')
+{
+ $order = $my_order;
+ $order_status_id = DEFAULT_ORDERS_STATUS_ID;
+ $invoice_approved = false;
+ switch($HTTP_POST_VARS["invoice_status"])
+ {
+ case "created":
+ case "pending":
+ $msg = "customer has been asked to pay ".$HTTP_POST_VARS['invoice_amount']." ".$HTTP_POST_VARS['invoice_currency']." with reference: ".$HTTP_POST_VARS["invoice_reference"]. " via his online bank";
+ $order_status_id = MODULE_PAYMENT_INPAY_CREATE_ORDER_STATUS_ID;
+ break;
+ case "approved":
+ $msg = "Inpay has confimed that the payment of ".$HTTP_POST_VARS['invoice_amount']." ".$HTTP_POST_VARS['invoice_currency']." has been received";
+ $order_status_id = MODULE_PAYMENT_INPAY_COMP_ORDER_STATUS_ID;
+ $invoice_approved = true;
+ break;
+ case "sum_too_low":
+ $msg = "Partial payment received by inpay. Reference: ".$HTTP_POST_VARS["invoice_reference"];
+ $order_status_id = MODULE_PAYMENT_INPAY_SUM_TOO_LOW_ORDER_STATUS_ID;
+ break;
+ }
+ $comment_status .= $msg." ;";
+ $customer_notified = '0';
+ //
+ // update order status
+ //
+ $sql_data_array = array ('orders_id'=>$HTTP_POST_VARS['order_id'],
+ 'orders_status_id'=>$order_status_id,
+ 'date_added'=>'now()',
+ 'customer_notified'=>$customer_notified,
+ 'comments'=>'Inpay '.ucfirst($HTTP_POST_VARS['invoice_status']).'['.$comment_status.']');
+ tep_db_perform(TABLE_ORDERS_STATUS_HISTORY, $sql_data_array);
+ tep_db_query("update ".TABLE_ORDERS." set orders_status = '".$order_status_id."', last_modified = now() where orders_id = '".(int)$HTTP_POST_VARS['order_id']."'");
+ if ($invoice_approved)
+ {
+ // for email
+ include(DIR_WS_LANGUAGES . $language . '/modules/payment/inpay.php');
+ // let's re-create the required arrays
+ require (DIR_WS_CLASSES.'order.php');
+ $order = new order($HTTP_POST_VARS['order_id']);
+ // START STATUS == COMPLETED LOOP
+ // initialized for the email confirmation
+ $products_ordered = '';
+ $total_tax = 0;
+
+ // let's update the stock
+ // #######################################################
+ for ($i = 0, $n = sizeof($order->products); $i < $n; $i++)
+ { // PRODUCT LOOP STARTS HERE
+ // Stock Update - Joao Correia
+ if ((MODULE_PAYMENT_INPAY_DECREASE_STOCK_ON_CREATION=='False') && (STOCK_LIMITED == 'true'))
+ {
+ if (DOWNLOAD_ENABLED == 'true')
+ {
+ $stock_query_raw = "SELECT products_quantity, pad.products_attributes_filename
+ FROM ".TABLE_PRODUCTS." p
+ LEFT JOIN ".TABLE_PRODUCTS_ATTRIBUTES." pa
+ ON p.products_id=pa.products_id
+ LEFT JOIN ".TABLE_PRODUCTS_ATTRIBUTES_DOWNLOAD." pad
+ ON pa.products_attributes_id=pad.products_attributes_id
+ WHERE p.products_id = '".tep_get_prid($order->products[$i]['id'])."'";
+ // Will work with only one option for downloadable products
+ // otherwise, we have to build the query dynamically with a loop
+ $products_attributes = $order->products[$i]['attributes'];
+ if (is_array($products_attributes))
+ {
+ $stock_query_raw .= " AND pa.options_id = '".$products_attributes[0]['option_id']."' AND pa.options_values_id = '".$products_attributes[0]['value_id']."'";
+ }
+ $stock_query = tep_db_query($stock_query_raw);
+ } else
+ {
+ $stock_query = tep_db_query("select products_quantity from ".TABLE_PRODUCTS." where products_id = '".tep_get_prid($order->products[$i]['id'])."'");
+ }
+ if (tep_db_num_rows($stock_query) > 0)
+ {
+ $stock_values = tep_db_fetch_array($stock_query);
+ // do not decrement quantities if products_attributes_filename exists
+ if ((DOWNLOAD_ENABLED != 'true') || (!$stock_values['products_attributes_filename']))
+ {
+ $stock_left = $stock_values['products_quantity']-$order->products[$i]['qty'];
+ } else
+ {
+ $stock_left = $stock_values['products_quantity'];
+ }
+ tep_db_query("update ".TABLE_PRODUCTS." set products_quantity = '".$stock_left."' where products_id = '".tep_get_prid($order->products[$i]['id'])."'");
+ if (($stock_left < 1) && (STOCK_ALLOW_CHECKOUT == 'false'))
+ {
+ tep_db_query("update ".TABLE_PRODUCTS." set products_status = '0' where products_id = '".tep_get_prid($order->products[$i]['id'])."'");
+ }
+ }
+ } // decrease stock end
+
+ // Update products_ordered (for bestsellers list)
+ tep_db_query("update ".TABLE_PRODUCTS." set products_ordered = products_ordered + ".sprintf('%d', $order->products[$i]['qty'])." where products_id = '".tep_get_prid($order->products[$i]['id'])."'");
+
+ // Let's get all the info together for the email
+ $total_weight += ($order->products[$i]['qty']*$order->products[$i]['weight']);
+ $total_tax += tep_calculate_tax($total_products_price, $products_tax)*$order->products[$i]['qty'];
+ $total_cost += $total_products_price;
+
+ // Let's get the attributes
+ $products_ordered_attributes = '';
+ if (( isset ($order->products[$i]['attributes'])) && (sizeof($order->products[$i]['attributes']) > 0))
+ {
+ for ($j = 0, $n2 = sizeof($order->products[$i]['attributes']); $j < $n2; $j++)
+ {
+ $products_ordered_attributes .= "\n\t".$order->products[$i]['attributes'][$j]['option'].' '.$order->products[$i]['attributes'][$j]['value'];
+ }
+ }
+
+ // Let's format the products model
+ $products_model = '';
+ if (! empty($order->products[$i]['model']))
+ {
+ $products_model = ' ('.$order->products[$i]['model'].')';
+ }
+
+ // Let's put all the product info together into a string
+ $products_ordered .= $order->products[$i]['qty'].' x '.$order->products[$i]['name'].$products_model.' = '.$currencies->display_price($order->products[$i]['final_price'], $order->products[$i]['tax'], $order->products[$i]['qty']).$products_ordered_attributes."\n";
+ } // PRODUCT LOOP ENDS HERE
+ #######################################################
+
+ // lets start with the email confirmation
+ // BOF content type fix by AlexStudio
+ $content_type = '';
+ $content_count = 0;
+ // BOF order comment fix
+ $comment_query = tep_db_query("select comments from ".TABLE_ORDERS_STATUS_HISTORY." where orders_id = '".$HTTP_POST_VARS['order_id']."'");
+ $comment_array = tep_db_fetch_array($comment_query);
+ $comments = $comment_array['comments'];
+ // EOF order comment fix
+
+ if (DOWNLOAD_ENABLED == 'true')
+ {
+ $content_query = tep_db_query("select * from ".TABLE_ORDERS_PRODUCTS_DOWNLOAD." where orders_id = '".(int)$HTTP_POST_VARS['order_id']."'");
+ $content_count = tep_db_num_rows($content_query);
+ if ($content_count > 0)
+ {
+ $content_type = 'virtual';
+ }
+ }
+ switch($content_type)
+ {
+ case 'virtual':
+ if ($content_count != sizeof($order->products))$content_type = 'mixed';
+ break;
+ default:
+ $content_type = 'physical';
+ break;
+ }
+ // EOF content type fix by AlexStudio
+ // $order variables have been changed from checkout_process to work with the variables from the function query () instead of cart () in the order class
+ $email_order = STORE_NAME."\n".
+ EMAIL_SEPARATOR."\n".
+ EMAIL_TEXT_ORDER_NUMBER.' '.$HTTP_POST_VARS['order_id']."\n".
+ EMAIL_TEXT_INVOICE_URL.' '.tep_href_link(FILENAME_ACCOUNT_HISTORY_INFO, 'order_id='.$HTTP_POST_VARS['order_id'], 'SSL', false)."\n".
+ EMAIL_TEXT_DATE_ORDERED.' '.strftime(DATE_FORMAT_LONG)."\n\n";
+ // BOF order comment fix by AlexStudio
+ if ($comments)
+ {
+ // do not add comments
+ // $email_order .= $comments."\n\n";
+ }
+ // EOF order comment fix by AlexStudio
+
+ $email_order .= EMAIL_TEXT_PRODUCTS."\n".
+ EMAIL_SEPARATOR."\n".
+ $products_ordered.
+ EMAIL_SEPARATOR."\n";
+
+ for ($i = 0, $n = sizeof($order->totals); $i < $n; $i++)
+ {
+ $email_order .= strip_tags($order->totals[$i]['title']).' '.strip_tags($order->totals[$i]['text'])."\n";
+ }
+ // BOF content type fix by AlexStudio
+ if ($content_type != 'virtual')
+ {
+ // EOF content type fix by AlexStudio
+ $email_order .= "\n".EMAIL_TEXT_DELIVERY_ADDRESS."\n".
+ EMAIL_SEPARATOR."\n".
+ tep_address_format($order->delivery['format_id'], $order->delivery, 0, '', "\n")."\n";
+ }
+
+ $email_order .= "\n".EMAIL_TEXT_BILLING_ADDRESS."\n".
+ EMAIL_SEPARATOR."\n".
+ tep_address_format($order->billing['format_id'], $order->billing, 0, '', "\n")."\n\n";
+ if (is_object($$payment))
+ {
+ $email_order .= EMAIL_TEXT_PAYMENT_METHOD."\n".
+ EMAIL_SEPARATOR."\n";
+ $payment_class = $$payment;
+ $email_order .= $payment_class->title."\n\n";
+ if ($payment_class->email_footer)
+ {
+ $email_order .= $payment_class->email_footer."\n\n";
+ }
+ }
+ tep_mail($order->customer['name'], $order->customer['email_address'], EMAIL_TEXT_SUBJECT, nl2br($email_order), STORE_OWNER, STORE_OWNER_EMAIL_ADDRESS);
+
+ // send emails to other people
+ if (SEND_EXTRA_ORDER_EMAILS_TO != '')
+ {
+ tep_mail('', SEND_EXTRA_ORDER_EMAILS_TO, EMAIL_TEXT_SUBJECT, nl2br($email_order), STORE_OWNER, STORE_OWNER_EMAIL_ADDRESS);
+ }
+ } // END oreder approved LOOP
+
+
+
+} else
+{
+ //
+ // Invalid result
+ //
+ //
+ // send warning email
+ //
+ if (tep_not_null(MODULE_PAYMENT_INPAY_DEBUG_EMAIL))
+ {
+ $email_body = '$HTTP_POST_VARS:'."\n\n";
+
+ reset($HTTP_POST_VARS);
+ while ( list ($key, $value) = each($HTTP_POST_VARS))
+ {
+ $email_body .= $key.'='.$value."\n";
+ }
+
+ $email_body .= "\n".'$HTTP_GET_VARS:'."\n\n";
+
+ reset($HTTP_GET_VARS);
+ while ( list ($key, $value) = each($HTTP_GET_VARS))
+ {
+ $email_body .= $key.'='.$value."\n";
+ }
+
+ tep_mail('', MODULE_PAYMENT_INPAY_DEBUG_EMAIL, 'Inpay Invalid Process', $email_body, STORE_OWNER, STORE_OWNER_EMAIL_ADDRESS);
+ }
+ //
+ // add error message to history if order can be found
+ //
+ if ( isset ($HTTP_POST_VARS['order_id']) && is_numeric($HTTP_POST_VARS['order_id']) && ($HTTP_POST_VARS['order_id'] > 0))
+ {
+ $check_query = tep_db_query("select orders_id from ".TABLE_ORDERS." where orders_id = '".$HTTP_POST_VARS['order_id']."'"); //TODO: fix custom "' and customers_id = '" . (int)$HTTP_POST_VARS['custom'] . "'");
+ $order_status_id = $order['orders_status'];
+ if (($order_status_id==null)||($order['orders_status']=='')){
+ $order_status_id = DEFAULT_ORDERS_STATUS_ID;
+ }
+ if (tep_db_num_rows($check_query) > 0)
+ {
+ $comment_status = $result;
+ //tep_db_query("update ".TABLE_ORDERS." set orders_status = '".((MODULE_PAYMENT_INPAY_ORDER_STATUS_ID > 0)?MODULE_PAYMENT_INPAY_ORDER_STATUS_ID:DEFAULT_ORDERS_STATUS_ID)."', last_modified = now() where orders_id = '".$HTTP_POST_VARS['order_id']."'");
+ $sql_data_array = array ('orders_id'=>$HTTP_POST_VARS['order_id'],
+ 'orders_status_id'=>$order_status_id,
+ 'date_added'=>'now()',
+ 'customer_notified'=>'0',
+ 'comments'=>'Inpay Invalid ['.$comment_status.']');
+ tep_db_perform(TABLE_ORDERS_STATUS_HISTORY, $sql_data_array);
+ }
+ }
+}
+
+require ('includes/application_bottom.php');
+
+?>
View
46 catalog/includes/languages/english/modules/payment/inpay.php
@@ -0,0 +1,46 @@
+<?php
+/*
+ $Id: inpay.php VER: 1.0.3443 $
+ osCommerce, Open Source E-Commerce Solutions
+ http://www.oscommerce.com
+ Copyright (c) 2008 osCommerce
+ Released under the GNU General Public License
+ */
+
+ define('MODULE_PAYMENT_INPAY_TEXT_TITLE', 'Inpay - instant online bank transfers');
+ define('MODULE_PAYMENT_INPAY_TEXT_PUBLIC_TITLE', 'Pay with your online bank - instant and 100% secure');
+ define('MODULE_PAYMENT_INPAY_TEXT_PUBLIC_HTML', '<img src="https://resources.inpay.com/images/oscommerce/inpay_checkout.png" alt="Secure checkouts using inpay" /><br /><br />
+ <table cellspacing="5">
+ <tr><td><img src="https://resources.inpay.com/images/oscommerce/inpay_check.png" alt="100% Secure payments using inpay" /></td><td class="main">100% Secure payments using inpay <span style="color: #666;">- our security level matches the security of your online bank.</span></td></tr>
+ <tr><td><img src="https://resources.inpay.com/images/oscommerce/inpay_check.png" alt="Instant payments using inpay" /></td><td class="main">Instant payments using inpay <span style="color: #666;">- our system ensures you will receive your order as soon as possible.</span></td></tr>
+ <tr><td><img src="https://resources.inpay.com/images/oscommerce/inpay_check.png" alt="Anonymous payment using inpay" /></td><td class="main">Anonymous payment using inpay <span style="color: #666;">- no need to share your credit card number or any other personal information.</span></td></tr>
+ </table><a href="http://inpay.com/shoppers" style="text-decoration: underline;" target="_blank" class="main">Click here to read more about inpay</a><br />');
+ define('MODULE_PAYMENT_INPAY_TEXT_DESCRIPTION', '<strong>What is inpay?</strong><br />
+ inpay is an extra payment option for webshops, that allows customers to pay using their online bank - instantly and worldwide.<br />
+ <br />
+ <strong>Increase profits</strong><br />
+ By allowing shoppers to pay using their online bank, you can now sell to customers that are otherwise unable or unwilling to pay today.<br />
+<br />
+<strong>Increase market size</strong><br />
+By offering your customers the inpay payment option you increase your market share to not only credit and debit card owners, but also online bank users from all over the world.<br />
+<br />
+<strong>No risk</strong><br />
+With inpay there is no risk of credit card fraud or any kind of chargebacks. This means that when you get paid you stay paid! With inpay you can even sell to customers from \'high risk\' regions including all parts of Asia and Eastern Europe.<br /><br />
+ <a href="http://inpay.com/" style="text-decoration: underline;" target="_blank">Read more or signup at inpay.com</a><br />');
+ // ------------- e-mail settings ---------------------------------
+ define('EMAIL_TEXT_SUBJECT', 'Payment confirmed by inpay');
+ define('EMAIL_TEXT_ORDER_NUMBER', 'Order Number:');
+ define('EMAIL_TEXT_INVOICE_URL', 'Detailed Invoice:');
+ define('EMAIL_TEXT_DATE_ORDERED', 'Date Ordered:');
+ define('EMAIL_TEXT_PRODUCTS', 'Products');
+ define('EMAIL_TEXT_SUBTOTAL', 'Sub-Total:');
+ define('EMAIL_TEXT_TAX', 'Tax: ');
+ define('EMAIL_TEXT_SHIPPING', 'Shipping: ');
+ define('EMAIL_TEXT_TOTAL', 'Total: ');
+ define('EMAIL_TEXT_DELIVERY_ADDRESS', 'Delivery Address');
+ define('EMAIL_TEXT_BILLING_ADDRESS', 'Billing Address');
+ define('EMAIL_TEXT_PAYMENT_METHOD', 'Payment Method');
+ define('EMAIL_SEPARATOR', '------------------------------------------------------');
+ define('TEXT_EMAIL_VIA', 'via');
+
+?>
View
701 catalog/includes/modules/payment/inpay.php
@@ -0,0 +1,701 @@
+<?php
+/*
+ $Id: inpay.php VER: 1.0.3443 $
+ osCommerce, Open Source E-Commerce Solutions
+ http://www.oscommerce.com
+ Copyright (c) 2008 osCommerce
+ Released under the GNU General Public License
+ */
+
+require_once(DIR_FS_CATALOG.'ext/modules/payment/inpay/inpay_functions.php');
+
+class inpay
+{
+ var $code, $title, $description, $enabled;
+
+ // class constructor
+ function inpay()
+ {
+ global $order;
+ $this->signature = 'inpay|inpay|1.0|2.2';
+ $this->code = 'inpay';
+ $this->title = MODULE_PAYMENT_INPAY_TEXT_TITLE;
+ $this->public_title = MODULE_PAYMENT_INPAY_TEXT_PUBLIC_TITLE;
+ $this->description = MODULE_PAYMENT_INPAY_TEXT_DESCRIPTION;
+ $this->sort_order = MODULE_PAYMENT_INPAY_SORT_ORDER;
+ $this->enabled = ((MODULE_PAYMENT_INPAY_STATUS == 'True')?true:false);
+
+ // if ((int)MODULE_PAYMENT_INPAY_PREPARE_ORDER_STATUS_ID > 0)
+ // {
+ // $this->order_status = MODULE_PAYMENT_INPAY_PREPARE_ORDER_STATUS_ID;
+ // }
+
+ if (is_object($order))$this->update_status();
+
+ if (MODULE_PAYMENT_INPAY_GATEWAY_SERVER == 'Production')
+ {
+ $this->form_action_url = 'https://secure.inpay.com';
+ } else
+ {
+ $this->form_action_url = 'https://test-secure.inpay.com';
+ }
+ }
+
+ // class methods
+ function update_status()
+ {
+ global $order;
+
+ if (($this->enabled == true) && ((int)MODULE_PAYMENT_INPAY_ZONE > 0))
+ {
+ $check_flag = false;
+ $check_query = tep_db_query("select zone_id from ".TABLE_ZONES_TO_GEO_ZONES." where geo_zone_id = '".MODULE_PAYMENT_INPAY_ZONE."' and zone_country_id = '".$order->billing['country']['id']."' order by zone_id");
+ while ($check = tep_db_fetch_array($check_query))
+ {
+ if ($check['zone_id'] < 1)
+ {
+ $check_flag = true;
+ break;
+ } elseif ($check['zone_id'] == $order->billing['zone_id'])
+ {
+ $check_flag = true;
+ break;
+ }
+ }
+
+ if ($check_flag == false)
+ {
+ $this->enabled = false;
+ }
+ }
+ }
+
+ function javascript_validation()
+ {
+ return false;
+ }
+
+ function selection()
+ {
+ global $cart_inpay_Standard_ID;
+
+ if (tep_session_is_registered('cart_inpay_Standard_ID'))
+ {
+ $order_id = substr($cart_inpay_Standard_ID, strpos($cart_inpay_Standard_ID, '-')+1);
+
+ $check_query = tep_db_query('select orders_id from '.TABLE_ORDERS_STATUS_HISTORY.' where orders_id = "'.(int)$order_id.'" limit 1');
+
+ if (tep_db_num_rows($check_query) < 1)
+ {
+ tep_db_query('delete from '.TABLE_ORDERS.' where orders_id = "'.(int)$order_id.'"');
+ tep_db_query('delete from '.TABLE_ORDERS_TOTAL.' where orders_id = "'.(int)$order_id.'"');
+ tep_db_query('delete from '.TABLE_ORDERS_STATUS_HISTORY.' where orders_id = "'.(int)$order_id.'"');
+ tep_db_query('delete from '.TABLE_ORDERS_PRODUCTS.' where orders_id = "'.(int)$order_id.'"');
+ tep_db_query('delete from '.TABLE_ORDERS_PRODUCTS_ATTRIBUTES.' where orders_id = "'.(int)$order_id.'"');
+ tep_db_query('delete from '.TABLE_ORDERS_PRODUCTS_DOWNLOAD.' where orders_id = "'.(int)$order_id.'"');
+
+ tep_session_unregister('cart_inpay_Standard_ID');
+ }
+ }
+
+ return array ('id'=>$this->code,
+ 'module'=>$this->public_title, 'fields' => array(array('title' => '', 'field' => MODULE_PAYMENT_INPAY_TEXT_PUBLIC_HTML)));
+ }
+
+ function pre_confirmation_check()
+ {
+ global $cartID, $cart;
+
+ if ( empty($cart->cartID))
+ {
+ $cartID = $cart->cartID = $cart->generate_cart_id();
+ }
+
+ if (!tep_session_is_registered('cartID'))
+ {
+ tep_session_register('cartID');
+ }
+ }
+
+ function confirmation()
+ {
+ global $cartID, $cart_inpay_Standard_ID, $customer_id, $languages_id, $order, $order_total_modules;
+
+ if (tep_session_is_registered('cartID'))
+ {
+ $insert_order = false;
+
+ if (tep_session_is_registered('cart_inpay_Standard_ID'))
+ {
+ $order_id = substr($cart_inpay_Standard_ID, strpos($cart_inpay_Standard_ID, '-')+1);
+
+ $curr_check = tep_db_query("select currency from ".TABLE_ORDERS." where orders_id = '".(int)$order_id."'");
+ $curr = tep_db_fetch_array($curr_check);
+
+ if (($curr['currency'] != $order->info['currency']) || ($cartID != substr($cart_inpay_Standard_ID, 0, strlen($cartID))))
+ {
+ $check_query = tep_db_query('select orders_id from '.TABLE_ORDERS_STATUS_HISTORY.' where orders_id = "'.(int)$order_id.'" limit 1');
+
+ if (tep_db_num_rows($check_query) < 1)
+ {
+ tep_db_query('delete from '.TABLE_ORDERS.' where orders_id = "'.(int)$order_id.'"');
+ tep_db_query('delete from '.TABLE_ORDERS_TOTAL.' where orders_id = "'.(int)$order_id.'"');
+ tep_db_query('delete from '.TABLE_ORDERS_STATUS_HISTORY.' where orders_id = "'.(int)$order_id.'"');
+ tep_db_query('delete from '.TABLE_ORDERS_PRODUCTS.' where orders_id = "'.(int)$order_id.'"');
+ tep_db_query('delete from '.TABLE_ORDERS_PRODUCTS_ATTRIBUTES.' where orders_id = "'.(int)$order_id.'"');
+ tep_db_query('delete from '.TABLE_ORDERS_PRODUCTS_DOWNLOAD.' where orders_id = "'.(int)$order_id.'"');
+ }
+
+ $insert_order = true;
+ }
+ } else
+ {
+ $insert_order = true;
+ }
+
+ if ($insert_order == true)
+ {
+ $order_totals = array ();
+ if (is_array($order_total_modules->modules))
+ {
+ reset($order_total_modules->modules);
+ while ( list (, $value) = each($order_total_modules->modules))
+ {
+ $class = substr($value, 0, strrpos($value, '.'));
+ if ($GLOBALS[$class]->enabled)
+ {
+ for ($i = 0, $n = sizeof($GLOBALS[$class]->output); $i < $n; $i++)
+ {
+ if (tep_not_null($GLOBALS[$class]->output[$i]['title']) && tep_not_null($GLOBALS[$class]->output[$i]['text']))
+ {
+ $order_totals[] = array ('code'=>$GLOBALS[$class]->code,
+ 'title'=>$GLOBALS[$class]->output[$i]['title'],
+ 'text'=>$GLOBALS[$class]->output[$i]['text'],
+ 'value'=>$GLOBALS[$class]->output[$i]['value'],
+ 'sort_order'=>$GLOBALS[$class]->sort_order);
+ }
+ }
+ }
+ }
+ }
+
+ $sql_data_array = array ('customers_id'=>$customer_id,
+ 'customers_name'=>$order->customer['firstname'].' '.$order->customer['lastname'],
+ 'customers_company'=>$order->customer['company'],
+ 'customers_street_address'=>$order->customer['street_address'],
+ 'customers_suburb'=>$order->customer['suburb'],
+ 'customers_city'=>$order->customer['city'],
+ 'customers_postcode'=>$order->customer['postcode'],
+ 'customers_state'=>$order->customer['state'],
+ 'customers_country'=>$order->customer['country']['title'],
+ 'customers_telephone'=>$order->customer['telephone'],
+ 'customers_email_address'=>$order->customer['email_address'],
+ 'customers_address_format_id'=>$order->customer['format_id'],
+ 'delivery_name'=>$order->delivery['firstname'].' '.$order->delivery['lastname'],
+ 'delivery_company'=>$order->delivery['company'],
+ 'delivery_street_address'=>$order->delivery['street_address'],
+ 'delivery_suburb'=>$order->delivery['suburb'],
+ 'delivery_city'=>$order->delivery['city'],
+ 'delivery_postcode'=>$order->delivery['postcode'],
+ 'delivery_state'=>$order->delivery['state'],
+ 'delivery_country'=>$order->delivery['country']['title'],
+ 'delivery_address_format_id'=>$order->delivery['format_id'],
+ 'billing_name'=>$order->billing['firstname'].' '.$order->billing['lastname'],
+ 'billing_company'=>$order->billing['company'],
+ 'billing_street_address'=>$order->billing['street_address'],
+ 'billing_suburb'=>$order->billing['suburb'],
+ 'billing_city'=>$order->billing['city'],
+ 'billing_postcode'=>$order->billing['postcode'],
+ 'billing_state'=>$order->billing['state'],
+ 'billing_country'=>$order->billing['country']['title'],
+ 'billing_address_format_id'=>$order->billing['format_id'],
+ 'payment_method'=>$order->info['payment_method'],
+ 'cc_type'=>$order->info['cc_type'],
+ 'cc_owner'=>$order->info['cc_owner'],
+ 'cc_number'=>$order->info['cc_number'],
+ 'cc_expires'=>$order->info['cc_expires'],
+ 'date_purchased'=>'now()',
+ 'orders_status'=>$order->info['order_status'],
+ 'currency'=>$order->info['currency'],
+ 'currency_value'=>$order->info['currency_value']);
+
+ tep_db_perform(TABLE_ORDERS, $sql_data_array);
+
+ $insert_id = tep_db_insert_id();
+
+ for ($i = 0, $n = sizeof($order_totals); $i < $n; $i++)
+ {
+ $sql_data_array = array ('orders_id'=>$insert_id,
+ 'title'=>$order_totals[$i]['title'],
+ 'text'=>$order_totals[$i]['text'],
+ 'value'=>$order_totals[$i]['value'],
+ 'class'=>$order_totals[$i]['code'],
+ 'sort_order'=>$order_totals[$i]['sort_order']);
+
+ tep_db_perform(TABLE_ORDERS_TOTAL, $sql_data_array);
+ }
+
+ for ($i = 0, $n = sizeof($order->products); $i < $n; $i++)
+ {
+ $sql_data_array = array ('orders_id'=>$insert_id,
+ 'products_id'=>tep_get_prid($order->products[$i]['id']),
+ 'products_model'=>$order->products[$i]['model'],
+ 'products_name'=>$order->products[$i]['name'],
+ 'products_price'=>$order->products[$i]['price'],
+ 'final_price'=>$order->products[$i]['final_price'],
+ 'products_tax'=>$order->products[$i]['tax'],
+ 'products_quantity'=>$order->products[$i]['qty']);
+
+ tep_db_perform(TABLE_ORDERS_PRODUCTS, $sql_data_array);
+
+ $order_products_id = tep_db_insert_id();
+
+ $attributes_exist = '0';
+ if ( isset ($order->products[$i]['attributes']))
+ {
+ $attributes_exist = '1';
+ for ($j = 0, $n2 = sizeof($order->products[$i]['attributes']); $j < $n2; $j++)
+ {
+ if (DOWNLOAD_ENABLED == 'true')
+ {
+ $attributes_query = "select popt.products_options_name, poval.products_options_values_name, pa.options_values_price, pa.price_prefix, pad.products_attributes_maxdays, pad.products_attributes_maxcount , pad.products_attributes_filename
+ from ".TABLE_PRODUCTS_OPTIONS." popt, ".TABLE_PRODUCTS_OPTIONS_VALUES." poval, ".TABLE_PRODUCTS_ATTRIBUTES." pa
+ left join ".TABLE_PRODUCTS_ATTRIBUTES_DOWNLOAD." pad
+ on pa.products_attributes_id=pad.products_attributes_id
+ where pa.products_id = '".$order->products[$i]['id']."'
+ and pa.options_id = '".$order->products[$i]['attributes'][$j]['option_id']."'
+ and pa.options_id = popt.products_options_id
+ and pa.options_values_id = '".$order->products[$i]['attributes'][$j]['value_id']."'
+ and pa.options_values_id = poval.products_options_values_id
+ and popt.language_id = '".$languages_id."'
+ and poval.language_id = '".$languages_id."'";
+ $attributes = tep_db_query($attributes_query);
+ } else
+ {
+ $attributes = tep_db_query("select popt.products_options_name, poval.products_options_values_name, pa.options_values_price, pa.price_prefix from ".TABLE_PRODUCTS_OPTIONS." popt, ".TABLE_PRODUCTS_OPTIONS_VALUES." poval, ".TABLE_PRODUCTS_ATTRIBUTES." pa where pa.products_id = '".$order->products[$i]['id']."' and pa.options_id = '".$order->products[$i]['attributes'][$j]['option_id']."' and pa.options_id = popt.products_options_id and pa.options_values_id = '".$order->products[$i]['attributes'][$j]['value_id']."' and pa.options_values_id = poval.products_options_values_id and popt.language_id = '".$languages_id."' and poval.language_id = '".$languages_id."'");
+ }
+ $attributes_values = tep_db_fetch_array($attributes);
+
+ $sql_data_array = array ('orders_id'=>$insert_id,
+ 'orders_products_id'=>$order_products_id,
+ 'products_options'=>$attributes_values['products_options_name'],
+ 'products_options_values'=>$attributes_values['products_options_values_name'],
+ 'options_values_price'=>$attributes_values['options_values_price'],
+ 'price_prefix'=>$attributes_values['price_prefix']);
+
+ tep_db_perform(TABLE_ORDERS_PRODUCTS_ATTRIBUTES, $sql_data_array);
+
+ if ((DOWNLOAD_ENABLED == 'true') && isset ($attributes_values['products_attributes_filename']) && tep_not_null($attributes_values['products_attributes_filename']))
+ {
+ $sql_data_array = array ('orders_id'=>$insert_id,
+ 'orders_products_id'=>$order_products_id,
+ 'orders_products_filename'=>$attributes_values['products_attributes_filename'],
+ 'download_maxdays'=>$attributes_values['products_attributes_maxdays'],
+ 'download_count'=>$attributes_values['products_attributes_maxcount']);
+
+ tep_db_perform(TABLE_ORDERS_PRODUCTS_DOWNLOAD, $sql_data_array);
+ }
+ }
+ }
+ }
+
+ $cart_inpay_Standard_ID = $cartID.'-'.$insert_id;
+ tep_session_register('cart_inpay_Standard_ID');
+ }
+ }
+
+ return false;
+ }
+
+ function process_button()
+ {
+ global $customer_id, $order, $sendto, $currency, $cart_inpay_Standard_ID, $shipping;
+
+ $process_button_string = '';
+ $parameters = array ('cmd'=>'_xclick',
+ 'item_name'=>STORE_NAME,
+ 'shipping'=>$this->format_raw($order->info['shipping_cost']),
+ 'tax'=>$this->format_raw($order->info['tax']),
+ //'business'=>MODULE_PAYMENT_INPAY_ID,
+ 'amount'=>$this->format_raw($order->info['total']), //TODO: we do not calculate tax+shipping only gross total -$order->info['shipping_cost']-$order->info['tax']),
+ 'currency'=>$currency,
+ 'order_id'=>substr($cart_inpay_Standard_ID, strpos($cart_inpay_Standard_ID, '-')+1),
+ 'custom'=>$customer_id,
+ 'no_note'=>'1',
+ 'notify_url'=>tep_href_link('ext/modules/payment/inpay/pb_handler.php', '', 'SSL', false, false),
+ 'return_url'=>tep_href_link(FILENAME_CHECKOUT_PROCESS, '', 'SSL'),
+ 'cancel_url'=>tep_href_link(FILENAME_CHECKOUT_PAYMENT, '', 'SSL'),
+ 'bn'=>'osCommerce22_Default_ST',
+ 'buyer_email'=>$order->customer['email_address'],
+ 'merchant_id'=>MODULE_PAYMENT_INPAY_MERCHANT_ID,
+ 'flow_layout'=>MODULE_PAYMENT_INPAY_FLOW_LAYOUT,
+ 'paymentaction'=>'Sale');
+
+ if (is_numeric($sendto) && ($sendto > 0))
+ {
+ $address = '';
+ $address = $order->delivery['street_address'].' '.$order->delivery['city'].' '.
+ tep_get_zone_code($order->delivery['country']['id'], $order->delivery['zone_id'], $order->delivery['state']).
+ ' '.$order->delivery['postcode'].' '.$order->delivery['country']['iso_code_2'];
+
+ $parameters['address_override'] = '1';
+ $parameters['buyer_name'] = utf8_encode($order->delivery['firstname']." ".$order->delivery['lastname']);
+ $parameters['buyer_address'] = utf8_encode($address);
+ $parameters['country'] = $order->delivery['country']['iso_code_2'];
+ } else
+ {
+ $address = '';
+ $address = $order->billing['street_address'].' '.$order->billing['city'].' '.
+ tep_get_zone_code($order->billing['country']['id'], $order->billing['zone_id'], $order->billing['state']).
+ ' '.$order->billing['postcode'].' '.$order->billing['country']['iso_code_2'];
+ $parameters['buyer_name'] = utf8_encode($order->billing['firstname']." ".$order->billing['lastname']);
+ $parameters['buyer_address'] = utf8_encode($address);
+ $parameters['country'] = $order->billing['country']['iso_code_2'];
+ }
+ //
+ // pruduct(s) info
+ //
+ $products_info = '';
+ for ($i = 0, $n = sizeof($order->products); $i < $n; $i++)
+ {
+ $products_info = $products_info.$order->products[$i]['qty']."x".
+ $order->products[$i]['model'].' '.$order->products[$i]['name'].";";
+ }
+ $parameters['order_text'] = utf8_encode($products_info);
+ //
+ // calc Md5 sum
+ //
+ $parameters['checksum'] = $this->calcInpayMd5Key($parameters);
+ reset($parameters);
+ while ( list ($key, $value) = each($parameters))
+ {
+ $process_button_string .= tep_draw_hidden_field($key, $value);
+ }
+ return $process_button_string;
+ }
+
+ function before_process()
+ {
+ global $customer_id, $order, $order_totals, $sendto, $billto, $languages_id, $payment, $currencies, $cart, $cart_inpay_Standard_ID;
+ global $$payment;
+ $order_id = substr($cart_inpay_Standard_ID, strpos($cart_inpay_Standard_ID, '-')+1);
+ $my_status_query = tep_db_query("select orders_status from ".TABLE_ORDERS." where orders_id = '".$order_id."'"); // TODO: fix PB to add all params"' and customers_id = '" . (int)$HTTP_POST_VARS['custom'] . "'");
+ $current_status_id = 0;
+ $delivered_status = 3;
+ $update_status = true;
+ if (tep_db_num_rows($my_status_query) > 0)
+ {
+ $o_stat = tep_db_fetch_array($my_status_query);
+ $current_status_id = (int)$o_stat['orders_status'];
+ }
+ if (($current_status_id == MODULE_PAYMENT_INPAY_COMP_ORDER_STATUS_ID) || ($current_status_id == $delivered_status))
+ {
+ $update_status = false;
+ }
+ if ($update_status)
+ {
+ $order_status_id = (int)DEFAULT_ORDERS_STATUS_ID;
+ tep_db_query("update ".TABLE_ORDERS." set orders_status = '".$order_status_id."', last_modified = now() where orders_id = '".(int)$order_id."'");
+
+ $sql_data_array = array ('orders_id'=>$order_id,
+ 'orders_status_id'=>$order_status_id,
+ 'date_added'=>'now()',
+ 'customer_notified'=>(SEND_EMAILS == 'true')?'1':'0',
+ 'comments'=>$order->info['comments']);
+
+ tep_db_perform(TABLE_ORDERS_STATUS_HISTORY, $sql_data_array);
+ }
+ // initialized for the email confirmation
+ $products_ordered = '';
+ $subtotal = 0;
+ $total_tax = 0;
+
+ for ($i = 0, $n = sizeof($order->products); $i < $n; $i++)
+ {
+ // Stock Update - Joao Correia
+ if ((MODULE_PAYMENT_INPAY_DECREASE_STOCK_ON_CREATION == 'True') && (STOCK_LIMITED == 'true'))
+ {
+ if (DOWNLOAD_ENABLED == 'true')
+ {
+ $stock_query_raw = "SELECT products_quantity, pad.products_attributes_filename
+ FROM ".TABLE_PRODUCTS." p
+ LEFT JOIN ".TABLE_PRODUCTS_ATTRIBUTES." pa
+ ON p.products_id=pa.products_id
+ LEFT JOIN ".TABLE_PRODUCTS_ATTRIBUTES_DOWNLOAD." pad
+ ON pa.products_attributes_id=pad.products_attributes_id
+ WHERE p.products_id = '".tep_get_prid($order->products[$i]['id'])."'";
+ // Will work with only one option for downloadable products
+ // otherwise, we have to build the query dynamically with a loop
+ $products_attributes = $order->products[$i]['attributes'];
+ if (is_array($products_attributes))
+ {
+ $stock_query_raw .= " AND pa.options_id = '".$products_attributes[0]['option_id']."' AND pa.options_values_id = '".$products_attributes[0]['value_id']."'";
+ }
+ $stock_query = tep_db_query($stock_query_raw);
+ } else
+ {
+ $stock_query = tep_db_query("select products_quantity from ".TABLE_PRODUCTS." where products_id = '".tep_get_prid($order->products[$i]['id'])."'");
+ }
+ if (tep_db_num_rows($stock_query) > 0)
+ {
+ $stock_values = tep_db_fetch_array($stock_query);
+ // do not decrement quantities if products_attributes_filename exists
+ if ((DOWNLOAD_ENABLED != 'true') || (!$stock_values['products_attributes_filename']))
+ {
+ $stock_left = $stock_values['products_quantity']-$order->products[$i]['qty'];
+ } else
+ {
+ $stock_left = $stock_values['products_quantity'];
+ }
+ tep_db_query("update ".TABLE_PRODUCTS." set products_quantity = '".$stock_left."' where products_id = '".tep_get_prid($order->products[$i]['id'])."'");
+ if (($stock_left < 1) && (STOCK_ALLOW_CHECKOUT == 'false'))
+ {
+ tep_db_query("update ".TABLE_PRODUCTS." set products_status = '0' where products_id = '".tep_get_prid($order->products[$i]['id'])."'");
+ }
+ }
+ } // Decrease stock ended
+
+ // Update products_ordered (for bestsellers list)
+ tep_db_query("update ".TABLE_PRODUCTS." set products_ordered = products_ordered + ".sprintf('%d', $order->products[$i]['qty'])." where products_id = '".tep_get_prid($order->products[$i]['id'])."'");
+
+ //------insert customer choosen option to order--------
+ $attributes_exist = '0';
+ $products_ordered_attributes = '';
+ if ( isset ($order->products[$i]['attributes']))
+ {
+ $attributes_exist = '1';
+ for ($j = 0, $n2 = sizeof($order->products[$i]['attributes']); $j < $n2; $j++)
+ {
+ if (DOWNLOAD_ENABLED == 'true')
+ {
+ $attributes_query = "select popt.products_options_name, poval.products_options_values_name, pa.options_values_price, pa.price_prefix, pad.products_attributes_maxdays, pad.products_attributes_maxcount , pad.products_attributes_filename
+ from ".TABLE_PRODUCTS_OPTIONS." popt, ".TABLE_PRODUCTS_OPTIONS_VALUES." poval, ".TABLE_PRODUCTS_ATTRIBUTES." pa
+ left join ".TABLE_PRODUCTS_ATTRIBUTES_DOWNLOAD." pad
+ on pa.products_attributes_id=pad.products_attributes_id
+ where pa.products_id = '".$order->products[$i]['id']."'
+ and pa.options_id = '".$order->products[$i]['attributes'][$j]['option_id']."'
+ and pa.options_id = popt.products_options_id
+ and pa.options_values_id = '".$order->products[$i]['attributes'][$j]['value_id']."'
+ and pa.options_values_id = poval.products_options_values_id
+ and popt.language_id = '".$languages_id."'
+ and poval.language_id = '".$languages_id."'";
+ $attributes = tep_db_query($attributes_query);
+ } else
+ {
+ $attributes = tep_db_query("select popt.products_options_name, poval.products_options_values_name, pa.options_values_price, pa.price_prefix from ".TABLE_PRODUCTS_OPTIONS." popt, ".TABLE_PRODUCTS_OPTIONS_VALUES." poval, ".TABLE_PRODUCTS_ATTRIBUTES." pa where pa.products_id = '".$order->products[$i]['id']."' and pa.options_id = '".$order->products[$i]['attributes'][$j]['option_id']."' and pa.options_id = popt.products_options_id and pa.options_values_id = '".$order->products[$i]['attributes'][$j]['value_id']."' and pa.options_values_id = poval.products_options_values_id and popt.language_id = '".$languages_id."' and poval.language_id = '".$languages_id."'");
+ }
+ $attributes_values = tep_db_fetch_array($attributes);
+
+ $products_ordered_attributes .= "\n\t".$attributes_values['products_options_name'].' '.$attributes_values['products_options_values_name'];
+ }
+ }
+ //------insert customer choosen option eof ----
+ $total_weight += ($order->products[$i]['qty']*$order->products[$i]['weight']);
+ $total_tax += tep_calculate_tax($total_products_price, $products_tax)*$order->products[$i]['qty'];
+ $total_cost += $total_products_price;
+
+ $products_ordered .= $order->products[$i]['qty'].' x '.$order->products[$i]['name'].' ('.$order->products[$i]['model'].') = '.$currencies->display_price($order->products[$i]['final_price'], $order->products[$i]['tax'], $order->products[$i]['qty']).$products_ordered_attributes."\n";
+ }
+
+ // lets start with the email confirmation
+ $email_order = STORE_NAME."\n".
+ EMAIL_SEPARATOR."\n".
+ EMAIL_TEXT_ORDER_NUMBER.' '.$order_id."\n".
+ EMAIL_TEXT_INVOICE_URL.' '.tep_href_link(FILENAME_ACCOUNT_HISTORY_INFO, 'order_id='.$order_id, 'SSL', false)."\n".
+ EMAIL_TEXT_DATE_ORDERED.' '.strftime(DATE_FORMAT_LONG)."\n\n";
+ if ($order->info['comments'])
+ {
+ $email_order .= tep_db_output($order->info['comments'])."\n\n";
+ }
+ $email_order .= EMAIL_TEXT_PRODUCTS."\n".
+ EMAIL_SEPARATOR."\n".
+ $products_ordered.
+ EMAIL_SEPARATOR."\n";
+
+ for ($i = 0, $n = sizeof($order_totals); $i < $n; $i++)
+ {
+ $email_order .= strip_tags($order_totals[$i]['title']).' '.strip_tags($order_totals[$i]['text'])."\n";
+ }
+
+ if ($order->content_type != 'virtual')
+ {
+ $email_order .= "\n".EMAIL_TEXT_DELIVERY_ADDRESS."\n".
+ EMAIL_SEPARATOR."\n".
+ tep_address_label($customer_id, $sendto, 0, '', "\n")."\n";
+ }
+
+ $email_order .= "\n".EMAIL_TEXT_BILLING_ADDRESS."\n".
+ EMAIL_SEPARATOR."\n".
+ tep_address_label($customer_id, $billto, 0, '', "\n")."\n\n";
+
+ if (is_object($$payment))
+ {
+ $email_order .= EMAIL_TEXT_PAYMENT_METHOD."\n".
+ EMAIL_SEPARATOR."\n";
+ $payment_class = $$payment;
+ $email_order .= $payment_class->title."\n\n";
+ if ($payment_class->email_footer)
+ {
+ $email_order .= $payment_class->email_footer."\n\n";
+ }
+ }
+ //
+ // sent email only if post back not did not respond - we send it from post back handler
+ //
+ if ($update_status)
+ {
+ tep_mail($order->customer['firstname'].' '.$order->customer['lastname'], $order->customer['email_address'], EMAIL_TEXT_SUBJECT, $email_order, STORE_OWNER, STORE_OWNER_EMAIL_ADDRESS);
+ // send emails to other people
+ if (SEND_EXTRA_ORDER_EMAILS_TO != '')
+ {
+ tep_mail('', SEND_EXTRA_ORDER_EMAILS_TO, EMAIL_TEXT_SUBJECT, $email_order, STORE_OWNER, STORE_OWNER_EMAIL_ADDRESS);
+ }
+ }
+ // load the after_process function from the payment modules
+ $this->after_process();
+
+ $cart->reset(true);
+
+ // unregister session variables used during checkout
+ tep_session_unregister('sendto');
+ tep_session_unregister('billto');
+ tep_session_unregister('shipping');
+ tep_session_unregister('payment');
+ tep_session_unregister('comments');
+
+ tep_session_unregister('cart_inpay_Standard_ID');
+
+ tep_redirect(tep_href_link(FILENAME_CHECKOUT_SUCCESS, '', 'SSL'));
+ }
+
+ function after_process()
+ {
+ return false;
+ }
+
+ function output_error()
+ {
+ return false;
+ }
+
+ function check()
+ {
+ if (! isset ($this->_check))
+ {
+ $check_query = tep_db_query("select configuration_value from ".TABLE_CONFIGURATION." where configuration_key = 'MODULE_PAYMENT_INPAY_STATUS'");
+ $this->_check = tep_db_num_rows($check_query);
+ }
+ return $this->_check;
+ }
+ function set_order_status($order_status, $set_to_public)
+ {
+ $status_id = 0;
+ $check_query = tep_db_query("select orders_status_id from ".TABLE_ORDERS_STATUS." where orders_status_name = '".$order_status."' limit 1");
+ if (tep_db_num_rows($check_query) < 1)
+ {
+ $status_query = tep_db_query("select max(orders_status_id) as status_id from ".TABLE_ORDERS_STATUS);
+ $status = tep_db_fetch_array($status_query);
+ $status_id = $status['status_id']+1;
+ $languages = tep_get_languages();
+ $flags_query = tep_db_query("describe " . TABLE_ORDERS_STATUS . " public_flag");
+ if (tep_db_num_rows($flags_query) == 1) {
+ foreach ($languages as $lang)
+ {
+ tep_db_query("insert into ".TABLE_ORDERS_STATUS." (orders_status_id, language_id, orders_status_name, public_flag) values ('".$status_id."', '".$lang['id']."', "."'".$order_status."', 1)");
+ }
+ }else{
+ foreach ($languages as $lang)
+ {
+ tep_db_query("insert into ".TABLE_ORDERS_STATUS." (orders_status_id, language_id, orders_status_name) values ('".$status_id."', '".$lang['id']."', "."'".$order_status."')");
+ }
+ }
+
+
+ } else
+ {
+ $check = tep_db_fetch_array($check_query);
+ $status_id = $check['orders_status_id'];
+ }
+ return $status_id;
+ }
+ function install()
+ {
+ $created_status_id = $this->set_order_status('Processing [inpay]', true);
+ $sum_too_low_status_id = $this->set_order_status('Sum too low [inpay]', true);
+ $completed_status_id = $this->set_order_status('Completed [inpay]', true);
+
+ $sort_order = 0;
+ tep_db_query("insert into ".TABLE_CONFIGURATION." (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable inpay on your webshop?', 'MODULE_PAYMENT_INPAY_STATUS', 'False', '', '6', '".$sort_order++."', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+ tep_db_query("insert into ".TABLE_CONFIGURATION." (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Gateway Server', 'MODULE_PAYMENT_INPAY_GATEWAY_SERVER', 'Production', 'Use the testing or production gateway server for transactions', '6', '".$sort_order++."', 'tep_cfg_select_option(array(\'Production\', \'Test\'), ', now())");
+ tep_db_query("insert into ".TABLE_CONFIGURATION." (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Your merchant id', 'MODULE_PAYMENT_INPAY_MERCHANT_ID', '', 'Your merchant unique identifier (supplied by inpay)', '6', '".$sort_order++."', now())");
+ tep_db_query("insert into ".TABLE_CONFIGURATION." (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Your secret key', 'MODULE_PAYMENT_INPAY_SECRET_KEY', '', 'Your secret key (supplied by inpay)', '6', '".$sort_order++."', now())");
+ tep_db_query("insert into ".TABLE_CONFIGURATION." (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Flow Layout', 'MODULE_PAYMENT_INPAY_FLOW_LAYOUT', 'multi_page', 'Layout for the buyer flow', '6', '".$sort_order++."', now())");
+
+ tep_db_query("insert into ".TABLE_CONFIGURATION." (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Decrease stock on payment creation', 'MODULE_PAYMENT_INPAY_DECREASE_STOCK_ON_CREATION', 'False', 'Do you want to decrease stock upon payment creation?', '6', '".$sort_order++."', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+ tep_db_query("insert into ".TABLE_CONFIGURATION." (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Debug E-Mail Address', 'MODULE_PAYMENT_INPAY_DEBUG_EMAIL', '', 'All parameters of an Invalid IPN notification will be sent to this email address if one is entered.', '6', '".$sort_order++."', now())");
+
+
+ tep_db_query("insert into ".TABLE_CONFIGURATION." (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, use_function, set_function, date_added) values ('Payment Zone', 'MODULE_PAYMENT_INPAY_ZONE', '0', 'If a zone is selected, only enable this payment method for that zone.', '6', '".$sort_order++."', 'tep_get_zone_class_title', 'tep_cfg_pull_down_zone_classes(', now())");
+
+ //tep_db_query("insert into ".TABLE_CONFIGURATION." (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('E-Mail Address', 'MODULE_PAYMENT_INPAY_ID', '', 'The inpay seller e-mail address to accept payments for', '6', '4', now())");
+ tep_db_query("insert into ".TABLE_CONFIGURATION." (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort order of display.', 'MODULE_PAYMENT_INPAY_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '".$sort_order++."', now())");
+
+ tep_db_query("insert into ".TABLE_CONFIGURATION." (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set inpay Acknowledged Order Status', 'MODULE_PAYMENT_INPAY_CREATE_ORDER_STATUS_ID', '".$created_status_id."', 'Set the status of orders made with this payment module to this value', '6', '".$sort_order++."', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
+ tep_db_query("insert into ".TABLE_CONFIGURATION." (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set inpay sum too low Order Status', 'MODULE_PAYMENT_INPAY_SUM_TOO_LOW_ORDER_STATUS_ID', '".$sum_too_low_status_id."', 'Set the status of orders which are paid with insufficient fund (sum too low) to this value', '6', '".$sort_order++."', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
+ tep_db_query("insert into ".TABLE_CONFIGURATION." (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set inpay Completed Order Status', 'MODULE_PAYMENT_INPAY_COMP_ORDER_STATUS_ID', '".$completed_status_id."', 'Set the status of orders which are confirmed as paid (approved) to this value', '6', '".$sort_order++."', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
+
+ // tep_db_query("insert into ".TABLE_CONFIGURATION." (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Transaction Method', 'MODULE_PAYMENT_INPAY_TRANSACTION_METHOD', 'Sale', 'The processing method to use for each transaction.', '6', '0', 'tep_cfg_select_option(array(\'Authorization\', \'Sale\'), ', now())");
+ // tep_db_query("insert into ".TABLE_CONFIGURATION." (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable Encrypted Web Payments', 'MODULE_PAYMENT_INPAY_EWP_STATUS', 'False', 'Do you want to enable Encrypted Web Payments?', '6', '3', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+ // tep_db_query("insert into ".TABLE_CONFIGURATION." (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Working Directory', 'MODULE_PAYMENT_INPAY_EWP_WORKING_DIRECTORY', '', 'The working directory to use for temporary files. (trailing slash needed)', '6', '4', now())");
+ // tep_db_query("insert into ".TABLE_CONFIGURATION." (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('OpenSSL Location', 'MODULE_PAYMENT_INPAY_EWP_OPENSSL', '/usr/bin/openssl', 'The location of the openssl binary file.', '6', '4', now())");
+ }
+
+ function remove()
+ {
+ tep_db_query("delete from ".TABLE_CONFIGURATION." where configuration_key in ('".implode("', '", $this->keys())."')");
+ tep_db_query("delete from ".TABLE_ORDERS_STATUS." where orders_status_name like '%[inpay]%'");
+ }
+
+ function keys()
+ {
+ //'MODULE_PAYMENT_INPAY_ID',
+ return array('MODULE_PAYMENT_INPAY_STATUS', 'MODULE_PAYMENT_INPAY_GATEWAY_SERVER', 'MODULE_PAYMENT_INPAY_MERCHANT_ID', 'MODULE_PAYMENT_INPAY_SECRET_KEY', 'MODULE_PAYMENT_INPAY_FLOW_LAYOUT', 'MODULE_PAYMENT_INPAY_DECREASE_STOCK_ON_CREATION', 'MODULE_PAYMENT_INPAY_DEBUG_EMAIL', 'MODULE_PAYMENT_INPAY_ZONE', 'MODULE_PAYMENT_INPAY_SORT_ORDER', 'MODULE_PAYMENT_INPAY_CREATE_ORDER_STATUS_ID', 'MODULE_PAYMENT_INPAY_SUM_TOO_LOW_ORDER_STATUS_ID', 'MODULE_PAYMENT_INPAY_COMP_ORDER_STATUS_ID');
+ }
+
+ // format prices without currency formatting
+ function format_raw($number, $currency_code = '', $currency_value = '')
+ {
+ global $currencies, $currency;
+
+ if ( empty($currency_code) || !$this->is_set($currency_code))
+ {
+ $currency_code = $currency;
+ }
+
+ if ( empty($currency_value) || !is_numeric($currency_value))
+ {
+ $currency_value = $currencies->currencies[$currency_code]['value'];
+ }
+
+ return number_format(tep_round($number*$currency_value, $currencies->currencies[$currency_code]['decimal_places']), $currencies->currencies[$currency_code]['decimal_places'], '.', '');
+ }
+ //
+ // calculate inpay MD5 for invoice creation
+ //
+ function calcInpayMd5Key($order)
+ {
+
+ $sk = MODULE_PAYMENT_INPAY_SECRET_KEY;
+ $q = http_build_query( array ("merchant_id"=>$order['merchant_id'],
+ "order_id"=>$order['order_id'],
+ "amount"=>$order['amount'],
+ "currency"=>$order['currency'],
+ "order_text"=>$order['order_text'],
+ "flow_layout"=>$order['flow_layout'],
+ "secret_key"=>$sk), "", "&");
+ $md5v = md5($q);
+ return $md5v;
+ }
+}
+
+?>

0 comments on commit f7f7cce

Please sign in to comment.
Something went wrong with that request. Please try again.