Внедрение кредитов Facebook - приложение не отвечает - PullRequest
0 голосов
/ 09 марта 2012

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

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

Я думаю, что-то связано с order_info , в котором я не уверен

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

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

enter image description here

Callback.php также реализован и похоже, что FB пропинговал callback.php. Но проблема, похоже, в том, что подписанный запрос не такой, как ожидалось.

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

[пт мар 09 11:17:20 2012] [ошибка] [клиент 66.220.146.244] Неизвестно алгоритм. Ожидается HMAC-SHA256 , но получен дамп данных :

Примечание: (но полученный дамп данных - это дополнительные переменные отладки, которые я добавил, чтобы найти, что будет $ data ['gorithm '] и $ data полностью

Я реализовал код для дампа переменной signature_request в БД для дальнейшей отладки и отладки, которую я отладил и проследил

Вот полный код 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 возвращает ноль

 $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)
  • Режим песочницы включен (попытался отключить также)

1 Ответ

2 голосов
/ 10 марта 2012

Ну, я решил это.Я еще раз внимательно прочитал документацию по обратному вызову и обнаружил, какую ошибку я совершил.

Я только что проанализировал Sign_request и отправил обратно проанализированные данные, но я полагаюотправить обратно контент

Это еще не конец, есть еще кое-что, что хорошо описано там с полным примером.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...