作成中のコンテスト フォームに Facebook 登録を使用すると問題が発生します。フォームは送信され、print_r を使用すると次の JSON 配列が返されます。
Array (
[algorithm] => HMAC-SHA256
[expires] => 1364313600
[issued_at] => 1364306406
[oauth_token] => AAAB8bFGZCv4MBAIpl7rSmqzMnJ6V6Om78oZAEvWtxlGZCMoMgiNNIWjLHv2nf7ZAQulTr8fqrwFKFnKROX4rpwbaiZACTMIsrwMZBtDI47jgZDZD
[registration] => Array (
[name] => Ben Franklin
[email] => email@email.com
[address] => 455 Hickory Rd.
[city] => Array
(
[name] => Baltimore, Maryland
[id] => 1.04052369632E+14
)
[gender] => male
[birthday] => 07/12/1978
[phone] => 5550005555
)
[registration_metadata] => Array (
[fields] => [{'name':'name'},
{'name':'email'},
{'name':'address', 'description':'Address', 'type':'text'},
{'name':'city', 'description':'City', 'type':'typeahead', 'categories':['city','country','state_province']},
{'name':'gender'},
{'name':'birthday'},
{'name':'phone', 'description':'Phone Number', 'type':'text'}]
)
[user] => Array (
[country] => us
[locale] => en_US
)
[user_id] => 574207194
)
私の問題は、signed_request を必要に応じて読み取る Facebook PHP の例に従い、print_r を使用して上記の出力を取得することです。ここで、データベースに格納できる実際の変数をいくつか取得する必要があります。foreach ループを使用して、Registration 配列内で必要なフィールドを取得し、次にその中の City 配列を取得しようとしましたが、簡単にするために、[address] 値を取得して保存しようとしていましたそれ、Facebookが示唆するように、以下は私のPHPコードであり、print_rコマンドの下で、値を取得するためにforeachループに試行を追加しました.「致命的なエラー:文字列オフセットを配列として使用できません.... "。以下は、送信されたフォームを処理する私の PHP ファイルです。
<?php
define('FACEBOOK_APP_ID', 'MY_APP_ID');
define('FACEBOOK_SECRET', 'MY_SECRET_ID');
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, '-_', '+/'));
}
if ($_REQUEST) {
$response = parse_signed_request($_REQUEST['signed_request'],
FACEBOOK_SECRET);
echo '<pre>';
print_r ($response);
echo '</pre>';
foreach ($response as $r) {
echo $r["registration"]["address"];
}
} else {
echo '$_REQUEST is empty';
}
?>