Используйте API Mozilla Backpack Connect с PHP

Я хотел бы выпустить значок с помощью API Mozilla Backpack Connect ( проверьте это!). Для этого я проследил за этим документом, но до сих пор не могу выпустить значок!

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

Я хотел бы сделать это на PHP с cURL, а не в Javascript.

Вот мой код:

$data = array(
    'grant_type' => 'refresh_token',
    'refresh_token' => $refreshToken
);
$url = $apiRoot .'/token';

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, count($data));
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Content-Type: application/json'
));
curl_setopt($ch, CURLOPT_VERBOSE, true);
curl_setopt($ch, CURLOPT_STDERR, fopen('php://output', 'w+'));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$response = curl_exec($ch);
var_dump($response);

curl_close($ch);

Здесь я просто пытаюсь получить новый токен доступа, как упомянуто в том же документе, но, к сожалению, я всегда получаю такой ответ:

Плохой запрос: плохой запрос
в следующем (/var/www/openbadges/node_modules/express/node_modules/connect/lib/proto.js:125:13)
по адресу /var/www/openbadges/node_modules/express/node_modules/connect/lib/middleware/bodyParser.js:54:23
на входящем сообщении. (/Var/www/openbadges/node_modules/express/node_modules/connect/lib/middleware/json.js:74:60)
на IncomingMessage.emit (events.js:92:17)
на _stream_readable.js: 938: 16
at process._tickCallback (node.js: 419: 13)

Если я посмотрю глубже, я изложу запрос, и он даст мне следующее:

> POST / api / token HTTP / 1.1
Ведущий: backpack.openbadges.org
Принять: /
Тип контента: приложение / JSON
Длина контента: 81

* загрузка полностью отправлена: 81 из 81 байтов
* дополнительные вещи не в порядке передачи. C: 1037:00
* HTTP 1.1 или новее с постоянным соединением, поддерживается конвейерная обработка
<Дата: пт, 29 мая 2015 12:36:03 GMT
<Соединение: keep-alive
<
* Соединение № 0 с хостом backpack.openbadges.org оставлено без изменений
* Закрытие соединения № 0

Так что, в основном, он отвечает мне ошибкой 400 "Bad Request" без дополнительной информации...

Для информации, если я пытаюсь сделать это с помощью Javascript, это работает. Если я сделаю это:

$.ajax({
    type: 'POST',
    url: 'https://backpack.openbadges.org/api/token',
    data: {
        grant_type: 'refresh_token',
        refresh_token: theRefreshToken
    },
    headers: {
        'Content-Type': 'application/json'
    },
    success: function(data, textStatus, req) {
        console.log(textStatus);
        console.log(data);
    },
    error: function(xhr, textStatus, err) {
        console.log(textStatus);
        console.log(err);
        console.log(xhr);
        console.log($(this));
    }
});

Это возвращает мне успех, но когда я использую PHP cURL, это не работает! Так почему же?

И мой значок действителен (он проходит проверку без проблем).

1 ответ

Решение

Я искал часами! Решение действительно простое, но не столь очевидное...

На этой линии: curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data)); ты должен использовать json_encode() вместо http_build_query()!

Так что делаю так: curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data)); и это работает! Ура!

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