Процедура обратного вызова кредитов Facebook не вызывается

Когда вызывается подпрограмма кредитов buy(), Facebook отображает эту ошибку, There Was a Problem Processing Your Payment. и диалоговое окно оплаты не отображается.

Я проверил следующее, но не могу найти проблему:

  1. Установите URL-адрес обратного вызова в настройках кредитов: http://sharp-journey-4179.herokuapp.com/callback.jsp
  2. Назначил себя тестером кредитов.
  3. Проверено, что процедуру обратного вызова можно вызвать из инструмента Facebook Object Debugger.
  4. Урезан callback.jsp, чтобы просто возвращать готовый ответ на POST-запрос payment_get_items.
  5. Маршрутизатор Heroku получает POST со статусом 200, но вывод console.log в callback.jsp не получен в журналах Heroku.
  6. Ответ на payment_get_items:

"{\"content\":[{\"title\":\"Мое приложение\",\"description\":\"Это мое приложение.\",\"price\":2,\"product_url \":\"http://www.facebook.com/images/gifts/21.png\",\"image_url\":\"http://www.facebook.com/images/gifts/21.png \"}],\"метод\":\"payments_get_items\"}"

В документации Facebook Credit указано, что в ответ на запрос на покупку выдается запрос сервера приложений. Нужно ли мне реализовать сервлет для обработки POST и передачи его в мою процедуру обратного вызова? Как Facebook использует название процедуры обратного вызова, callback.jsp? Нужно ли называть сервлет обратным вызовом?

Это фрагмент моей клиентской процедуры buy():

// The dialog only opens if you've implemented the
// Credits Callback payments_get_items.
function buy() {
  var obj = {
    method: 'pay',
    action: 'buy_item',
    // You can pass any string, but your payments_get_items must
    // be able to process and respond to this data.
    order_info: {'item_id': '1a1'},
    dev_purchase_params: {'oscif': true}
  };

  FB.ui(obj, js_callback);
}

Это мой код callback.jsp:

<script type="text/javascript">

var secret = 'xxxxxxxxxxxxxxxxxxxxx';

console.log("In fnf callback.jsp");

//$request_type = $_POST['method'];
// Setup response.
var return_data = '';

var item = {
  title: 'My App',
  description: 'This is my app.',
  price: 2,
  product_url: 'http:\/\/www.facebook.com\/images\/gifts\/21.png',
  image_url: 'http:\/\/www.facebook.com\/images\/gifts\/21.png'
};

var content_array = new Array;
content_array[0] = item;

// Construct response.
var response = {
   content: content_array,
   method: 'payments_get_items'
};

// Response must be JSON encoded.
return_data = JSON.stringify(response);

// Send response.
alert(return_data);

</script>

person Joanne Koch    schedule 18.06.2012    source источник


Ответы (1)


Мне нужно было реализовать сервлет для обработки POSTS обратного вызова кредитов, полученных от Facebook. Я создал сервлет в своей подпрограмме Main.java в каталоге запуска. В Main.java я добавил контекст addServletMapping для отправки всех запросов обратного вызова POST на сервлет. Первый аргумент context.addServletMapping соответствует тексту после последнего разделителя в URL-адресе обратного вызова кредитов, введенном в настройках кредитов для вашего приложения. Таким образом, сервлету не нужно называться Callback.

Таким образом, Facebook отправляет POSTS обратного вызова кредитов на URL-адрес обратного вызова через HTTP. Как разработчик, вам необходимо создать сервлет и выполнить одно из следующих действий:

  1. Сопоставьте POSTS обратного вызова с сервлетом и выполните обработку в сервлете на Java. URL-адрес обратного вызова Credits — это уникальная текстовая строка, добавленная к URL-адресу вашего приложения.
  2. Создайте файл web.xml, в котором вы сопоставляете сервлет с файлом callback.jsp. URL-адрес обратного вызова Credits — это файл callback.jsp, добавленный к вашему URL-адресу.
person Joanne Koch    schedule 28.06.2012