За последние 24 часа нас посетили 24214 программистов и 1682 робота. Сейчас ищет 1231 программист ...

Помошь с формой оплаты!

Тема в разделе "PHP для новичков", создана пользователем dima_selevanov, 18 окт 2024 в 18:01.

  1. dima_selevanov

    dima_selevanov Новичок

    С нами с:
    Пятница
    Сообщения:
    4
    Симпатии:
    0
    НЕ ПОДСКАЖИТЕ ЕЩЁ ПОЧЕМУ НЕ МОГУ СУММУ ПОМЕНЯТЬ ? Меняю сумму пишите не верный хеш передаёт!

    Код (Text):
    1. <?php
    2. $l = $_SESSION['$l'];
    3. $merchant_id = '7f50cd2c-1297-43e7-adde-8bc8d0106e96'; // ID Вашего магазина
    4. $amount = '1000';
    5. $currency = 'RUB'; // Валюта заказа
    6. $secret = 'c2870017b1a7b15d5b9102b6ba09a23c'; // Секретный ключ №1 из настроек магазина
    7. $order_id = shapeSpace_random_string(6); // order_id
    8. $order_id = $order_id . '-' . $l;
    9. $sign = hash('sha256', implode(':', array($merchant_id, $amount, $currency, $secret, $order_id)));
    10. $lang = 'ru'; // Язык формы
    11. function shapeSpace_random_string($length)
    12. {
    13.     $characters = '123456789';
    14.     srand((float)microtime() * 1000000);
    15.     $random = '';
    16.     for ($i = 0; $i < $length; $i++) {
    17.         $random .= $characters[rand() % strlen($characters)];
    18.     }
    19.     return $random;
    20. }
    21. ?>
    22. <script type="text/javascript">
    23. var min = 1;
    24. function calculate(sum) {
    25.     var re = /[^0-9\.]/gi;
    26.     if (re.test(sum)) {
    27.         sum = sum.replace(re, '');
    28.         $('#oa').val(sum);
    29.     }
    30.     if (sum < min) {
    31.         $('#error').html('Cумма должна быть больше ' + min);
    32.         $('#submit').attr("disabled", "disabled");
    33.         return false;
    34.     } else {
    35.         $('#error').html('');
    36.     }
    37.     $.get('fk_ajax.php?prepare_once=1&l=<?=$l?>&oa=' + sum, function(data) {
    38.         $('#s').val(data);
    39.         $('#submit').removeAttr("");
    40.     });
    41. }
    42. var olda = 0;
    43. function recalcsign() {
    44.     var a = $('input[name=amount]').val();
    45.     var log = $('input[name=log]').val();
    46. if (olda == a) return;
    47.     olda = a;
    48.     //alert(a);
    49.     $('submit').prop('disabled', true);
    50.     $.get('recalcsign.php?log=' + log + '&amount=' + a + '&order_id=' + $('input[name=order_id]').val(), function(
    51.         data) {
    52.         $('input[name=sign2]').val(data);
    53.         $('submit').prop('disabled', false);
    54.     });
    55. }
    56. </script>
    57. <br><br><br><br><br>
    58. <form method="GET" action="https://aaio.so/merchant/pay">
    59.     <input type="hidden" name="merchant_id" value="<?=$merchant_id; ?>">
    60.     <span style="padding:10px; font-size:19px; display:inline-block;">
    61.                 <div class="arrow">Введите сумму для оплаты:</div>
    62.             </span>
    63.             <input onkeyup=recalcsign() onchange=recalcsign() type="number" name="amount" value="<?php echo $amount; ?>"
    64.                 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)"
    65.                 style="font-size: 19px;line-height: 2;letter-spacing: 0em;font-weight: 400;font-style: normal;border-radius: 5px;">
    66.                
    67.            
    68.             <span></span>
    69.             <span style="padding:10px; font-size:19px; display:inline-block;">руб</span>
    70.     <input type="hidden" name="currency" value=<?=$currency; ?>>
    71.     <input type="hidden" name="order_id" value="<?=$order_id; ?>">
    72.    
    73.     <input type="hidden" name="sign" value="<?=$sign?>">
    74.             <input type="hidden" name="log" value=<?=$l; ?>>
    75.        
    76.             &nbsp;&nbsp;
    77.             <span><input type="submit" id="submit" value="ОПЛАТИТЬ"
    78.                     style="padding:10px; font-size:19px; border-radius: 5px;"></span>
    79.         </form>
    Сумма $amount
    При вводе другой суммы форма не работает !

    Кто сделает и будет работать скину 1000 Руб! В знак благодарности!
     
  2. Survivor

    Survivor Новичок

    С нами с:
    8 фев 2023
    Сообщения:
    82
    Симпатии:
    15
    Тестил в отдельном файле, все ок, дальше на твоей совести)))

    Код (Text):
    1. <?php
    2. session_start();
    3. $l = $_SESSION['$l'] ?? 'ru';
    4. $merchant_id = '7f50cd2c-1297-43e7-adde-8bc8d0106e96';
    5. $amount = '1000';
    6. $currency = 'RUB';
    7. $secret = 'c2870017b1a7b15d5b9102b6ba09a23c';
    8. $order_id = shapeSpace_random_string(6);
    9. $order_id = $order_id . '-' . $l;
    10. $sign = hash('sha256', implode(':', array($merchant_id, $amount, $currency, $secret, $order_id)));
    11.  
    12.  
    13. function shapeSpace_random_string($length)
    14. {
    15.     $characters = '123456789';
    16.     srand((float)microtime() * 1000000);
    17.     $random = '';
    18.     for ($i = 0; $i < $length; $i++) {
    19.         $random .= $characters[rand() % strlen($characters)];
    20.     }
    21.     return $random;
    22. }
    23.  
    24. if (isset($_POST['amount'])) {
    25.     $amount = $_POST['amount'];
    26.     $sign = hash('sha256', implode(':', array($merchant_id, $amount, $currency, $secret, $order_id)));
    27.     echo json_encode(['sign' => $sign, 'order_id' => $order_id]);
    28.     exit;
    29. }
    30.  
    31. $amount = '1000';
    32. ?>
    33.  
    34.     <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
    35.     <script type="text/javascript">
    36.         var min = 1;
    37.  
    38.         function calculate(sum) {
    39.             var re = /[^0-9\.]/gi;
    40.             if (re.test(sum)) {
    41.                 sum = sum.replace(re, '');
    42.                 $('#oa').val(sum);
    43.             }
    44.             if (sum < min) {
    45.                 $('#error').html('Cумма должна быть больше ' + min);
    46.                 $('#submit').attr("disabled", "disabled");
    47.                 return false;
    48.             } else {
    49.                 $('#error').html('');
    50.             }
    51.         }
    52.  
    53.         function recalcsign() {
    54.             var a = $('input[name=amount]').val();
    55.             if (a < 1000) {
    56.                 $('#error').html('Cумма должна быть не менее 1000 рублей');
    57.                 return;
    58.             }
    59.             $.post(window.location.href, { amount: a }, function(data) {
    60.                 var response = JSON.parse(data);
    61.                 $('input[name=sign]').val(response.sign);
    62.                 $('input[name=order_id]').val(response.order_id);
    63.             });
    64.         }
    65.  
    66.         $(document).ready(function() {
    67.             $('#oa').on('input', function() {
    68.                 calculate(this.value);
    69.                 recalcsign();
    70.             });
    71.         });
    72.     </script>
    73.  
    74.     <form method="GET" action="https://aaio.so/merchant/pay">
    75.         <input type="hidden" name="merchant_id" value="<?=$merchant_id; ?>">
    76.         <span style="padding:10px; font-size:19px; display:inline-block;">
    77.             <div class="arrow">Введите сумму для оплаты:</div>
    78.         </span>
    79.         <input type="number" name="amount" value="<?=$amount; ?>" id="oa" step="1" min="1000" max="100000" required=""
    80.             style="font-size: 19px;line-height: 2;letter-spacing: 0em;font-weight: 400;font-style: normal;border-radius: 5px;">
    81.         <span style="padding:10px; font-size:19px; display:inline-block;">руб</span>
    82.  
    83.         <input type="hidden" name="currency" value="<?=$currency; ?>">
    84.         <input type="hidden" name="order_id" value="<?=$order_id; ?>">
    85.         <input type="hidden" name="sign" value="<?=$sign; ?>">
    86.         <input type="hidden" name="log" value="<?=$l; ?>">
    87.  
    88.         <span id="error" style="color:red;"></span>
    89.         &nbsp;&nbsp;
    90.         <span><input type="submit" id="submit" value="ОПЛАТИТЬ" style="padding:10px; font-size:19px; border-radius: 5px;"></span>
    91.     </form>
     
  3. dima_selevanov

    dima_selevanov Новичок

    С нами с:
    Пятница
    Сообщения:
    4
    Симпатии:
    0
    Спасибо большое но не работает в php версия 5,3
     
  4. Survivor

    Survivor Новичок

    С нами с:
    8 фев 2023
    Сообщения:
    82
    Симпатии:
    15
    1. $l = $_SESSION['$l'] ?? 'ru'; замени на старое значение
     
  5. dima_selevanov

    dima_selevanov Новичок

    С нами с:
    Пятница
    Сообщения:
    4
    Симпатии:
    0
    заменил на
    <?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]);
     
  6. Survivor

    Survivor Новичок

    С нами с:
    8 фев 2023
    Сообщения:
    82
    Симпатии:
    15
    забыл... переходи на php 8+)
    PHP:
    1. echo json_encode(array('sign' => $sign, 'order_id' => $order_id));
     
  7. Vladimir Kheifets

    Vladimir Kheifets Новичок

    С нами с:
    23 сен 2023
    Сообщения:
    378
    Симпатии:
    70
    Адрес:
    Бавария, Германия
    Добрый день!
    M.б. переменная сессии "i" и поможет
    PHP:
    1. $l = $_SESSION['l'];
    Parse error: syntax error, unexpected... из-за того, что перед этим потеряли ";"
    Удачи!-
     
  8. dima_selevanov

    dima_selevanov Новичок

    С нами с:
    Пятница
    Сообщения:
    4
    Симпатии:
    0
    Parse error: syntax error, unexpected 29 строка
    не не могу весь код на 5,3 переделывать 1000 страниц нет смысла!
    --- Добавлено ---
    работает но меняю сумму платежа ошибка Хеш сгенерирован неверно
     
  9. Survivor

    Survivor Новичок

    С нами с:
    8 фев 2023
    Сообщения:
    82
    Симпатии:
    15
    замени на
    PHP:
    1. $l = isset( $_SESSION['$l'] ) ? $_SESSION['$l'] : 'ru';
    Вообще у тебя логика "немного" корявая, но мы конечно не об этом) непонятно что и где определяется . Проверяй, буду несколько позже.

    Скинул в личку url для теста
     
  10. Vladimir Kheifets

    Vladimir Kheifets Новичок

    С нами с:
    23 сен 2023
    Сообщения:
    378
    Симпатии:
    70
    Адрес:
    Бавария, Германия
    Думаю, прояснится почему при вводе другой суммы форма не работает...
    Однако, обратите внимание на паттерн /[^0-9\.]/ в функции calculate
    Код (Javascript):
    1. function calculate(sum) {
    2.     var re = /[^0-9\.]/gi;
    3.     if (re.test(sum)) {
    4.         sum = sum.replace(re, '');
    5.         $('#oa').val(sum);
    6.     }
    7.     if (sum < min)
    8.     {
    9.         $('#error').html('Cумма должна быть больше ' + min);
    10.         $('#submit').attr("disabled", "disabled");
    11.         return false;
    12.     }
    13.     else
    14.     {
    15.         $('#error').html('');
    16.     }
    17.     $.get('fk_ajax.php?prepare_once=1&l=<?=$l?>&oa=' + sum, function(data)
    18.     {
    19.         $('#s').val(data);
    20.         $('#submit').removeAttr("");
    21.     });
    22. }
    Вроде бы Вы пытаетесь исправить данные в переменной sum
    и хотите удалить все символы отличающиеся от чисел и символа "."
    К сожалению, правильность ввода чисел этот паттерн не проверяет.
    Если вместо числа введена, например, дата "19.10.2024", она не будет исправляться.
    Советую Вам примерить паттерн var re = /^[-+]?(\d*\.\d+|\d+)$/gi и если sum задана
    не верно выдавать сообщение об ошибке и не пытаться испралять значение
     
    #10 Vladimir Kheifets, 19 окт 2024 в 12:33
    Последнее редактирование: 19 окт 2024 в 12:40
  11. Vladimir Kheifets

    Vladimir Kheifets Новичок

    С нами с:
    23 сен 2023
    Сообщения:
    378
    Симпатии:
    70
    Адрес:
    Бавария, Германия
    Добрый день!

    При вводе другой суммы форма не работает, потому, что метод в форме GET
    HTML:
    1. <form method="GET" action="https://aaio.so/merchant/pay">
    между почим method="GET" можно не писать GET идёт по умолчанию.
    а в PHP (злесь и далее последнея версия от Survivor)
    PHP:
    1. if (isset($_POST['amount'])) {
    2.     $amount = $_POST['amount'];
    3.     $sign = hash('sha256', implode(':', array($merchant_id, $amount, $currency, $secret, $order_id)));
    4.     echo json_encode(['sign' => $sign, 'order_id' => $order_id]);
    5.     exit;
    6. }
    Теперь несколько общих сображений по коду:

    1. Некорректаная структура HTML-документа нет html, head и body

    2. В тэгах стили определяются в атрибутах style, и это усложняет чтение кода.
    Советую всегда стили собирать в одном месте и следить за избыточностью.

    3. У Вас в коде JS перед HTML-form и он должен исполняться после загрузки документа.
    Поэтому добавил
    Код (Javascript):
    1. <script type="text/javascript">
    2. var min = 1;
    3. $(document).ready(function() {
    4. ...
    5. });
    6. </script>
    4. Исправил поле формы amount
    HTML:
    1. <input type="text" name="amount" value="<?=$amount; ?>" id="oa" step="1" min="1000"
    2.          max="100000" pattern="^(\d*\.\d+|\d+)$" required>
    поменял type="number" на type="text" и добавил аттрибут pattern
    поэтому отпала необходимость проверки sum (amount) JS.

    5. Исправил код от Survivor
    PHP:
    1. <?php
    2. $l = $_SESSION['$l'] ?? 'ru';
    3. $merchant_id = '7f50cd2c-1297-43e7-adde-8bc8d0106e96';
    4. $amount = '1000';
    5. $currency = 'RUB';
    6. $secret = 'c2870017b1a7b15d5b9102b6ba09a23c';
    7. $order_id = shapeSpace_random_string(6);
    8. $order_id = $order_id . '-' . $l;
    9. $sign = hash('sha256', implode(':', array($merchant_id, $amount, $currency, $secret, $order_id)));
    10. function shapeSpace_random_string($length)
    11. {
    12.   $characters = '123456789';
    13.   srand((float)microtime() * 1000000);
    14.   $random = '';
    15.   for ($i = 0; $i < $length; $i++) {
    16.   $random .= $characters[rand() % strlen($characters)];
    17.   }
    18.   return $random;
    19. }
    20.  
    21. if (isset($_GET['amount'])) {
    22.   $amount = $_GET['amount'];
    23.   $sign = hash('sha256', implode(':', array($merchant_id, $amount, $currency, $secret, $order_id)));
    24.   echo json_encode(['sign' => $sign, 'order_id' => $order_id]);
    25.   exit;
    26. }
    27. ?>
    28. <html>
    29. <head>
    30. <style>
    31. body,input{font-size: 19px}
    32. input{border-radius: 5px;}
    33. #oa{
    34.   line-height: 2;
    35.   letter-spacing: 0em;
    36.   font-weight: 400;
    37. }
    38. #submit, span{padding:10px}
    39. span{display:inline-block;}
    40. #error{
    41.   color:red;
    42.   padding:0px
    43. }
    44. #submit{margin-left:10px}
    45. </style>
    46. <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
    47. <script type="text/javascript">
    48. var min = 1;
    49. $(document).ready(function() {
    50.   function calculate(sum) {
    51.   if (sum < min) {
    52.   $('#error').html('Cумма должна быть больше ' + min);
    53.   $('#submit').attr("disabled", "disabled");
    54.   return false;
    55.   }
    56.   else
    57.   {
    58.   $('#error').html('');
    59.   }
    60.   }
    61.   function recalcsign() {
    62.   var a = $('input[name=amount]').val();
    63.   if (a < 1000) {
    64.   $('#error').html('Cумма должна быть не менее 1000 рублей');
    65.   return;
    66.   }
    67.   $.post(window.location.href, { amount: a }, function(data) {
    68.   var response = JSON.parse(data);
    69.   $('input[name=sign]').val(response.sign);
    70.   $('input[name=order_id]').val(response.order_id);
    71.   });
    72.   }
    73.   $(document).ready(function() {
    74.   $('#oa').on('input', function() {
    75.   calculate(this.value);
    76.   recalcsign();
    77.   });
    78.   });
    79. });
    80. </script>
    81. </head>
    82. <body>
    83.   <form method="GET" action="https://aaio.so/merchant/pay">
    84.   <input type="hidden" name="merchant_id" value="<?=$merchant_id; ?>">
    85.   <span>
    86.   <div class="arrow">Введите сумму для оплаты:</div>
    87.   </span>
    88.   <input type="text" name="amount" value="<?=$amount; ?>" id="oa" step="1" min="1000"
    89.   max="100000" pattern="^(\d*\.\d+|\d+)$" required>
    90.   <span>руб</span>
    91.   <input type="hidden" name="currency" value="<?=$currency; ?>">
    92.   <input type="hidden" name="order_id" value="<?=$order_id; ?>">
    93.   <input type="hidden" name="sign" value="<?=$sign; ?>">
    94.   <input type="hidden" name="log" value="<?=$l; ?>">
    95.   <span id="error"></span>
    96.   <input type="submit" id="submit" value="ОПЛАТИТЬ">
    97.   </form>
    98. </body>
    99. </html>
     
    #11 Vladimir Kheifets, 20 окт 2024 в 12:57
    Последнее редактирование: 20 окт 2024 в 13:05
  12. Aleksandr.B

    Aleksandr.B Новичок

    С нами с:
    2 фев 2023
    Сообщения:
    158
    Симпатии:
    41
    Адрес:
    Барнаул
    Генерация хеша от суммы в 1000 при этом отправляя форму на платёжный шлюз с произвольной суммой, конечно хеш не будет соответствовать.
     
  13. Vladimir Kheifets

    Vladimir Kheifets Новичок

    С нами с:
    23 сен 2023
    Сообщения:
    378
    Симпатии:
    70
    Адрес:
    Бавария, Германия
    Дополнение
    Доделал и проверил
    HTML:
    1. <?php
    2. session_start();
    3. $l = $_SESSION['$l'] ?? 'ru';
    4. $merchant_id = '7f50cd2c-1297-43e7-adde-8bc8d0106e96';
    5. $amount = '1000';
    6. $currency = 'RUB';
    7. $secret = 'c2870017b1a7b15d5b9102b6ba09a23c';
    8. $order_id = shapeSpace_random_string(6);
    9. $order_id = $order_id . '-' . $l;
    10. function shapeSpace_random_string($length)
    11. {
    12.    $characters = '123456789';
    13.    srand((float)microtime() * 1000000);
    14.    $random = '';
    15.    for ($i = 0; $i < $length; $i++) {
    16.        $random .= $characters[rand() % strlen($characters)];
    17.    }
    18.    return $random;
    19. }
    20.  
    21. if (isset($_GET['amount'])) {
    22.    $amount = $_GET['amount'];
    23.    $sign = hash('sha256', implode(':', array($merchant_id, $amount, $currency, $secret, $order_id)));
    24.    echo json_encode(['sign' => $sign, 'order_id' => $order_id]);
    25.     exit;
    26. }
    27. ?>
    28. body,input{font-size: 19px}
    29. input{border-radius: 5px;}
    30. #oa{
    31.     line-height: 2;
    32.     letter-spacing: 0em;
    33.     font-weight: 400;    
    34. }
    35.  
    36. body, input{font-size:19px;}
    37. #submit, span{padding:10px}
    38. span{display:inline-block;}
    39. #error{
    40.     color:red;
    41.     padding:0px
    42. }
    43. #submit{
    44.     margin-left:10px;
    45.     cursor: pointer}
    46. <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
    47. <script type="text/javascript">  
    48. var minAmount = 1000;
    49. var maxAmount = 100000;
    50. $(document).ready(function() {
    51.     var errorEl = $('#error');
    52.     var submitEl = $('#submit');
    53.     var amountEl = $('input[name=amount]');
    54.     var paymentEl = $('#payment');
    55.  
    56.         function recalcsign() {
    57.             $.get(window.location.href, { amount: amount }, function(data) {
    58.                 var response = JSON.parse(data);
    59.                 console.log(amount,response);
    60.                 $('input[name=sign]').val(response.sign);
    61.                 $('input[name=order_id]').val(response.order_id);
    62.             });
    63.         };
    64.  
    65.         function valid(){
    66.             if(!amount) amount = 0;
    67.             amountF = parseFloat(amount);
    68.             if (amountF < minAmount) {
    69.                errorEl.html('Cумма должна быть больше ' + minAmount);
    70.                submitEl.attr("disabled", "disabled");
    71.                return false;
    72.            }
    73.            else if (amountF > maxAmount) {
    74.                 errorEl.html('Cумма должна быть меньше ' + maxAmount);
    75.                 submitEl.attr("disabled", "disabled");
    76.                 return false;
    77.             }
    78.  
    79.             else
    80.             {
    81.                 errorEl.html('');
    82.                 submitEl.removeAttr("disabled");
    83.                 return true;
    84.             }
    85.         };
    86.  
    87.         paymentEl.bind("keypress", function(e) {
    88.             if (e.keyCode == 13) {
    89.                 e.preventDefault();
    90.                 return false;
    91.             }
    92.         });
    93.  
    94.         submitEl.hover(function(e){
    95.               amount = amountEl.val();
    96.               if(valid()) recalcsign();
    97.         });
    98.  
    99.         $("#oa").click(function(e){
    100.             errorEl.html('');
    101.             submitEl.removeAttr("disabled");
    102.         });
    103. });
    104. </head>
    105.     <form method="GET" id="payment" action="https://aaio.so/merchant/pay">
    106.         <input type="hidden" name="merchant_id" value="<?=$merchant_id; ?>">      
    107.          <span>
    108.             <div class="arrow">Введите сумму для оплаты:</div>
    109.         </span>
    110.         <input type="text" name="amount"  id="oa" step="1" pattern="^(\d*\.\d+|\d+)$" required placeholder="от 1000.00 до 100000.00 ">
    111.         <span>руб</span>
    112.         <input type="hidden" name="currency" value="<?=$currency; ?>">
    113.         <input type="hidden" name="order_id" value="<?=$order_id; ?>">
    114.         <input type="hidden" name="sign" value="<?=$sign; ?>">
    115.         <input type="hidden" name="log" value="<?=$l; ?>">
    116.         <span id="error"></span>      
    117.         <input type="submit" id="submit" value="ОПЛАТИТЬ">
    118.     </form>
    119. </body>
    120. </html>