seb606
seb606

Reputation: 41

How can I prevent duplicate charge using Stripe and PHP?

Recently i got duplicated payments with Stripe.

They told me to use Idempotent Requests.

I made some tests and i see the error message if i tried to refresh the browser for example.

But i don't know how to make the "next step" in case of error.

I mean if my client make a payment and there is a network issue, how to do with Stripe to retry and continu the process or how to display an error message and came back to the payment's page ?

My code for now:

    \Stripe\Stripe::setApiKey("xxxxxx");
$charge = \Stripe\Charge::create([
    'customer' => $customer->id,
    'amount'   => $total_payment,
    'currency' => $currency,
    'description' => $description
    ], ["idempotency_key" => $idempotency,]);  
$chargeJson = $charge->jsonSerialize();
$status = $chargeJson['status'];
if($status=="succeeded") {...

Thank you for your help, if you can just give me some information and then it will help me to improve my code ^^

Upvotes: 2

Views: 961

Answers (1)

Here is a functional demo of the try/catch with all the possible errors adding "Idempotent Requests field", just add your own functionality in each catch:

try {

  // Use Stripe's library to make requests...
  $charge = \Stripe\Charge::create([
    'amount' => $amount,
    'currency' => "usd",
    'description' => $description,
    "receipt_email" => $mail,
   ], [
    'idempotency_key' => $uniqueID
   ]);

} catch(\Stripe\Exception\CardException $e) {
  // Since it's a decline, \Stripe\Exception\CardException will be caught
  echo 'Status is:' . $e->getHttpStatus() . '\n';
  echo 'Type is:' . $e->getError()->type . '\n';
  echo 'Code is:' . $e->getError()->code . '\n';
  // param is '' in this case
  echo 'Param is:' . $e->getError()->param . '\n';
  echo 'Message is:' . $e->getError()->message . '\n';
} catch (\Stripe\Exception\RateLimitException $e) {
  // Too many requests made to the API too quickly
} catch (\Stripe\Exception\InvalidRequestException $e) {
  // Invalid parameters were supplied to Stripe's API
} catch (\Stripe\Exception\AuthenticationException $e) {
  // Authentication with Stripe's API failed
  // (maybe you changed API keys recently)
} catch (\Stripe\Exception\ApiConnectionException $e) {
  // Network communication with Stripe failed
} catch (\Stripe\Exception\ApiErrorException $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
}

Upvotes: 1

Related Questions