簡體   English   中英

將Mozilla Backpack Connect API與PHP結合使用

[英]Use the Mozilla Backpack Connect API with PHP

我想使用Mozilla Backpack Connect API發行徽章( 請選中此! )。 為此,我已經遵循了本文檔,但是仍然無法頒發徽章!

當我嘗試使用刷新令牌獲取新的訪問令牌時,我遇到了完全相同的問題。 因此,我在此處發布了“獲取新的訪問令牌”代碼,因為它比發出代碼更容易理解。

我想用cURL而不是JavascriptPHP中執行此操作。

這是我的代碼:

$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
在IncomingMessage。 (/var/www/openbadges/node_modules/express/node_modules/connect/lib/middleware/json.js:74:60)
在IncomingMessage.emit(events.js:92:17)
在_stream_visible.js:938:16
在process._tickCallback(node.js:419:13)

如果我看起來更深入,則我已詳細說明了請求,它給了我以下信息:

> POST / api /令牌HTTP / 1.1
主持人:backpack.openbadges.org
接受: /
內容類型:application / json
內容長度:81

*上傳完全發送:81個字節(共81個字節)
*多余的東西無法正常傳輸。c:1037:0 0
*具有持續連接的HTTP 1.1或更高版本,支持管道傳輸
<HTTP / 1.1 400錯誤請求
<緩存控制:no-cache =“ set-cookie”
<內容類型:文本/純文本
<日期:2015年5月29日,星期五,格林尼治標准時間
<Set-Cookie:AWSELB = 674101290634B07D75A3C1417FA6788D6E65270EC8D2D0E6014FB81FA4E878CAEA117D6E6334DB190F94A3D84909E9928F08D6B81651BDC3386AFC0A84F3A39F4B51E09B31PATH;
<x幀選項:DENY
<X-Powered-By:快速
<內容長度:478
<連接:保持活動狀態
<
*與主機Backpack.openbadges.org的連接#0完好無損
*關閉連接#0

因此,基本上,它會在沒有更多信息的情況下響應我一個錯誤400“錯誤請求” ...

有關信息,如果我嘗試使用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)); 而且有效! 好極了 !

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM