2015-04-20 6 views
0

У меня есть следующий код:если код возвращает ошибку, не запустите запрос

<?php 
    require_once('./config.php'); 
include("includes/db.php"); 
    $token = $_POST["token"]; 
    $userId = $_POST["userId"]; 

    $email = $_POST["userEmail"]; 
    $courseProvider = $_POST["courseProvider"]; 

    $amount = $_POST["priceFinal"]; 
    $courseTitle = $_POST["courseTitle"]; 

    $amount = $amount * 100; 
    $customer = \Stripe\Customer::create(array(
     'email' => $email, 
     'card' => $token 
)); 

    $charge = \Stripe\Charge::create(array(
     'customer' => $customer->id, 
     'amount' => $amount, 
     'currency' => 'cad' 
)); 

$amountDisplay = $amount/100; 
$course_paid = "Yes"; 
$course_paid_date = date("Y-m-d"); 

$insert_c = "insert into order_complete (course_title, course_price, course_buyer, course_provider, course_paid_date) 
      values ('$courseTitle','$amount','$email','$courseProvider','$course_paid_date')"; 
    $run_c = mysqli_query($con, $insert_c); 

    $insert_c2 = "Update orders SET course_paid = '$course_paid' where course_id = '$userId'"; 
    $run_c2 = mysqli_query($con, $insert_c2); 


    echo "<h4>Successfully charged $$amountDisplay to $email</h4>"; 




?> 

, где я хочу только запросы, которые будут выполняться, если выполняются следующие пробеги успешно (без ошибок не возвращается)

$charge = \Stripe\Charge::create(array(
      'customer' => $customer->id, 
      'amount' => $amount, 
      'currency' => 'cad' 
    )); 

Причина в том, что я не хочу записывать в базу данных, что платеж был успешным, когда полоса не смогла завершить транзакцию до ошибки.

ответ

2

Что мы должны сделать, это понять, что эта функция возвращает: \Stripe\Charge::create на успех, а затем, используя простое условие, мы будем сравнивать значение для значений успеха $charge.

В то время как я на самом деле не знаком с этим API, в соответствии с их API of create charge ответа для создания нового заряда:

Возвращает объект заряда, если заряд удался. Возвращает ошибку, если что-то пошло не так. Общим источником ошибки является недопустимая или устаревшая карта или действительная карта с недостаточным доступным балансом.

Таким образом, вы можете использовать Используйте try - catch блок, как вы можете видеть в следующем примере: (https://stripe.com/docs/tutorials/charges)

$stripChargeValid = true; 
try { 
$charge = \Stripe\Charge::create(array(
    "amount" => 1000, // amount in cents, again 
    "currency" => "usd", 
    "source" => $token, 
    "description" => "Example charge") 
); 
} catch(\Stripe\Error\Card $e) { 
    // The card has been declined 
    $stripChargeValid = false; 
} 

if($stripChargeValid){ 
    //Run your queries. 
} 

Или в более всесторонним образом:

try { 
    // Use Stripe's bindings... 
} 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\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 
} 
+0

спасибо за ваши объяснения и примеры. где, например, я бы подключил свои запросы, чтобы убедиться, что они работают только с успехом? – John

+0

** Отредактированный мой ответ. ** Вы можете определить переменную внутри 'catch block', например:' $ error = true', а после блока 'try-catch' просто проверьте, не указана ли эта переменная' isset' и ее value is true: 'if (isset ($ error) && $ error) {.....}' –

+0

Это сработало для вас? –

1
if($run_c === TRUE){ 
    $insert_c2 = "Update orders SET course_paid = '$course_paid' where course_id = '$userId'"; 
    $run_c2 = mysqli_query($con, $insert_c2); 
} 
Смежные вопросы