Зафиксировать конкретную сумму денег при оплате услуги с формы PHP

252
01 июня 2022, 22:40

Имею следующую задачу. Необходимо после оплаты определённой суммы денег выслать пользователю письмо с определенным контентом. Нужно использовать Яндекс Деньги. Настроил у себя уведомления от Яндекса до моего сервера, возникающие при совершении платежа.

На Яндексе получил код кнопки для фронта.

<iframe src="https://yoomoney.ru/quickpay/button-widget?targets=123&default-sum=156&button-text=11&yoomoney-payment-type=on&button-size=m&button-color=orange&successURL=&quickpay=small&account=4100116111775687&" width="184" height="36" frameborder="0" allowtransparency="true" scrolling="no"></iframe>

Параметр default-sum можно поменять в коде и сделать его меньше. Не хочется, чтобы у пользователя была такая возможность.

Настроил получение уведомлений от яндекса при совершении любого платежа (с любой суммой).

$secret = "secret";
$r = array(
    'notification_type' => $_POST['notification_type'], // p2p-incoming / card-incoming - с кошелька / с карты
    'operation_id'      => $_POST['operation_id'],      // Идентификатор операции в истории счета получателя.
    'amount'            => $_POST['amount'],            // Сумма, которая зачислена на счет получателя.
    'withdraw_amount'   => $_POST['withdraw_amount'],   // Сумма, которая списана со счета отправителя.
    'currency'          => $_POST['currency'],            // Код валюты — всегда 643 (рубль РФ согласно ISO 4217).
    'datetime'          => $_POST['datetime'],          // Дата и время совершения перевода.
    'sender'            => $_POST['sender'],            // Для переводов из кошелька — номер счета отправителя. Для переводов с произвольной карты — параметр содержит пустую строку.
    'codepro'           => $_POST['codepro'],           // Для переводов из кошелька — перевод защищен кодом протекции. Для переводов с произвольной карты — всегда false.
    'label'             => $_POST['label'],             // Метка платежа. Если ее нет, параметр содержит пустую строку.
    'sha1_hash'         => $_POST['sha1_hash'],          // SHA-1 hash параметров уведомления.
    'unaccepted'        => $_POST['unaccepted']         // Флаг означает, что пользователь не получил перевод. Возможные причины:
);
//notification_type&operation_id&amount&currency&datetime&sender&codepro&notification_secret&label
// проверка хеш
$secret_string = $r['notification_type'].'&'.$r['operation_id'].'&'.$r['amount'].'&'.$r['currency'].'&'.$r['datetime'].'&'.$r['sender'].'&'.$r['codepro'].'&'.$secret.'&'.$r['label'];
if (sha1($secret_string) != $r['sha1_hash']) {
    exit('Верификация не пройдена. SHA1_HASH не совпадает.'); // останавливаем скрипт. у вас тут может быть свой код.
}
// обработаем данные. нас интересует основной параметр label и withdraw_amount для получения денег без комиссии для пользователя.
// либо если вы хотите обременить пользователя комиссией - amount, но при этом надо учесть, что яндекс на странице платежа будет писать "без комиссии".
$r['amount']          = floatval($r['amount']);
$r['withdraw_amount'] = floatval($r['withdraw_amount']);
$r['label']           = intval($r['label']); // здесь я у себя передаю id юзера, который пополняет счет на моем сайте. поэтому обрабатываю его intval
// дальше ваш код для обновления баланса пользователя / для вставки полученного платежа в историю платежей, например:
file_put_contents('history.txt', serialize($r));
?>

Хочется, чтобы если сумма платежа была изменена, то пользователь получал ошибку. Решением я вижу возможность зафиксировать параметр amount определенным значением. Тогда, если пользователь подменит этот параметр и вышлет другую сумму у него не пройдет проверка хеша, письмо не будет выслано, но деньги все равно спишутся. Очень заманчивый вариант, но неправильный.

Подскажите, как мне сделать так, чтобы человек не мог выслать никакую иную сумму, кроме конкретно той, которую я задумал??

READ ALSO
side bar съезжает вниз

side bar съезжает вниз

side-bar должен находится справа от основного блока с новостями, но он съезжает вниз, как я понял, из-за отступа справа у основного блока

152
Как правильно парсить страницу на python?

Как правильно парсить страницу на python?

Есть вот такая страница:

275
SQL - один IF (условие), два значения

SQL - один IF (условие), два значения

Как выполняется одно условие понятноМожно ли в одном условии, менять 2 значения? Или только 2 if использовать? Условие одно - значения нужно...

189
геометрическая вероятность, интеграл

геометрическая вероятность, интеграл

Мне необходимо вычислить интегралОбласть G, ограниченная прямыми x=2, y=x и гиперболой xy=1, вписанная в прямоугольник D

228