Полосовой биллинг: проблема с передачей данных из JS в PHP с использованием Fetch API - PullRequest
0 голосов
/ 26 февраля 2020

Я понимаю, что, скорее всего, здесь я делаю ошибку ладьи ie, но я пытаюсь внедрить Stripe Billing в мое PHP веб-приложение, и я сталкиваюсь с проблемой передачи данных из одного из JS Stripe работает с моим PHP методом с использованием Fetch API. Все до этого момента в коде, кажется, работает правильно, и я могу правильно сгенерировать идентификатор метода оплаты Stripe для передачи в функцию JS.

Ссылочный код реализации из Stripe:

Вот моя Javascript функция:

async function createCustomer(paymentMethod) {

    return fetch(urlRoot + 'create-customer', {
        method: 'POST',
        headers: {'Content-Type': 'application/json'},
        body: JSON.stringify({
            payment_method: paymentMethod
        }),
    })
        .then(function(response) {
            return response.text();  // Using .text instead of .json simply to debug.
        })
        .then(function(text) {
            console.log(text);
        })
        .catch(function(error) {
            console.log('Error: ', error.message);
        });
}

А вот мой PHP метод:

public function createCustomer() {
    if ($_SERVER['REQUEST_METHOD'] === 'POST') {

        \Stripe\Stripe::setApiKey(Config::STRIPE_SECRET_KEY);

        $customer = \Stripe\Customer::create([
            "payment_method" => $_POST['payment_method'],
            "invoice_settings" => [
                "default_payment_method" => $_POST['payment_method']
            ]
        ]);

        header('Content-Type: application/json');
        echo json_encode($customer);

    }
} 

Однако, когда я пытаюсь выполнить скрипт, Я получаю ошибку 500, что "payment_method" является неопределенным индексом в моем методе PHP. Когда я выполняю var_dump ($ _ POST) в качестве первой строки кода в том же методе, он говорит, что массив $ _POST пуст.

Когда я запускаю скрипт, я получаю следующая ошибка в моей консоли Chrome DevTools:

<code>VM3531:1 POST http://localhost/toryn/create-customer 500 (Internal Server Error)
(anonymous) @ VM3531:1
createCustomer @ main.js:125
(anonymous) @ main.js:101
Promise.then (async)
createPaymentMethod @ main.js:95
(anonymous) @ main.js:80
main.js:138 

<h1>Fatal Error</h1>
<p>Uncaught exception: "ErrorException"</p>
<p>Message: "Undefined index: payment_method"</p>
<p>Stack trace:<pre>#0 /Applications/XAMPP/xamppfiles/htdocs/toryn/App/Controllers/Stripe.php(30): Core\Error::ErrorHandler(8, 'Undefined index...', '/Applications/X...', 30, Array)
#1 /Applications/XAMPP/xamppfiles/htdocs/toryn/Core/Router.php(110): App\Controllers\Stripe->createCustomer()
#2 /Applications/XAMPP/xamppfiles/htdocs/toryn/public/index.php(43): Core\Router->dispatchRoute('create-customer...')
#3 {main}

Вброшено "/Applications/XAMPP/xamppfiles/htdocs/toryn/App/Controllers/Stripe.php" в строке 30

Я уверен, что мне не хватает чего-то фундаментального о том, как PHP работает с Fetch API и JSON, но я искал это часами и не могу кажется, найти решение. Я буду рад и ценим любые рекомендации или идеи, которые вы, ребята, можете предоставить.

Заранее большое спасибо, и если я не предоставил достаточно фрагментов кода, чтобы описать проблему, пожалуйста, дайте мне знать.

1 Ответ

0 голосов
/ 26 февраля 2020

Благодаря @James выше, я решил эту проблему. Я забыл вызвать приведенный ниже код в моем скрипте PHP, прежде чем пытаться использовать переданные JSON данные POST:

$data = json_decode(file_get_contents('php://input'), true);

Учитывая, что я сейчас сохраняю результаты в $ Переменная data, я, конечно, также изменил свой исходный код PHP с $ _POST ['payment_method'] на $ data ['payment_method'].

Теперь все кажется работающим; Я вижу, что данные $ customer успешно переданы обратно в мой JS скрипт, и Stripe регистрирует успешную регистрацию новых клиентов на их панели инструментов.

Еще раз большое спасибо, @James!

...