НЕ ПОДСКАЖИТЕ ЕЩЁ ПОЧЕМУ НЕ МОГУ СУММУ ПОМЕНЯТЬ ? Меняю сумму пишите не верный хеш передаёт! Код (Text): <?php $l = $_SESSION['$l']; $merchant_id = '7f50cd2c-1297-43e7-adde-8bc8d0106e96'; // ID Вашего магазина $amount = '1000'; $currency = 'RUB'; // Валюта заказа $secret = 'c2870017b1a7b15d5b9102b6ba09a23c'; // Секретный ключ №1 из настроек магазина $order_id = shapeSpace_random_string(6); // order_id $order_id = $order_id . '-' . $l; $sign = hash('sha256', implode(':', array($merchant_id, $amount, $currency, $secret, $order_id))); $lang = 'ru'; // Язык формы function shapeSpace_random_string($length) { $characters = '123456789'; srand((float)microtime() * 1000000); $random = ''; for ($i = 0; $i < $length; $i++) { $random .= $characters[rand() % strlen($characters)]; } return $random; } ?> <script type="text/javascript"> var min = 1; function calculate(sum) { var re = /[^0-9\.]/gi; if (re.test(sum)) { sum = sum.replace(re, ''); $('#oa').val(sum); } if (sum < min) { $('#error').html('Cумма должна быть больше ' + min); $('#submit').attr("disabled", "disabled"); return false; } else { $('#error').html(''); } $.get('fk_ajax.php?prepare_once=1&l=<?=$l?>&oa=' + sum, function(data) { $('#s').val(data); $('#submit').removeAttr(""); }); } var olda = 0; function recalcsign() { var a = $('input[name=amount]').val(); var log = $('input[name=log]').val(); if (olda == a) return; olda = a; //alert(a); $('submit').prop('disabled', true); $.get('recalcsign.php?log=' + log + '&amount=' + a + '&order_id=' + $('input[name=order_id]').val(), function( data) { $('input[name=sign2]').val(data); $('submit').prop('disabled', false); }); } </script> <br><br><br><br><br> <form method="GET" action="https://aaio.so/merchant/pay"> <input type="hidden" name="merchant_id" value="<?=$merchant_id; ?>"> <span style="padding:10px; font-size:19px; display:inline-block;"> <div class="arrow">Введите сумму для оплаты:</div> </span> <input onkeyup=recalcsign() onchange=recalcsign() type="number" name="amount" value="<?php echo $amount; ?>" id="oa" step="0" min="1000" max="100000" required="" onchange="calculate(this.value)" onkeyup="calculate(this.value)" onfocusout="calculate(this.value)" onactivate="calculate(this.value)" ondeactivate="calculate(this.value)" style="font-size: 19px;line-height: 2;letter-spacing: 0em;font-weight: 400;font-style: normal;border-radius: 5px;"> <span></span> <span style="padding:10px; font-size:19px; display:inline-block;">руб</span> <input type="hidden" name="currency" value=<?=$currency; ?>> <input type="hidden" name="order_id" value="<?=$order_id; ?>"> <input type="hidden" name="sign" value="<?=$sign?>"> <input type="hidden" name="log" value=<?=$l; ?>> <span><input type="submit" id="submit" value="ОПЛАТИТЬ" style="padding:10px; font-size:19px; border-radius: 5px;"></span> </form> Сумма $amount При вводе другой суммы форма не работает ! Кто сделает и будет работать скину 1000 Руб! В знак благодарности!
Тестил в отдельном файле, все ок, дальше на твоей совести))) Код (Text): <?php session_start(); $l = $_SESSION['$l'] ?? 'ru'; $merchant_id = '7f50cd2c-1297-43e7-adde-8bc8d0106e96'; $amount = '1000'; $currency = 'RUB'; $secret = 'c2870017b1a7b15d5b9102b6ba09a23c'; $order_id = shapeSpace_random_string(6); $order_id = $order_id . '-' . $l; $sign = hash('sha256', implode(':', array($merchant_id, $amount, $currency, $secret, $order_id))); function shapeSpace_random_string($length) { $characters = '123456789'; srand((float)microtime() * 1000000); $random = ''; for ($i = 0; $i < $length; $i++) { $random .= $characters[rand() % strlen($characters)]; } return $random; } if (isset($_POST['amount'])) { $amount = $_POST['amount']; $sign = hash('sha256', implode(':', array($merchant_id, $amount, $currency, $secret, $order_id))); echo json_encode(['sign' => $sign, 'order_id' => $order_id]); exit; } $amount = '1000'; ?> <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script> <script type="text/javascript"> var min = 1; function calculate(sum) { var re = /[^0-9\.]/gi; if (re.test(sum)) { sum = sum.replace(re, ''); $('#oa').val(sum); } if (sum < min) { $('#error').html('Cумма должна быть больше ' + min); $('#submit').attr("disabled", "disabled"); return false; } else { $('#error').html(''); } } function recalcsign() { var a = $('input[name=amount]').val(); if (a < 1000) { $('#error').html('Cумма должна быть не менее 1000 рублей'); return; } $.post(window.location.href, { amount: a }, function(data) { var response = JSON.parse(data); $('input[name=sign]').val(response.sign); $('input[name=order_id]').val(response.order_id); }); } $(document).ready(function() { $('#oa').on('input', function() { calculate(this.value); recalcsign(); }); }); </script> <form method="GET" action="https://aaio.so/merchant/pay"> <input type="hidden" name="merchant_id" value="<?=$merchant_id; ?>"> <span style="padding:10px; font-size:19px; display:inline-block;"> <div class="arrow">Введите сумму для оплаты:</div> </span> <input type="number" name="amount" value="<?=$amount; ?>" id="oa" step="1" min="1000" max="100000" required="" style="font-size: 19px;line-height: 2;letter-spacing: 0em;font-weight: 400;font-style: normal;border-radius: 5px;"> <span style="padding:10px; font-size:19px; display:inline-block;">руб</span> <input type="hidden" name="currency" value="<?=$currency; ?>"> <input type="hidden" name="order_id" value="<?=$order_id; ?>"> <input type="hidden" name="sign" value="<?=$sign; ?>"> <input type="hidden" name="log" value="<?=$l; ?>"> <span id="error" style="color:red;"></span> <span><input type="submit" id="submit" value="ОПЛАТИТЬ" style="padding:10px; font-size:19px; border-radius: 5px;"></span> </form>
заменил на <?php session_start(); $l = $_SESSION['$l']; не помогло --- Добавлено --- Parse error: syntax error, unexpected echo json_encode(['sign' => $sign, 'order_id' => $order_id]); --- Добавлено --- ругается на echo json_encode(['sign' => $sign, 'order_id' => $order_id]);
Добрый день! M.б. переменная сессии "i" и поможет PHP: $l = $_SESSION['l']; Parse error: syntax error, unexpected... из-за того, что перед этим потеряли ";" Удачи!-
Parse error: syntax error, unexpected 29 строка не не могу весь код на 5,3 переделывать 1000 страниц нет смысла! --- Добавлено --- работает но меняю сумму платежа ошибка Хеш сгенерирован неверно
замени на PHP: $l = isset( $_SESSION['$l'] ) ? $_SESSION['$l'] : 'ru'; Вообще у тебя логика "немного" корявая, но мы конечно не об этом) непонятно что и где определяется . Проверяй, буду несколько позже. Скинул в личку url для теста
Думаю, прояснится почему при вводе другой суммы форма не работает... Однако, обратите внимание на паттерн /[^0-9\.]/ в функции calculate Код (Javascript): function calculate(sum) { var re = /[^0-9\.]/gi; if (re.test(sum)) { sum = sum.replace(re, ''); $('#oa').val(sum); } if (sum < min) { $('#error').html('Cумма должна быть больше ' + min); $('#submit').attr("disabled", "disabled"); return false; } else { $('#error').html(''); } $.get('fk_ajax.php?prepare_once=1&l=<?=$l?>&oa=' + sum, function(data) { $('#s').val(data); $('#submit').removeAttr(""); }); } Вроде бы Вы пытаетесь исправить данные в переменной sum и хотите удалить все символы отличающиеся от чисел и символа "." К сожалению, правильность ввода чисел этот паттерн не проверяет. Если вместо числа введена, например, дата "19.10.2024", она не будет исправляться. Советую Вам примерить паттерн var re = /^[-+]?(\d*\.\d+|\d+)$/gi и если sum задана не верно выдавать сообщение об ошибке и не пытаться испралять значение
Добрый день! При вводе другой суммы форма не работает, потому, что метод в форме GET HTML: <form method="GET" action="https://aaio.so/merchant/pay"> между почим method="GET" можно не писать GET идёт по умолчанию. а в PHP (злесь и далее последнея версия от Survivor) PHP: if (isset($_POST['amount'])) { $amount = $_POST['amount']; $sign = hash('sha256', implode(':', array($merchant_id, $amount, $currency, $secret, $order_id))); echo json_encode(['sign' => $sign, 'order_id' => $order_id]); exit; } Теперь несколько общих сображений по коду: 1. Некорректаная структура HTML-документа нет html, head и body 2. В тэгах стили определяются в атрибутах style, и это усложняет чтение кода. Советую всегда стили собирать в одном месте и следить за избыточностью. 3. У Вас в коде JS перед HTML-form и он должен исполняться после загрузки документа. Поэтому добавил Код (Javascript): <script type="text/javascript"> var min = 1; $(document).ready(function() { ... }); </script> 4. Исправил поле формы amount HTML: <input type="text" name="amount" value="<?=$amount; ?>" id="oa" step="1" min="1000" max="100000" pattern="^(\d*\.\d+|\d+)$" required> поменял type="number" на type="text" и добавил аттрибут pattern поэтому отпала необходимость проверки sum (amount) JS. 5. Исправил код от Survivor PHP: <?php session_start(); $l = $_SESSION['$l'] ?? 'ru'; $merchant_id = '7f50cd2c-1297-43e7-adde-8bc8d0106e96'; $amount = '1000'; $currency = 'RUB'; $secret = 'c2870017b1a7b15d5b9102b6ba09a23c'; $order_id = shapeSpace_random_string(6); $order_id = $order_id . '-' . $l; $sign = hash('sha256', implode(':', array($merchant_id, $amount, $currency, $secret, $order_id))); function shapeSpace_random_string($length) { $characters = '123456789'; srand((float)microtime() * 1000000); $random = ''; for ($i = 0; $i < $length; $i++) { $random .= $characters[rand() % strlen($characters)]; } return $random; } if (isset($_GET['amount'])) { $amount = $_GET['amount']; $sign = hash('sha256', implode(':', array($merchant_id, $amount, $currency, $secret, $order_id))); echo json_encode(['sign' => $sign, 'order_id' => $order_id]); exit; } ?> <html> <head> <style> body,input{font-size: 19px} input{border-radius: 5px;} #oa{ line-height: 2; letter-spacing: 0em; font-weight: 400; } #submit, span{padding:10px} span{display:inline-block;} #error{ color:red; padding:0px } #submit{margin-left:10px} </style> <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script> <script type="text/javascript"> var min = 1; $(document).ready(function() { function calculate(sum) { if (sum < min) { $('#error').html('Cумма должна быть больше ' + min); $('#submit').attr("disabled", "disabled"); return false; } else { $('#error').html(''); } } function recalcsign() { var a = $('input[name=amount]').val(); if (a < 1000) { $('#error').html('Cумма должна быть не менее 1000 рублей'); return; } $.post(window.location.href, { amount: a }, function(data) { var response = JSON.parse(data); $('input[name=sign]').val(response.sign); $('input[name=order_id]').val(response.order_id); }); } $(document).ready(function() { $('#oa').on('input', function() { calculate(this.value); recalcsign(); }); }); }); </script> </head> <body> <form method="GET" action="https://aaio.so/merchant/pay"> <input type="hidden" name="merchant_id" value="<?=$merchant_id; ?>"> <span> <div class="arrow">Введите сумму для оплаты:</div> </span> <input type="text" name="amount" value="<?=$amount; ?>" id="oa" step="1" min="1000" max="100000" pattern="^(\d*\.\d+|\d+)$" required> <span>руб</span> <input type="hidden" name="currency" value="<?=$currency; ?>"> <input type="hidden" name="order_id" value="<?=$order_id; ?>"> <input type="hidden" name="sign" value="<?=$sign; ?>"> <input type="hidden" name="log" value="<?=$l; ?>"> <span id="error"></span> <input type="submit" id="submit" value="ОПЛАТИТЬ"> </form> </body> </html>
Генерация хеша от суммы в 1000 при этом отправляя форму на платёжный шлюз с произвольной суммой, конечно хеш не будет соответствовать.
Дополнение Доделал и проверил HTML: <?php session_start(); $l = $_SESSION['$l'] ?? 'ru'; $merchant_id = '7f50cd2c-1297-43e7-adde-8bc8d0106e96'; $amount = '1000'; $currency = 'RUB'; $secret = 'c2870017b1a7b15d5b9102b6ba09a23c'; $order_id = shapeSpace_random_string(6); $order_id = $order_id . '-' . $l; function shapeSpace_random_string($length) { $characters = '123456789'; srand((float)microtime() * 1000000); $random = ''; for ($i = 0; $i < $length; $i++) { $random .= $characters[rand() % strlen($characters)]; } return $random; } if (isset($_GET['amount'])) { $amount = $_GET['amount']; $sign = hash('sha256', implode(':', array($merchant_id, $amount, $currency, $secret, $order_id))); echo json_encode(['sign' => $sign, 'order_id' => $order_id]); exit; } ?> <html> <head> <style> body,input{font-size: 19px} input{border-radius: 5px;} #oa{ line-height: 2; letter-spacing: 0em; font-weight: 400; } body, input{font-size:19px;} #submit, span{padding:10px} span{display:inline-block;} #error{ color:red; padding:0px } #submit{ margin-left:10px; cursor: pointer} </style> <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script> <script type="text/javascript"> var minAmount = 1000; var maxAmount = 100000; $(document).ready(function() { var errorEl = $('#error'); var submitEl = $('#submit'); var amountEl = $('input[name=amount]'); var paymentEl = $('#payment'); function recalcsign() { $.get(window.location.href, { amount: amount }, function(data) { var response = JSON.parse(data); console.log(amount,response); $('input[name=sign]').val(response.sign); $('input[name=order_id]').val(response.order_id); }); }; function valid(){ if(!amount) amount = 0; amountF = parseFloat(amount); if (amountF < minAmount) { errorEl.html('Cумма должна быть больше ' + minAmount); submitEl.attr("disabled", "disabled"); return false; } else if (amountF > maxAmount) { errorEl.html('Cумма должна быть меньше ' + maxAmount); submitEl.attr("disabled", "disabled"); return false; } else { errorEl.html(''); submitEl.removeAttr("disabled"); return true; } }; paymentEl.bind("keypress", function(e) { if (e.keyCode == 13) { e.preventDefault(); return false; } }); submitEl.hover(function(e){ amount = amountEl.val(); if(valid()) recalcsign(); }); $("#oa").click(function(e){ errorEl.html(''); submitEl.removeAttr("disabled"); }); }); </script> </head> <body> <form method="GET" id="payment" action="https://aaio.so/merchant/pay"> <input type="hidden" name="merchant_id" value="<?=$merchant_id; ?>"> <span> <div class="arrow">Введите сумму для оплаты:</div> </span> <input type="text" name="amount" id="oa" step="1" pattern="^(\d*\.\d+|\d+)$" required placeholder="от 1000.00 до 100000.00 "> <span>руб</span> <input type="hidden" name="currency" value="<?=$currency; ?>"> <input type="hidden" name="order_id" value="<?=$order_id; ?>"> <input type="hidden" name="sign" value="<?=$sign; ?>"> <input type="hidden" name="log" value="<?=$l; ?>"> <span id="error"></span> <input type="submit" id="submit" value="ОПЛАТИТЬ"> </form> </body> </html>
Дополнение. Добрый день! Я посмотрел документацию https://wiki.aaio.so/priem-platezhe...odom-na-formu-ustarevshee/primer-formy-na-php Это метод устарел. Однако у Вас была проблема с JS. Я показал Вам как сделать валидацию и отправку данных на jQuery. Теперь решил покаказать Вам реализацию на Native Java Script ( в коде функция $ специально для фанатов jQuery ) Код (Javascript): $ = function(selector){return document.querySelectorAll(selector)[0];}; var minAmount = 1000; var maxAmount = 100000; window.addEventListener("load", () => { var errorEl = $('#error'); var amountEl = $('input[name=amount]'); var paymentEl = $('#payment'); //--------------------------------------------- recalcsign = function(){ fetch("?amount=amount") .then(response => response.json()) .then((data) => { $('input[name=sign]').value = data.sign; $('input[name=order_id]').value = data.order_id; paymentEl.submit(); }); }; errorMsg = function(msg){errorEl.innerHTML = msg;}; valid = function(){ if(!amount) amount = 0; amountF = parseFloat(amount); if (amountF < minAmount) msg = `Cумма должна быть больше ${minAmount}`; else if (amountF > maxAmount) msg = `Cумма должна быть меньше ${maxAmount}`; else msg = ''; errorMsg(msg); return msg?false:true; }; amountEl.addEventListener("click", () => {errorMsg('')}); paymentEl.addEventListener("submit", (e) => { e.preventDefault(); amount = amountEl.value; if(valid()) recalcsign(); }); }); PHP: <?php session_start(); $lang = $_SESSION['$l'] ?? 'ru'; $merchant_id = '7f50cd2c-1297-43e7-adde-8bc8d0106e96'; $currency = 'RUB'; $secret = 'c2870017b1a7b15d5b9102b6ba09a23c'; $order_id = shapeSpace_random_string(6); $order_id = "$order_id-$lang"; $desc = 'Order Payment'; function shapeSpace_random_string($length) { $characters = '123456789'; srand((float)microtime() * 1000000); $random = ''; for ($i = 0; $i < $length; $i++) { $random .= $characters[rand() % strlen($characters)]; } return $random; } if (isset($_GET['amount'])) { $amount = $_GET['amount']; $sign = hash('sha256', implode(':', array($merchant_id, $amount, $currency, $secret, $order_id))); echo json_encode(['sign' => $sign, 'order_id' => $order_id]); exit; } echo <<<HTML <html> <head> <script src="payment.js"></script> <link rel="stylesheet" href="payment.css"> </head> <body> <form id="payment" method="POST" action="https://aaio.so/merchant/pay"> <span> <div class="arrow">Введите сумму для оплаты:</div> </span> <input type="text" name="amount" id="oa" step="1" pattern="^(\d*\.\d+|\d+)$" required placeholder="от 1000.00 до 100000.00 "> <span>руб</span> <input type="hidden" name="merchant_id" value="$merchant_id"> <input type="hidden" name="currency" value="$currency"> <input type="hidden" name="order_id" value="$order_id"> <input type="hidden" name="sign" value=""> <input type="hidden" name="desc" value="$desc"> <input type="hidden" name="lang" value="$lang"> <input type="submit" name="pay" value="ОПЛАТИТЬ"> <div id="error"></div> </form> </body> </html> HTML; Код (CSS): body,input{ font-size: 19px; font-family: arial; } input{border-radius: 5px;} #oa{ line-height: 2; letter-spacing: 0em; font-weight: 400; } body, input{font-size:19px;} input[type='submit'], span{padding:10px} span{display:inline-block;} #error{ color:red; padding:20 0 0 10; } input[type='submit']{ margin-left:10px; cursor: pointer }