Почему я получаю сообщение «BAD_REQUEST Unprocessable JSON»?

Я пытаюсь сделать вызов REST-API, но он возвращает только «BAD_REQUEST Unprocessable JSON».

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

Это код, который я использую для отправки запроса:

function callAPI($method, $url, $data) 
{
    $curl = curl_init();
    $username = 'PK10008_e8f77aebdb0a';
    $password = 'rwBmthNFK8JTbIL7';

    switch($method)
    {
      case "POST":
         curl_setopt($curl, CURLOPT_POST, 1);
         if ($data)
            curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
         break;
    }

    //Options
    curl_setopt($curl, CURLOPT_USERPWD, $username . ":" . $password);
    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_HTTPHEADER, array(
        'Content-Type: application/json'
    ));
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);

    $result = curl_exec($curl);
    if (!$result)
    {
        die("Connection Failure");
    }

    curl_close($curl);
    return $result;
}

И это код, который я использую для создания и отправки информации:

    $data_array = array(
        'purchase_country'=> 'SE',
        'purchase_currency'=> 'SEK',
        'locale'=> 'sv-SE',
        'order_amount'=> 10,
        'order_tax_amount'=> 0,
        'order_lines' => array(
            'type'=> 'physical',
            'reference'=> '19-402',
            'name'=> 'Test',
            'quantity'=> 1,
            'unit_price'=> 10,
            'tax_rate'=> 0,
            'total_amount'=> 10,
            'total_discount_amount'=> 0,
            'total_tax_amount'=> 0
        )
    );

    $make_call = callAPI('POST', 'https://api.playground.klarna.com/payments/v1/sessions', json_encode($data_array));
    $response = json_decode($make_call, true);

И это пример:

POST /payments/v1/sessions
Authorization: Basic pwhcueUff0MmwLShJiBE9JHA==
Content-Type: application/json

{
  "purchase_country": "SE",
  "purchase_currency": "SEK",
  "locale": "sv-SE",
  "order_amount": 10,
  "order_tax_amount": 0,
  "order_lines": [{
    "type": "physical",
    "reference": "19-402",
    "name": "Battery Power Pack",
    "quantity": 1,
    "unit_price": 10,
    "tax_rate": 0,
    "total_amount": 10,
    "total_discount_amount": 0,
    "total_tax_amount": 0
  }]
}

Результат, который я получаю, таков: 'ПЛОХОЙ_ЗАПРОС Необрабатываемый JSON 1734c472-c9cb-4022-b469-a8231c7abec'

Но я должен получить что-то вроде этого:

HTTP/1.1 200 OK
Content-Type: application/json

{
  "session_id": "068df369-13a7-4d47-a564-62f8408bb760",
  "client_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjAwMDAwMDAwMDAtMDAwMDAtMDAwMC0wMDAwMDAwMC0wMDAwIiwidXJsIjoiaHR0cHM6Ly9jcmVkaXQtZXUua2xhcm5hLmNvbSJ9.A_rHWMSXQN2NRNGYTREBTkGwYwtm-sulkSDMvlJL87M",
  "payment_method_categories": [{
      "identifier": "pay_later"
      "name" : "Pay later.",
      "asset_urls" : {
        "descriptive" : "https://cdn.klarna.com/1.0/shared/image/generic/badge/en_us/pay_later/descriptive/pink.svg",
        "standard" : "https://cdn.klarna.com/1.0/shared/image/generic/badge/en_us/pay_later/standard/pink.svg"
      }
  }]
}

Я предлагаю вам прочитать описание параметра CURLOPT_POSTFIELDS на странице руководства

RiggsFolly 10.06.2019 11:10

Но разве данные не отправляются в виде строки из-за json_encode?

Ivar Jönsson 10.06.2019 11:17

Да, но в руководстве говорится, что используйте массив assoc или 'para1=val1&para2=val2&...'

RiggsFolly 10.06.2019 11:22

Как бы я включил массив в этом формате?

Ivar Jönsson 10.06.2019 11:29

Вы можете попробовать изменить эту строку $make_call = callAPI('POST', 'https://api.playground.klarna.com/payments/v1/sessions', json_encode($data_array)), чтобы пройти $data_array без json_encoding.

RiggsFolly 10.06.2019 11:31

Это дало мне эту ошибку: преобразование массива в строку здесь: curl_setopt($curl, CURLOPT_POSTFIELDS, $data);

Ivar Jönsson 10.06.2019 11:35
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
6
627
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема, с которой я столкнулся, заключалась в том, как json_encode создает массивы кодирования. Вместо этого: "example":[{ "ex": "ex" }]

Он сделал это: "example":{ "ex": "ex" }

Что, в свою очередь, сделало json нечитаемым до конца API

Другие вопросы по теме