Google Affiliate Network API PHP Script

by on December 21, 2011

Pin It

Google Affiliate Network

I was excited when I read Google had released an API for their Affiliate Network, as I wanted to automate pulling sales data from GAN. But I quickly became disheartened when I realized how difficult it is to use.

Since this was for myself, and not a web-based service that would be used by others, the Simple API method of authorization was good enough. After getting it to work with Picasa, but not GAN, I asked for some help and was introduced to the OAuth 2.0 Playground. This showed me the headers I’d need to send, and how OAuth 2.0 works.

For the record: the Google Affiliate Network API does NOT support Simple API Access. You cannot access the service with an API Key and IP locking.

I now have a working script, and have written up step-by-step instructions on how you can pull orders from GAN automatically each day.

This script is not complete, as it’s up to you to do something with the data once you have it. You can also modify the final call to pull advertisers, instead of orders.

Copy this to a new file (double-click to select-all. I named mine gan.php)

<?php
$cPublisherID	=	'';
$cScope			=	'https://www.googleapis.com/auth/gan.readonly';
$cClientID		=	'';
$cClientSecret	=	'';
$cRedirectURI	=	'urn:ietf:wg:oauth:2.0:oob';

$cAuthCode		=	'';
$cRefreshToken	=	'';

$bRefresh = true;

if (empty($cAuthCode)) {
	$rsParams = array(
						'response_type'	=>	'code',
						'client_id'		=>	$cClientID,
						'redirect_uri'	=>	$cRedirectURI,
						'scope'			=>	$cScope
						);
	$cOauthURL = 'https://accounts.google.com/o/oauth2/auth?' . http_build_query($rsParams);
	echo("Go to\n$cOauthURL\nand enter the given value into \$cAuthCode\n");
	exit();
} // ends if (empty($cAuthCode))
elseif (empty($cRefreshToken)) {
	$cTokenURL = 'https://accounts.google.com/o/oauth2/token';
	$rsPostData = array(
						'code'			=>	$cAuthCode,
						'client_id'		=>	$cClientID,
						'client_secret'	=>	$cClientSecret,
						'redirect_uri'	=>	$cRedirectURI,
						'grant_type'	=>	'authorization_code',
						);
	$ch = curl_init();

	curl_setopt($ch, CURLOPT_URL, $cTokenURL);
	curl_setopt($ch, CURLOPT_POST, 1);
	curl_setopt($ch, CURLOPT_POSTFIELDS, $rsPostData);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

	$cTokenReturn = curl_exec($ch);
	$oToken = json_decode($cTokenReturn);
	echo("Enter the following values:\n\n");
	echo("\$cRefreshToken = '" . $oToken->refresh_token . "';\n");
} // ends
else {
	// Get a new Access Token
	$cTokenURL = 'https://accounts.google.com/o/oauth2/token';
	$rsPostData = array(
						'client_secret'	=>	$cClientSecret,
						'grant_type'	=>	'refresh_token',
						'refresh_token'	=>	$cRefreshToken,
						'client_id'		=>	$cClientID
						);
	$ch = curl_init();

	curl_setopt($ch, CURLOPT_URL, $cTokenURL);
	curl_setopt($ch, CURLOPT_POST, 1);
	curl_setopt($ch, CURLOPT_POSTFIELDS, $rsPostData);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

	$cTokenReturn = curl_exec($ch);
	$oToken = json_decode($cTokenReturn);
	$cAccessToken = $oToken->access_token;

	// Get the results
	$cGANURL = 'https://www.googleapis.com/gan/v1beta1/publishers/' . $cPublisherID . '/events';
	$cAuthHeader = "Authorization: OAuth " . $cAccessToken;

	$ch = curl_init();

	curl_setopt($ch, CURLOPT_HTTPHEADER, array($cAuthHeader));
	curl_setopt($ch, CURLOPT_URL, $cGANURL);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

	$cJsonReturn = curl_exec($ch);

	print_r(json_decode($cJsonReturn));
} // ends else from <all authenticated>

?>

Login to your GAN account and get your Publisher ID. It’s the 6-character ID under your name (or your site’s name) in the upper-right once you login. Enter that value here

$cPublisherID	=	'';

GAN API Create New ProjectNext, go to https://code.google.com/apis/console/, login, click the drop-down in the left navigation, then choose Create… and name your project. I named my project GAN Reporting

In the list of services, turn on Google Affiliate Network API

Turn on the Google Affiliate Network API Service

Turn on the Google Affiliate Network API Service

Create an OAuth 2.0 client ID...Now click on API Access (left navigation), then click on the button Create an OAuth 2.0 client ID…

Enter “GAN Reporting” for the “Product name” then click Next

GAN API Create Client ID

GAN API Create Client ID

Choose “Installed application” for the Application type, then click “Create client ID”

GAN API Application Type

GAN API Application Type

You now have a Client ID, Client secret, and 2 Redirect URIs
GAN API OAuth Client

Enter your Client ID in the variable $cClientID and the Client secret value in $cClientSecret

$cClientID		=	'xxxxxxxxxxxx.apps.googleusercontent.com';
$cClientSecret	=	'xxxxxxxxxxxxxxxxx_xxxxxx';

Make sure $cRedirectURI is correct. Then save and upload gan.php (yes, there will be some empty variables… that’s OK!), and run it via command-line or a browser. You’ll see:

[esnagel@ec2 temp]$ php gan.php
Go to

https://accounts.google.com/o/oauth2/auth?response_type=code&client_id=xxxxxxxxxxxx.apps.googleusercontent.com&redirect_uri=urn%3Aietf%3Awg%3Aoauth%3A2.0%3Aoob&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fgan.readonly

and enter the given value into $cAuthCode

Go to this URL while logged into the Google account associated with your Google Affiliate Network (usually you@gmail.com, but if you’re like me and use Google Apps, you’ll have to open an Incognito window in Chrome to login)

You’ll see a page telling you GAN Reporting (your application) wants access to your GAN data. Click Allow access.

GAN API Allow Access

GAN API Allow Access

Next, you’ll see an Auth Code.

GAN API Auth Code

GAN API Auth Code

Copy that value and paste it back into gan.php:

$cAuthCode		=	'x/x-xxxxxxxxxx-xxxxxxxxxxxxxxx';

Save, upload and run the script again. Now, you’re given the value for the Refresh Token. Copy that and put it in gan.php:

$cRefreshToken = 'x/xxx_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';

Save, upload, and run the script again. Now when you run the script via command-line, you’ll see:

[esnagel@ec2 temp]$ php gan.php
stdClass Object
(
    [kind] => gan#events
    [items] => Array
        (
            [0] => stdClass Object
                (
                    [kind] => gan#event
                    [modifyDate] => 2011-12-21T01:17:47.608Z
                    [eventDate] => 2011-12-21T00:46:38.185Z
                    [orderId] => xxxxxx
                    [commissionableSales] => stdClass Object
                        (
                            [amount] => xx.xx
                            [currencyCode] => USD
                        )

                    [status] => ACTIVE
                    [type] => TRANSACTION
                    [products] => Array
                        (
                            [0] => stdClass Object
                                (
                                    [sku] => @adjustment
                                    [quantity] => 1
                                    [unitPrice] => stdClass Object
                                        (
                                            [amount] => xx.xx
                                            [currencyCode] => USD
                                        )

                                )

                        )

                    [advertiserId] => xxxxxx
                    [advertiserName] => xxxxxxxxxxxxx
                    [memberId] => xxxxxxxxxx
                    [earnings] => stdClass Object
                        (
                            [amount] => xx.xxxx
                            [currencyCode] => USD
                        )

                )
...

This is the result of

print_r(json_decode($cJsonReturn));

At this point, it’s up to you to loop through the items array and do what you want with the data.

I’ll answer some technical questions in the comments, but for the complicated questions, I’ll direct you to my PHP Programmer page where you can email or call me to describe your project and receive an estimate.

Was this post useful? Please share it with others:

Pin It

{ 18 comments… read them below or add one }

Jhun December 22, 2011 at 3:40 am

Hope you can help me understanding the json code response I get.
I only get the following json code response:

{ “kind”: “gan#events” }

upon running the code:

—————————————————————–

// Get the results
$cGANURL = ‘https://www.googleapis.com/gan/v1beta1/publishers/’ . $cPublisherID . ‘/events’;
$cAuthHeader = “Authorization: OAuth ” . $cAccessToken;

$ch = curl_init();

curl_setopt($ch, CURLOPT_HTTPHEADER, array($cAuthHeader));
curl_setopt($ch, CURLOPT_URL, $cGANURL);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$cJsonReturn = curl_exec($ch);

print_r(json_decode($cJsonReturn));

—————————————————————–

* But changing the “events” to “advertisers” returns advertiser data in json code format.

Thanks you.

Reply

Eric Nagel December 22, 2011 at 7:30 am

I’m pretty new to this, but my first thought is: do you have data to return? Did you have sales (orders) in the past 24 hours?

Based on http://code.google.com/apis/gan/v1beta1/events.html, you’re getting a result, but the result is empty.

Try setting eventDateMin and eventDateMax to extend your timeframe.

Reply

Brandon Carlson January 27, 2012 at 5:11 pm

Eric,

Google doesn’t specify the date format for eventDateMax, I’ve tried several different variations (mm/dd/YYYY, dd/mm/YYYY, mm/dd/yy, dd/mm/yy, and even unix timestamp). Do you know what format we’re supposed to use?

Reply

Eric Nagel January 27, 2012 at 5:22 pm

I’d guess ISO 8601, as that’s what they return. That’s “c” in PHP’s date() function

Reply

Brandon Carlson January 27, 2012 at 5:34 pm

That looks right. I tried eventDateMin=2011-09-04T19:56:22.982Z which I found in one of their python samples and that seemed to do the trick.

Thanks for the quick reply, and the awesome post!

Matt December 22, 2011 at 11:41 am

Eric,

Thanks for posting this. This was extremely helpful.

Reply

R. January 3, 2012 at 3:05 pm

Thank you a lot. I was going crazy with that… Is the first place I find useful information!

Reply

Charlie January 19, 2012 at 1:24 pm

Eric,

Any ideas as to why I’m getting a blank $cRefreshToken? After running the script with $cAuthCode added I just get:

Enter the following values: $cRefreshToken = ”;

Thanks for your input in advance.

Reply

Eric Nagel January 19, 2012 at 1:27 pm

After $cTokenReturn gets set (about line 40), echo out that value & see what you get. The refresh token probably isn’t in there, but an error message probably is.

Reply

Frank January 24, 2012 at 3:41 pm

Hey Eric,
I’m having the same problem as Charlie. I printed the value and I get this message:

{ “error” : “invalid_grant” }

any idea why?

Reply

Eric Nagel January 24, 2012 at 3:46 pm
Frank January 24, 2012 at 3:58 pm

I went ahead and tried adding ‘approval_prompt’ => ‘force’ to $rsParams and it gets rid of that error, but it’s still prompting
Enter the following values: $cRefreshToken = ”;

I also noticed if you refresh the page, you have to get a new AuthCode

Reply

Free iBooks February 5, 2012 at 6:24 pm

I’m getting the same problem with cRefreshToken being empty. I tried reseting the keys and still no lock.
Any updates?

MiniGig Custom Web Development February 7, 2012 at 11:06 pm

To fix the empty $cRefreshToken issue you need to enable SSL by adding
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
right before curl_exec($ch);

Good Luck! Contact minigig.com if you need web or .NET development!

Reply

Eric Nagel February 8, 2012 at 6:20 am

Thanks guys! Hope that works for those having trouble w/ this.

Reply

Tim February 20, 2012 at 11:51 am

Thank you so much for this code, extremely grateful.

I did make a couple changes to your code in order to download all transactions for a certain period, as by default there is a limit of 20 transactions, and even if you specify a number the max is 100.

while (true) {

$cGANURL = ‘https://www.googleapis.com/gan/v1beta1/publishers/’.$cPublisherID.’/events?maxResults=100′;

if (isset($cJson->nextPageToken)) $cGANURL .= ‘&pageToken=’.$cJson->nextPageToken;

$cAuthHeader = “Authorization: OAuth “.$cAccessToken;

[existing code]

$cJsonReturn = curl_exec($ch);
$cJson = json_decode($cJsonReturn);

if (!isset($cJson->nextPageToken)) break;

}

Reply

Sri March 21, 2012 at 5:05 am

Hi Eric,
What is the validity of the refresh token?
–Sri

Reply

Eric Nagel March 22, 2012 at 9:08 am

1 hour

Reply

Leave a Comment

{ 2 trackbacks }

Previous post:

Next post: