A  Linux/Mac  OS  X  Command  Line  Interface  to  AffiliateWindow   David  Walker,  Data  Management  &  Warehousing,  January  2010



  Affiliate  Window  offer  a  tracking  and  management  solutions  for  maintaining  an   affiliate  program.  This  works  by  directing  sales  to  a  merchant  from  an  affiliates’   website.   In   exchange   for   displaying   the   merchants’   advertising   the   affiliate   receives   commission   for   sales   that   originate   from   the   affiliate   site.   Affiliate   Window   (http://www.affiliatewindow.com)   are   one   of   the   market   leaders   in   providing  a  tracking  and  management  solution.     In  order  to  exchange  information  between  merchant  and  the  affiliate  there  is  an   API   for   exchange   of   data   via   XML   and   SOAP   over   HTTP(S).   AffiliateWindow   provide   a   comprehensive   description   of   the   API1   to   their   clients   and   a   PHP   example2,3  on  how  to  access  this  information.  This  example  is  very  powerful  for   those   organisations   that   have   PHP   development   resources   and   is   very   easy   to   integrate  with  PHP  based  websites  however  there  are  limited  resources  for  those   who   may   wish   to   use   other   development   tools,4   test   file   structures   from   the   command  line,  store  requests  and  responses  for  audit  purposes,  etc.     This   document   describes   a   way   to   use   the   interface   from   a   Linux   or   Mac   OS   X   command  line.  


  In   order   to   use   this   script   the   Linux   server   must   have   curl   installed   (available   on   Debian   based   systems   with   “apt-­‐get   install   curl”   and   on   RedHat   based   systems   with  “rpm  –Uvh  curl”  or  “yum  install  curl”.     Mac   OS   X   10.6   (Snow   Leopard)   and   potentially   earlier   versions   have   curl   pre-­‐ installed  so  no  further  installation  is  required.     In   addition   to   the   software   a   username   and   password   are   required.   These   are   available  from  AffiliateWindow.  It  is  also  useful  to  have  a  copy  of  the  API  to  hand.                                                                                                                     1   http://www.affiliatewindow.com/documents/affiliates/documentation/webser vices/affiliateservice/Affiliateservice_API_v3.pdf  (requires  login)   2  http://www.affiliatewindow.com/downloads/api.client.zip  (requires  login)   3  For  those  looking  for  further  information  of  the  PHP  packages  required  for   Linux  will  need  php  and  php-­‐soap.  If  these  are  installed  with  apt-­‐get,  yum  or  rpm   then  the  remaining  dependencies  will  automatically  be  installed   4  Whilst  researching  this  note  a  version  of  the  API  written  in  C#  was  found  at   http://awin.codeplex.com/    

The  Scripts  

  There   are   two   files.   The   first,   request.xml,   contains   the   request   in   XML   format   as   per  the  API.  The  second,  request.sh,  reads  request.xml  and  writes  response.xml   in   the   current   working   directory.   Debugging   can   be   assisted   by   changing   the   line   “curl  \”  to  be  “curl  –-­‐verbose  \”.     In   this   example   we   are   fetching   affiliate   transaction   data   using   the   example   from   the  API5.      
<?xml version="1.0" encoding="UTF-8"?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://api.affiliatewindow.com/"> <SOAP-ENV:Header> <ns1:UserAuthentication> SOAP-ENV:mustUnderstand="1" SOAP-ENV:actor=http://api.affiliatewindow.com/ <ns1:iId>YOUR_USERNAME_HERE</ns1:iId> <ns1:sPassword>YOUR_PASSWORD_HERE</ns1:sPassword> <ns1:sType>affiliate</ns1:sType> </ns1:UserAuthentication> <ns1:getQuota> SOAP-ENV:mustUnderstand="1" SOAP-ENV:actor=http://api.affiliatewindow.com/ True </ns1:getQuota> </SOAP-ENV:Header> <SOAP-ENV:Body> <ns1:getTransactionList> <ns1:dStartDate>2009-12-01T00:00:00</ns1:dStartDate> <ns1:dEndDate>2009-12-31T23:59:59</ns1:dEndDate> <ns1:sDateType>transaction</ns1:sDateType> </ns1:getTransactionList> </SOAP-ENV:Body> </SOAP-ENV:Envelope>

  Figure  1  -­  request.xml  


    Since  we  are  fetching  affiliate  data  from  the  version  3  API  the  correct  URL  is  to   call   is   http://api.affiliatewindow.com/v3/AffiliateService.   To   fetch   merchant   data   the   URL   is   http://api.affiliatewindow.com/v3/MerchantService.   Note   that   the  path  (v3/AffiliateService  and  v3/MerchantService)  is  case  sensitive.      

                                                                                                                5  The  namespace  setting  “xmlns:xsd=http://www.w3.org/2001/XMLSchema”   also  appears  in  the  example  but  it  is  not  used  by  PHP  example  code  and  was  not   seen  in  the  wireshark  trace  file.  

#!/bin/bash curl \ --user YOUR_USERNAME_HERE:YOUR_PASSWORD_HERE \ --data @request.xml \ -H "Content-Type: application/soap+xml" \ --output response.xml \ http://api.affiliatewindow.com/v3/AffiliateService

  Figure  2  -­  request.sh  (curl  version)  


  The   curl   command   line   can   have   many   options.   In   this   example   the   important   things  to  note  are:     • The   @   before   the   data   file   that   instructs   curl   not   to   escape   the   payload   data.   • -­‐H   “ContentType:”   adds   a   header   that   is   essential   for   the   input   to   be   treated  as  a  SOAP  request  by  the  server.     It  is  also  possible  to  use  the  wget  command6  on  Linux  systems:       #!/bin/bash  
wget \ --http-user=“YOUR_USERNAME_HERE” \ --http-passwd=“YOUR_PASSWORD_HERE” \ --header=“Content-Type: application/soap+xml” \ --post-file=“request.xml” \ --output-document=“response.xml” \ http://api.affiliatewindow.com/v3/AffiliateService
Figure  3  -­  request.sh  (wget  version)  

Debugging  can  be  added  by  changing  “wget  \”  to  “wget  -­‐-­‐debug  \”.     Note  that  these  scripts  have  only  been  tested  with  version  3  of  the  API  and  this   may  change  in  the  future  with  new  releases.  

Background  Research  

  It   took   some   time   to   make   this   work.   In   the   end   WireShark7   was   run   to   packet   sniff   a   working   PHP   version   of   the   code.   The   important   aspect   of   making   this   work  appears  to  be  the  content  type  of  application/soap+xml  in  the  header.  

                                                                                                                6  Available  on  Debian  based  systems  with  “apt-­‐get  install  wget”  and  on  RedHat   based  systems  with  “rpm  –Uvh  wget”  or  “yum  install  wget”   7  http://www.wireshark.org/