我正在使用Stripe.js元素启动一个应用程序。使用Stripe提供的测试卡号时,没有问题,一切按预期工作。现在我专注于错误处理。当使用测试卡4000 0000 0000 0002处理故意拒绝的卡时,会出现以下错误:Fatal error: Uncaught Stripe\Error\Card: Your card was declined. in C:\Apache24\htdocs...\vendor\stripe\stripe-php\lib\ApiRequestor.php:128 from API request {token}.... 我假设这不是PHP致命错误(无法在try/catch块中处理),所以我搜索并找到了this example,并将其实施到我的代码中,如下所示:
然而,这并没有捕获错误。消息继续显示为之前没有catch块的情况下。
有什么线索可以解释我为什么会收到致命错误?当然,我预计卡会被拒绝,但我期望在try/catch块中处理拒绝的结果。
编辑
我应该补充说明,我正在使用composer来包含Stripe php库。
进一步说明:可能不相关,但是所有应该被拒绝的测试卡都会出现致命错误消息。每张卡片的拒绝原因在错误消息中清楚地说明(不是逐字)如邮政编码验证失败、CVC不正确、卡过期等。
正如@Ywain所指出的那样,这实际上不是try/catch块的问题。致命错误是由第一个交易的charge生成的。换句话说,对\Stripe\Charge的调用应返回具有适当标志或字段值的JSON数组,而不是致命错误。
\Stripe\Stripe::setApiKey(self::APIKEY);
$charge_arr = array(
"key" => value, etc ... )
try {
$charge = \Stripe\Charge::create($charge_arr);
if($charge->paid == true) {
echo '<br>the card was successfully charged!';
}
} catch (\Stripe\Error\Base $e) {
echo '<br>base';
echo ($e->getMessage());
} catch (\Stripe\Error\Card $e) {
$body = $e->getJsonBody();
$err = $body['error'];
print('Status is:' . $e->getHttpStatus() . "\n");
print('Type is:' . $err['type'] . "\n");
print('Code is:' . $err['code'] . "\n");
echo ($e->getMessage());
} catch (\Stripe\Error\Authentication $e) {
echo '<br>Auth';
// a good one to catch
} catch (\Stripe\Error\InvalidRequest $e) {
echo '<br>Invalid Request';
// and catch this one just in case
} catch (Exception $e) {
//catch any non-stripe exceptions
}
然而,这并没有捕获错误。消息继续显示为之前没有catch块的情况下。
有什么线索可以解释我为什么会收到致命错误?当然,我预计卡会被拒绝,但我期望在try/catch块中处理拒绝的结果。
编辑
我应该补充说明,我正在使用composer来包含Stripe php库。
进一步说明:可能不相关,但是所有应该被拒绝的测试卡都会出现致命错误消息。每张卡片的拒绝原因在错误消息中清楚地说明(不是逐字)如邮政编码验证失败、CVC不正确、卡过期等。
正如@Ywain所指出的那样,这实际上不是try/catch块的问题。致命错误是由第一个交易的charge生成的。换句话说,对\Stripe\Charge的调用应返回具有适当标志或字段值的JSON数组,而不是致命错误。
\Stripe\Error\Base
是所有 Stripe 错误的父类,因此如果您首先捕获它,则不会执行任何其他\Stripe\Error\...\
捕获子句。您应该在最后第二个位置(在Exception
之前但在所有其他捕获子句之后)才捕获它。话虽如此,如果尽管出现错误消息但没有执行任何捕获子句,则最可能的解释是运行的代码与您查看并复制到此处的代码不同。 - Ywain