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

0

Я пытаюсь поймать 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
Теги:
omnipay
payum

2 ответа

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
    Благодарю. Где мне нужно создать этот новый класс расширения (в какой папке)
  • 0
    Вы можете создать папку расширений в вашей папке src. Я уверен, что ваш автозагрузчик поймает его.
Показать ещё 6 комментариев
0

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

  • 0
    спасибо, есть ли какой-нибудь пример, на который вы можете сослаться мне о том, как его использовать?
  • 0
    Нет, у меня никогда не было шанса сделать что-то подобное.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню