I'm trying to set up a Google Contact Sync feature using the google-api-php-client library. I've been able to connect, retrieve and create contacts in my Google Contacts List using this php api library. But I can't seem to find a way to edit existing contacts. The Official Google Contacts API V3 Documentation says:
To update a contact, first retrieve the contact entry, modify the data and send an authorized PUT request to the contact's edit URL with the modified contact entry in the body.
This is the code I've used so far.
require_once '../includes/google-api-php-client/src/Google_Client.php';
$client = new Google_Client();
$client->setApplicationName("Google Apps PHP Starter Application");
$client->setScopes(array(
'https://apps-apis.google.com/a/feeds/groups/',
'https://www.googleapis.com/auth/userinfo.email',
'https://apps-apis.google.com/a/feeds/alias/',
'https://apps-apis.google.com/a/feeds/user/',
'https://www.google.com/m8/feeds/',
'https://www.google.com/m8/feeds/user/',
));
$client->setClientId('[MY-CLIENT-ID]');
$client->setClientSecret('[MY-CLIENT-SECRET]');
$client->setRedirectUri('MY-REDIRECT-URI');
$client->setAccessType('offline');
$client->setDeveloperKey('DEVELOPER_KEY');
<h3>Google Authentication</h3>
if (isset($_GET['code']))
{
$client->authenticate();
$_SESSION['token'] = $client->getAccessToken();
$client->setAccessToken($_SESSION['token']);
$token = json_decode($_SESSION['token']);
<h3>Refresh Token - To be used for later use</h3>
$json_response= $_SESSION['token'];
$decode_json = json_decode($json_response,true);
$refreshtoken = $decode_json['refresh_token'];
$qry = "UPDATE access_token set refresh_token='$refreshtoken', email='$email' where name = '$name'";
$res = mysqli_query($connection, $qry);
}
$qry = "Select * from access_token where name = '$name'";
$res = mysqli_query($connection, $qry);
$row = mysqli_fetch_array($res);
if(mysqli_num_rows($res)>0 && !empty($row['refresh_token']))
{
$rtoken = $row['refresh_token'];
$client->refreshToken($rtoken);
$json_response= $client->getAccessToken();
$_SESSION['token'] = $json_response;
$_SESSION['rtoken'] = $rtoken;
<h3>Get Email of our Logged In User</h3>
$req = new Google_HttpRequest("https://www.google.com/m8/feeds/contacts/default/full");
$req->setRequestHeaders(array('GData-Version'=> '3.0','content-type'=>'application/atom+xml; charset=UTF-8; type=feed'));
$val = $client->getIo()->authenticatedRequest($req);
$response =$val->getResponseBody(); // The contacts api only returns XML responses.
$xml = simplexml_load_string($response); // Convert to an ARRAY
$user_email = urlencode($xml->id); // email address
unset($xml); // clean-up
<h3>Create a Contact</h3>
$contact="
<atom:entry xmlns:atom='http://www.w3.org/2005/Atom'
xmlns:gd='http://schemas.google.com/g/2005'
xmlns:gContact='http://schemas.google.com/contact/2008'>
<atom:category scheme='http://schemas.google.com/g/2005#kind'
term='http://schemas.google.com/contact/2008#contact'/>
<gd:name>
<gd:givenName>HELLO</gd:givenName>
<gd:familyName>WORLD</gd:familyName>
<gd:fullName>Hello Changed Me</gd:fullName>
</gd:name>
<atom:content type='text'>Notes</atom:content>
<gd:email rel='http://schemas.google.com/g/2005#work'
primary='true' address='liz@gmail.com' displayName='E. Bennet'/>
<gd:email rel='http://schemas.google.com/g/2005#home' address='liz@example.org'/>
<gd:phoneNumber rel='http://schemas.google.com/g/2005#work'primary='true'>
(206)555-1212
</gd:phoneNumber>
<gd:phoneNumber rel='http://schemas.google.com/g/2005#home'>
(206)555-1213
</gd:phoneNumber>
<gd:im address='liz@gmail.com' protocol='http://schemas.google.com/g/2005#GOOGLE_TALK'
primary='true' rel='http://schemas.google.com/g/2005#home'/>
<gd:structuredPostalAddress rel='http://schemas.google.com/g/2005#work' primary='true'>
<gd:city>Mountain View</gd:city>
<gd:street>1600 Amphitheatre Pkwy</gd:street>
<gd:region>CA</gd:region>
<gd:postcode>94043</gd:postcode>
<gd:country>United States</gd:country>
<gd:formattedAddress>1600 Amphitheatre Pkwy Mountain View</gd:formattedAddress>
</gd:structuredPostalAddress>
<gContact:groupMembershipInfo deleted='false'
href='http://www.google.com/m8/feeds/groups/".$user_email."/base/6' />
</atom:entry>
";
$len = strlen($contact);
$add = new Google_HttpRequest("https://www.google.com/m8/feeds/contacts/".$user_email."/full/");
$add->setRequestMethod("POST");
$add->setPostBody($contact);
$add->setRequestHeaders(array('content-length' => $len, 'GData-Version'=> '3.0','content-type'=>'application/atom+xml; charset=UTF-8; type=feed'));
$submit = $client->getIo()->authenticatedRequest($add);
$sub_response = $submit->getResponseBody();
$parsed = simplexml_load_string($sub_response);
$client_id = explode("base/",$parsed->id);
var_dump($client_id);
<h3>Groups and Contacts Retrieval</h3>
$req = new Google_HttpRequest("https://www.google.com/m8/feeds/groups/default/full?v=3");
$val = $client->getIo()->authenticatedRequest($req);
$xml = simplexml_load_string($val->getResponseBody());
$xml->registerXPathNamespace('gd', 'http://schemas.google.com/g/2005');
$data['contacts'] = '<table class="table table-striped"><tbody>
';
$output_array = array();
foreach ($xml->entry as $entry)
{
$output_array[] = array((string)$entry->title, (string)$entry->id);
if((string)$entry->title == "")
{
$name = "No name";
}
else
{
$name = (string)$entry->title;
$name = str_replace("System Group:","", $name);
}
$req = new Google_HttpRequest("https://www.google.com/m8/feeds/contacts/default/full?max-results=10000&updated-min=2007-03-16T00:00:00&group=".(string)$entry->id."");
$val = $client->getIo()->authenticatedRequest($req);
$corrected_id = (string)$entry->id;
$corrected_id = substr($corrected_id, strrpos($corrected_id, '/' )+1);
$xml = simplexml_load_string($val->getResponseBody());
$xml->registerXPathNamespace('gd', 'http://schemas.google.com/g/2005');
$output_array_2 = array();
if(empty($xml->entry))
{
$data['contacts'] .= '';
}
else
{
$data['contacts'] .= '
<tr class="success">
<td><input type="checkbox" class="checker_'.$corrected_id.' inline" /></td>
<td colspan="3">'.$name.'</td>
</tr>
';
}
foreach ($xml->entry as $entry)
{
foreach ($entry->xpath('gd:email') as $email)
{
$output_array_2[] = array((string)$entry->title, (string)$email->attributes()->address);
if((string)$entry->title == "")
{
$name = "--- No Name ---";
}
else
{
$name = (string)$entry->title;
}
$data['contacts'] .= '
<tr>
<td style="width:10px;"><input type="checkbox" class="check_'.$corrected_id.'" name="email[]" value="'.(string)$email->attributes()->address.'" />'.$entry->id.'</td>
<td>'.$name.'</td>
<td>'.(string)$email->attributes()->address.'</td>
</tr>';
}
}
}
$data['contacts'] .= '
</tbody>
</table>';
echo $data['contacts'];
}
As you can see, I'm able to retrieve the contact entry, the problem remains; how do I send that entry back to the Google Contacts with the updated contact entry? Please help me find a way.
Thanks,
Rizwan