Facebook认为没有调用回调例程

时间:2012-06-18 22:44:26

标签: java javascript facebook-credits

当调用信用buy()例程时,Facebook会显示此错误There Was a Problem Processing Your Payment.,并且不会显示付款对话框。

我已经验证了以下内容,但我找不到问题:

  1. 在点数设置中设置回调网址:http://sharp-journey-4179.herokuapp.com/callback.jsp
  2. 将自己定位为Credits Tester。
  3. 已验证可以从Facebook对象调试工具访问回调例程。
  4. 简化callback.jsp,只返回对payments_get_items POST的预设回复。
  5. Heroku路由器收到状态为200的POST,但在Heroku日志中未收到callback.jsp中的console.log输出。
  6. 对payments_get_items的回复是:
  7.   

    “{\”content \“:[{\”title \“:\”我的应用   \“,\”description \“:\”这是我的应用   \ “\ ”价格\“: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文档指出,应用服务器请求是为响应购买请求而发出的。我是否需要实现一个Servlet来处理POST并将其传递给我的回调例程? Facebook如何使用回调例程callback.jsp的名称? Servlet是否需要命名为Callback?

    这是我的客户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>
    

1 个答案:

答案 0 :(得分:0)

我需要实现一个Servlet来处理从Facebook收到的信用回调POSTS。我在启动目录的Main.java例程中创建了一个Servlet。在Main.java中,我添加了一个上下文addServletMapping来将所有回调POST请求发送到Servlet。 context.addServletMapping的第一个agrument匹配在应用的Credits Settings中输入的Credits Callback URL中的最后一个分隔符之后的文本。因此,servlet不需要命名为Callback。

总之,Facebook通过HTTP将信用回调POSTS发送到回调URL。作为开发人员,您需要创建一个Servlet并执行以下操作之一:

  1. 将回调POSTS映射到Servlet,并在Java中的Servlet中进行处理。 Credits回调URL是附加到您的应用URL的唯一文本字符串。
  2. 创建一个web.xml文件,将Servlet映射到callback.jsp文件。 Credits Callback URL是附加到您的URL的callback.jsp文件。