【问题标题】:Implementing Facebook Credits - App not responding (signed_request parsing error in callback imeplemntation)实施 Facebook Credits - 应用程序没有响应(回调 imeplemntation 中的签名请求解析错误)
【发布时间】:2012-03-09 11:58:42
【问题描述】:

这是我earlier post的延续

从昨天开始,我一直在尝试按照官方教程实施 facebook 积分。可能是我的菜鸟或信息不足,我遇到了很多问题,我已经一一解决了,我已经到了最后一步(希望如此)

我想这与 order_info 有关系,我不确定

我根据here 给出的教程创建了一个基本页面。这个页面有一个简单的按钮。单击它会调用 placeOrder() 函数,这几乎是教程中给出的复制粘贴代码。

现在,我收到此错误消息

callback.php 也被实现了,好像 FB 已经 ping 了 callback.php。但问题似乎是 signed_request 与预期不符。

我从 apache 日志中收到此错误消息

[2012 年 3 月 9 日星期五 11:17:20] [错误] [客户端 66.220.146.244] 未知 算法。预期 HMAC-SHA256 但得到了数据转储

注意:(但得到的数据转储是我添加的额外调试变量,用于完全查找 $data['algorithm'] 和 $data 的内容

我已经实现了代码将signed_request变量转储到db中以进行进一步调试,并且我已经调试并跟踪了调试

这里是callback.php的完整代码

<?php

//based on https://developers.facebook.com/docs/credits/callback/


include_once 'Config.php';

mysql_connect('myhost','usr','zzz');
mysql_select_db("mydb");

//dump the request into the db
$request = join(':', $_REQUEST);
$request = mysql_real_escape_string($request);
$query = "insert into fbcredits_callback(data)values('$request')";
$result = mysql_query($query);

$fb_signed_req = $_REQUEST['signed_request'];

echo parse_signed_request($signed_request, Config::$appSecret);

function parse_signed_request($signed_request, $secret) {
  list($encoded_sig, $payload) = explode('.', $signed_request, 2); 

  // decode the data
  $sig = base64_url_decode($encoded_sig);
  $data = json_decode(base64_url_decode($payload), true);

  if (strtoupper($data['algorithm']) !== 'HMAC-SHA256') {
   error_log('Unknown algorithm. Expected HMAC-SHA256 but got '.$data['algorithm'].'data dump:'.join(':',$data));
   return null;
  }

  // check sig
  $expected_sig = hash_hmac('sha256', $payload, $secret, $raw = true);
  if ($sig !== $expected_sig) {
    error_log('Bad Signed JSON signature!');
    return null;
  }

  return $data;
}

function base64_url_decode($input) {
  return base64_decode(strtr($input, '-_', '+/'));
}

?>

上面的错误信息是在这一行产生的

  if (strtoupper($data['algorithm']) !== 'HMAC-SHA256') {
   error_log('Unknown algorithm. Expected HMAC-SHA256 but got '.$data['algorithm'].'data dump:'.join(':',$data));
   return null;
  }

更新:我一步一步调试了输出,在下面的步骤 $data 返回 null

 $data = json_decode(base64_url_decode($payload), true);

这意味着解码没有正确进行。谁能告诉我这里出了什么问题?

buy.php的完整代码

<?php 
include_once 'Config.php';
include_once 'fb-sdk/facebook.php';
?>
<html>
    <head>
      <title>My Facebook Credits Page</title>
    </head>
    <body>
<div id="fb-root"></div>
<script src="http://connect.facebook.net/en_US/all.js"></script>
<script>
  FB.init({
    appId  : '<?php echo Config::$appId?>',
    status : true, // check login status
    cookie : true, // enable cookies to allow the server to access the session
    xfbml  : false, // parse XFBML
    channelUrl : 'http://199.192.xxx.yyy/buy.php', // channel.html file
    oauth  : true // enable OAuth 2.0
  });

var callback = function(data) {
    if (data['order_id']) {
        alert('called back');
      return true;
    } else {
      //handle errors here
      alert('some error');
      return false;
    }
  };

function placeOrder(){

    alert('in placeOrder()');

    var order_info = {
        item_code: "someItemCode",
        user_id: "1313213131"
    };
    alert('creating obj');

    var obj = {
            method: 'pay',
            order_info: order_info,
            action: 'buy_item',
            dev_purchase_params: {'oscif': true},
         app_id: '<?php echo Config::$appId?>'
          };
     alert('calling ui');
     FB.ui(obj, callback);

}

</script>

<input type="button" value="post" onclick="postFeed()" />
<input type="button" value="Buy" onclick="placeOrder()" />
</body>
</html>

附加信息:

  • 我的网络服务器支持 SSL(安装了来自 verizon 的测试证书)
  • 沙盒模式已启用(也尝试禁用)

【问题讨论】:

  • 明显的问题:您没有在 callback.php 的配置中使用错误的应用程序密码吗?
  • 我很确定 :),我使用了正确的密码

标签: php javascript facebook json encoding


【解决方案1】:

好吧,我已经解决了。我又仔细阅读了callback documentation,发现自己做错了什么。

我只是在解析 signed_request 并将解析后的数据发回,但我想发回 content

这还没有结束,还有更多的事情要做,那里有完整的例子。

【讨论】:

  • 请务必回来将您自己的答案标记为已接受,以便结束此问题。谢谢:)
  • “你可以在 4 小时内接受你自己的答案”是不是意味着,我不能接受我自己的答案,因为它已经过了 4 小时?
  • 是的,我认为默认等待时间是 12 小时。
猜你喜欢
  • 2011-05-12
  • 1970-01-01
  • 1970-01-01
  • 2012-09-07
  • 1970-01-01
  • 2011-11-03
  • 1970-01-01
  • 2012-08-26
  • 1970-01-01
相关资源
最近更新 更多