Chvalov
Гуру форума
- Регистрация
- 31 Окт 2011
- Сообщения
- 265
- Реакции
- 81
- Автор темы
- #1
Есть код от робокассы, я же переделываю его под Единую кассу, оплата происходит теперь нужно сделать возврат данных о платеже
Собственно задание: Мне же нужно подправить так чтобы сортировка массива была по именам ключей в порядке возрастания и формирование сообщения, путем объединения значений формы
Как мне правильно подправить код ??
PHP:
<?php
class XenForo_UserUpgradeProcessor_RoboKassa
{
protected $_request;
protected $_input;
protected $_filtered = null;
protected $_upgrade = false;
protected $_user = false;
protected $_upgradeRecordId = null;
protected $_upgradeRecord = false;
protected $_upgradeModel = null;
public function initCallbackHandling(Zend_Controller_Request_Http $request)
{
$this->_request = $request;
$this->_input = new XenForo_Input($request);
$this->_filtered = $this->_input->filter(array(
'InvId' => XenForo_Input::UINT,
'OutSum' => XenForo_Input::STRING,
'SignatureValue' => XenForo_Input::STRING,
'Shp_item' => XenForo_Input::STRING,
));
$this->_upgradeModel = XenForo_Model::create('XenForo_Model_UserUpgrade');
}
public function validateRequest(&$errorString)
{
return true;
}
public function validatePreConditions(&$errorString)
{
$itemParts = explode(',', $this->_filtered['Shp_item'], 4);
if (count($itemParts) != 4)
{
$errorString = 'Invalid item (Shp_item)';
return false;
}
list($userId, $userUpgradeId, $validationType, $validation) = $itemParts;
$user = XenForo_Model::create('XenForo_Model_User')->getFullUserById($userId);
if (!$user)
{
$errorString = 'Invalid user';
return false;
}
$this->_user = $user;
$tokenParts = explode(',', $validation);
if (count($tokenParts) != 3 || sha1($tokenParts[1] . $user['csrf_token']) != $tokenParts[2])
{
$errorString = 'Invalid validation';
return false;
}
$upgrade = $this->_upgradeModel->getUserUpgradeById($userUpgradeId);
if (!$upgrade)
{
$errorString = 'Invalid user upgrade';
return false;
}
$this->_upgrade = $upgrade;
if (!$this->_filtered['InvId'])
{
$errorString = 'No InvId';
return false;
}
$transaction = $this->_upgradeModel->getProcessedTransactionLog($this->_filtered['InvId']);
if ($transaction)
{
$errorString = 'Transaction already processed';
return false;
}
$upgradeRecord = $this->_upgradeModel->getActiveUserUpgradeRecord($this->_user['user_id'], $this->_upgrade['user_upgrade_id']);
if ($upgradeRecord)
{
$this->_upgradeRecordId = $upgradeRecord['user_upgrade_record_id'];
$this->_upgradeRecord = $upgradeRecord;
}
$out_summ = $this->_filtered["OutSum"];
$inv_id = $this->_filtered['InvId'];
$shp_item = $this->_filtered["Shp_item"];
$crc = $this->_filtered["SignatureValue"];
$crc = strtoupper($crc);
$my_crc = strtoupper(md5("$out_summ:$inv_id:$mrh_pass2:Shp_item=$shp_item"));
// проверка корректности подписи
// check signature
if ($my_crc !=$crc)
{
$errorString = 'Invalid Signature';
return false;
}
if ($upgradeRecord)
{
$extra = unserialize($upgradeRecord['extra']);
$cost = $extra['cost_amount'];
$currency = $extra['cost_currency'];
}
else
{
$cost = $upgrade['cost_amount'];
$currency = $upgrade['cost_currency'];
}
if (round($this->_filtered['OutSum'], 2) != round($cost, 2) )
{
$errorString = 'Invalid payment amount';
return false;
}
return true;
}
public function processTransaction()
{
$this->_upgradeRecordId = $this->_upgradeModel->upgradeUser($this->_user['user_id'], $this->_upgrade);
return array('payment', 'Payment received, upgraded/extended');
}
public function getLogDetails()
{
$details = $_POST;
$details['_callbackIp'] = (isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : false);
return $details;
}
public function getTransactionId()
{
return $this->_filtered['InvId'];
}
public function getProcessorId()
{
return 'RoboKassa';
}
public function getUpgradeRecordId()
{
return intval($this->_upgradeRecordId);
}
public function log($type, $message, array $extra)
{
$upgradeRecordId = $this->getUpgradeRecordId();
$processor = $this->getProcessorId();
$transactionId = $this->getTransactionId();
$details = $this->getLogDetails() + $extra;
$this->_upgradeModel->logProcessorCallback(
$upgradeRecordId, $processor, $transactionId, $type, $message, $details
);
}
}
Да но теперь вопросlatteo написал(а):вызывается initCallbackHandling, посредством $this->_input->filter выдёргивает обведённые красным переменные из $_POST или $_GET запроса.
Потом вызывается validatePreConditions, которая использует эти значения для составления хеша $my_crc = strtoupper(md5("$out_summ:$inv_id:$mrh_pass2:Shp_item=$shp_item")); и сравнивает с тем хешем, который получили в запросе $crc = $this->_filtered["SignatureValue"]; $crc = strtoupper($crc);
InvId, OutSum, SignatureValue и Shp_item
встречаются только здесь:
Разве возможно такое чтобы передавались значения с названий ?PHP:<?php if (isset($_POST['OutSum']) and isset($_POST['_xfTokens']) and isset($_POST['desc_info'])) { $out_summ = $_POST['OutSum']; $shp_item = $_POST['_xfTokens']; $inv_desc = $_POST['desc_info']; $inv_id = 0; $mrh_login = "spaxy"; $mrh_pass1 = "password#1"; $in_curr = ""; $crc = md5("$mrh_login:$out_summ:$inv_id:$mrh_pass1:Shp_item=$shp_item"); print "<form action='https://merchant.roboxchange.com/Index.aspx' method=POST>". "<input type=hidden name=MrchLogin value=$mrh_login>". "<input type=hidden name=OutSum value='$out_summ'>". "<input type=hidden name=InvId value='$inv_id'>". "<input type=hidden name=Desc value='$inv_desc'>". "<input type=hidden name=SignatureValue value=$crc>". "<input type=hidden name=Shp_item value='$shp_item'>". "<input type=hidden name=IncCurrLabel value=$in_curr>". "<input type=hidden name=Culture value=$culture>". "<input type=submit class='button primary' value='Оплатить и перейти'>". </form>"; } ?>
input type=hidden name=XXXXXX
Собственно задание: Мне же нужно подправить так чтобы сортировка массива была по именам ключей в порядке возрастания и формирование сообщения, путем объединения значений формы
PHP:
<?php
// Секретный ключ интернет-магазина (настраивается в кабинете)
$skey = "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX";
// Функция, которая возвращает результат в Единую кассу
function print_answer($result, $description)
{
print "WMI_RESULT=" . strtoupper($result) . "&";
print "WMI_DESCRIPTION=" .urlencode($description);
exit();
}
// Проверка наличия необходимых параметров в POST-запросе
if (!isset($_POST["WMI_SIGNATURE"]))
print_answer("Retry", "Отсутствует параметр WMI_SIGNATURE");
if (!isset($_POST["WMI_PAYMENT_NO"]))
print_answer("Retry", "Отсутствует параметр WMI_PAYMENT_NO");
if (!isset($_POST["WMI_ORDER_STATE"]))
print_answer("Retry", "Отсутствует параметр WMI_ORDER_STATE");
// Извлечение всех параметров POST-запроса, кроме WMI_SIGNATURE
foreach($_POST as $name => $value)
{
if ($name !== "WMI_SIGNATURE") $params[$name] = $value;
}
// Сортировка массива по именам ключей в порядке возрастания и формирование сообщения, путем объединения значений формы
uksort($params, "strcasecmp"); $values = "";
foreach($params as $name => $value)
{
//Конвертация из текущей кодировки (UTF-8)
//необходима только если кодировка магазина отлична от Windows-1251
$value = iconv("utf-8", "windows-1251", $value);
$values .= $value;
}
// Формирование подписи для сравнения ее с параметром WMI_SIGNATURE
$signature = base64_encode(pack("H*", md5($values . $skey)));
//Сравнение полученной подписи с подписью W1
if ($signature == $_POST["WMI_SIGNATURE"])
{
if (strtoupper($_POST["WMI_ORDER_STATE"]) == "ACCEPTED")
{
// TODO: Пометить заказ, как «Оплаченный» в системе учета магазина
print_answer("Ok", "Заказ #" . $_POST["WMI_PAYMENT_NO"] . " оплачен!");
}
else
{
// Случилось что-то странное, пришло неизвестное состояние заказа
print_answer("Retry", "Неверное состояние ". $_POST["WMI_ORDER_STATE"]);
}
}
else
{
// Подпись не совпадает, возможно вы поменяли настройки интернет-магазина
print_answer("Retry", "Неверная подпись " . $_POST["WMI_SIGNATURE"]);
}
?>
Как мне правильно подправить код ??
Последнее редактирование: