0

我正在尝试使用 PayumBundle的Omnipay BridgeInvalidCreditCardException来捕获任何其他异常。

我努力了:

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
4

2 回答 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

在此配置文件中,您应该:

于 2015-03-03T01:06:04.697 回答
0

您可以使用支付扩展onException消息。在该方法中,您可以捕获异常并将有关它的信息添加到付款详细信息中。

于 2015-02-16T08:30:27.777 回答