Бот-Чат-Магазин. Проверка оплаты.

← К списку тем

Доброго времени!
iMakeBots, помоги сделать проверку оплаты в файле ya_success.php.
Сравнить оплату с реальной ценой товара, а то получается если в ссылке на оплату параметр Sum, например 100 заменить на 1 и оплатить, то бот считает что оплата прошла и товар куплен.
amun ra 16.10.2021 в 20:20

Авторизуйтесь через Telegram, чтобы ответить.
Откройте бот @SiteAuthBot, нажмите кнопку Старт/Start. Следуйте инструкциям бота.


Ответы

  •    ...
    
     /** Проверяем секрет
         * @return bool
         */
        function checkSecret($data)
        {
            $params_steck = 'notification_type&operation_id&amount¤cy&datetime&sender&codepro';
            $params = explode('&', $params_steck);
            $secretYandex = 'secret_yandex';
            $forHASH = [];
            foreach ($params as $key => $p) {
                if (isset($data[$p])) array_push($forHASH, $data[$p]);
            }
            if ($secretYandex != "") array_push($forHASH, $secretYandex);
            if (isset($data['label'])) array_push($forHASH, $data['label']);
            $forHASH = implode('&', $forHASH);
            return ($data['sha1_hash'] === sha1($forHASH) && $data['codepro'] !== 'true');
        }
    
       ...
    
       // передаем ответ от Yandex на проверку
       echo checkSecret($_POST) ? "Ок" : "!!!Not Ok";
    
    iMakeBots 16.10.2021 в 21:46
  • Просто проверяйте секрет генерируемый на стороне яндекса - он строит хеш на основе данных в том числе и стоимости, которую вы передаете в параметрах при вызове формы оплаты
    iMakeBots 16.10.2021 в 21:48
    • Ничего не понял))
      А как проверить это безболезненно, а то задолбался деньги с одной карты на другую гонять.
      Яндекс денег уже нет, теперь Юмани.
      У меня вообще идея была из таблицы bot_shop_order по номеру заказа и id пользователя взять id заказа затем в bot_shop_order_product получить product_id и его сравнить с ценой товара в bot_shop_product.
      Надеюсь не путанно написал.
      amun ra 16.10.2021 в 22:11
      • Можно и так, сверять сколько пришло и цену товара. Но по секретной сумме более правильнее
        iMakeBots 16.10.2021 в 22:13
    • Я конечно может что не понимаю, но форма оплаты создаётся ссылкой и если ссылку изменить, то и форма будет другой.
      amun ra 16.10.2021 в 22:16
    • Я уже если честно не помню схему как это работает - не пользуюсь в практике. Но помню что проверял все и секрет и цену оплаты с ценой товара.
      iMakeBots 16.10.2021 в 22:27
      • Я тебя понимаю, действительно давно уже было.
        Можно тебя попросить хотя бы половину из моего уравнения в примере привести (как получить значение и как передать), дальше я попытаюсь допилить.
        А то я в ступоре полнейшем.
        amun ra 17.10.2021 в 00:53
      • Приведи пример кода
        iMakeBots 17.10.2021 в 11:12
        •     private function getPay()
              {
                  // делаем запрос в бд по пришедшим данным
                  $order = $this->pdo->prepare("SELECT * FROM bot_shop_order WHERE user_id = :user_id AND id = :order_id AND status = 0");
                  $order->execute(['user_id' => $this->getIdUser(), 'order_id' => $this->getIdOrder()]);
                  // если запись в бд найдена
                  if ($order->rowCount() > 0) {
                      // запрос на обновление статуса заказа
                      // где то здесь наверное нужно 
                      $update = $this->pdo->prepare("UPDATE bot_shop_order SET status = 1 WHERE id = :id");
                      // если обновили то уведомляем
                      if ($update->execute(['id' => $this->getIdOrder()])) {
                          // шлем пользователю уведомление что заказ оплачен
                          $this->sendMsg(['chat_id' => $this->getIdUser(), 'text' => "Заказ #" . $this->getIdOrder() . " успешно оплачен. В ближайшее время с вами свяжется менеджер."]);
                          // шлем админу уведомление что заказ оплачен
                          $this->sendMsg(['chat_id' => $this->admin, 'text' => "Заказ #" . $this->getIdOrder() . " успешно оплачен. Сумма " . $this->getFullSum() . ' от пользователя ' . $this->getIdUser() . "."]);
                      } else {
                          // шлем пользователю уведомление о том что пришли деньги за заказ, но есть проблемы
                          $this->sendMsg(['chat_id' => $this->getIdUser(), 'text' => 'Пришли деньги ' . $this->getFullSum() . ' РУБ, за заказ ' . $this->getIdOrder() . ' но не удалось обновить статус заказа. С вами свяжется менеджер.']);
                          // шлем админу уведомление о том что пришли деньги за заказ, но есть проблемы
                          $this->sendMsg(['chat_id' => $this->admin, 'text' => 'Пришли деньги ' . $this->getFullSum() . ' РУБ, за заказ ' . $this->getIdOrder() . ' от пользователя ' . $this->getIdUser() . ' но не удалось обновить статус заказа.']);
                      }
                  } else {
                      // шлем админу уведомление о том что пришли какие-то деньги
                      $this->sendMsg(['chat_id' => $this->admin, 'text' => 'Пришли деньги ' . $this->getFullSum() . " руб, но назначение не понятно n" . "Заказ #" . $this->getIdOrder() . "nот пользователя " . $this->getIdUser()]);
                  }
              }
          amun ra 17.10.2021 в 14:01
        •             // где то здесь наверное нужно 
                      $orderProduct = $this->pdo->prepare("SELECT * FROM bot_shop_order_product WHERE parent_id = :parent_id");
                      $orderProduct->execute(['parent_id' => $this->getIdOrder()]);
                      // итоговую сумму определяем как ноль
                      $total = 0.00;
          
                      // перебираем массив
                      while ($row = $orderProduct->fetch()) {
                          $model_product = $this->pdo->prepare("SELECT * FROM bot_shop_product WHERE id = :id");
                          $model_product->execute(['id' => $row['product_id']]);
                          $product = $model_product->fetch();
                          // увеличиваем сумму
                          $sum = $product['price'] * $row['product_count'];
                          $total  = $sum;
                      }
                      // проверяем 
                      if($total < $this->getFullSum()) {
                      	exit();
                      }
          iMakeBots 17.10.2021 в 14:18
          • iMakeBots, спасибо!
            Но что-то не сработало. Платёж прошёл и в таблице статус заказа тоже изменился с 0 на 1
            amun ra 17.10.2021 в 14:46
          • Посмотри что в переменных - что туда приходит
            $total и $this->getFullSum()
            iMakeBots 17.10.2021 в 14:47
            • Они либо пустые или я что-то не так делаю.
              Чтобы посмотреть, я эти переменные прописал в сообщение об успешной оплате.
              amun ra 17.10.2021 в 15:04
            • Вот так у мня функция выглядит
                  private function getPay()
                  {
                      // делаем запрос в бд по пришедшим данным
                      $order = $this->pdo->prepare("SELECT * FROM bot_shop_order WHERE user_id = :user_id AND id = :order_id AND status = 0");
                      $order->execute(['user_id' => $this->getIdUser(), 'order_id' => $this->getIdOrder()]);
                      // если запись в бд найдена
                      if ($order->rowCount() > 0) {
                          // запрос на обновление статуса заказа
                          // где то здесь наверное нужно 
                          $orderProduct = $this->pdo->prepare("SELECT * FROM bot_shop_order_product WHERE parent_id = :parent_id");
                          $orderProduct->execute(['parent_id' => $this->getIdOrder()]);
                          // итоговую сумму определяем как ноль
                          $total = 0.00;
              
                          // перебираем массив
                          while ($row = $orderProduct->fetch()) {
                              $model_product = $this->pdo->prepare("SELECT * FROM bot_shop_product WHERE id = :id");
                              $model_product->execute(['id' => $row['product_id']]);
                              $product = $model_product->fetch();
                              // увеличиваем сумму
                              $sum = $product['price'] * $row['product_count'];
                              $total  = $sum;
                          }
                          // проверяем 
                          if($total < $this->getFullSum()) {
                              exit();
                          }
                          $update = $this->pdo->prepare("UPDATE bot_shop_order SET status = 1 WHERE id = :id");
                          // если обновили то уведомляем
                          if ($update->execute(['id' => $this->getIdOrder()])) {
                              // шлем пользователю уведомление что заказ оплачен
                              $this->sendMsg(['chat_id' => $this->getIdUser(), 'text' => "Заказ #" . $this->getIdOrder() . " успешно оплачен. В ближайшее время с вами свяжется менеджер."]);
                              // шлем админу уведомление что заказ оплачен
                              $this->sendMsg(['chat_id' => $this->admin, 'text' => "Заказ #" . $this->getIdOrder() . " успешно оплачен. Сумма " . $this->getFullSum() . ' от пользователя ' . $this->getIdUser() . "."]);
                          } else {
                              // шлем пользователю уведомление о том что пришли деньги за заказ, но есть проблемы
                              $this->sendMsg(['chat_id' => $this->getIdUser(), 'text' => 'Пришли деньги ' . $this->getFullSum() . ' РУБ, за заказ ' . $this->getIdOrder() . ' но не удалось обновить статус заказа. С вами свяжется менеджер.']);
                              // шлем админу уведомление о том что пришли деньги за заказ, но есть проблемы
                              $this->sendMsg(['chat_id' => $this->admin, 'text' => 'Пришли деньги ' . $this->getFullSum() . ' РУБ, за заказ ' . $this->getIdOrder() . ' от пользователя ' . $this->getIdUser() . ' но не удалось обновить статус заказа.']);
              
                          }
                      } else {
                          // шлем админу уведомление о том что пришли какие-то деньги
                          $this->sendMsg(['chat_id' => $this->admin, 'text' => 'Пришли деньги ' . $this->getFullSum() . " руб, но назначение не понятно n" . "Заказ #" . $this->getIdOrder() . "nот пользователя " . $this->getIdUser()]);
                      }
                  }
              amun ra 17.10.2021 в 15:55
            • if($total > $this->getFullSum()) {
                  exit();
              }

              $total - сумма заказа
              $this->getFullSum() - сумма которая пришла
              iMakeBots 17.10.2021 в 15:59
            • Огромное спасибо!
              Всё работает.
              amun ra 17.10.2021 в 16:54