Я хотел бы выпустить значок с API Mozilla Backpack Connect (Проверь это !). Для этого я следовал этот документ но я все еще не могу выпустить значок!
У меня точно такая же проблема, когда я просто пытаюсь получить новый токен доступа, используя токен обновления. Поэтому я разместил здесь код «получить новый токен доступа», потому что его немного легче понять, чем исходящий.
Я хотел бы сделать это в PHP с завивать, не в 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
Accept: /
Тип контента: приложение / JSON
Длина контента: 81* загрузка полностью отправлена: 81 из 81 байтов
* дополнительные вещи не в порядке передачи. C: 1037:00
* HTTP 1.1 или новее с постоянным соединением, поддерживается конвейерная обработка
< HTTP / 1.1 400 неверный запрос
< Cache-control: no-cache = «set-cookie»
< Тип контента: текст / обычный
< Дата: пт, 29 мая 2015 12:36:03 GMT
< Набор-cookie: AWSELB = 674101290634B07D75A3C1417FA6788D6E65270EC8D2D0E6014FB81FA4E878CAEA117D6E6334DB190F94A3D84909E9928F08D6B81651BDC3386AFC0A0000B3 = 394EBE3H0 = E
< x-frame-options: DENY
< X-Powered-By: Экспресс
< Контент-длина: 478
< Подключение: 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 это не работает! Так почему же?
И мой значок действителен (проходит проверка без проблем).
Я искал часами! Решение действительно простое, но не столь очевидное …
На этой линии: curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
ты должен использовать json_encode()
вместо http_build_query()
!
Так что делаю так: curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
и это работает! Ура !
Других решений пока нет …