Внедрение Facebook Credits – приложение не отвечает (ошибка синтаксического анализа signed_request при обратном вызове)

Это продолжение моего предыдущего сообщения

Со вчерашнего дня я пытался внедрить кредиты facebook, следуя официальным учебным пособиям. Может быть, мое отсутствие или недостаточная информация, с которой я столкнулся со многими проблемами, которые я решил один за другим, и я пришел к заключительному этапу (надеюсь)

Я думаю, что есть что-то делать с order_info, который я не уверен

Я создал базовую страницу на основе приведенного здесь урока. На этой странице есть простая кнопка. При нажатии на нее вызывает функцию placeOrder (), которая почти копирует код вставки, указанный в учебнике.

Теперь я получаю это сообщение об ошибке

введите описание изображения здесь

Обратный callback.php также реализован и кажется, что FB провела pingback call.php. Но проблема заключается в том, что signed_request не так, как ожидалось.

Я получил это сообщение об ошибке из журнала apache

[Пт мар 09 11:17:20 2012] [ошибка] [клиент 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)
  • Режим Sandbox включен (также отключено)