2012-03-23 56 views
0

以下是錯誤代碼: 「您使用的應用程序未響應,請稍後再試。」Facebook付款對話不起作用

回調設置爲php文件(通過https)。我不知道爲什麼它不起作用。

這裏的JS(綁定到VAR博士):

dr.buyCoins = function(){ 
    var obj = { 
     method: 'pay', 
     order_info: order_info, 
     action: 'buy_item', 
     dev_purchase_params: {'oscif': true} 
    }; 

    FB.ui(obj, dr.coinCheck); 
} 

dr.coinCheck = function(d){ 
    if (d['order_id']) { 
    return true; 
    } else { 
    return false; 
    } 
} 

和這裏的PHP:

<?php 

$app_secret = '...'; 

// Validate request is from Facebook and parse contents for use. 
$request = parse_signed_request($_POST['signed_request'], $app_secret); 

// Get request type. 
// Two types: 
// 1. payments_get_items. 
// 2. payments_status_update. 
$request_type = $_POST['method']; 

// Setup response. 
$response = ''; 

if ($request_type == 'payments_get_items') { 
    // Get order info from Pay Dialog's order_info. 
    // Assumes order_info is a JSON encoded string. 
    $order_info = json_decode($request['credits']['order_info'], true); 

    // Get item id. 
    $item_id = $order_info['item_id']; 

    // Simulutates item lookup based on Pay Dialog's order_info. 
    if ($item_id == '1a') { 
    $item = array(
     'title' => '100 some game cash', 
     'description' => 'Spend cash in some game.', 
     // Price must be denominated in credits. 
     'price' => 1, 
     'image_url' => 'http://some_image_url/coin.jpg', 
    ); 

    // Construct response. 
    $response = array(
        'content' => array(
           0 => $item, 
           ), 
        'method' => $request_type, 
       ); 
    // Response must be JSON encoded. 
    $response = json_encode($response); 
    } 

} else if ($request_type == "payments_status_update") { 
    // Get order details. 
    $order_details = json_decode($request['credits']['order_details'], true); 

    // Determine if this is an earned currency order. 
    $item_data = json_decode($order_details['items'][0]['data'], true); 
    $earned_currency_order = (isset($item_data['modified'])) ? 
          $item_data['modified'] : null; 

    // Get order status. 
    $current_order_status = $order_details['status']; 

    if ($current_order_status == 'placed') { 
    // Fulfill order based on $order_details unless... 

    if ($earned_currency_order) { 
     // Fulfill order based on the information below... 
     // URL to the application's currency webpage. 
     $product = $earned_currency_order['product']; 
     // Title of the application currency webpage. 
     $product_title = $earned_currency_order['product_title']; 
     // Amount of application currency to deposit. 
     $product_amount = $earned_currency_order['product_amount']; 
     // If the order is settled, the developer will receive this 
     // amount of credits as payment. 
     $credits_amount = $earned_currency_order['credits_amount']; 
    } 

    $next_order_status = 'settled'; 

    // Construct response. 
    $response = array(
        'content' => array(
           'status' => $next_order_status, 
           'order_id' => $order_details['order_id'], 
           ), 
        'method' => $request_type, 
       ); 
    // Response must be JSON encoded. 
    $response = json_encode($response); 

    } else if ($current_order_status == 'disputed') { 
    // 1. Track disputed item orders. 
    // 2. Investigate user's dispute and resolve by settling or refunding the order. 
    // 3. Update the order status asychronously using Graph API. 

    } else if ($current_order_status == 'refunded') { 
    // Track refunded item orders initiated by Facebook. No need to respond. 

    } else { 
    // Track other order statuses. 

    } 
} 

// Send response. 
echo $response; 

// These methods are documented here: 
// https://developers.facebook.com/docs/authentication/signed_request/ 
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, '-_', '+/')); 
} 

?> 
+0

你的回調肯定是Facebook的命中?檢查您的服務器日誌並確保您收到請求並正確回覆 - 請注意,如果您的回調是HTTPS,則您的證書需要完全有效,包括所有中間證書 – Igy 2012-03-23 19:51:32

+0

它實際上看起來沒有被擊中。我有一個完全認證的SSL證書 - https://drawabble.com – 2012-03-23 20:48:26

+1

可能是一個紅色的鯡魚,但sslchecker說你可能錯過了中間鏈 - http://www.sslshopper.com/ssl-checker .html#hostname = https://drawabble.com/ – Igy 2012-03-24 10:33:39

回答