在 WAMP 服务器(本地主机)上的 PHP 中实施 Health Graph API 授权流程的问题
problems with implementing Health Graph API authorization flow in PHP on WAMP server (localhost)
编辑(2016 年 7 月 8 日):下面的代码确实可以正常工作。我在我的台式电脑上测试过它。我想留下代码,因为其他开发人员可能会发现它有用。我遇到的问题是无关的——我似乎无法对笔记本电脑上的 WAMP 服务器执行任何 HTTP POST,这可能是由于防火墙或某些安全软件的原因。我今天要深入研究它。
我正在按照这里的步骤操作,"Connect your Application to a User's Health Graph Account":
https://runkeeper.com/developer/healthgraph/getting-started
我卡在第 3 步(向 Health Graph API 令牌端点发出 POST 请求。)
在下面的代码之后,$response 为空,$httpResponseCode 为 0。我认为 CURL POST 格式正确,但我不确定如何继续。
这是我的重定向页面,用户在第 1 步之后被引导至“http://localhost/my-site/redirect.php”。我只删除了 client_id 和 client_secret.
<!DOCTYPE html>
<body>
<?php
# RunKeeper API
define('client_id', xxxxxxx);
define('client_secret', xxxxxxx);
define('auth_url', 'https://runkeeper.com/apps/authorize');
define('access_token_url', 'https://runkeeper.com/apps/token');
define('redirect_uri','http://localhost/my-site/redirect.php');
define('api_base_url','https://api.runkeeper.com');
if ($_GET['code']) {
$auth_code = $_GET['code'];
$params = http_build_query(array(
'grant_type' => 'authorization_code',
'code' => $auth_code,
'client_id' => client_id,
'client_secret' => client_secret,
'redirect_uri' => redirect_uri
));
$options = array(
CURLOPT_URL => access_token_url,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $params,
CURLOPT_RETURNTRANSFER => true
);
$curl = curl_init();
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt_array($curl, $options);
$response = curl_exec($curl);
$responseInfo = curl_getinfo($curl);
$httpResponseCode = $responseInfo['http_code'];
curl_close($curl);
$decoderesponse = json_decode($response);
$access_token = $decoderesponse->access_token;
}
?>
</body>
</html>
您必须将 $params 数组作为 application/x-www-form-urlencoded
传递。
您可以使用以下代码进行 urlencoded。
$fields_string="";
foreach($params as $key=>$value)
{
$fields_string .= $key.'='.$value.'&';
}
rtrim($fields_string, '&');
然后传给$option数组,值为
CURLOPT_POSTFIELDS => $fields_string,
编辑(2016 年 7 月 8 日):下面的代码确实可以正常工作。我在我的台式电脑上测试过它。我想留下代码,因为其他开发人员可能会发现它有用。我遇到的问题是无关的——我似乎无法对笔记本电脑上的 WAMP 服务器执行任何 HTTP POST,这可能是由于防火墙或某些安全软件的原因。我今天要深入研究它。
我正在按照这里的步骤操作,"Connect your Application to a User's Health Graph Account": https://runkeeper.com/developer/healthgraph/getting-started
我卡在第 3 步(向 Health Graph API 令牌端点发出 POST 请求。)
在下面的代码之后,$response 为空,$httpResponseCode 为 0。我认为 CURL POST 格式正确,但我不确定如何继续。
这是我的重定向页面,用户在第 1 步之后被引导至“http://localhost/my-site/redirect.php”。我只删除了 client_id 和 client_secret.
<!DOCTYPE html>
<body>
<?php
# RunKeeper API
define('client_id', xxxxxxx);
define('client_secret', xxxxxxx);
define('auth_url', 'https://runkeeper.com/apps/authorize');
define('access_token_url', 'https://runkeeper.com/apps/token');
define('redirect_uri','http://localhost/my-site/redirect.php');
define('api_base_url','https://api.runkeeper.com');
if ($_GET['code']) {
$auth_code = $_GET['code'];
$params = http_build_query(array(
'grant_type' => 'authorization_code',
'code' => $auth_code,
'client_id' => client_id,
'client_secret' => client_secret,
'redirect_uri' => redirect_uri
));
$options = array(
CURLOPT_URL => access_token_url,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $params,
CURLOPT_RETURNTRANSFER => true
);
$curl = curl_init();
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt_array($curl, $options);
$response = curl_exec($curl);
$responseInfo = curl_getinfo($curl);
$httpResponseCode = $responseInfo['http_code'];
curl_close($curl);
$decoderesponse = json_decode($response);
$access_token = $decoderesponse->access_token;
}
?>
</body>
</html>
您必须将 $params 数组作为 application/x-www-form-urlencoded
传递。
您可以使用以下代码进行 urlencoded。
$fields_string="";
foreach($params as $key=>$value)
{
$fields_string .= $key.'='.$value.'&';
}
rtrim($fields_string, '&');
然后传给$option数组,值为
CURLOPT_POSTFIELDS => $fields_string,