Перейти к содержанию
Форум поддержки пользователей VamShop

Интеркасса. ik.php как он вообще работал?


Рекомендуемые сообщения

Итак. ПРосят пофиксить неработающий модуль интеркассы.

Начинаю все проверять, логи, все дела и.... че нахожу то.

Модуль оперирует переменными (например) 

 

if(MODULE_PAYMENT_IK_SHOP_ID !== $ik_co_id)
	die('error: ik_co_id');

 

а $ik_co_id - откуда берется то? Т.е проблема в том, что $ik_* переменные не определены и пусты

там вверху манипуляции с массивом $_POST ведутся. Так они внутри функции, которая возвращает код авторизации.

 

Как она работает то хоть у кого-то?

 

 

Еще есть там сточка 

$orderTotal = number_format($vamPrice->CalculateCurrEx($order->info['total'], $ikCurrency), 2, '.', '');

Идем в класс order находим info 

Проверяем, что там у нас в total и, о Боги strip_tags($order_total['text']), 

Текст будем передавать в функцию вывода цены?

наверное 

total_value

должно быть?

 

 

 

Сам файл

 

<?php
/*------------------------------------------------------------------------------
  $Id: ik.php 1310 2010-05-06 19:20:03 VaM $

   VaM Shop - open source ecommerce solution
   http://vamshop.ru
   http://vamshop.com

   Copyright (c) 2010 VaM Shop
  -----------------------------------------------------------------------------
   based on:
   (c) 2005 Vetal (robox.php,v 1.48 2003/05/27); metashop.ru

  Released under the GNU General Public License
------------------------------------------------------------------------------*/

function get_var($name, $default = 'none') {
  return (isset($_GET[$name])) ? $_GET[$name] : ((isset($_POST[$name])) ? $_POST[$name] : $default);
}

require('includes/application_top.php');
require (DIR_WS_CLASSES.'order.php');

function ikGetSign($post)
{
	$aParams = array();
	foreach ($post as $key => $value)
	{
		if (!preg_match('/ik_/', $key))
			continue;
		$aParams[$key] = $value;
	}

	unset($aParams['ik_sign']);

		$key = MODULE_PAYMENT_IK_SECRET_KEY;

	ksort ($aParams, SORT_STRING);
	array_push($aParams, $key);
	$signString = implode(':', $aParams);
	$sign = base64_encode(md5($signString, true));
	return $sign;
}

// logging

//$fp = fopen('ik.log', 'a+');
//$str=date('Y-m-d H:i:s').' - ';
//foreach ($_POST as $vn=>$vv) {
//  $str.=$vn.'='.$vv.';';
//}

//fwrite($fp, $str."\n");
//fclose($fp);

// Проверка id магазина
if(MODULE_PAYMENT_IK_SHOP_ID !== $ik_co_id)
	die('error: ik_co_id');

$sign = ikGetSign($_POST);

if ($ik_sign === $sign && $ik_inv_st == 'success')
{
	// данные заказа
	$order = new order((int)$ik_pm_no);
	$ikCurrency = (MODULE_PAYMENT_IK_CURRENCY == 'RUB') ? 'RUR' : MODULE_PAYMENT_IK_CURRENCY;

	global $vamPrice;
	$orderTotal = number_format($vamPrice->CalculateCurrEx($order->info['total'], $ikCurrency), 2, '.', '');

	// Проверяем стоимость
	if($ik_am != $orderTotal OR $ik_am <= 0)
		die("error: ik_am");

	$sql_data_array = array
	(
		'orders_status' => MODULE_PAYMENT_IK_ORDER_STATUS_ID
	);
	vam_db_perform('orders', $sql_data_array, 'update', "orders_id='".(int)$ik_pm_no."'");

	$sql_data_arrax = array
	(
		'orders_id' => (int)$ik_pm_no,
		'orders_status_id' => MODULE_PAYMENT_IK_ORDER_STATUS_ID,
		'date_added' => 'now()',
		'customer_notified' => '0',
		'comments' => 'InterKassa accepted this order payment '.vam_db_prepare_input($ik_pw_via)
	);
	vam_db_perform('orders_status_history', $sql_data_arrax);

	echo 'OK'.$ik_pm_no;
}
else
	die('error: ik_sign or ik_inv_st');

 

Ссылка на сообщение
Поделиться на другие сайты

По-моему, этот модуль добавлялся кем-то из пользователей.

Лично я не в курсе.

Да и наверняка у интеркассы и протокол обмена данными уже поменялся.

Не только ik.ru придётся править, но и платёжную форму.

Ссылка на сообщение
Поделиться на другие сайты

нене. все остальное работает на ура. 

 

//$fp = fopen('ik.log', 'a+');
//$str=date('Y-m-d H:i:s').' - ';
//foreach ($_POST as $vn=>$vv) {
//  $str.=$vn.'='.$vv.';';
//}

В лог гупит как надо.

Нужно понять, как из $_POST сделать одноименные переменные. 

На выхлопе лог выглядит примерно так

ik_co_id=57d123412341234123412341324;
ik_co_prs_id=1234123412341234;
ik_inv_id=4324141434141;
ik_inv_st=success;
ik_inv_crt=2017-03-19 22:35:59;
ik_inv_prc=2017-03-19 22:38:09;
ik_trn_id=22660431;
ik_pm_no=1;
ik_pw_via=privat24_liqpay_merchant3_uah;
ik_am=1.08;
ik_co_rfn=1.0800;
ik_ps_price=1.13;
ik_cur=UAH;
ik_desc=Order-1;
ik_sign=пывапывапывапывапывапыNg==;

 

extract($_POST); помогает. Но не до конца. с итоговой суммой смотрю

Ссылка на сообщение
Поделиться на другие сайты
23 минуты назад, KoVaLsKy сказал:

extract($_POST); помогает. Но не до конца. с итоговой суммой смотрю

Так же как я /yandex.php, к примеру, сверху добавить:

function get_var($name, $default = 'none') {
  return (isset($_GET[$name])) ? $_GET[$name] : ((isset($_POST[$name])) ? $_POST[$name] : $default);
}

и уже в коде использовать get_var("ik_co_id")

Хотя смысла ведь особого и нет в этой обёртке, можно сразу использовать $_POST["ik_co_id"] и т.д.

Ссылка на сообщение
Поделиться на другие сайты

Ловим работающий файл. Ахтунг. Запись логов не закомментирована

<?php
/*------------------------------------------------------------------------------
  $Id: ik.php 1310 2010-05-06 19:20:03 VaM $

   VaM Shop - open source ecommerce solution
   http://vamshop.ru
   http://vamshop.com

   Copyright (c) 2010 VaM Shop
  -----------------------------------------------------------------------------
   based on:
   (c) 2005 Vetal (robox.php,v 1.48 2003/05/27); metashop.ru

  Released under the GNU General Public License
------------------------------------------------------------------------------*/
$txt_mail = '';
function get_var($name, $default = 'none') {
  return (isset($_GET[$name])) ? $_GET[$name] : ((isset($_POST[$name])) ? $_POST[$name] : $default);
}

require('includes/application_top.php');
require (DIR_WS_CLASSES.'order.php');

function ikGetSign($post)
{
	$aParams = array();
	foreach ($post as $key => $value)
	{
		if (!preg_match('/ik_/', $key))
			continue;
		$aParams[$key] = $value;
	}

	unset($aParams['ik_sign']);

		$key = MODULE_PAYMENT_IK_SECRET_KEY;

	ksort ($aParams, SORT_STRING);
	array_push($aParams, $key);
	$signString = implode(':', $aParams);
	$sign = base64_encode(md5($signString, true));
	return $sign;
}

// logging

$sign = ikGetSign($_POST);

extract($_POST);

// Проверка id магазина
if(MODULE_PAYMENT_IK_SHOP_ID !== $ik_co_id)
	die('error: ik_co_id');


$txt_mail .= '$sig = '.$ik_sign .'    $sign = '. $sign .'    $ik_inv_st = '. $ik_inv_st;


$fp = fopen('ik.log', 'a+');
$str=date('Y-m-d H:i:s').' - ';
foreach ($_POST as $vn=>$vv) {
  $str.=$vn.'='.$vv.';';
}

// данные заказа
$order = new order((int)$ik_pm_no);
$ikCurrency = (MODULE_PAYMENT_IK_CURRENCY == 'RUB') ? 'RUR' : MODULE_PAYMENT_IK_CURRENCY;

global $vamPrice;
$orderTotal = number_format($order->info['total_value'], 2, '.', '');
$ik_am = number_format($ik_am, 2, '.', '');

$str.= 'ot='.$orderTotal.' $order->info[total_value]='.$order->info['total_value'] .'; $ikCurrency'. $ikCurrency.' $ik_pm_no='.$ik_pm_no.' $orderTotal2='.$orderTotal2;


fwrite($fp, $str."\n");
fclose($fp);

if ($ik_sign === $sign && $ik_inv_st == 'success')
{
	
	// Проверяем стоимость
	//$txt_mail .= '$ik_am = '.$ik_am.' $orderTotal = '.$orderTotal;

	
	if($ik_am != $orderTotal OR $ik_am <= 0)
		die("error: ik_am");

	$sql_data_array = array
	(
		'orders_status' => MODULE_PAYMENT_IK_ORDER_STATUS_ID
	);
	vam_db_perform('orders', $sql_data_array, 'update', "orders_id='".(int)$ik_pm_no."'");

	$sql_data_arrax = array
	(
		'orders_id' => (int)$ik_pm_no,
		'orders_status_id' => MODULE_PAYMENT_IK_ORDER_STATUS_ID,
		'date_added' => 'now()',
		'customer_notified' => '0',
		'comments' => 'InterKassa accepted this order payment '.vam_db_prepare_input($ik_pw_via)
	);
	vam_db_perform('orders_status_history', $sql_data_arrax);

	echo 'OK'.$ik_pm_no;
}
else{

	die('error: ik_sign or ik_inv_st');
	}

 

Ссылка на сообщение
Поделиться на другие сайты
  • 2 weeks later...
3 часа назад, eugenem сказал:

Что-то не работает модуль. Не передается сумма, в переменной ik_am 0.00
Где может быть ошибка?

Там идёт пересчёт в валюту, указанную в настройках модуля.

По умолчанию - гривна, код валюты UAH

т.е. в Админке - Разное - Валюты должна присутствовать эта валюта, с кодом UAH 

Что б пересчёт работал.

Либо можно просто в /includes/modules/payment/ik.php поментять:

      $TotalAmount = number_format($vamPrice->CalculateCurrEx($order->info['total'], MODULE_PAYMENT_IK_CURRENCY), 2, '.', '');

на:

      $TotalAmount = number_format($order->info['total'], 2, '.', '');

Что б никаких пересчётов не было, а просто выводилась сумма заказа. 

Ссылка на сообщение
Поделиться на другие сайты
7 часов назад, eugenem сказал:

Еще вопрос такой - а должен ли этот модуль менять статус заказа при оплате?

Выше Kovalsky как раз писал об этом, что по умолчанию /ik.php не менял статус и выложил свой исправленный вариант /ik.php

Он писал, что его файл меняет статус.

Ссылка на сообщение
Поделиться на другие сайты
1 час назад, eugenem сказал:

ага, ок, тогда надо потестировать...

Напишите как раз, работает или нет.

Я то сейчас интеркассу проверить нет возможности.

Ссылка на сообщение
Поделиться на другие сайты
×
×
  • Создать...