Я пытаюсь поймать InvalidCreditCardException
и любое другое исключение, используя Omnipay Bridge PayumBundle.
Я пытался:
try {
return $this->forward('PayumBundle:Capture:do', array(
'payum_token' => $captureToken,
));
} catch (\Exception $e) {
$exceptions = array();
do {
$exceptions[] = $e->getMessage();
} while ($e = $e->getPrevious());
$response = new Response(json_encode(array('status' => 'failed', 'Message' => $exceptions)));
return $response;
}
Но до того, как код дойдет до моего улова, Omnipay
выбрасывает свое собственное исключение из номера Omnipay
не действующее.
В комментариях он также говорит:
Как правило, если вы хотите самостоятельно проверить кредитную карту с помощью настраиваемых сообщений об ошибках, вы должны использовать свою библиотеку проверки фреймворка, а не этот метод.
Это именно то, что я пытаюсь сделать, как я могу проверить карточку с пользовательской ошибкой, используя исключение Symfony PayumBundle?
Пожалуйста, не отвечайте на этот вопрос, указав ссылку, как первый ответ ниже. Я ценю его помощь, но это не помогает мне в том, как использовать это исключение в моем коде.
Очень важно
Я пытаюсь понять PayumBundle лучше, поэтому мне нужно понять, что я делаю неправильно и шаги (не на английском, а в реальном примере кода с объяснением). Я должен взять, чтобы уловить исключение в моем действии и отобразить удобное для пользователя сообщение. Пожалуйста, поймите, я действительно новичок в symfony, и я стараюсь учиться, если вы попросите меня создать сервис и сделать то или это, то это не поможет мне, пожалуйста, посмотрите пример здесь, я действительно очень ценю помощь но тогда я действительно действительно потерян.
Обратите внимание, что если введен правильный номер кредита, транзакция проходит через штраф, это только исключение, которое мне нужно поймать, когда введен неправильный номер карты, или срок действия карты или любой другой.
В случае, если это помогает, так выглядит мой config.yml
contexts:
paypal:
paypal_express_checkout_nvp:
username: %paypal_username%
password: %paypal_password%
signature: %paypal_signature%
sandbox: %paypal_sandbox%
stripe_omnipay:
omnipay:
type: Stripe
options:
apiKey: xxxx
testMode: true
extensions:
PaymentExtension:
class: Payum\Core\Extension\PaymentExtention
Вам нужно добавить расширение, которое будет выполнено Payum\Core\Payment
. Как вы можете видеть в этом коде, исключение фиксируется, а затем соответствующие расширения будут выполняться последовательно: https://github.com/Payum/Core/blob/master/Payment.php#L104-L108
Вам нужно создать новый класс, который реализует Payum\Core\Extension\ExtensionInterface
и реализовать логику, которая вам нужна внутри onException()
.
Вот пример расширения:
class YourExtension implements Payum\Core\Extension\ExtensionInterface
{
/**
* @param mixed $request
*/
public function onPreExecute($request) {}
/**
* @param mixed $request
* @param \Payum\Core\Action\ActionInterface $action
*/
public function onExecute($request, ActionInterface $action) {}
/**
* @param mixed $request
* @param \Payum\Core\Action\ActionInterface $action
*/
public function onPostExecute($request, ActionInterface $action) {}
/**
* @param \Payum\Core\Reply\ReplyInterface $reply
* @param mixed $request
* @param \Payum\Core\Action\ActionInterface $action
*
* @return null|\Payum\Core\Reply\ReplyInterface an extension able to change reply to something else.
*/
public function onReply(ReplyInterface $reply, $request, ActionInterface $action) {}
/**
* @param \Exception $exception
* @param mixed $request
* @param \Payum\Core\Action\ActionInterface|null $action
*/
public function onException(\Exception $exception, $request, ActionInterface $action = null)
{
// Put your code here
}
}
Затем в файле конфигурации приложения вы должны добавить это расширение, чтобы он мог загружаться и выполняться инфраструктурой. Точный ответ зависит от типа формата, который вы используете в качестве файла конфигурации (yml, php, ini,?).
Вот пример с yml (официальная документация находится здесь: https://github.com/Payum/Payum/blob/master/docs/symfony/container-tags.md):
payum:
contexts:
yourContextName:
PaymentFactoryName:
extensions:
YourCustomExtension:
class: Payum\Core\Extension\YourExtension
В этом файле конфигурации вы должны:
yourContextName
что вы хотите.PaymentFactoryName
именем фабрики платежей, которую вы используете, вот список: https://github.com/Payum/PayumBundle/tree/master/DependencyInjection/Factory/PaymentYourCustomExtension
именем, которое вы хотите предоставить своему продлению.Вы можете использовать расширение payum onException. В методе вы можете поймать исключение и добавить информацию об этом в подробности оплаты.