Как использовать omnipay для проверки того, является ли он ожидающим платежа или нет

Я использую Omnipay 2.1 и CodeIgniter 2.1.4 для получения платежей Paypal.

Я использую эту строку, чтобы завершить покупку и проверить, был ли отправлен платеж:

$bool = $gateway->completePurchase(array('amount' => $total, 'currency' => 'EUR')) ->send() ->isSuccessful(); 

Но я заметил, что метод isSuccessful() также вернет true если платеж находится на рассмотрении.

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

Рассматривая данные необработанных ответов, важными являются следующие:

 [ACK] => Success [PAYMENTINFO_0_CURRENCYCODE] => EUR [PAYMENTINFO_0_PAYMENTSTATUS] => Pending [PAYMENTINFO_0_PENDINGREASON] => multicurrency 

Таким образом, платеж был успешно обработан, но находится в состоянии Pending . Omnipay явно не проверяет это, но я не уверен, что это было бы разумно в любом случае. С точки зрения клиента, платеж был успешным, и деньги оставили свой счет.

Просмотр документации API PayPal для PAYMENTINFO_0_PENDINGREASON :

мультивалюта. У вас нет баланса в отправленной валюте, и у вас нет настроек приема платежей, чтобы автоматически конвертировать и принимать этот платеж. Вы должны вручную принять или отклонить этот платеж.

Таким образом, в основном платеж был успешным, единственная причина, по которой он ожидает рассмотрения, заключается в том, что вы платите клиентам в валюте (EUR), которую вы явно не включили в свою учетную запись PayPal.

Я считаю, что вы не должны связывать isSuccessful() fn. Попробуйте просто send() затем проверить ответ со шлюза:

 $response = $gateway->purchase(['amount' => '10.00', 'currency' => 'USD')->send(); if ($response->isSuccessful()) { // payment was successful: update database print_r($response); } else { // debug etc; print_r($response); } 

В противном случае вы можете получить bool для send() т. Д .;

В последних версиях OmniPay есть метод isPending в классе Response который вы можете использовать, чтобы проверить, ожидает ли платеж.

Если вы видите возможные причины ожидающего статуса платежа, некоторые из них могут привести к неудачной оплате.

Например

  • Проверка платежа
  • regulatory_review
  • Echeck.

Я бы посоветовал не очень неплохо отправить или подтвердить заказ, прежде чем проверять это не будет полагаться на ответ isSuccessful метод, возвращающий true сам по себе.