2012-03-09 15 views
0

這是延續了我earlier post實現Facebook Credits的 - 應用程序沒有響應(在回調imeplemntation signed_request解析錯誤)

從昨天開始我一直在努力實現以下官方教程Facebook Credits的。可能是我noobness或者我遇到很多的,我已經逐一解決,我已經到了最後一步(希望)

我想有一些做order_info對此我沒有問題的信息不夠當然

我已經創建了基於here給出的教程的基本頁面。這個頁面有一個簡單的按鈕。點擊它時,會調用幾乎是教程中給出的複製粘貼代碼的placeOrder()函數。

現在,我得到這個錯誤信息

enter image description here

的callback.php也實現並似乎已FB的ping操作callback.php。但問題似乎是signed_request並非如預期的那樣。

我從Apache日誌

[週五09年3月11時17分二十〇秒2012] [錯誤] [客戶66.220.146.244]未知 算法此錯誤消息。預期HMAC-SHA256 但得到的數據轉儲

注:(但得到的數據轉儲是我已經加入到尋找什麼是未來的$數據[「算法」]和$數據完全多餘的調試變量

我已經實現代碼轉儲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; 
    } 

更新:我調試由步驟的輸出步驟中,在低於步驟$數據返回null

這意味着解碼是不正確發生。有人能告訴我這裏出了什麼問題嗎?

完整的買代碼。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> 

附加信息:

  • 我的web服務器具有支持SSL(Verizon公司安裝的測試證書)啓用
  • 沙盒模式(試過也禁用)
+0

明顯的問題:你的callback.php的配置中沒有使用錯誤的應用密碼? – Igy 2012-03-09 14:35:05

+0

我對此很肯定:),我用了正確的祕密 – 2012-03-09 14:50:07

回答

2

嗯,我已經解決它。我再次仔細閱讀callback documentation,發現我在做什麼錯誤。

我只是解析signed_request併發送回解析數據,但我想以發回內容

這還沒有結束,還有更多的事情要做這是記錄良好那裏完整的例子。

+0

務必回來標記自己的答案,因爲它接受了這個問題。謝謝:) – DMCS 2012-03-11 01:25:37

+0

「你可以在4個小時內接受你自己的答案」是否意味着,我不能接受我自己的答案,因爲它通過了4小時? – 2012-03-11 07:58:31

+0

是的,我認爲默認的等待時間是12小時。 – DMCS 2012-03-11 16:21:58