Я использую 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
который вы можете использовать, чтобы проверить, ожидает ли платеж.
Если вы видите возможные причины ожидающего статуса платежа, некоторые из них могут привести к неудачной оплате.
Например
Я бы посоветовал не очень неплохо отправить или подтвердить заказ, прежде чем проверять это не будет полагаться на ответ isSuccessful
метод, возвращающий true
сам по себе.