Accessing Clickbank API through Delphi's TIdHTTP? - delphi

I am trying to access the ClickBank API from my Delphi project, to check if a customer has a valid subscription.
I found the API Documentation here, but there are no Delphi examples. So I am trying to create my own little example, however I just cant figure it out with Indy's TIdHTTP.
Could anyone point me in the right direction, perhaps set up a minimal example?
P.S: I tried looking at the C# sample, however I cant port it to Delphi.

ClickBank sample C# is found here https://sandbox.clickbank.com/api_12_examples/api_example.csharp
HttpWebRequest request = (HttpWebRequest)
WebRequest.Create("https://api.clickbank.com/rest/1.2/orders/list");
request.Accept = "application/xml";
request.Headers.Add(HttpRequestHeader.Authorization,
"<< DEVELOPER KEY >>:<< API KEY >>");
request.Method = "GET";
HttpWebResponse response = (HttpWebResponse) request.GetResponse();
The PHP version is
https://sandbox.clickbank.com/api_12_examples/api_example.php
You'll see that they aren't doing much setup here... just setting two headers and performing a GET.
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://api.clickbank.com/rest/1.2/orders/list");
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_GET, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
"Accept: application/xml",
"Authorization: << DEVELOPER KEY >>:<< API KEY >>"));
$result = curl_exec($ch);
curl_close($ch);
In Delphi - a quick demo is to drop a TIdHTTP1 client on a form, along with a Button and a Memo. Then on an onclick of the button (where xxx= your developer key and yyy= your api key) do the same - set two headers and perform a GET:
IdHTTP1.Request.Accept := 'application/xml';
IdHTTP1.Request.CustomHeaders.Add('Authorization: xxx:yyy');
Memo1.Text := IdHTTP1.Get('https://api.clickbank.com/rest/1.2/orders/list');

Related

Which youtuve v3 api not supporting etag

I am using youtuve v3 https://www.googleapis.com/youtube/v3/search api to get the list of videos in a channel.
Also, trying to use etag to use caching to avoid quota limit in youtube api. I am always get different etag for each request.
So i would like to know is this search api support etag caching?. I am using php curl to get the results.
eg:
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HEADER, true);
curl_setopt($curl, CURLOPT_FILETIME, true);
curl_setopt($curl, CURLOPT_HEADER, 'If-None-Match: "'.$eTag.'"' );
$curl_exec = curl_exec($curl);

QuickBooks Oauth 2.0 returning Invalid Request Error while getting accesstoken

I am trying to Authorize the quick-books using Oath 2.0. I have done with authorization and now trying to get access token. But while making POST request to get access token I am getting "Invalid Request Error".
`$adminUrl="https://oauth.platform.intuit.com/oauth2/v1/tokens/bearer";
$client_id='Q0ble08jhv8hvQwLbBo******************';
$client_secret='ewHQsRokdOhOjcNHpt7wH***********';
$redirect_url='http://localhost/quickbooks/testaccesstoken.php';
//According to Quickbooks API need to pass Authorization Header//
$authorizationToken=base64_encode($client_id."".$client_secret);
//Curl Post Request//
$ch = curl_init();
$data = array("code" =>$code,"redirect_uri"=>$redirect_url,"grant_type"=>"authorization_code");
$headers = array();
$ch = curl_init($adminUrl);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT__TIMEOUT, "30");
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Authorization:Basic' .$authorizationToken,'Content-Type: application/x-www-form-urlencoded','Accept: application/json'));
$token = curl_exec($ch);
{"error":"invalid_request"}

Google email settings api error 403 with php curl

I am trying to update a signature through the Google email settings api. The domain is an EDU account, the user in question is a super admin. After successfully retrieving an OAuth 2.0 token, i issue this php curl code:
$mydomain = '<mydomain.com>';
$myuser = '<myusername>';
$token = '<mytoken>';
$url = 'https://apps-apis.google.com/a/feeds/emailsettings/2.0/'.$mydomain.'/'.$myuser.'/signature'
$data = '<?xml version="1.0" encoding="utf-8"?>
<atom:entry xmlns:atom="http://www.w3.org/2005/Atom" xmlns:apps="http://schemas.google.com/apps/2006">
<apps:property name="signature" value="blabla" />
</atom:entry>';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/atom+xml', 'Authorization: Bearer '.$token));
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$output = curl_exec ($ch);
curl_close ($ch);
Which results in:
You are not authorized to access this API. Error 403
Because of other issues mentioned here about the client_id when getting authorized, i have tried the above with both the gserviceaccount.com address and the googleusercontent.com address, with the same results.
What am i doing wrong here?
To answer my own question: after speaking to a Google rep i have learned that the email settings api cannot be used through standard "web app" authorization but needs to be used through a "service account":
https://developers.google.com/identity/protocols/OAuth2ServiceAccount

Asana API Adding an Attachment via cURL/PHP

Experiencing difficulty trying to successfully add an attachment to a task using cURL/PHP.
$data = array("file" => "#$filename");
$headers = array("Authorization: Basic " . base64_encode($asana_api_key) . ":"));
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://app.asana.com/api/1.0/tasks/$task_id/attachments");
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_exec($ch);
Assume $filename, $asana_api_key, and $task_id are set properly. Should be fairly straightforward... but for some unknown reason I get the following response:
{"errors":[{"message":"Server Error","phrase":"19 snobby warthogs cheer busily"}]}
Oddly enough, running this request using curl command line works perfectly. I've tinkered with this for hours now to no avail.
Any ideas as to what the issue may be?
This was a bug on our end, and should now be fixed. It had to do with the way curl was sending the filename, namely, as the entire path to the file. Browsers typically send only the basename (without the directory). We now apply the same logic ourselves if we get a full path for our local name, and it seems like it works, but your case may be different.
I'd certainly appreciate knowing if it works for you now.

Posting from a UTF-8 site to a ISO-8859-1 site (PHP)

Concerning the following situation:
www.foo.com is a page delivered in UTF-8. It features a login form to www.bar.com/Servlet. www.bar.com is a ISO-8859-1 capable application.
I have the following problem:
whenever someone is using special chars like German umlauts for his password the login fails because the password is posted in UTF-8, but the application expects it to be in ISO-8859-1.
Of course I could add accept-charset="ISO-8859-1" attribute to the html-form, but this (of course) does not work in IE.
I now thought of a proxy script, that is converting the UTF8 to ISO-8859-1 and posting that data to www.bar.com/Servlet. The conversion does work, also the posting (done by CURL). But as I'm echoing the returned html of www.bar.com/Servlet directly (and there is still www.foo.com in the address bar) the relative links in the html don't work. I managed to add a base tag to the output with an ugly replacement and it seems to work, but it's not a very elegant solution.
Is there a more simple way to post UTF-8-data to a ISO-8859-1 application?
My CURL code looks like this:
define('POSTURL', 'https://www.bar.com/Servlet');
array_map('utf8_decode', $_POST);
$ch = curl_init(POSTURL);
curl_setopt ($ch, CURLOPT_POST, 1);
curl_setopt ($ch, CURLOPT_POSTFIELDS, http_build_query($_POST));
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt');
curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookie.txt');
$response = curl_exec($ch);
curl_close ($ch);
$response = preg_replace('/(<head(.*)>)/U', "$1<base href=\"https://www.bar.com\" />", $response);
echo $response;
exit;
I did not find a simple working solution. My solution is now to move the UTF-8-form that gets posted into an iframe on the same page and setting the charset to ISO-8859-1 within this iframe. The iframe-form posts to target="_top" then.

Resources