Это продолжение моего предыдущего поста
Со вчерашнего дня я пытаюсь реализовать кредиты Facebook , следуя официальным учебным пособиям. Может быть, моя неряшливость или неадекватная информация: я столкнулся с множеством проблем, которые я решил один за другим, и я пришел к последнему шагу (надеюсь)
Я думаю, что-то связано с order_info , в котором я не уверен
Я создал базовую страницу на основе данного урока здесь . На этой странице есть простая кнопка. При нажатии на него вызывается функция placeOrder (), которая почти копирует код вставки, приведенный в руководстве.
Теперь я получаю это сообщение об ошибке
Callback.php также реализован и похоже, что FB пропинговал callback.php. Но проблема, похоже, в том, что подписанный запрос не такой, как ожидалось.
Я получил это сообщение об ошибке из журнала Apache
[пт мар 09 11:17:20 2012] [ошибка] [клиент 66.220.146.244] Неизвестно
алгоритм. Ожидается HMAC-SHA256 , но получен дамп данных :
Примечание: (но полученный дамп данных - это дополнительные переменные отладки, которые я добавил, чтобы найти, что будет $ data ['gorithm '] и $ data полностью
Я реализовал код для дампа переменной signature_request в БД для дальнейшей отладки и отладки, которую я отладил и проследил
Вот полный код callback.php
<?php
//based on https://developers.facebook.com/docs/credits/callback/
include_once 'Config.php';
mysql_connect('myhost','usr','zzz');
mysql_select_db("mydb");
//dump the request into the db
$request = join(':', $_REQUEST);
$request = mysql_real_escape_string($request);
$query = "insert into fbcredits_callback(data)values('$request')";
$result = mysql_query($query);
$fb_signed_req = $_REQUEST['signed_request'];
echo parse_signed_request($signed_request, Config::$appSecret);
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 but got '.$data['algorithm'].'data dump:'.join(':',$data));
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 (strtoupper($data['algorithm']) !== 'HMAC-SHA256') {
error_log('Unknown algorithm. Expected HMAC-SHA256 but got '.$data['algorithm'].'data dump:'.join(':',$data));
return null;
}
Обновление: шаг за шагом я отлаживал вывод, на шаге ниже $ data возвращает ноль
$data = json_decode(base64_url_decode($payload), true);
Что означает, что декодирование происходит неправильно. Может кто-нибудь сказать мне, что здесь происходит не так?
Полный код buy.php
<?php
include_once 'Config.php';
include_once 'fb-sdk/facebook.php';
?>
<html>
<head>
<title>My Facebook Credits Page</title>
</head>
<body>
<div id="fb-root"></div>
<script src="http://connect.facebook.net/en_US/all.js"></script>
<script>
FB.init({
appId : '<?php echo Config::$appId?>',
status : true, // check login status
cookie : true, // enable cookies to allow the server to access the session
xfbml : false, // parse XFBML
channelUrl : 'http://199.192.xxx.yyy/buy.php', // channel.html file
oauth : true // enable OAuth 2.0
});
var callback = function(data) {
if (data['order_id']) {
alert('called back');
return true;
} else {
//handle errors here
alert('some error');
return false;
}
};
function placeOrder(){
alert('in placeOrder()');
var order_info = {
item_code: "someItemCode",
user_id: "1313213131"
};
alert('creating obj');
var obj = {
method: 'pay',
order_info: order_info,
action: 'buy_item',
dev_purchase_params: {'oscif': true},
app_id: '<?php echo Config::$appId?>'
};
alert('calling ui');
FB.ui(obj, callback);
}
</script>
<input type="button" value="post" onclick="postFeed()" />
<input type="button" value="Buy" onclick="placeOrder()" />
</body>
</html>
Дополнительная информация:
- Мой веб-сервер поддерживает SSL (установлен тестовый сертификат от verizon)
- Режим песочницы включен (попытался отключить также)