Search code examples
javascriptphpstripe-paymentshttp-status-code-403

Stripe: payment_init.php returns 403 forbidden error code


I am trying to integrate a Stripe payment method in a web application. I am stuck: payment_init.php does not load, when I am redirected to the page. I get 403 Forbidden error code ("Forbidden. You don't have permission to access this resource. Additionally, a 400 Bad Request error was encountered while trying to use an ErrorDocument to handle the request"). Here is my payment_init.php file's code:

<?php

// Include the Stripe PHP library 
require_once 'stripe-php/init.php';

// Include the configuration file 
require_once 'config.php';

$chosenService = $_POST['submitService'];

printf($chosenService);

// Product Details
if ($chosenService === "1") {
    $productName = "Hajvágás (6900 HUF)";
    $productID = "hc001";
    $productPrice = 6900;
} elseif ($chosenService === "2") {
    $productName = 'Hajvágás + Szakáll (9900 HUF)';
    $productID = "hc002";
    $productPrice = 9900;
};
$currency = "huf";
$description = "20% előleg Mobil Barber";

printf($productName);


// Set API key 
\Stripe\Stripe::setApiKey(STRIPE_API_KEY);

$response = array(
    'status' => 0,
    'error' => array(
        'message' => 'Invalid Request!'
    )
);

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    $input = file_get_contents('php://input');
    $request = json_decode($input);
}

if (json_last_error() !== JSON_ERROR_NONE) {
    http_response_code(400);
    echo json_encode($response);
    exit;
}


if (!empty($request->createCheckoutSession)) {
    printf($productName);

    // Convert product price to cent 
    $stripeAmount = round($productPrice * 100, 2);

    // Create new Checkout Session for the order 
    try {
        printf($productName);
        $checkout_session = \Stripe\Checkout\Session::create([
            'line_items' => [[
                'price_data' => [
                    'currency' => $currency,
                    'unit_amount' => $productPrice,
                    'product_data' => [
                        'name' => $productName,
                        'description' => $description,
                    ],
                ],
                'quantity' => 1,
            ]],
            'mode' => 'payment',
            'success_url' => STRIPE_SUCCESS_URL . '?session_id={CHECKOUT_SESSION_ID}',
            'cancel_url' => STRIPE_CANCEL_URL,
        ]);
    } catch (Exception $e) {
        $api_error = $e->getMessage();
    }

    if (empty($api_error) && $checkout_session) {
        $response = array(
            'status' => 1,
            'message' => 'Checkout Session created successfully!',
            'sessionId' => $checkout_session->id
        );
    } else {
        $response = array(
            'status' => 0,
            'error' => array(
                'message' => 'Checkout Session creation failed! ' . $api_error
            )
        );
    }
}

// Return response 
echo json_encode($response);

When I print $chosenService and $productName variables outside the "if (!empty($request->createCheckoutSession)) {...}" condition, I get the parameters, so they are not NULL. But inside the condition I do not get anything back, neither NULL (does this mean that the $request is empty?). I even checked the Logs in Stripe dashboard, this is the err message there:

"parameter_missing - line_items[0][price_data][product_data][name] Looks like you are missing the name field tied to a given line item's product_data.

This field is required in that it contains the name that will show up on associated invoice line item descriptions."

I would be really grateful, if someone could help me with this. Thank you in advance.


Solution

  • I don't think your problem is the $productName. I tested out the code you provided and it looks like the issue has to do with the price value. You convert the $productPrice to $stripeAmount but then you don't use it. Without the conversion the amounts for either of the services are less than the $0.50 threshold (with the USD = HUF conversion).

    As their docs point out, Stripe requires your charge amounts to be valued between $0.50 and $999,999.00

    I don't think this impacted your attempt here but it might also be worth updating the way in which you are invoking/using the Stripe PHP library to conform to the current standard: https://github.com/stripe/stripe-php#getting-started

    It will mean you can more easily use the code snippets displayed in the API docs