2


,我是 FatSecret 平台 API 的新手,我开发了一个 PHP 脚本来
使用 foods.search 方法访问食物详细信息
这是 food.search 方法 Api 调用示例,使用 Curl 并且效果
很好。

<?php
$consumer_key = "xxxxxxx";
$secret_key = "xxxxxxx";
//签名基字符串
//<HTTP Method>&<Request URL>&<Normalized Parameters>
$base = rawurlencode("GET")."&";
$base .= "http%3A%2F%2Fplatform.fatsecret.com%2Frest%2Fserver.api
&";

//按 abc 对参数进行排序....构建正确的唯一签名所必需的
$params = "method=foods.search&";
$params .= "oauth_consumer_key=$consumer_key&"; // 你的消费者密钥
$params .= "oauth_nonce=123&";
$params .= "oauth_signature_method=HMAC-SHA1&";
$params .= "oauth_timestamp=".time()."&";
$params .= "oauth_version=1.0&";
$params .= "search_expression=".urlencode($_GET['pasVar']);
$params2 = rawurlencode($params);
$base .= $params2;

//加密!
$sig= base64_encode(hash_hmac('sha1', $base, "$secret_key&",
true)); // 将 xxx 替换为 Consumer Secret

//现在获取搜索结果并将它们写下来
$url = "http://platform.fatsecret.com/rest/server.api?".
$params."&oauth_signature=".rawurlencode($sig);

//$food_feed = file_get_contents($url);
列表($output,$error,$info)= loadFoods($url);
回声'<pre>';
if($error == 0){
    if($info['http_code'] == '200')
        echo $output;
    else
        die('状态信息:'.$info['http_code']);

}

else
    die('状态错误:'.$error);

函数加载食物($url)
{

        // 创建 curl 资源
        $ch = curl_init();

        // 设置 url
        curl_setopt($ch, CURLOPT_URL, $url);

        //以字符串形式返回传输
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

        // $output 包含输出字符串
        $output = curl_exec($ch);

        $error = curl_error($ch);

        $info = curl_getinfo($ch);
        // 关闭 curl 资源以释放系统资源
        curl_close($ch);

        返回数组($输出,$错误,$信息);

}

?>


上面的脚本工作完美,并使用搜索方法检索食物详细信息。但是

当我使用 food.get 方法使用 food_id 检索数据时,它说
无效签名错误,这是 food.get 方法 api 调用示例,我
提供了正确的密钥并传递了 food_id 参数。有人可以帮
我解决这个问题,我真的击中此代码。它说无效
签名错误。

<?php
$consumer_key = "xxxxxxxxx";
$secret_key = "xxxxxxxxxx";
//签名基字符串
//<HTTP Method>&<Request URL>&<Normalized Parameters>
$base = rawurlencode("GET")."&";
$base .= "http%3A%2F%2Fplatform.fatsecret.com%2Frest%2Fserver.api&";

//按 abc 对参数进行排序....构建正确的唯一签名所必需的
$params = "method=food.get&";
$params .= "oauth_consumer_key=$consumer_key&"; // 你的消费者密钥
$params .= "oauth_nonce=".​​rand()."&";
$params .= "oauth_signature_method=HMAC-SHA1&";
$params .= "oauth_timestamp=".time()."&";
$params .= "oauth_version=1.0&";
$params .= "food_id=".urlencode($_GET['pasVar']);
$params2 = rawurlencode($params);
$base .= $params2;

//加密!
$sig= base64_encode(hash_hmac('sha1', $base, "$secret_key&",
true)); // 将 xxx 替换为 Consumer Secret

//现在获取搜索结果并将它们写下来
$url = "http://platform.fatsecret.com/rest/server.api?".
$params."&oauth_signature=".rawurlencode($sig);

//$food_feed = file_get_contents($url);
列表($output,$error,$info)= loadFoods($url);
回声'<pre>';
if($error == 0){
    if($info['http_code'] == '200')
        echo $output;
    else
        die('状态信息:'.$info['http_code']);

}

else
    die('状态错误:'.$error);

函数加载食物($url)
{

        // 创建 curl 资源
        $ch = curl_init();

        // 设置 url
        curl_setopt($ch, CURLOPT_URL, $url);

        //以字符串形式返回传输
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

        // $output 包含输出字符串
        $output = curl_exec($ch);

        $error = curl_error($ch);

        $info = curl_getinfo($ch);
        // 关闭 curl 资源以释放系统资源
        curl_close($ch);

        返回数组($输出,$错误,$信息);

}

?>

帮助我代码中有什么错误并帮助我解决问题,因为
我必须在我的项目中使用这个 API

感谢等待您的回复......

4

1 回答 1

3

您应该按 alpha 排序参数。所以你应该按这个顺序做:

$params = "food_id=".urlencode($_GET['pasVar'])."&"; 
$params .= "method=food.get&";
$params .= "oauth_consumer_key=$consumer_key&"; // ur consumer key
$params .= "oauth_nonce=".rand()."&";
$params .= "oauth_signature_method=HMAC-SHA1&";
$params .= "oauth_timestamp=".time()."&";
$params .= "oauth_version=1.0";
于 2013-04-10T20:33:30.053 回答