我正在使用Stripe.js元素旋轉應用程序。使用Stripe提供的測試卡號碼,我沒有問題。所有按預期工作。如何在PHP中捕捉到條帶致命錯誤?
我現在專注於錯誤處理。當使用測試卡4000 0000 0000技術來處理卡是刻意地拒絕,我得到這個錯誤:
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並實現它變成我這樣的代碼:
\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
}
這不,但是,捕獲的錯誤。該消息繼續顯示,因爲它是在我有捕獲塊之前。
任何線索爲什麼我得到致命錯誤?當然,我預計這張卡會被拒絕,但我預計這個下降的結果是我能夠在try/catch塊中處理的。
編輯
我要補充一點,我使用的作曲家包括條紋PHP庫。
進一步注意:它可能不相關,但對於所有應該被拒絕的測試卡都會顯示致命錯誤消息。下降的原因在每張卡的錯誤信息中都有明確說明,例如(不是逐字)郵政編碼驗證失敗,CVC不正確,卡過期等。
正如@Ywain正確地指出,這實際上並不是嘗試/ catch塊問題。致命錯誤首先由收費交易產生。換句話說,對\ Stripe \ Charge的調用應該返回一個帶有相應標誌或字段值的JSON數組,而不是一個致命錯誤。
'\條\錯誤\ Base'是所有條紋錯誤的父類,所以如果你先抓住它,沒有其他的'\條\錯誤\的... \'catch子句就會執行。你應該只在倒數第二個(在Exception之前,但在所有其他catch子句之後)捕獲它。 也就是說,如果沒有任何catch子句被執行,儘管出現了錯誤消息,最可能的解釋是運行的代碼與您正在查看並複製到此處的代碼不同。 – Ywain
@Ywain - 我嘗試過許多不同方式的代碼。沒有任何try/catch,我也會得到相同的結果。所以你提出了一個很好的觀點:雖然try/catch塊可能不是「spec」,但它確實不是問題。我將重新編輯帖子以反映這一點。任何線索? – globalSchmidt