Поймайте недопустимое исключение кредитной карты с помощью Symfony PayumBundle

Я пытаюсь поймать InvalidCreditCardException и любое другое исключение, использующее Омнипай Мост из 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 бросает свой собственный исключение номер кредитной карты не действителен.

В комментариях также говорится:

Как правило, если вы хотите самостоятельно проверить кредитную карту с помощью пользовательских сообщений об ошибках, вам следует использовать библиотеку проверки вашей платформы, а не этот метод.

Это именно то, что я пытаюсь сделать, как я могу проверить карту с пользовательской ошибкой используя 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

0

Решение

Вы можете использовать расширение Payum OnException сообщение. В методе вы можете поймать исключение и добавить информацию о нем в реквизиты платежа.

0

Другие решения

Вам нужно добавить расширение, которое будет выполнено 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/Payment
  • замещать YourCustomExtension по имени, которое вы хотите дать вашему
    расширение.
0

По вопросам рекламы [email protected]