Никак не могу понять в чем ошибка в формировании ссылки и подписи, может кто сталкивался с данной проблемой у этой платежной системы?
Вот код генерации ссылки и подписи (Не добавлял ключи из аккаунта).
private function getUrl($sum, $user_id, $order_id)
{
$account = $user_id;
$secretKey = 'Ключ для подписи';
$desc = 'Оплата заказа ' . $order_id;
$currency = 'RUB';
$hashStr = hash('sha256', $account.'{up}'.$currency.'{up}'.$desc.'{up}'.$sum.'{up}'.$secretKey);
return 'https://unitpay.ru/pay/111111-11111/card?sum=' . $sum . '&account=' . $account . '&desc=' . $desc . '&signature=' . $hashStr;
}
Формируется ссылка типа того: https://unitpay.ru/pay/111111-11111/card?sum=500&a…
При переходе вылезает ошибка Ошибка 400. Подпись запроса не верна.
Все перерыл, не пойму как это исправить, помогите пожалуйста(
-
Вопрос заданболее двух лет назад
-
2001 просмотр
В общем, компался я и копался, в итоге решил свою проблему, было еще куча ошибок, но вроде исправил.
Дело было 1. Из-за того что в ссылке было указано RUB а в ключе нет.
2. Порядок добавления параметров.
3. Описание заказа, # <- символ не пропускала платежка эта, пришлось заменить на №. Пробовал шифровать, но не получалось с первым символом.
Все, вот рабочий код:
private function getUrl($sum, $user_id, $order_id)
{
$desc = 'Оплата заказа №' . $order_id;
$hashStr = hash('sha256', $order_id.'{up}'.$desc.'{up}'.$sum.'{up}'.Config::SECRET_KEY);
return 'https://unitpay.ru/pay/'.Config::PUBLIC_KEY.'/card?account=' . $order_id . '&desc=' . $desc . '&sum=' . $sum . '&signature=' . $hashStr;
}
Я тут вывожу ссылку на форму, вы можете по своему переделать.
Пригласить эксперта
Не знаю как у конкретно этой системы, но при формировании подписи запроса, обычно важен порядок аргументов ( в алфовитном порядке ).
К тому же, 400 ошибка может быть из за того, что запрос отправляете не тем методом (GET вместо POST)
-
Показать ещё
Загружается…
22 мая 2023, в 18:02
120000 руб./за проект
25 мая 2023, в 11:04
3000 руб./в час
10 мая 2023, в 14:08
3000 руб./в час
Минуточку внимания
Всем привет, создал эту тему только для тех, у кого ошибка: 400 В UnitPay
Касается это не только Авто-Донат движков, а вообще всех движков.
Эта статья может вам не помочь, если вы не криворукий, и всё поймёте в этой статье
Первое, что можно сделать, обратится в тех. поддержку UnitPay с просьбой отключить проверку цифровой подписи
Они могут вам отключить как на время, так и на всегда. Но могут и вообще не отключать. Всё зависит от вашего аккаунта в UnitPay.
Если вы отключите проверку, то ничего не сломается.
Второе, что можно сделать, вправлять код. С 1 апреля 2020 года UnitPay сменила свой API, а многие движки ещё не перешли на новое API, поэтому, вам придётся вправлять код самим.
Первый код: /application/donate.php (Зависит от движка)
Код с оформлением (BB-коды):
<?php
$secretKey = 'Секретный ключ проекта';
$publicKey = 'Публичный ключ проекта';
$tpl->LoadView( "donate" );
if ( isset( $_POST['act'] ) && $_POST['act'] == 'confirm' )
{
function getFormSignature( $account, $currency, $desc, $sum, $secretKey )
{
return hash( 'sha256', $account . '{up}' . $currency . '{up}' . $desc . '{up}' . $sum . '{up}' . $secretKey );
}
$account = isset( $_POST['account'] ) ? $_POST['account'] : '';
$currency = isset( $_POST['currency'] ) ? $_POST['currency'] : '';
$desc = isset( $_POST['desc'] ) ? $_POST['desc'] : '';
$sum = isset( $_POST['sum'] ) ? $_POST['sum'] : '';
$tpl->Set( 'publicKey', $publicKey );
$tpl->Set( 'account', $account );
$tpl->Set( 'currency', $currency );
$tpl->Set( 'desc', $desc );
$tpl->Set( 'sum', $sum );
$tpl->Set( 'signature', getFormSignature( $account, $currency, $desc, $sum, $secretKey ) );
$tpl->Block( 'prepare', false );
$tpl->Block( 'confirm' );
}
else
{
$tpl->Block( 'prepare' );
$tpl->Block( 'confirm', false );
}
$tpl->Build( "content" );
?>
Второй код: /templates/default/donate.tpl (Зависит от движка)
Код с оформлением (BB-коды):
[prepare]
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
<script type="text/javascript">
$(function ()
{
function calculateBonuses()
{
var coinPrice = parseFloat($('#unitpayForm #coinPrice').val());
var coins = parseInt($('#unitpayForm #coins').val());
if (isNaN(coins) || isNaN(coinPrice) || coins <= 0) {
$('#unitpayForm #sum').val('');
return;
}
var price = coins * coinPrice;
if (price > 1) {
price = 1;
}
$('#unitpayForm #sum').val(price);
}
$('#unitpayForm input#coins').keyup(function () {
calculateBonuses();
});
calculateBonuses();
$('#unitpayForm').submit(function(){
var sum = parseFloat($('#unitpayForm #sum').val());
if (isNaN(sum) || sum <= 0 || sum > 1) {
alert('Неверная сумма платежа');
return false;
}
});
});
</script>
<form id="unitpayForm" action="/donate" method="post">
<input type="hidden" name="act" value="confirm">
<label for="account">Ник персонажа:</label> <input type="text" value="" name="account" required="required" id="account"><br>
<label for="coins">Количество монет:</label>
<input type="text" id="coins" name="coins" value="1" required="required"><br>
<input type="hidden" id="sum" name="sum" value="">
<input type="hidden" name="currency" value="RUB">
<input type="hidden" id="coinPrice" name="coinPrice" value="1">
<input type="hidden" name="desc" value="Покупка внутриигровой валюты">
<input type="submit" class="btn" value="Оплатить">
</form>
[/prepare]
[confirm]
<form id="unitpayForm" action="https://unitpay.money/pay/{publicKey}/card" method="post">
<label for="account">Ник персонажа: {account}</label><br>
<label>Пожертвование: {sum} {currency}</label>
<input type="hidden" name="account" value="{account}"><br>
<input type="hidden" name="currency" value="{currency}">
<input type="hidden" name="sum" value="{sum}">
<input type="hidden" name="desc" value="{desc}">
<input type="hidden" name="signature" value="{signature}">
<input type="submit" class="btn" value="Подтвердить">
</form>
[/confirm]
Эти 2 кода, могут не совпадать с вашим движком, т.к написаны на TPL
Т.к он на tpl, и писался под GameCMS (Движок для игр VALVe) то вам придётся его вправлять.
Третий способ, как исправить данную ошибку, попробовать обновить SECRET KEY
Может быть у вас оно поможет, кто знает.
Дополнение к статье:
Исправление данной ошибки может повлиять данный скрипт, написанный на пыхе (php)
PHP:
function getFormSignature($account, $currency, $desc, $sum, $secretKey) {
$hashStr = $account.'{up}'.$currency.'{up}'.$desc.'{up}'.$sum.'{up}'.$secretKey;
return hash('sha256', $hashStr);
}
$sign = getFormSignature($name, $currency, $desc, $money, $secret_key);
$url = '[URL='https://unitpay.money/pay/.$public_key.?sum=.$money.&account=.$name.¤cy=.$currency.&desc=.$desc.&signature=.$sign;']https://unitpay.money/pay/'.$public_key.'?sum='.$money.'&account='.$name.'¤cy='.$currency.'&desc='.$desc.'&signature='.$sign;[/URL]
header('Location: '.$url);
Дополнение к статье:
Во многих случаях может быть это из-за того, что UnitPay не поддерживает символику по типу: #
Если вы зайдёте в конфиг UnitPay, и найдёте эту #, замените её на №
Например:
Не правильно: Оплата заказа #
Правильно: Оплата заказа №
Так-же это может быть из-за того, что не совпадают валюты, например у вас прописано RUB, а в ключе например $ Dollar, или Euro
Вам так-же надо будет это заменить на RUB.
Конечно, можно убрать эту строчку, и UnitPay сам подставит валюту (без значения RUB и т.д) Но, могут быть ошибки, так что лучше этого не делать. Если у вас $currency = ‘RUB’;
То можете попробовать убрать эту строчку, или заменить RUB на вашу валюту
Но, это не единственные решения данной проблемы.
Проблема может вызвана из-за отправки запроса не тем методом.
Например, у вас стоит GET, а надо POST
Ну, я всё объяснил понятно (я так думаю), если что-то не понятно, комментаторы в студию под эту статью.
Администрация никогда не пришлет Вам ссылку на авторизацию и не запросит Ваши данные для входа в игру.
- Статус
- В этой теме нельзя размещать новые ответы.
-
#1
Во время перехода на сайт UnitPay к пополнению счёта картой,вылазит ошибка 400.Сначало обратился к ним в поддержку,меня отправили на сайт где производилась покупка!
Ward
Технический Администратор
Команда форума
Тех.Админ
-
#2
Здравствуйте!
Привяжите почту к игровому аккаунту, после — произведите платеж.
- Статус
- В этой теме нельзя размещать новые ответы.
Pawno-Info.Ru — Портал о программировании №1
Присоединяйтесь к нам сейчас, чтобы получить доступ ко всем нашим функциям и ответы на все интересующие Вас вопросы. После регистрации Вы сможете создавать темы, публиковать ответы, влиять на репутацию пользователей форума, обмениваться личными сообщениями и многое другое. Это быстро и совершенно бесплатно, так чего же Вы ждете?
Вход
Регистрация
Интеграция платежного решения
Есть ли готовое решение для моей системы/CMS?
Есть ли готовое решение для моей системы/CMS?
Со всеми готовыми модулями, которые мы сейчас готовы предложить, можно ознакомиться
по ссылке
.
Также вы можете интегрироваться
через наше API
. В этом случае выдача товара/покупки покупателю производится и настраивается со стороны вашего магазина самостоятельно.
Могу ли я использовать поддомен?
Могу ли я использовать поддомен?
Одним из обязательных требований является домен не ниже второго уровня. Сам прием платежей можно осуществлять с поддомена сайта, прошедшего модерацию.
Тестовая среда и демо-доступ.
Тестовая среда и демо-доступ.
Вы можете ознакомиться с интерфейсом и функционалом личного кабинета, используя демо-режим, а также протестировать форму и виджет оплаты через кнопки “Попробовать”
на нашем сайте
.
Проведение тестовых платежей в демо-кабинете невозможно.
Ошибка: “Магазин отклонил платеж: Incorrect digital signature”
Ошибка: “Магазин отклонил платеж: Incorrect digital signature”
Для дополнительной безопасности ваших платежей мы по умолчанию включаем обязательную проверку цифровой подписи при создании платежа. Наличие подписи гарантирует защиту от подмены передаваемых значений (например, изменение суммы платежа или номера заказа).
Могу ли я на форме оплаты выставлять счет в другой валюте?
Могу ли я на форме оплаты выставлять счет в другой валюте?
Да, за это отвечает дополнительный параметр “currency” (подробнее о параметре можно посмотреть
по ссылке
. В этом случае на форме оплаты у клиента будет отображаться счет в выбранной валюте.
Ошибка при настройке, связанная с IP-адресами.
Ошибка при настройке, связанная с IP-адресами.
По этому вопросу вам необходимо написать в службу поддержки, указав IP-адрес, который нужно добавить в исключения. Контактные данные можно найти в личном кабинете в правом верхнем углу, кликнув на значок с “?”. Она вас наиболее точно сориентирует по дальнейшим действиям.
Как поменять язык платежной формы?
Как поменять язык платежной формы?
У нас есть дополнительный параметр locale, с помощью которого можно принудительно указать язык платежной формы. По умолчанию язык формы определяется исходя из страны, к которой относится IP-адрес пользователя.
Более подробно с этими параметром можно ознакомиться
по ссылке
.
Как можно скрыть некоторые методы оплаты?
Как можно скрыть некоторые методы оплаты?
Для этих целей используется дополнительный параметр hideOtherMethods, он скроет все методы оплаты, кроме необходимой.
Как настроить внешний вид формы оплаты?
Как настроить внешний вид формы оплаты?
Об изменении внешнего вида формы оплаты можно посмотреть
по ссылке
.
“Ответ вашего сервера не совпадает с требуемым кодом” при добавлении проекта на модерацию.
“Ответ вашего сервера не совпадает с требуемым кодом” при добавлении проекта на модерацию.
Чаще всего такая ситуация возникает в том случае, если проверочный файл расположен по неверному адресу. Пожалуйста, обратите внимание, файл должен находиться на основном домене (например, вашсайт.ру), а не на поддомене (например, поддомен.вашсайт.ру).
Ошибка: “Подпись запроса не верна”, “Не передана подпись запроса”.
Ошибка: “Подпись запроса не верна”, “Не передана подпись запроса”.
Данная ошибка возникает на стороне сайта. Цифровая подпись при создании платежа является обязательной защитой от подмены платежей.
Код виджета находится в личном кабинете → Настройки проекта → раздел Виджет оплаты.