วิธีแก้เมื่อ app facebook error ว่า Fatal error: Uncaught OAuthException: An active access token must be used to query information about the current user by

29
Apr
6

สืบเนื่องจากโปรเจกการฝึกงานของผมคือการทำ application ขึ้น Facebook โดยใช้ php-sdk และ javascript-sdk ในการทำ แต่เมื่อทำเสร็จและอัพขึ้น Facebook เรียบร้อย เมื่อตอนที่กำลังจะเข้าขั้นตอนเพื่อขอ permission กลับเกิด error พิสดารขึ้นมาว่า
Fatal error: Uncaught OAuthException: An active access token must be used to query information about the current user.thrown in xxxxx(ที่อยู่แอพเราบน server)/facebook.php line 560 (บางคนก็เกิดที่บรรทัดอื่น แต่เชื่อว่าน่าจะมาจากสาเหตุเดียวกัน) ซึ่ง error นี้เกิดจากการที่ user ยังไม่ได้ log in เข้า Facebook หรืออาจจะเป็น access token ที่มีนั้นหมดอายุไปแล้ว ซึ่งวิธีแก้ก็คือลองเรียก session Facebook ออกมาดู ถ้า session ไม่สามารถใช้ได้ให้ redirect ไปยังหน้า login ก่อน อธิบายไปอาจไม่เห็นภาพเรามาดูโค้ดดีกว่า

$facebook = new Facebook(array(
‘appId’  => $appId,
‘secret’ => $secret,
‘cookie’ => true,
));

$redirect_url = $facebook->getLoginUrl(array(‘canvas’ => 1,
‘fbconnect’ => 0,
‘next’ => $start_page(page ที่จะไปเมื่อ log in เสร็จ)
));

$session = $facebook->getSession();

if($session) {
    // i am logged in
    $this->me = $facebook->api('/me?access_token='.$session['access_token']);
 } else {
    // not logged in
    echo '<script type="text/javascript">top.location.href = \''.$redirect_url.'\';</script>';
}

ซึ่งโค้ดข้างต้นสามารถแก้ปัญหา error ดังกล่าวได้เป็นอย่างดี ทว่ามีบางกรณีที่ยังเกิด error อยู่ก็คือ cookie ที่ใช้เก็บ session ในขณะนั้น ซึ่งบางครั้งที่เราปิด browser ไปแต่
cookie ยังคงเก็บค่าไว้ วิธีแก้ก็คือก่อนจะทำการเรียก session ใหม่ ให้ทำการลบ cookie เดิมของแอพนี้ออกก่อน ดังนี้

if ($session) {
      try {
      $me = $facebook->api('/me?access_token='.$session['access_token']);
     } catch (FacebookApiException $e) {
       error_log($e);
       unset($_COOKIE['fbs_' .$appId]);
      $facebook = new Facebook(array(
       'appId'  => $appId,
        'secret' => $secret,
         'cookie' => true,
         ));
         $session = $facebook->getSession();
         $me = $facebook->api('/me?access_token='.$session['access_token']);
        }
     }

 อ้างอิง
http://forum.developers.facebook.net/viewtopic.php?id=95536

Enjoy this article?

Consider subscribing to our RSS feed!

6 ความเห็น

  1. อิ๊ก
    00:27 on November 15th, 2011

    สวัสดีครับ พอดีผมติดปัญหานี้ ตอนลบ App แล้ว Install ใหม่ จะขึ้น แบบนี้แต่ว่า
    เนื่อจากผมยังไม่ค่อยเข้าใจ เรื่องพวกนี้เท่าไหร่
    อยากลบกวนถามว่า เจ้า

    if ($session) {
    try {
    $me = $facebook->api(‘/me?access_token=’.$session['access_token']);
    } catch (FacebookApiException $e) {
    error_log($e);
    unset($_COOKIE['fbs_' .$appId]);
    $facebook = new Facebook(array(
    ‘appId’ => $appId,
    ‘secret’ => $secret,
    ‘cookie’ => true,
    ));
    $session = $facebook->getSession();
    $me = $facebook->api(‘/me?access_token=’.$session['access_token']);
    }
    }
    มีวางตรงส่วนไหนเหรอครับ รองวางหลายตำแหน่งแล้วมันไม่หายนะครับ

    ในPage ผมใส่

    $appId = ‘xxxxxxxxxxxxxxxxxxxxxxxxx’;
    $secret = ‘xxxxxxxxxxxxxxxxxxxxxxxxxxx’;
    $start_page = “http://xxxxxxxxxxxxxxxxx/”;

    $facebook = new Facebook(array(
    ‘appId’ => $appId,
    ‘secret’ => $secret,
    ‘cookie’ => true,
    ));
    ผมว่ามันน่าใช้ด้วยกันได้แต่ผมไม่รู้ต้องวางไว้ก่อน Code ตัวไหนเหรอครับ ???
    ขอบคุณครับ

  2. heha
    09:10 on November 15th, 2011

    ใส่ไว้บนสุดของไฟล์ php ก่อนมีการ echo ค่าใดๆ ออกมาครับ

  3. heha
    09:11 on November 15th, 2011
  4. อิ๊ก
    13:55 on November 16th, 2011

    ขอบคุณครับ ทำหลายแบบ แล้วไม่หาย ทั้งตาม Link ที่ให้มาด้วย ก็ยังไม่หาย
    ปล่อยวางแล้วครับ 555+ เป็นเฉพาะ App ใหม่ ที่ติดตั้ง 2 ขั้นตอน – - นะครับ

  5. Street44
    03:37 on March 25th, 2012

    คือเจอปัญหานี้เช่นกัน พอมาอ่านบล็อคนี้ แล้วมองหาโค้ดตัวอย่างไม่เจอค่ะ ต้องขอรบกวนช่วยแสดงโค้ดให้ดูหน่อยได้มั้ยคะ

  6. Street44
    04:06 on March 25th, 2012

    อ่า เห็นโค้ดแล้วค่ะ อยู่ดีๆก็ขึ้นมา ทั้งๆที่รีเฟรชไปหลายรอบก่อนหน้า – -”

    ขอบคุณมากๆนะคะ สำหรับคำแนะนำ ^^

ใส่ความเห็น

RSS feed for comments on this post