Wie üblich, wenn ich einem Tutorial folge, um eine Facebook-Applikation zu erstellen, erhalte ich nicht (sofort) das vom Tutorialverfasser dargestellte Ergebnis, sondern in der Regel Fehlermeldungen an verschiedenen Stellen. Offenbar gibt es zu viele verschiedene Einstellungen und Serverkonfigurationen, um ein einziges Skript überall gleich lauffähig zu bekommen. *seufz*
In diesem Fall folgte ich Emanuele Feronatos Tutorial „Create a Facebook application like “Friend interview“ und stieß nach Auruf meiner index.php im Browser auf die folgende Fehlermeldung:
Parse error: parse error in /mnt/web9/52/01/5163301/htdocs/hella/facebook.php on line 4
Fatal error: Cannot instantiate non-existent class: facebook in /mnt/web9/52/01/5163301/htdocs/hella/index.php on line 5
In den Kommentaren unter Emanueles Artikel riet jemand, die Dateiendung manuell in „php5“ umzubenennen.
Nachdem ich jetzt also keine index.php, sondern eine index.php5 auf meinem Testserver liegen hatte und diese aufrief, klappte dieser Teil schon mal.
Jedoch blieb die Applikation dann wieder mit einer Fehlermeldung hängen; diesmal stammte sie von Facebook und warnte mich durch Ausgabe des Fehlercodes „API Error Code: 191“, dass die angegebene URL nicht der Applikation gehöre — WTF?
Es hat einige Zeit gekostet, herauszufinden, wie ich diesen Eisberg umschiffen kann, aber die Lösung ist glücklicherweise einfach.
Emanuele übersah es in seinem Tutorial, darauf hinzuweisen, dass unter „Edit Settings“ im Facebook Developer Bereich auch unter „Web Site“ Einstellungen vorgenommen werden müssen. Vielleicht klappt es bei ihm ja auch ohne, bei mir allerdings ging es mit der Applikation erst weiter, nachdem ich folgendes eingetragen hatte:
Nach diesem Schritt lief die Applikation immerhin bis zur Anzeige des Autorisierungsdialogs. Der Moment der Erleichterung währte nicht allzu lang, denn direkt anschließend bockte PHP erneut:
Fatal error: Uncaught CurlException: 60: SSL certificate problem, verify that the CA cert is OK. Details: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed thrown in /mnt/web9/52/01/5163301/htdocs/hella/facebook.php on line 612
Dieses Problem scheint der Netzgemeinde bekannt zu sein. An verschiedenen (so auch hier) Stellen wird geraten, die Datei facebook.php geringfügig zu manipulieren, um das Problem zu beheben. In meinem Fall hat es gereicht, eine Zeile Code in facebook.php einzufügen (im folgenden Skript mit !!! markiert):
/**
* Makes an HTTP request. This method can be overriden by subclasses if
* developers want to do fancier things or use something other than curl to
* make the request.
*
* @param String $url the URL to make the request to
* @param Array $params the parameters to use for the POST body
* @param CurlHandler $ch optional initialized curl handle
* @return String the response text
*/
protected function makeRequest($url, $params, $ch=null) {
if (!$ch) {
$ch = curl_init();
}
$opts = self::$CURL_OPTS;
if ($this->useFileUploadSupport()) {
$opts[CURLOPT_POSTFIELDS] = $params;
} else {
$opts[CURLOPT_POSTFIELDS] = http_build_query($params, null, '&');
}
$opts[CURLOPT_URL] = $url;
$opts[CURLOPT_SSL_VERIFYPEER] = false; // !!!
// disable the 'Expect: 100-continue' behaviour. This causes CURL to wait
// for 2 seconds if the server does not support this header.
if (isset($opts[CURLOPT_HTTPHEADER])) {
$existing_headers = $opts[CURLOPT_HTTPHEADER];
$existing_headers[] = 'Expect:';
$opts[CURLOPT_HTTPHEADER] = $existing_headers;
} else {
$opts[CURLOPT_HTTPHEADER] = array('Expect:');
}
curl_setopt_array($ch, $opts);
$result = curl_exec($ch);
if ($result === false) {
$e = new FacebookApiException(array(
'error_code' => curl_errno($ch),
'error' => array(
'message' => curl_error($ch),
'type' => 'CurlException',
),
));
curl_close($ch);
throw $e;
}
curl_close($ch);
return $result;
}
DANKBAR!!
fehler->google->hilfe: sowas freut den verzweifelten Fb entwickler