Aw: Plagin WebMoney (ver. 1.0.0): Problem mit Orderstatus
webdesigner - 18.10.2014 21:04
Думаю проблема в коде
Все Ваши предложения протестировал. Устранить ошибку не удалось, но есть некоторые сведения по ее локализации. Подробнее.
1. Удаление строки
$error = $order->order_status != $pmconfigs['transaction_complete_status'];
или ее замена на $error = false; в функции
[root-joomla-path]/components/com_jshopping/payments/pm_webmoney/pm_webmoney.php
public function checkTransaction($pmconfigs, $order, $act)
{
$error = false;
if($act != 'return')
{
$error = $error || !$this->checkTransactionPurseNumber($pmconfigs);
$error = $error || $this->getSum($order, $pmconfigs) != JRequest::getVar('LMI_PAYMENT_AMOUNT');
if(!JRequest::getVar('LMI_PREREQUEST'))
{
$error = $error || $pmconfigs['sign_algorithm'] == 'md5' && !$this->checkTransactionMD5($pmconfigs);
$error = $error || $pmconfigs['sign_algorithm'] == 'sign' && !$this->checkTransactionSIGN($pmconfigs);
}
}
else
{
$error = $order->order_status != $pmconfigs['transaction_complete_status'];
}
return $error ? array(3, JText::_('JSHOPPING_PM_WEBMONEY_ERROR_TRANSACTION')) : array(9, '');
}
не меняет вообще ничего в результатах оплаты, как будто не происходит обращение к этой функции. Тогда я заменял 3 и 9 другими значениями. Или вообще ставил вместо последней строки
return $error ? array(9, '') : array(9, '');
принуждая функцию дать в тесте желанный результат: простой массив со значением 0-го элемента 9, а не 3. (Эта 3 - причина всех бед как неизменный результат значения статуса заказа в функции step7()) И вот что происходит: после такой замены РЕАКЦИЯ ЕСТЬ: в WebMoney сбой, WebMoney отказывается платить. Таким образом, на первой фазе обработки платежа функция
function function checkTransaction($pmconfigs, $order, $act)
{
...
}
работает правильно - платеж проходит без задоринки, эта функция в его формировании участвует. Во второй фазе return эта функция НЕ УЧАСТВУЕТ (а должна). Я обнаружил, что таких функций в папке
[root-joomla-path]\components\com_jshopping\
5 штук. Они принадлежат разным стандартным способам оплаты: payment.php (с магазином), pm_paypal.php (с магазином), pm_paypal_pro.php (купленный у вас модуль), pm_sofortüberweisung.php (с магазином), pm_webmoney (купленный у вас модуль).
При этом в двух из них в pm_paypal.php и pm_paypal_pro.php есть 3 как результат успешного проведения платежа. Я подумал грешным делом, что 3-ка происходит отсюда, то есть на заключительном этапе используется подмененная функция с таким же названием. По этому поводу я пока провел простенький эксперимент: заменил в pm_paypal.php и pm_paypal_pro.php 3 на 9. Это ничего не изменило. Тем не менее не оставляет ощущение, что на последнем этапе "царь не настоящий".
2. Позитивные новости. В функции
[root-joomla-path]/components/com_jshopping/payment/payment.php
function getStatusFromResCode($rescode, $pmconfigs){
$status = 0;
$types_status = array(
0=>0,
1=>$pmconfigs['transaction_end_status'],
2=>$pmconfigs['transaction_pending_status'],
3=>$pmconfigs['transaction_failed_status'],
4=>$pmconfigs['transaction_cancel_status'],
5=>$pmconfigs['transaction_open_status'],
6=>$pmconfigs['transaction_shipping_status'],
7=>$pmconfigs['transaction_refunded_status'],
8=>$pmconfigs['transaction_confirm_status'],
9=>$pmconfigs['transaction_complete_status'],
10=>$pmconfigs['transaction_other_status'],
99=>0
);
if (isset($types_status[$rescode])){
$status = $types_status[$rescode];
}
return $status;
}
замена строки (только для теста)
3=>$pmconfigs['transaction_failed_status'],
на строку
3=>9,
дает положительный результат, процедура оплаты завершается правильно.
Идем выше по логике, туда, где формируется желанная 9-ка - значение переменной $status, в функцию
[root-joomla-path]/components/com_jshopping/controllers/checkout.php
function step7(){
...
$res = $payment_system->checkTransaction($pmconfigs, $order, $act);
$rescode = $res[0];
...
$status = $payment_system->getStatusFromResCode($rescode, $pmconfigs); //1. здесь у переменной $status неправильное значение 3 (после установки магазина соответствует ID=3 "Cancelled")
...
}
и меняем в обращении к функции расчета значения $status входной параметр $rescode на 9, вот так:
$status = $payment_system->getStatusFromResCode(9, $pmconfigs);
Результат положительный. А вот более ранняя замена строки
$rescode = $res[0];
на
$rescode = 9; или $rescode = '9';
приводит к сбою в оплате. Я не понимаю, почему: переменная $rescode встречается ТОЛЬКО в функции step7() 6 раз в безобидной форме простой переменной. Или я что-то не учел?
Общий вывод из двух вышеприведенных пунктов:
Неправильно формируется значение переменной $status. Возможная причина: полиморфизм, или точнее - перегрузка функций. Хотя последнее - всего лишь гипотеза.
Letzte Änderung: 19.10.2014 11:57