3

「このソリューション」を使用すると、空の連絡先配列が得られます。

私は「google-api-php-client-0.6.7」をserviceAccount.phpをexamples/contactsフォルダーに、Google_ContactsServiceをsrc/contribフォルダーに使用しています。

OAUTH 2 をサーバー アカウントとして、Google Apis Access を構成しました。p12 ファイル、クライアント ID、クライアント メール アドレスがあります。プロジェクト名は「Google Contacts Sample」です。

serviceAccount.php:

<?php
require_once '../../src/Google_Client.php';
require_once '../../src/contrib/Google_ContactsService.php';

const CLIENT_ID = 'xxxxxxxxxxxxx.apps.googleusercontent.com';
const SERVICE_ACCOUNT_NAME = 'xxxxxxxxxxxxx@developer.gserviceaccount.com';
const KEY_FILE = '/absolute_path/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-privatekey.p12';

$client = new Google_Client();
$client->setApplicationName("Google Contacts Sample");

session_start();
if (isset($_SESSION['token'])) {
 $client->setAccessToken($_SESSION['token']);
}

$key = file_get_contents(KEY_FILE);
$client->setAssertionCredentials(new Google_AssertionCredentials(SERVICE_ACCOUNT_NAME, array('https://www.googleapis.com/auth/contacts'), $key));
$client->setClientId(CLIENT_ID);

if ($client->getAuth()->isAccessTokenExpired()) {
  $client->getAuth()->refreshTokenWithAssertion();
}
$token = $client->getAccessToken();

$service = new Google_ContactsService($client);
$result = $service->all();
print '<h2>Contacts Result:</h2><pre>' . print_r($result, true) . '</pre>';

Google_ContactsService.php:

<?php
class Google_ContactsService
{

    const SCOPE = "https://www.google.com/m8/feeds";

    /**
     * @var Google_Client
     */
    private $client;

    public function __construct($pClient)
    {
        $this->client = $pClient;
        $this->client->setScopes(self::SCOPE);
    }

    public function all()
    {
        $result = $this->execute('default/full?max-results=999');
        $contacts = array();

        foreach($result["feed"]["entry"] as $entry)
        {
            if(!isset($entry['gd$email']))
                $entry['gd$email'] = array();
            if(!isset($entry['gd$phoneNumber'])||empty($entry['gd$phoneNumber']))
                continue;

            $phones = array();
            $emails = array();

            foreach($entry['gd$phoneNumber'] as $phone)
            {
                $phone['$t'] = preg_replace('/\+33/', "0", $phone['$t']);
                $phone['$t'] = preg_replace('/\-/', '', $phone['$t']);
                $phones[] = $phone['$t'];
            }

            foreach($entry['gd$email'] as $email)
            {
                $emails[] = $email['address'];
            }

            $contacts[] = array(
                "fullName"=>utf8_decode($entry['title']['$t']),
                "phones"=>$phones,
                "emails"=>$emails
            );
        }

        return $contacts;
    }

    private function execute($pUrl)
    {
        $oauth = Google_Client::$auth;
        $request = new Google_HttpRequest("https://www.google.com/m8/feeds/contacts/".$pUrl."&alt=json");
        $oauth->sign($request);
        $io = Google_Client::$io;

        $result_json = $io->makeRequest($request)->getResponseBody();
        $result = json_decode($result_json, true);
        return $result;
    }
}

http://server.com/packs/googleapi/examples/contacts/serviceAccount.php」にアクセスすると、連絡先が表示されません。

関数 Execute は空を返します。

私に何ができる?

ありがとう。

4

1 に答える 1

1

これは古いので、おそらく先に進んでいると思いますが、他の人がこれを見つけた場合、連絡先が表示されないのは、特定のユーザーに委任していないためだと思います. Google Apps Premier Edition および Education Edition ドメインの共有連絡先はカウントされません。連絡先はそのユーザーに非公開です。

この行を変更します

$client->setAssertionCredentials(new Google_AssertionCredentials(SERVICE_ACCOUNT_NAME, array('https://www.googleapis.com/auth/contacts'), $key));

もっとこうなる

$auth = new Google_AssertionCredentials(SERVICE_ACCOUNT_NAME, array('https://www.google.com/m8/feeds'), $key);
$auth->sub = 'user@domain.com'; //whoever's contacts you want to see
$client->setAssertionCredentials($auth);

Google_AssertionCredentials メソッドの署名を見れば、最初の 2 行をまとめておくことができますが、これにより、より明確になると思います。達成しようとしていることに応じて、user@domain.com は、何らかの入力、データベースなどから設定される変数になる可能性があります。

于 2014-07-22T15:27:36.250 に答える