一旦我已经有了访问令牌,如何在服务器上用php获取Facebook用户电子邮件


How to get Facebook user email on server with php once I already have the access token

我成功地从我的Android应用程序中获得了访问令牌。。。

  fbbutton = (com.facebook.login.widget.LoginButton) findViewById(R.id.fbbutton);
  fbbutton.setOnClickListener(this);
  fbbutton.setReadPermissions(Arrays.asList("public_profile", "email"));
  callbackManager = CallbackManager.Factory.create();
  fbbutton.registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
    @Override
    public void onSuccess(LoginResult loginResult) {
      GraphRequest request = GraphRequest.newMeRequest(loginResult.getAccessToken(), new GraphRequest.GraphJSONObjectCallback() {
        @Override
        public void onCompleted(JSONObject object, GraphResponse response) {
          if (response.getError() != null) {
          } else {
            if ((email = object.optString("email")) != null) {
            } else {
              email = object.optString("id") + "@facebook.com";
            }
            editor.putString("ftoken", AccessToken.getCurrentAccessToken().toString());
            editor.apply();
            Intent intent = new Intent(getApplicationContext(), MainActivity.class);
            startActivity(intent);
            finish();
          }
        }
      });
      Bundle parameters = new Bundle();
      parameters.putString("fields", "id, name, email"); // facebook parameters
      request.setParameters(parameters);
      request.executeAsync();
      // signed in UI
    }

然后,我成功地将访问令牌发送到服务器的php脚本中。

我正试图让脸书在服务器端使用访问令牌给我用户的电子邮件。

我正在努力。。。

        require_once __DIR__ . '/facebook-php-sdk-v4/src/Facebook/autoload.php';

(…)

        $fb = new Facebook'Facebook([
            'app_id' => '491680537671890',
            'app_secret' => 'abe9f51094b3d7c9edb3c28d102170a1',
            'default_graph_version' => 'v2.4'
        ]);
        fwrite($Handle, "point 1");
            $response = $fb->get('/me', $ftoken);
        //print_r($response);
        fwrite($Handle, "response:$response'n'n");
        $email = $response["email"];
        $userid = $email;
        fwrite($Handle, "email confirmed by facebook:[$email]'n'n");

但是我的php代码只到了"第1点"。所以它在$fb->get阶段失败了。我做错了什么?谢谢你的帮助。

编辑:我忘记在最后一个数组项后面加逗号了

$fb = new Facebook'Facebook([
            'app_id' => '491680537671890',
            'app_secret' => 'abe9f51094b3d7c9edb3c28d102170a1',
            'default_graph_version' => 'v2.4',
        ]);

现在,我的代码甚至还没有到达点1

编辑:逗号显然无关紧要,但我把它去掉了,我又到了点1[我错了,逗号真的没什么区别]。但是var_dumps在我下面编程时是空的。。

$ftoken = $json->ftoken;
fwrite($Handle, "ftoken:$ftoken'r'n");
$fb = new Facebook'Facebook([
    'app_id' => '491680537671890',
    'app_secret' => 'abe9f51094b3d7c9edb3c28d102170a1',
    'default_graph_version' => 'v2.4'
]);
$vardump = var_dump($fb);
fwrite($Handle, "first vardump:$vardump'n'n");
$response = $fb->get('/me?fields=id,name', $ftoken);
$vardump = var_dump($response);
fwrite($Handle, "vardump:$vardump'n'n");

编辑:#3:我实现了以下建议的代码。。。

$ftoken = $json->ftoken;
        fwrite($Handle, "ftoken:$ftoken'r'n");
        $fb = new Facebook'Facebook([
                'app_id' => '491680537671890',
                'app_secret' => 'abe9f51094b3d7c9edb3c28d102170a1',
                'default_graph_version' => 'v2.4'
        ]);
        $fb->setDefaultAccessToken($ftoken);
        try {
            $response = $fb->get('/me');
            $userResponse = $response->getGraphUser();
        } catch(Facebook'Exceptions'FacebookResponseException $e) {
            // When Graph returns an error
            $userResponse = 'Graph returned an error: ' . $e->getMessage();
        } catch(Facebook'Exceptions'FacebookSDKException $e) {
            // When validation fails or other local issues
            $userResponse = 'Facebook SDK returned an error: ' . $e->getMessage();
        }finally{
            fwrite($Handle, "response:$userResponse'n'n");
            }

我得到。。。

response:Graph returned an error: Invalid OAuth access token.

所以我的代币类型似乎不正确?

编辑:#4:我去了facebook对象调试页面,并输入了令牌。。。

Access Token Info
App ID  xxxxxxxxxxxxxxxxx : recipes
User ID
xxxxxxxxxxxxxxxxxxxxxxxxx : Rxxn Kxxm
User last installed this app via API v2.x
Issued  1451792399 (20 hours ago)
Expires 1456976399 (in about 2 months)
Valid   True
Origin  Mobile Web Faceweb
Scopes  email, public_profile

因此,代币不应该有任何真正的问题。我被难住了。

您可以尝试以下

$ftoken = $json->ftoken;
fwrite($Handle, "ftoken:$ftoken'r'n");
$fb = new Facebook'Facebook([
        'app_id' => '491680537671890',
        'app_secret' => 'abe9f51094b3d7c9edb3c28d102170a1',
        'default_graph_version' => 'v2.4'
]);
$fb->setDefaultAccessToken($ftoken);
try {
    $response = $fb->get('/me');
    $userResponse = $response->getGraphUser();
} catch(Facebook'Exceptions'FacebookResponseException $e) {
    // When Graph returns an error
    $userResponse = 'Graph returned an error: ' . $e->getMessage();
} catch(Facebook'Exceptions'FacebookSDKException $e) {
    // When validation fails or other local issues
    $userResponse = 'Facebook SDK returned an error: ' . $e->getMessage();
}finally{
    fwrite($Handle, "response:$userResponse'n'n");
}

看看我们得到了什么。。。

请确保您的域在您的应用程序设置中