← Вернуться к списку тем

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

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

Ответы


  • iMakeBots [16.10.2021 в 21:46 → amun ra]
       ...
    
     /** Проверяем секрет
         * @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:48 → amun ra]
    Просто проверяйте секрет генерируемый на стороне яндекса - он строит хеш на основе данных в том числе и стоимости, которую вы передаете в параметрах при вызове формы оплаты
  • amun ra [16.10.2021 в 22:11 → iMakeBots]
    Ничего не понял))
    А как проверить это безболезненно, а то задолбался деньги с одной карты на другую гонять.
    Яндекс денег уже нет, теперь Юмани.
    У меня вообще идея была из таблицы bot_shop_order по номеру заказа и id пользователя взять id заказа затем в bot_shop_order_product получить product_id и его сравнить с ценой товара в bot_shop_product.
    Надеюсь не путанно написал.
  • iMakeBots [16.10.2021 в 22:13 → amun ra]
    Можно и так, сверять сколько пришло и цену товара. Но по секретной сумме более правильнее
  • amun ra [16.10.2021 в 22:16 → iMakeBots]
    Я конечно может что не понимаю, но форма оплаты создаётся ссылкой и если ссылку изменить, то и форма будет другой.
  • iMakeBots [16.10.2021 в 22:27 → iMakeBots]
    Я уже если честно не помню схему как это работает - не пользуюсь в практике. Но помню что проверял все и секрет и цену оплаты с ценой товара.
  • amun ra [17.10.2021 в 00:53 → iMakeBots]
    Я тебя понимаю, действительно давно уже было.
    Можно тебя попросить хотя бы половину из моего уравнения в примере привести (как получить значение и как передать), дальше я попытаюсь допилить.
    А то я в ступоре полнейшем.
  • iMakeBots [17.10.2021 в 11:12 → iMakeBots]
    Приведи пример кода
  • amun ra [17.10.2021 в 14:01 → iMakeBots]
        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()]);
            }
        }
  • iMakeBots [17.10.2021 в 14:18 → iMakeBots]
                // где то здесь наверное нужно 
                $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();
                }
  • amun ra [17.10.2021 в 14:46 → iMakeBots]
    iMakeBots, спасибо!
    Но что-то не сработало. Платёж прошёл и в таблице статус заказа тоже изменился с 0 на 1
  • iMakeBots [17.10.2021 в 14:47 → iMakeBots]
    Посмотри что в переменных - что туда приходит
    $total и $this->getFullSum()
  • amun ra [17.10.2021 в 15:04 → iMakeBots]
    Они либо пустые или я что-то не так делаю.
    Чтобы посмотреть, я эти переменные прописал в сообщение об успешной оплате.
  • amun ra [17.10.2021 в 15:55 → iMakeBots]
    Вот так у мня функция выглядит
        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()]);
            }
        }
  • iMakeBots [17.10.2021 в 15:59 → iMakeBots]
    if($total > $this->getFullSum()) {
        exit();
    }

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