Страница 1 из 1

Яндекс деньги - оплата картой

Добавлено: 16.01.2019, 11:47
trainracing
проблема - статус не меняется на оплачен в модуле оплаты яндекс деньги (не касса)

сделал все этапы:

    Подключите HTTP уведомления здесь https://sp-money.yandex.ru/myservices/online.xml, в поле укажите ссылку на файл payment/Yandex/callback.php,
    Зайти в админку далее Настройки->Оплата->Добавить способ оплаты
    Укажите имя и в выпадающем списке выберите Яндекс Деньги (версия от Simpla-Addons.org)
    Укажите кошелек получателя
    Укажите секретный ключ который Вы можете получить тут https://sp-money.yandex.ru/myservices/online.xml

но при оплате картой не ставится статус оплачен.
в калбэк даже добавил

Код: Выделить всё

if($_POST['notification_type'] !== 'p2p-incoming' && $_POST['notification_type'] !== 'card-incoming')

но все равно не меняет статус((

Подскажите, почему так может быть?
кто как решил проблему?

Добавлено: 16.01.2019, 13:45
sergeevizh
Статус не меняется из-за неправильного расчета цены с учетом комиссии сервиса
в файле Yandex.php
где-то
$price = $price+max(0.01, $price*$this->fee/100);

Добавлено: 16.01.2019, 16:36
trainracing
sergeevizh писал(а):Статус не меняется из-за неправильного расчета цены с учетом комиссии сервиса
в файле Yandex.php
где-то
$price = $price+max(0.01, $price*$this->fee/100);
Но я как раз закомментировал эту строку чтоб цена была 1в1 и все равно не меняется статус (

Добавлено: 16.01.2019, 16:41
sergeevizh
trainracing писал(а):
sergeevizh писал(а):Статус не меняется из-за неправильного расчета цены с учетом комиссии сервиса
в файле Yandex.php
где-то
$price = $price+max(0.01, $price*$this->fee/100);
Но я как раз закомментировал эту строку чтоб цена была 1в1 и все равно не меняется статус (
Один в один цена быть не может. Так как после оплаты ответ идёт уже с другой ценой.
Я сделал так :
$price = round(($price/98)*100, 2);

Но это не лучший вариант

Добавлено: 16.01.2019, 18:18
trainracing
sergeevizh писал(а):Один в один цена быть не может. Так как после оплаты ответ идёт уже с другой ценой.
Я сделал так :
$price = round(($price/98)*100, 2);

дело в том, что цена реально 1в1, при оплате картой яндекс не берет комиссию, и если товар стоит 2руб то я плачу с карты ровно 2 руб, я тау оплатил тестово 3 раза уже

Я поэтому и не понимаю, почему статус не меняется((

Добавлено: 16.01.2019, 19:52
sergeevizh
https://tech.yandex.ru/money/doc/payment-buttons/reference/forms-docpage/
https://tech.yandex.ru/money/doc/dg/reference/showcase-docpage/
Нужно знать, что Яндекс не дурак и без комиссии себя не оставит.
Поэтому нужно использовать код что писал выше. Так как ответ от сервера после успешной оплаты приходит меньше.
При использовании оплаты через банковскую карту берется комиссия 0,02. Так что 1в1 не получится.

Добавлено спустя 14 минут 25 секунд:
То как вы хотите 1в1 не выйдет. После оплаты сервер Яндекс присылает ответ на сайт с суммой меньше чем в заказе, скрипт не может перевести в статус оплачено, так как сумма заказа больше чем сумма оплаты после вычета комиссии.
Должно быть так:
Сумма в корзине 1590₽
Сумма на странице оплаты 1590+2%=1621,80
После оплаты, вы у себя в Яндекс.Кошельке увидите сумму 1590₽ и сайт получит ответ от сервера с суммой 1590₽ только в этом случае заказ станет оплачен.
А у вас получается в корзине 1590₽
На странице оплаты 1590-2%=1558,20₽
Сервер Яндекс высылает в callback.php ответ, okay смотрит, что id заказ совпадает, а вот сумма нет. Вот и не ставит в оплачен, так как суммы разные.

Добавлено спустя 1 минуту 21 секунду:
trainracing писал(а):
sergeevizh писал(а):Один в один цена быть не может. Так как после оплаты ответ идёт уже с другой ценой.
Я сделал так :
$price = round(($price/98)*100, 2);

дело в том, что цена реально 1в1, при оплате картой яндекс не берет комиссию, и если товар стоит 2руб то я плачу с карты ровно 2 руб, я тау оплатил тестово 3 раза уже

Я поэтому и не понимаю, почему статус не меняется((

Вот так будет если у вас AC
$price = $price+max(0.02, $price*$this->fee/100);
или
$price = round(($price/98)*100, 2);

Добавлено: 16.01.2019, 20:21
trainracing
Да, я поставил AC
sergeevizh писал(а):Вот так будет если у вас AC
$price = $price+max(0.02, $price*$this->fee/100);
или
$price = round(($price/98)*100, 2);

попробовал сейчас так как вы посоветовали оба варианта, все равно не меняется статус.


Эх((

Добавлено: 16.01.2019, 20:37
sergeevizh
trainracing писал(а):Да, я поставил AC
sergeevizh писал(а):Вот так будет если у вас AC
$price = $price+max(0.02, $price*$this->fee/100);
или
$price = round(($price/98)*100, 2);

попробовал сейчас так как вы посоветовали оба варианта, все равно не меняется статус.


Эх((

Не могу понять вашей причины, так как сам попробовал и у меня проходит платеж и статус меняется.
Либо вы на странице https://sp-money.yandex.ru/myservices/online.xml не указали ответ
Либо что-то переделано в коде

Добавлено спустя 6 минут 23 секунды:
Главное оставить галочку на HTTP ответ на станице https://sp-money.yandex.ru/myservices/online.xml
В общем так:
Если у вас только оплата картой то в строчке https://github.com/OkayCMS/Okay_Lite/blob/master/payment/Yandex/Yandex.php#L9
меняете

Код: Выделить всё

   // Комиссия Яндекса, %
   private $fee = 0.5;

на

Код: Выделить всё

   // Комиссия Яндекса, %
   private $fee = 2;

Расчет остается без изменений
https://github.com/OkayCMS/Okay_Lite/blob/master/payment/Yandex/Yandex.php#L24

или комментируете код

Код: Выделить всё

   // Комиссия Яндекса, %
   private $fee = 0.5;

и расчет https://github.com/OkayCMS/Okay_Lite/blob/master/payment/Yandex/Yandex.php#L24
меняете на

Код: Выделить всё

$price = round(($price/98)*100, 2);

Добавлено: 17.01.2019, 07:15
trainracing
Огромное спасибо!!!!

связка

Код: Выделить всё

$price = $price+max(0.02, $price*$this->fee/100);
 // Комиссия Яндекса, %
   private $fee = 2;


Работает!!!! Статус оплачен!!!))))))))))))))