繁体   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