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

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

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

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

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

person Baig    schedule 15.02.2015    source источник


Ответы (2)



Вам нужно добавить расширение, которое будет выполняться объектом 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 на имя, которое вы хотите дать своему расширению.
person alfallouji    schedule 03.03.2015
comment
Спасибо. Где мне нужно создать этот новый класс расширения (в какой папке) - person Baig; 03.03.2015
comment
Вы можете создать папку расширения в папке src. Я почти уверен, что ваш автозагрузчик поймает его. - person alfallouji; 03.03.2015
comment
Не уверен, что мой ответ был ясен, я имел в виду где-нибудь ниже папки src (вы можете создавать подпапки). - person alfallouji; 03.03.2015
comment
Спасибо за продолжение, я изо всех сил пытаюсь настроить изменения конфигурации, которые вы упомянули, ошибка, которую я получаю: Invalid type for path "payum.contexts.stripe_omnipay.omnipay.extensions.PaymentExtension". Expected scalar, but got array. - person Baig; 03.03.2015
comment
я обновил свой вопрос, добавив свой config.yml, на всякий случай, если это поможет объяснить, как я его добавил - person Baig; 03.03.2015
comment
Я заметил опечатку (расширение вместо расширения): class: Payum\Core\Extension\PaymentExtention в вашем основном сообщении - person alfallouji; 03.03.2015
comment
Давайте продолжим обсуждение в чате. - person Baig; 03.03.2015