За последние 24 часа нас посетили 22955 программистов и 1241 робот. Сейчас ищут 739 программистов ...

Не происходит запись в базу данных.Фрикасса

Тема в разделе "PHP и базы данных", создана пользователем Resistanse, 5 авг 2017.

Метки:
  1. Resistanse

    Resistanse Новичок

    С нами с:
    5 авг 2017
    Сообщения:
    8
    Симпатии:
    0
    Здравствуйте,подключаю к сайту фрикассу и столкнулся с одной проблемой.При оплате сервер фрикассы высылает данные о платеже на мой сайт в файл kassa.php(указан в настройках кассы).Данные до их серверов доходят как мне сказали в техподдержке(там есть подтверждение в скрипте-если все хорошо мой сервер отсылает "YES"),но запись в БД не происходит,вот скрипт:

    PHP:
    1. $merchant_id     = '321';
    2. $merchant_secret = '123';
    3. function getIP(){
    4.     if(isset($_SERVER['HTTP_X_REAL_IP']))
    5.         return $_SERVER['HTTP_X_REAL_IP'];
    6.     else
    7.         return $_SERVER['REMOTE_ADDR'];
    8.     }
    9.    
    10. $arr = ['176.122.74.235','136.243.38.147', '136.243.38.149', '136.243.38.150', '136.243.38.151', '136.243.38.189', '88.198.88.98'];
    11. //Проверка IP
    12. if (!in_array(getIP(), $arr)) {
    13.     die("bad ip");
    14.     }
    15. //Электронная подпись
    16. $sign = $_REQUEST['MERCHANT_ID'] . ':' .$_REQUEST['AMOUNT'] . ':' .$merchant_secret . ':' .$_REQUEST['MERCHANT_ORDER_ID'];
    17. $hash = md5($sign);
    18. //Проверка электронной подписи
    19. if ($hash != $_REQUEST['SIGN']){
    20.     die('bad sign');
    21.     }  
    22. //Проверка суммы платежа и запись в базу данных
    23. if ($_REQUEST['AMOUNT'] == $_SESSION['summa']){
    24.     $mysqli     = mysqli_connect('','','','');
    25.     mysqli_query($mysqli,"SET NAMES 'utf8'");
    26.     $balance   = $_SESSION['summa'];
    27.     $usid        = $_SESSION['user_id'];
    28.     mysqli_query($mysqli,"UPDATE `us_inf` SET balance=balance+'{$balance}' WHERE `usid`='{$usid}' ");
    29.     mysqli_close($mysqli);
    30.     die('YES');
    31. }
     
  2. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.752
    Симпатии:
    1.322
    Адрес:
    Лень
    error_reporting ( E_ALL );
     
  3. Resistanse

    Resistanse Новичок

    С нами с:
    5 авг 2017
    Сообщения:
    8
    Симпатии:
    0
    ошибок нету,ответ от сервера в логах посмотрел-там все правильно,а запись в бд не происходит
     
  4. alexblack

    alexblack Старожил

    С нами с:
    20 янв 2016
    Сообщения:
    640
    Симпатии:
    381
    Посмотри что БД возвратит после запроса:

    PHP:
    1. if (!mysqli_query($mysqli, "твой запрос")) {
    2.     printf("Errormessage: %s\n", mysqli_error($mysqli));
     
  5. Познающий php

    Познающий php Новичок

    С нами с:
    23 мар 2017
    Сообщения:
    381
    Симпатии:
    74
    Ну хз тут с самого начала надо идти и проверять по цепочке.
    Во-первых нет никакой проверки, что соединние установлено. Проверь:
    PHP:
    1. if (!$mysqli) {
    2.     echo "Соединения нет";
    3.     exit;
    4. }
    Во-вторых, если соединение есть то перед самым запросом посмотреть что лежит в этих переменных $balance и $usid, а так же проверить название таблицы и колонок на точность. Всякое бывает...
     
  6. Resistanse

    Resistanse Новичок

    С нами с:
    5 авг 2017
    Сообщения:
    8
    Симпатии:
    0
    ошибок в запросе нету,уже проверял.
    соединение установлено,сейчас перепроверил,переменные уже тоже перепроверял сто раз
     
  7. Познающий php

    Познающий php Новичок

    С нами с:
    23 мар 2017
    Сообщения:
    381
    Симпатии:
    74
    Может чушь, я с бд не особо работаю, но последняя версия моя, что косяк в том, что что ты складываешь число со строкой - balance=balance+'{$balance}'

    Ну и права можешь еще проверить :D
     
  8. Resistanse

    Resistanse Новичок

    С нами с:
    5 авг 2017
    Сообщения:
    8
    Симпатии:
    0
    Не, balance - название столбца в БД и складывается текущее значение с новым
     
  9. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.824
    Симпатии:
    738
    Адрес:
    Татарстан
    может проверить этот самый
    PHP:
    1. $usid        = $_SESSION['user_id'];
    ???
     
    Resistanse нравится это.
  10. Resistanse

    Resistanse Новичок

    С нами с:
    5 авг 2017
    Сообщения:
    8
    Симпатии:
    0
    тут все хорошо
     
  11. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.824
    Симпатии:
    738
    Адрес:
    Татарстан
    Вот честно говоря я вообще удивляюсь как у вас отклик yes может быть. Ибо для сервиса фрикассы никаких сессий быть не может...строгий сервис отправляет ответ... Все проверки должны быть по request. Хотите проверять сумму - делайте вопрос в бд по ид платежа и сравнивание суммы.... Никаких сессий. Не верите - сделайте логирование в текст файл переменных request and session
     
    Познающий php и Resistanse нравится это.
  12. Resistanse

    Resistanse Новичок

    С нами с:
    5 авг 2017
    Сообщения:
    8
    Симпатии:
    0
    сессия это с моего сайта и нужна для проверки суммы,пользователь вводит сумму в форме и она попадает в сессию,затем сравнивается с тем значением,которое приходит с кассы,у них про это даже в АПИ написано,а юзер ай ди это ай ди вконтакте и тоже определяется на другой странице и нужен для определения в какую строку записать значение.Хз,может я что-то не то делаю,я ж еще зеленый в этом деле
     
  13. Resistanse

    Resistanse Новичок

    С нами с:
    5 авг 2017
    Сообщения:
    8
    Симпатии:
    0
    спасибо за наводочку,без сессии реально работает,теперь осталось придумать как проверять сумму платежа)
     
  14. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.824
    Симпатии:
    738
    Адрес:
    Татарстан
    А то спорят.....
    Чего там придумывать то. При отправки на оплату заносите в бд данные платежа ссылку статусом ожидает оплаты и получаете данные записи. Эту запись передаёте вместе с другими данными она же вам потом возвращается в request получаете из бд сравниваете суммы, ставите статус оплачено и делаете свои дела
     
  15. Resistanse

    Resistanse Новичок

    С нами с:
    5 авг 2017
    Сообщения:
    8
    Симпатии:
    0
    Спасибо еще раз,вчера так и сделал,не могли бы объяснить почему с сессией не работает?
     
  16. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.824
    Симпатии:
    738
    Адрес:
    Татарстан
    Надо понимать как веб и пхп в частности работает. В общем пользователь в браузере с сессией и пользователь-сервис фрикассы который вам извещение посылает - совершенно различные пользователи и у каждого своя сессия.. у фрикассы она пустая. Иначе б можно было воровать данные сессий
     
    denis01 и Resistanse нравится это.