Всем привет, создал эту тему только для тех, у кого ошибка: 400 В UnitPay
Касается это не только Авто-Донат движков, а вообще всех движков.
Эта статья может вам не помочь, если вы не криворукий, и всё поймёте в этой статье
Первое, что можно сделать, обратится в тех. поддержку UnitPay с просьбой отключить проверку цифровой подписи
Они могут вам отключить как на время, так и на всегда. Но могут и вообще не отключать. Всё зависит от вашего аккаунта в UnitPay.
Если вы отключите проверку, то ничего не сломается.
Второе, что можно сделать, вправлять код. С 1 апреля 2020 года UnitPay сменила свой API, а многие движки ещё не перешли на новое API, поэтому, вам придётся вправлять код самим.
Первый код: /application/donate.php (Зависит от движка)
Второй код: /templates/default/donate.tpl (Зависит от движка)
Эти 2 кода, могут не совпадать с вашим движком, т.к написаны на TPL
Т.к он на tpl, и писался под GameCMS (Движок для игр VALVe) то вам придётся его вправлять.
Третий способ, как исправить данную ошибку, попробовать обновить SECRET KEY

Может быть у вас оно поможет, кто знает.
Дополнение к статье:
Исправление данной ошибки может повлиять данный скрипт, написанный на пыхе (php)
Дополнение к статье:
Во многих случаях может быть это из-за того, что UnitPay не поддерживает символику по типу: #
Если вы зайдёте в конфиг UnitPay, и найдёте эту #, замените её на №
Например:
Не правильно: Оплата заказа #
Правильно: Оплата заказа №
Так-же это может быть из-за того, что не совпадают валюты, например у вас прописано RUB, а в ключе например $ Dollar, или Euro
Вам так-же надо будет это заменить на RUB.
Конечно, можно убрать эту строчку, и UnitPay сам подставит валюту (без значения RUB и т.д) Но, могут быть ошибки, так что лучше этого не делать. Если у вас $currency = 'RUB';
То можете попробовать убрать эту строчку, или заменить RUB на вашу валюту
Но, это не единственные решения данной проблемы.
Проблема может вызвана из-за отправки запроса не тем методом.
Например, у вас стоит GET, а надо POST
Ну, я всё объяснил понятно (я так думаю), если что-то не понятно, комментаторы в студию под эту статью.
Касается это не только Авто-Донат движков, а вообще всех движков.
Эта статья может вам не помочь, если вы не криворукий, и всё поймёте в этой статье
Первое, что можно сделать, обратится в тех. поддержку 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
Ну, я всё объяснил понятно (я так думаю), если что-то не понятно, комментаторы в студию под эту статью.
Последнее редактирование: