Помощь с ошибкой 400: Подпись запроса не верна в UnitPay

  • Мы теперь в Discord

    Мы рады объявить, что теперь у нас есть сервер Discord. В честь этого мы проводим розыгрыш!
    Теперь вы можете легко связаться с нами и другими участниками сообщества,
    обмениваться идеями и получать обновления о нашей деятельности.

  • EXCLUSIVE ⚡

    Гость, покупая подписку, ты увеличишь свои доходы в разы!
    Мы делаем самые актуальные сборки, переводим лучшие приватные плагины, а так-же обновляем их и фиксим любые ошибки.
    Дешевле, чем студии и другие разработчики!

  • Приветствуем тебя Гость!⁣

    Недавно на форуме? Не знаешь как можно скачивать ресурсы?
    Для этого нужно лишь зарегистрировать на форуме, и получать доступ к профессиональным плагинам, оптимизированным настройкам.
    Здесь только самое лучшее.

  • Обновленный «Mc-market.ru»

    Теперь у вас есть возможность продавать свои товары на Minecraft маркете.
    Это отличная возможность для вас начать зарабатывать на своих навыках и труде.
    Начни продавать сейчас!

  • Интеграция ChatGPT

    Администраторы Minecraft могут столкнуться с различными проблемами, связанными с работой серверов и кодом.
    Однако, благодаря инновационным технологиям, искусственный интеллект может помочь решить эти проблемы.
    Реши свою любую проблему сейчас!

Harroybay

Will be fine
DEVELOPER
Пользователь
21 Ноя 2020
616
44
28
Всем привет, создал эту тему только для тех, у кого ошибка: 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
1610697317626.png
Может быть у вас оно поможет, кто знает.

Дополнение к статье:

Исправление данной ошибки может повлиять данный скрипт, написанный на пыхе (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


Ну, я всё объяснил понятно (я так думаю), если что-то не понятно, комментаторы в студию под эту статью.
 
Последнее редактирование:

Помочь проекту! 💕

Собрано
"40,140.00" ₽
Цель
"50,000.00" ₽

Последние ресурсы