Ошибка 400 не передана подпись запроса unitpay

Никак не могу понять в чем ошибка в формировании ссылки и подписи, может кто сталкивался с данной проблемой у этой платежной системы?
Вот код генерации ссылки и подписи (Не добавлял ключи из аккаунта).

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. Подпись запроса не верна.
Все перерыл, не пойму как это исправить, помогите пожалуйста(


  • Вопрос задан

  • 2083 просмотра

В общем, компался я и копался, в итоге решил свою проблему, было еще куча ошибок, но вроде исправил.
Дело было 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, в 11:59

3500 руб./за проект

22 сент. 2023, в 11:34

2500 руб./за проект

22 сент. 2023, в 11:24

30000 руб./за проект

Минуточку внимания

Интеграция платежного решения

Есть ли готовое решение для моей системы/CMS?

Со всеми готовыми модулями, которые мы сейчас готовы предложить, можно ознакомиться

по ссылке

.

Также вы можете интегрироваться

через наше API

. В этом случае выдача товара/покупки покупателю производится и настраивается со стороны вашего магазина самостоятельно.

Могу ли я использовать поддомен?

Одним из обязательных требований является домен не ниже второго уровня. Сам прием платежей можно осуществлять с поддомена сайта, прошедшего модерацию.

Тестовая среда и демо-доступ.

Вы можете ознакомиться с интерфейсом и функционалом личного кабинета, используя демо-режим, а также протестировать форму и виджет оплаты через кнопки “Попробовать”

на нашем сайте

.

Проведение тестовых платежей в демо-кабинете невозможно.

Ошибка: “Магазин отклонил платеж: Incorrect digital signature”

Для дополнительной безопасности ваших платежей мы по умолчанию включаем обязательную проверку цифровой подписи при создании платежа. Наличие подписи гарантирует защиту от подмены передаваемых значений (например, изменение суммы платежа или номера заказа).

Могу ли я на форме оплаты выставлять счет в другой валюте?

Да, за это отвечает дополнительный параметр “currency” (подробнее о параметре можно посмотреть

по ссылке

. В этом случае на форме оплаты у клиента будет отображаться счет в выбранной валюте.

Ошибка при настройке, связанная с IP-адресами.

По этому вопросу вам необходимо написать в службу поддержки, указав IP-адрес, который нужно добавить в исключения. Контактные данные можно найти в личном кабинете в правом верхнем углу, кликнув на значок с “?”. Она вас наиболее точно сориентирует по дальнейшим действиям.

Как поменять язык платежной формы?

У нас есть дополнительный параметр locale, с помощью которого можно принудительно указать язык платежной формы. По умолчанию язык формы определяется исходя из страны, к которой относится IP-адрес пользователя.

Более подробно с этими параметром можно ознакомиться

по ссылке

.

Как можно скрыть некоторые методы оплаты?

Для этих целей используется дополнительный параметр hideOtherMethods, он скроет все методы оплаты, кроме необходимой.

Как настроить внешний вид формы оплаты?

Об изменении внешнего вида формы оплаты можно посмотреть

по ссылке

.

“Ответ вашего сервера не совпадает с требуемым кодом” при добавлении проекта на модерацию.

Чаще всего такая ситуация возникает в том случае, если проверочный файл расположен по неверному адресу. Пожалуйста, обратите внимание, файл должен находиться на основном домене (например, вашсайт.ру), а не на поддомене (например, поддомен.вашсайт.ру).

Ошибка: “Подпись запроса не верна”, “Не передана подпись запроса”.

Данная ошибка возникает на стороне сайта. Цифровая подпись при создании платежа является обязательной защитой от подмены платежей.

Код виджета находится в личном кабинете → Настройки проекта → раздел Виджет оплаты.


KaRmiN

SmartGuard 3.1

Описание

PHP скрипт который решит проблему «Ошибка 400. Не передана подпись запроса» которая возникает при использовании этого модуля.


Автор: obius (соседний форум)

<?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

[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]


  • 0 Comments

Всем привет, создал эту тему только для тех, у кого ошибка: 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

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

òbi

Сообщения
916
Розыгрыши
8
Решения
14
Репутация
1 596
Реакции
863
Баллы
1 828

  • #1

obius добавил(а) новый ресурс:

Unitpay — Ошибка 400 (StressWeb 13) — Решение «Ошибка 400. Не передана подпись запроса» Unitpay (StressWeb 13)

PHP:

<?php


$secretKey = 'Секретный ключ проекта';

$publicKey = 'Публичный ключ проекта';
[/QUOTE]

[URL='https://mmo-dev.info/resources/unitpay-%D0%9E%D1%88%D0%B8%D0%B1%D0%BA%D0%B0-400-stressweb-13.1681/']Узнать больше об этом ресурсе...[/URL]

Purpl

Purpl

Путник

Пользователь

Сообщения
10
Розыгрыши
0
Репутация
3
Реакции
8
Баллы
13

  • #2

А можно не подтверждать и сразу переходить к оплате?

òbi

Сообщения
916
Розыгрыши
8
Решения
14
Репутация
1 596
Реакции
863
Баллы
1 828

  • #3

А можно не подтверждать и сразу переходить к оплате?

будет время сделаю

вот форма (фодуль)

Вы не можете просматривать ссылку пожалуйста воспользуйтесь следующими ссылками Вход или Регистрация

но Вам придется набрать эти достижения до группы Участник

  • 10 сообщений на форуме.
  • 5 реакций на форуме.

или воспользоваться услугой Платные повышения

Понравилась статья? Поделить с друзьями:

Интересное по теме:

  • Ошибка 400 некорректный параметр customeremail
  • Ошибка 3eed bmw
  • Ошибка 400 невозможно определить csrf что это
  • Ошибка 400 неверный запрос размер заголовка
  • Ошибка 400 при установке blade and soul

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии