Catching Stripe errors with Try/Catch PHP method

后端 未结 6 851
独厮守ぢ
独厮守ぢ 2020-12-23 17:12

During my testing of STRIPE in a website, I built the code like this:

   try {
        $charge = Stripe_Charge::create(array(
          \"amount\" => $cli         


        
相关标签:
6条回答
  • 2020-12-23 17:52

    I may be late to this question, but I ran into the same issue and found this.

    You just need to use "Stripe_Error" class.

    use Stripe_Error;
    

    After declaring that, I was able to catch errors successfully.

    0 讨论(0)
  • 2020-12-23 17:58

    If you're using the Stripe PHP libraries and they have been namespaced (such as when they're installed via Composer) you can catch all Stripe exceptions with:

    <?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
    }
    
    0 讨论(0)
  • 2020-12-23 17:59

    This is how Stripe catches errors: Documentation.

    try {
        // make Stripe API calls
    } catch(\Stripe\Exception\ApiErrorException $e) {
        $return_array = [
            "status" => $e->getHttpStatus(),
            "type" => $e->getError()->type,
            "code" => $e->getError()->code,
            "param" => $e->getError()->param,
            "message" => $e->getError()->message,
        ];
        $return_str = json_encode($return_array);          
        http_response_code($e->getHttpStatus());
        echo $return_str;
    }
    

    You can then catch the error in ajax with the following code:

    $(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://stackoverflow.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.");
        }
    });
    
    0 讨论(0)
  • 2020-12-23 18:02

    I think there is more than these exceptions (Stripe_InvalidRequestError and Stripe_Error) to catch.

    The code below is from Stripe's web site. Probably, these additional exceptions, which you didn't consider, occurs and your code fails sometimes.

    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
    }
    

    EDIT:

    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();
    }
    

    Now, you will catch all possible exceptions and you can display error message as you wish. And also $error6 is for unrelated exceptions.

    0 讨论(0)
  • 2020-12-23 18:04

    I think all you really need to check is the base error class of Stripe and the exception if it's unrelated to Stripe. Here's how I do it.

    /**
     * Config.
     */
    require_once( dirname( __FILE__ ) . '/config.php' );
    
    // Hit Stripe API.
    try {
      // Register a Customer.
      $customer = \Stripe\Customer::create(array(
        'email'    => 'AA@TESTING.com',
        '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'         => 'a@a.c.o',
            '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>';
    }
    
    0 讨论(0)
  • 2020-12-23 18:07

    This is an update to another answer, but the docs have changed very slightly so I had success using the following method:

    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
    }
    

    You can find the source of this in the Stripe docs right here:

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

    0 讨论(0)
提交回复
热议问题