Доброго времени!
iMakeBots, помоги сделать проверку оплаты в файле ya_success.php.
Сравнить оплату с реальной ценой товара, а то получается если в ссылке на оплату параметр Sum, например 100 заменить на 1 и оплатить, то бот считает что оплата прошла и товар куплен.
... /** Проверяем секрет * @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";
А как проверить это безболезненно, а то задолбался деньги с одной карты на другую гонять.
Яндекс денег уже нет, теперь Юмани.
У меня вообще идея была из таблицы bot_shop_order по номеру заказа и id пользователя взять id заказа затем в bot_shop_order_product получить product_id и его сравнить с ценой товара в bot_shop_product.
Надеюсь не путанно написал.
Можно тебя попросить хотя бы половину из моего уравнения в примере привести (как получить значение и как передать), дальше я попытаюсь допилить.
А то я в ступоре полнейшем.
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()]); } }
// где то здесь наверное нужно $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(); }
Но что-то не сработало. Платёж прошёл и в таблице статус заказа тоже изменился с 0 на 1
$total и $this->getFullSum()
Чтобы посмотреть, я эти переменные прописал в сообщение об успешной оплате.
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()]); } }
if($total > $this->getFullSum()) { exit(); }
$total - сумма заказа
$this->getFullSum() - сумма которая пришла
Всё работает.