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í:
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
}