Как вернуть деньги через Omnipay

После того, как я совершу оплату через PayPal Express и моя база данных не обновится, что я могу сделать в этом случае?

Вот код:

    $transaction = $this->initPayPalExpress()->completePurchase($this->param);
    $response = $transaction->send();
    $data = $response->getData();
    if (isset($data['PAYMENTINFO_0_ACK']) && $data['PAYMENTINFO_0_ACK'] === 'Success') {
      $this->updateDatabase($data);
    }

person Vladimir Djukic    schedule 13.02.2016    source источник
comment
пожалуйста, распечатайте функцию обновления и данные ответа, если это возможно   -  person CodeIsLife    schedule 13.02.2016
comment
Для функции обновления я просто храню данные в базе данных MySQL. Для ответа я получаю все детали, которые показывают, что транзакция завершена. Проблема в том, что данные в базах данных не будут обновляться, если, например, пользователь закроет браузер, когда должна запуститься эта функция: $this->updateDatabase($data);   -  person Vladimir Djukic    schedule 13.02.2016
comment
даже если пользователь закроет браузер!, это обработка на стороне сервера, поэтому закрытие браузера не помешает выполнению транзакции   -  person CodeIsLife    schedule 13.02.2016
comment
Так что обновление не может не сработать? Я думаю, что сессия будет уничтожена, и она потерпит неудачу   -  person Vladimir Djukic    schedule 13.02.2016
comment
нет ! обновление не может завершиться ошибкой, и сеанс также является файлом на стороне сервера, поэтому ваш блок кода никогда не будет прерван действием на стороне клиента.   -  person CodeIsLife    schedule 13.02.2016


Ответы (2)


Я рекомендую вам перейти с PayPal Express на PayPal REST. Это новее и имеет лучшую документацию.

С точки зрения того, что делать в случае сбоя обновления вашей базы данных, я предлагаю вам иметь какой-то план резервного копирования - вы можете использовать сообщение RestListPurchaseRequest() для проверки истории покупок.

Вы спрашиваете о возмещении, но не приводите пример возмещения - какова точная природа вашей проблемы?

Я думаю, что в docblocks сообщений REST omnipay-paypal и шлюза есть несколько хороших примеров для достижения того, что вы хотите сделать.

person delatbabel    schedule 15.02.2016

Если вы работаете с платежными шлюзами, не полагайтесь на данные сеанса для хранения информации, которую вы будете использовать для обратной связи платежа с пользователем. Вместо этого, поскольку пользователь платит за что-то, должна быть таблица заказов/подписок или даже просто идентификатор самого пользователя. Таким образом, вы можете передать эту идентифицирующую информацию в PayPal в настраиваемых полях, которые вам разрешено передавать, а затем в перенаправлениях/обратных вызовах вы можете сделать что-то вроде (не код Omnipay, но он иллюстрирует суть):

$response = GetExpressCheckoutDetails( $_REQUEST['token'] );
$orderID = $response["PAYMENTREQUEST_0_CUSTOM"];

Таким образом, вы можете завершить транзакцию независимо от того, есть ли у пользователя активный сеанс; и если ваша база данных выходит из строя, вам не нужно возвращать деньги клиенту, потому что проблема не на их стороне, а на вашей. Вам лучше поймать сбой базы данных и иметь журнал сценария или электронное письмо с сообщением о том, что вы так-то и так-то успешно заплатили, но база данных не удалась - и вы вручную выполняете покупку.

person Sam    schedule 15.02.2016