Что не так в реализации Кредитов Facebook - PullRequest
0 голосов
/ 08 марта 2012

Я следую официальному учебнику для реализации кредитов FB, но он не работает.

Я добавил операторы оповещения, чтобы убедиться, что код выполняется из сообщений оповещения, яЯ уверен, что нет никаких ошибок JS и FB.ui вызывается.У меня также есть предупреждающие сообщения в функции обратного вызова, но ответа не получено.

Я ломаю голову уже 5 часов, чтобы выяснить, что не так в коде.Может кто-нибудь, пожалуйста, помогите мне.

Дополнительная информация о приложении:

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

Tool tip says, I can do it later as it is only mandatory for payments

Вот 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  : true, // parse XFBML
    channelUrl : 'http://localhost/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 = 'myorderinfo';
    alert('creating obj');

    var obj = {
            method: 'pay',
            order_info: order_info,
            action: 'buy_item',
            dev_purchase_params: {'oscif': true}
          };
     alert('calling ui');
     FB.ui(obj, callback);

}

</script>

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

Если вы заметили alert звонки, я получаю предупреждающие сообщения в порядке

  1. 'placeOrder () '
  2. ' создание объекта '
  3. ', вызывающего FB.ui '

в функции обратного вызова также есть предупреждающие сообщения, но они не вызываются

Чтобы убедиться, что fb правильно инициализирован, я реализовал функцию подачи сообщения и вызвал ее из события щелчка "postFeedback"

function postFeed(){
    alert('in postFeed()');
    FB.ui(
              {
                method: 'feed',
                name: 'Facebook Dialogs',
                link: 'https://developers.facebook.com/docs/reference/dialogs/',
                picture: 'http://fbrell.com/f8.jpg',
                caption: 'Reference Documentation',
                description: 'Dialogs provide a simple, consistent interface for applications to interface with users.'
              },
              function(response) {
                if (response && response.post_id) {
                  alert('Post was published.');
                } else {
                  alert('Post was not published.');
                }
              }
            );
}

Это работает нормально и публикует ленту новостей на моей стене

Я также реализовал callback.php, используя пример, приведенный в https://developers.facebook.com/docs/authentication/signed_request/

И да, я правильно настроил параметры приложения

callback.php

 <?php

include_once 'Config.php';

mysql_connect('localhost','root','');
mysql_select_db("precious_world");

//var_dump($_REQUEST);
//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');
    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, '-_', '+/'));
}

?>

У меня есть дополнительный код в этом файле для вывода всего запроса на трассировкузапрос

1 Ответ

1 голос
/ 08 марта 2012

Я вижу там "localhost" в одном из URL-адресов вашего канала, но если вы также используете localhost в качестве URL-адреса обратного вызова для кредитов, Facebook не сможет добраться до него (и, следовательно, для кредитов нет приказ продолжить)

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