Facebookアプリでクレジット付きの購入を設定しようとしています。
FB.ui()関数は正常に機能し、支払いコールバックURLと会社情報はすでに設定されています。支払いコールバック用の私のphpスクリプトは、Facebook開発者の例と同じです。
ただし、支払いダイアログには確認ダイアログが表示されず、FB.ui()コールバックはエラー1383046とerror_messageを返します。「申し訳ありませんが、支払いの処理に問題があります。このトランザクションの料金は請求されていません。」
これはpayments_get_itemsメソッドで発生するため、リマインダーメソッドをテストできません。
私は同じエラーコードに関する多くの投稿を読みましたが、私の問題が私が参加していない他の詳細に起因している可能性があるかどうかわかりません
これは私のphpスクリプトです:
<?php
$app_secret = '***********************';
error_log($_POST['signed_request']);
// Validate request is from Facebook and parse contents for use.
$request = parse_signed_request($_POST['signed_request'], $app_secret);
// Get request type.
$request_type = $_POST['method'];
error_log($request_type, 0);
// 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 == 'real_item_id') {
$item = array(
'title' => 'Title of my item',
'description' => 'Description if my item',
// Price must be denominated in credits.
'price' => 5,
'image_url' => 'my image url',
'product_url' => 'my image url',
);
// Construct response.
$response = array(
'content' => array (
0 => $item,
),
'method' => $request_type
);
// Response must be JSON encoded.
$response = json_encode($response);
error_log($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 if ($current_order_status == 'settled') {
// Verify that the order ID corresponds to a purchase you've fulfilled, then…
// Get order details.
$order_details = json_decode($request['credits']['order_details'], true);
// Construct response.
$response = array(
'content' => array(
'status' => 'settled',
'order_id' => $order_details['order_id']
),
'method' => $request_type
);
// Response must be JSON encoded.
$response = json_encode($response);
} 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;
}
error_log( print_r($data, true) );
return $data;
}
function base64_url_decode($input) {
return base64_decode(strtr($input, '-_', '+/'));
}
?>
error_logドキュメントを見ると、FB.ui()関数が呼び出されたときにコールバックが2回呼び出されるという事実があります(支払いダイアログが応答を受信しない場合に発生します)。ただし、すべての呼び出しで、var$responseとして送信されるjsonオブジェクトは正しいです。
私のアプリはHerokuでホストされています。ペイメントコールバックは、Amazonの有料サーバーで最初に行われました。その後、無料のWebホスティングアカウントを作成し、そこにスクリプトをアップロードして、支払いコールバックのURLをそのアカウントに送信しましたが、エラーが解決しません。
私が考慮する必要がある他の側面はありますか?
前もって感謝します!
注:この投稿からURLとIDを省略しましたが、コールバックスクリプトには実際の情報が含まれています;)