Facebook fangate

Sziasztok!

Szeretnék csinálni a cégnél a Facebook oldalunkra egy fangate-et, azaz egy olyan oldalt, hogy ha lájkolják, akkor engedjen tovább.
Eddig a következő megoldással próbálkoztam:


<?php

require_once('facebook.php');
$facebook = new Facebook(array(
'appId'=>'app_id',
'secret'=>'secret_id'
));
$signedRequest = $facebook->getSignedRequest();

if($signedRequest['page']['liked'] == 1){
include('like.php');
} else {
include('nolike.php');
}
?>

(Természetesen az appId és a secretid be volt írva)

A következő történt: Az én fb accountomból teljesen szuperül működött a dolog, ha lájkoltam az oldalt tovább engedett, ha visszavontam a lájkot, ismét a felszólító oldalra vitt vissza.
A munkatársaim tesztje során viszont bármilyen fiókkal, bármilyen böngészőből csak a felszólító oldal látszott, hiába lájkoltak, vonták vissza, és lájkoltak újból, egyszer sem engedte tovább őket a program.

Mi lehetett a hiba? Valaki csinált már ilyet?

Hozzászólások

Mar reg nem FB app-oztam (tobb mint fel eve, de az FB api-nal eleg sok), de itt par kerdes amin elindulhatsz:

1. A legujabb SDK-t hasznalod?
- https://github.com/facebook/facebook-php-sdk
2. Nem lehet cache problema?
- http://php.net/manual/en/function.header.php
- http://developers.facebook.com/tools/debug
3. Az app-ot most hoztad letre vagy regebbi (regebbi mint fel esetleg egy eves)?
4. Te kapcsolodtal az apphoz (FB Connect)? Ha igen akor probalj meg lekapcsolodni majd probald ugy.
5. A fb_ca_chain_bundle.crt file jelen van az SDK-bol?
6. A bemasolt kod elott van e meg mas kod is? A kodot tartalmazo file kozvetlenul hivodik az app-bol vagy van szerver vagy kliens oldali atiranyitas?
Ha van atiranyitas valahol akor a sigend_request post elvesz hacsak nem figyelsz ra, hogy az atiranyitasnal azt is told at.

Hű, nagyon köszönöm, ez már valami.
Nos, az SDK-val és fájljaival nem lehet probléma, azokból a legújabb van és a crt is ott van.
A cache-re szerencsére gondoltunk, kiürítettük, úgy sem ment, tehát ezt is kizárnám. A kód előtt csak egy statikus header van, elviekben nem okozhat gondot. Ja és most hoztam létre, egy hete, az miért számít?

De mi ez a FB Connect? Az app egy URL-ről simán behúzza az indexet, abban van kód.

A cache-re szerencsére gondoltunk, kiürítettük, úgy sem ment, tehát ezt is kizárnám. A kód előtt csak egy statikus header van, elviekben nem okozhat gondot.

- Azert biztos ami biztos alapon a kovetkezo headereket szurd be az elejere:

header('P3P: CP="IDC DSP COR CURa ADMa OUR IND PHY ONL COM STA"');
header( 'Expires: Sat, 26 Jul 1997 05:00:00 GMT' );
header( 'Last-Modified: ' . gmdate( 'D, d M Y H:i:s' ) . ' GMT' );
header( 'Cache-Control: no-store, no-cache, must-revalidate' );
header( 'Cache-Control: post-check=0, pre-check=0', false );
header( 'Pragma: no-cache' );

- Kliens oldalon is szurd be az inicializalo kodot: http://pastebin.com/R6TmEzs1

Nem tudom, de leirom azt ahogyan en ertelmezem:
- a FB app egy facebook oldalon belul el/letezik mint aloldal
- mikor egy latogato az aloldalra teved a facebook az app-ban bealitott URL-t betolti egy iFrame-be
- az iframe hivasnal post-ban kuld egy sigened_request parametert amit az app secret-el lehet dekodolni
- a signed_request tartalmazza a page parametert, amely tobbek kozott tartalmazza az oldal ID-jat (amelyen az app el) es hogy a jelenlegi latogato FAN-e (likeolta e az illeto oldalt) az illeto oldalon, ez a liked parameter.

Én is így gondolom. És ha a liked == 1, akkor elvileg a "like.php"-t kéne icludolnia, ha a program nem hibás valahol, de ez most egyszerű, mint a faék, fogalmam sincs hol lehet a hiba. Hiszen ha valahol az appId dekódolásával volna a probléma, akkor nem is tudná az appot iFrame-be tölteni, nem igaz?
Az SDK-val meg nem hinném, hogy baj van, mert pontosan ugyanazt a verziót szedtem le, amit belinkeltél...

Kemény dió...

Igen, a kod ok u.h. szerintem a $signedRequest = $facebook->getSignedRequest(); hivasnal lesz a problema, mivel ha az NULL-t terit visza sosem teljesul a kondicio.
A php logokban nem talalsz ezt alatamaszto Notice-okat?

Lentebb irtam a $facebook->getSession(); beszurasat a $facebook->getSignedRequest() ele. Probald meg esetleg azt is.

Nem, a kod jo, en tevedtem es a regi SDK-t neztem. Az ujban mar nincs getSession igy tokeletesen igaza volt abban, hogy a metodus nem letezik :)
Megyek egyet ebedelni es hatha jon ujjabb 5let kozben. Adig is erdemes lenne megnezned, hogy a signed_request erkezik e a havassal a kerdeses fiokoknal.

Köszönöm a választ, én is belefutottam, de ha jól értem, a json-os rész az appId dekódolását szolgálja, nekem pedig talán a signed_reqest paraméter postolása környékén lesz a problémám, ugyanis ha az általad említett kódrészlettel volna hiba, az iFrame be sem töltené az appot. Legalábbis azt hiszem.

Ha jól tudom akkor ahhoz, hogy egy tabpage-nél lájkolva van e az oldal ahhoz nem kell facebook SDK.

Nállunk egy hasonló kód fut:

....

public function isTabPageLiked(){
$signed_request= $this->parsePageSignedRequest();
if($signed_request and $signed_request->page->liked!=''){
return true;
} else {
return false;
}
}
....
private function parsePageSignedRequest() {
if (isset($_REQUEST['signed_request'])) {
$encoded_sig = null;
$payload = null;
list($encoded_sig, $payload) = explode('.', $_REQUEST['signed_request'], 2);
$sig = base64_decode(strtr($encoded_sig, '-_', '+/'));
$data = json_decode(base64_decode(strtr($payload, '-_', '+/'), true));
return $data;
}
return false;
}

Nagyon hasonló problémába én is belefutottam. Kiváncsian várom a fejleményeket.

Ebbe én is beleszaladtam, nálam az volt a gond, hogy nem az oldalt likeolta aki tesztelte, hanem az app-ot.