stripe error php error-handling try-catch stripe-payments

Captura de errores de Stripe con el método Try/Catch PHP



stripe error 500 (6)

Durante mi prueba de STRIPE en un sitio web, construí el código de esta manera:

try { $charge = Stripe_Charge::create(array( "amount" => $clientPriceStripe, // amount in cents "currency" => "usd", "customer" => $customer->id, "description" => $description)); $success = 1; $paymentProcessor="Credit card (www.stripe.com)"; } catch (Stripe_InvalidRequestError $a) { // Since it''s a decline, Stripe_CardError will be caught $error3 = $a->getMessage(); } catch (Stripe_Error $e) { // Since it''s a decline, Stripe_CardError will be caught $error2 = $e->getMessage(); $error = 1; } if ($success!=1) { $_SESSION[''error3''] = $error3; $_SESSION[''error2''] = $error2; header(''Location: checkout.php''); exit(); }

El problema es que a veces hay un error con la tarjeta (no atrapado por los argumentos "catch" que tengo allí) y el "try" falla y la página inmediatamente publica el error en la pantalla en lugar de ingresar al "si" y redirigiendo de nuevo a checkout.php.

¿Cómo debería estructurar mi manejo de errores para obtener el error e inmediatamente volver a dirigirme a checkout.php y mostrar el error allí?

¡Gracias!

Error lanzado:

Fatal error: Uncaught exception ''Stripe_CardError'' with message ''Your card was declined.'' in ............ /lib/Stripe/ApiRequestor.php on line 92


Así es como Stripe detecta errores en 2017. Documentation . Este fragmento requiere PHP 7.1+

catch(/Stripe/Error/Card | /Stripe/Error/RateLimit | /Stripe/Error/InvalidRequest | /Stripe/Error/Authentication | /Stripe/Error/ApiConnection $e) { $body = $e->getJsonBody(); $err = $body["error"]; $return_array = [ "status" => $e->getHttpStatus(), "type" => $err["type"], "code" => $err["code"], "param" => $err["param"], "message" => $err["message"], ]; $return_str = json_encode($return_array); http_response_code($e->getHttpStatus()); echo $return_str; }

A continuación, puede detectar el error en ajax con el siguiente código:

$(document).ajaxError(function ajaxError(event, jqXHR, ajaxSettings, thrownError) { try { var url = ajaxSettings.url; var http_status_code = jqXHR.status; var response = jqXHR.responseText; var message = ""; if (isJson(response)) { // see here for function: https://.com/a/32278428/4056146 message = " " + (JSON.parse(response)).message; } var error_str = ""; // 1. handle HTTP status code switch (http_status_code) { case 0: { error_str = "No Connection. Cannot connect to " + new URL(url).hostname + "."; break; } // No Connection case 400: { error_str = "Bad Request." + message + " Please see help."; break; } // Bad Request case 401: { error_str = "Unauthorized." + message + " Please see help."; break; } // Unauthorized case 402: { error_str = "Request Failed." + message; break; } // Request Failed case 404: { error_str = "Not Found." + message + " Please see help."; break; } // Not Found case 405: { error_str = "Method Not Allowed." + message + " Please see help."; break; } // Method Not Allowed case 409: { error_str = "Conflict." + message + " Please see help."; break; } // Conflict case 429: { error_str = "Too Many Requests." + message + " Please try again later."; break; } // Too Many Requests case 500: { error_str = "Internal Server Error." + message + " Please see help."; break; } // Internal Server Error case 502: { error_str = "Bad Gateway." + message + " Please see help."; break; } // Bad Gateway case 503: { error_str = "Service Unavailable." + message + " Please see help."; break; } // Service Unavailable case 504: { error_str = "Gateway Timeout." + message + " Please see help."; break; } // Gateway Timeout default: { console.error(loc + "http_status_code unhandled >> http_status_code = " + http_status_code); error_str = "Unknown Error." + message + " Please see help."; break; } } // 2. show popup alert(error_str); console.error(arguments.callee.name + " >> http_status_code = " + http_status_code.toString() + "; thrownError = " + thrownError + "; URL = " + url + "; Response = " + response); } catch (e) { console.error(arguments.callee.name + " >> ERROR >> " + e.toString()); alert("Internal Error. Please see help."); } });


Creo que hay más de estas excepciones ( Stripe_InvalidRequestError y Stripe_Error ) para atrapar.

El siguiente código es del sitio web de Stripe . Probablemente, estas excepciones adicionales, que usted no consideró, ocurren y su código falla a veces .

try { // Use Stripe''s bindings... } catch(Stripe_CardError $e) { // Since it''s a decline, Stripe_CardError will be caught $body = $e->getJsonBody(); $err = $body[''error'']; print(''Status is:'' . $e->getHttpStatus() . "/n"); print(''Type is:'' . $err[''type''] . "/n"); print(''Code is:'' . $err[''code''] . "/n"); // param is '''' in this case print(''Param is:'' . $err[''param''] . "/n"); print(''Message is:'' . $err[''message''] . "/n"); } catch (Stripe_InvalidRequestError $e) { // Invalid parameters were supplied to Stripe''s API } catch (Stripe_AuthenticationError $e) { // Authentication with Stripe''s API failed // (maybe you changed API keys recently) } catch (Stripe_ApiConnectionError $e) { // Network communication with Stripe failed } catch (Stripe_Error $e) { // Display a very generic error to the user, and maybe send // yourself an email } catch (Exception $e) { // Something else happened, completely unrelated to Stripe }

EDITAR:

try { $charge = Stripe_Charge::create(array( "amount" => $clientPriceStripe, // amount in cents "currency" => "usd", "customer" => $customer->id, "description" => $description)); $success = 1; $paymentProcessor="Credit card (www.stripe.com)"; } catch(Stripe_CardError $e) { $error1 = $e->getMessage(); } catch (Stripe_InvalidRequestError $e) { // Invalid parameters were supplied to Stripe''s API $error2 = $e->getMessage(); } catch (Stripe_AuthenticationError $e) { // Authentication with Stripe''s API failed $error3 = $e->getMessage(); } catch (Stripe_ApiConnectionError $e) { // Network communication with Stripe failed $error4 = $e->getMessage(); } catch (Stripe_Error $e) { // Display a very generic error to the user, and maybe send // yourself an email $error5 = $e->getMessage(); } catch (Exception $e) { // Something else happened, completely unrelated to Stripe $error6 = $e->getMessage(); } if ($success!=1) { $_SESSION[''error1''] = $error1; $_SESSION[''error2''] = $error2; $_SESSION[''error3''] = $error3; $_SESSION[''error4''] = $error4; $_SESSION[''error5''] = $error5; $_SESSION[''error6''] = $error6; header(''Location: checkout.php''); exit(); }

Ahora, detectará todas las excepciones posibles y podrá mostrar el mensaje de error que desee. Y también $ error6 es para excepciones no relacionadas.


Creo que todo lo que necesitas comprobar es la clase de error base de Stripe y la excepción si no está relacionado con Stripe. Así es como lo hago.

/** * Config. */ require_once( dirname( __FILE__ ) . ''/config.php'' ); // Hit Stripe API. try { // Register a Customer. $customer = /Stripe/Customer::create(array( ''email'' => ''[email protected]'', ''source'' => $token, ''metadata'' => array( // Note: You can specify up to 20 keys, with key names up to 40 characters long and values up to 500 characters long. ''NAME'' => ''AA'', ''EMAIL'' => ''[email protected]'', ''ORDER DETAILS'' => $order_details, ) )); // Charge a customer. $charge = /Stripe/Charge::create(array( ''customer'' => $customer->id, ''amount'' => 5000, // In cents. ''currency'' => ''usd'' )); // If there is an error from Stripe. } catch ( Stripe/Error/Base $e ) { // Code to do something with the $e exception object when an error occurs. echo $e->getMessage(); // DEBUG. $body = $e->getJsonBody(); $err = $body[''error'']; echo ''<br> ——— <br>''; echo ''<br>THE ERROR DEFINED — <br>''; echo ''— Status is: '' . $e->getHttpStatus() . ''<br>''; echo ''— Message is: '' . $err[''message''] . ''<br>''; echo ''— Type is: '' . $err[''type''] . ''<br>''; echo ''— Param is: '' . $err[''param''] . ''<br>''; echo ''— Code is: '' . $err[''code''] . ''<br>''; echo ''<br> ——— <br>''; // Catch any other non-Stripe exceptions. } catch ( Exception $e ) { $body = $e->getJsonBody(); $err = $body[''error'']; echo ''<br> ——— <br>''; echo ''<br>THE ERROR DEFINED — <br>''; echo ''— Status is: '' . $e->getHttpStatus() . ''<br>''; echo ''— Message is: '' . $err[''message''] . ''<br>''; echo ''— Type is: '' . $err[''type''] . ''<br>''; echo ''— Param is: '' . $err[''param''] . ''<br>''; echo ''— Code is: '' . $err[''code''] . ''<br>''; echo ''<br> ——— <br>''; }


Esta es una actualización de otra respuesta, pero los documentos han cambiado muy poco, así que tuve éxito usando el siguiente método:

try { // Use Stripe''s library to make requests... } catch(/Stripe/Error/Card $e) { // Since it''s a decline, /Stripe/Error/Card will be caught $body = $e->getJsonBody(); $err = $body[''error'']; print(''Status is:'' . $e->getHttpStatus() . "/n"); print(''Type is:'' . $err[''type''] . "/n"); print(''Code is:'' . $err[''code''] . "/n"); // param is '''' in this case print(''Param is:'' . $err[''param''] . "/n"); print(''Message is:'' . $err[''message''] . "/n"); } catch (/Stripe/Error/RateLimit $e) { // Too many requests made to the API too quickly } catch (/Stripe/Error/InvalidRequest $e) { // Invalid parameters were supplied to Stripe''s API } catch (/Stripe/Error/Authentication $e) { // Authentication with Stripe''s API failed // (maybe you changed API keys recently) } catch (/Stripe/Error/ApiConnection $e) { // Network communication with Stripe failed } catch (/Stripe/Error/Base $e) { // Display a very generic error to the user, and maybe send // yourself an email } catch (Exception $e) { // Something else happened, completely unrelated to Stripe }

Puede encontrar la fuente de esto en los documentos de Stripe aquí:

https://stripe.com/docs/api?lang=php#handling-errors


Puedo llegar tarde a esta pregunta, pero me encontré con el mismo problema y encontré esto.

Solo necesitas usar la clase "Stripe_Error".

use Stripe_Error;

Después de declarar eso, pude detectar errores con éxito.


Si está utilizando las bibliotecas de Stripe PHP y el espacio de nombres (como cuando se instalan mediante Composer) puede capturar todas las excepciones de Stripe con:

<?php try { // Use a Stripe PHP library method that may throw an exception.... /Stripe/Customer::create($args); } catch (/Stripe/Error/Base $e) { // Code to do something with the $e exception object when an error occurs echo($e->getMessage()); } catch (Exception $e) { // Catch any other non-Stripe exceptions }