Un programma di affiliazione in Asp: le basi del progetto

Siti dinamici con ASP
Impara a creare siti dinamici professionali con ASP

Scritto da Luca Ruggiero nella sezione Asp

Introduzione

Le attuali strategie di Marketing adottate da Siti e Portali che si occupano di vendita di prodotti online, prevedono spesso un sistema pubblicitario particolarmente conveniente sia per loro stessi che per i loro Partners. Si tratta di uno strumento che in gergo viene chiamato Programma di Affiliazione, ovvero un software (in questo caso realizzato in Asp) che permette ai Webmaster di registrarsi, chiedere eventualmente approvazione per il proprio Sito, ed ottenere un identificativo che verrà tenuto in considerazione al momento di un acquisto effettuato da un cliente.

In questo Articolo non ci occuperemo, ovviamente, della burocrazia che gravita intorno a tali sistemi di guadagno, ma dell'aspetto tecnico del software. Poniamo il caso di un Portale di servizi che offre una ricompensa ai propri Partners pubblicitari che, segnalando il servizio in questione, riescono a far registrare un nuovo utente: un Pay per Lead (ricompensa per la sola iscrizione).

Architettura dell'applicazione

Do per scontato che il lettore abbia conoscenza di accesso ad dati di un database Ms Access con Asp; se cosi non fosse consiglio di far prima pratica in questo senso prima di imbarcarsi in una situazione delicata dove c'è di mezzo del denaro, caso specifico di un Programma di Affiliazione.

Fatta questa premessa, avviso il lettore che mi limiterò a spiegare in termini analitici come implementare un Programma di Affiliazione su di una struttura di E-Commerce, o del servizio menzionato in precedenza, già esistente e funzionante.

Presumo che detta struttura sia corredata da un database con almeno due tabelle, i cui nomi che utilizzerò sono indicativi: la tabella utenti conterrà gli utenti registrati al servizio e la tabella servizio conterrà dati di varia natura proprietari del servizio in questione.

Che queste tabelle siano relazionate tra loro, nel caso di un Pay per Lead non ci interessa.

La tabella utenti conterrà campi relativi al nome, cognome, email ed altri dati necessari sempre al fine del servizio; la cosa indispensabile è quella di implementarla con un nuovo campo che chiameremo ref (referente) di tipo testo che consenta lunghezza zero (che può essere lasciato vuoto), lunghezza a discrezione dello sviluppatore.

Questo nuovo campo ci consentirà di registrare l'identificativo dell'eventuale Sito Partner referente.

Si crei una nuova tabella che chiameremo affiliati dove verranno registrati i dati dei Partners; i campi sono a discrezione dello sviluppatore: presumo che ci sarà la richiesta di una password, dell'indirizzo email, dell'indirizzo del Sito su cui verranno esposti banner e/o spot, indirizzo, telefono ecc... L'unico campo che deve essere creato è username (di tipo testo, altre proprietà a discrezione dello sviluppatore) che, nell'ambito dello script che utilizzeremo, viene utilizzato come parametro di identificazione del referente.

La pagina di iscrizione di nuovi utenti: iscriviti.asp

Siamo arrivati al punto caldo, la pagina di iscrizione di nuovi utenti: vediamo come si comporterà il software in base al fatto che ci sia un Sito referente in ballo o meno. Ribadisco che sto parlando di una pagina già esistente, in cui deve solo essere implementato lo script in questione.

Si implementi nel modulo di registrazione, all'intermo dei Tag <form> e </form> una casella di testo nascosta con name="ref", il cui value sarà o meno vuoto in base al fatto che ci sia o meno un Sito referente.

Il Sito referente adotterà un link verso il servizio del tipo

http://www.nomeservizio.ext/iscriviti.asp?ref=PROPRIA_USERNAME
E' chiaro a questo punto che utilizzeremo una variabile di tipo QueryString per riconoscere i referenti. Nel caso in cui ci sia un referente verificheremo che sul database quest'ultimo esista o meno; a questo punto memorizziamo in una variabile di tipo Session la Username del referente e la memorizzeremo (previo controllo) nella casella di testo nascosta.

Traduciamo tutto questo in codice:
<%@LANGUAGE = JScript%>
<%
    // Recupero la Username del referente
    var ref = new String(Request.QueryString("ref"));
    var r_ref = ref.replace(/'/g,"''");

    // Se c'è un referente...
    if (ref != "undefined")
    {
       // ...apro la connessione verso il database.
       var Cn = new ActiveXObject("ADODB.Connection");
           Cn.Open("driver={Microsoft Access Driver (*.mdb)};dbq=" + Server.MapPath("database.mdb"));

       // Verifico che il referente esista e...
       var VerificaReferrer = Cn.Execute("SELECT username FROM affiliati WHERE username = '" + r_ref + "'");

       if (!VerificaReferrer.EOF)
       {
           // ...se esiste creo la variabile di Sessione a suo nome
           Session("ref") = ref;
       }
       else
       {
           // ...oppure non creo nessuna Sessione.
           Session("ref") = null;
       }

       // Chiudo la connessione.
       Cn.Close();      
    }

    // Al fine di assegnare un value alla casella di testo nascosta
    // creo una funzione dedicata che verifica che:
    function ReferrerNull()
    {
        if (Session("ref") == null)
        {
            // se la sessione è nulla stamperà una stringa vuota
            Response.Write("");
        }
        else
        {
            // oppure la Username del referente.
            Response.Write(ref);
        }
    }
%>
<html>
 <head>
  <title>Iscriviti al nostro servizio</title>
 </head>
<body>

<form method="POST" action="elabora.asp">
    <input type="hidden" name="ref" value="<%ReferrerNull()%>">
    <!--
        Inserire qui tutti gli altri campi del modulo di registrazine,
        ad esempio nome, cognome, email e quant'altro si ritenga necessario
        al fine di registrare un nuovo utente al proprio servizio.
    -->
</form>

</body>
</html>
Il codice appena proposto è semplice e abbondantemente commentato.
Ho supposto che la pagina di registrazione del nuovo utente si chiami elabora.asp; se cosi non fosse, è necessario intervenire in questo punto
<form method="POST" action="elabora.asp">
per effettuare la modifica.

Nella casella di testo nascosta faccio riferimento alla funzione ReferrerNull() per verificare la presenza di un referente
<input type="hidden" name="ref" value="<%ReferrerNull()%>">
ma è possibile (solo in JScript) utilizzare l'operatore condizionale ternario ? : e by-passare questa funzione:
value="<%Session("ref") == null ? Response.Write("") : Response.Write(ref)%>"
Questo è quanto.

Pro e contro di questo specifico sistema di intercettazione dei referenti

Questo specifico sistema di intercettazione dei referenti, come ogni cosa, hai i suoi pro ed i suoi contro. Lasciare in chiaro nella QueryString la Username del referente è rischioso perchè una modifica manuale da parte dell'utente, ad esempio
http://www.nomeservizio.ext/iscriviti.asp?ref=lukeonweb
in
http://www.nomeservizio.ext/iscriviti.asp?ref=lukeonw
renderebbe impossibile il riconoscimento del referente, il quale non maturerebbe crediti nei confronti dei gestori del servizio in questione, pur essendo effettivamente il referente.

Per ovviare a questo problema è possibile creare una pagina a se stante che verifichi quanto visto in precedenza ed effettui un reindirizzamento alla pagina iscriviti.asp; vediamo come:
<%@LANGUAGE = JScript%>
<%
    var ref = new String(Request.QueryString("ref"));
    var r_ref = ref.replace(/'/g,"''");

    if (ref != "undefined")
    {
       var Cn = new ActiveXObject("ADODB.Connection");
           Cn.Open("driver={Microsoft Access Driver (*.mdb)};dbq=" + Server.MapPath("database.mdb"));

       var VerificaReferrer = Cn.Execute("SELECT username FROM affiliati WHERE username = '" + r_ref + "'");

       if (!VerificaReferrer.EOF)
       {
           Session("ref") = ref;
       }
       else
       {
           Session("ref") = null;
       }

       Cn.Close();      
    }

    Response.Redirect("iscriviti.asp");
%>
Cosa cambia?
Cambia il fatto che questo file diventerà, ad esempio, partners.asp ed il nuovo link da utilizzare sui siti Partner diventerà
http://www.nomeservizio.ext/partners.asp?ref=PROPRIA_USERNAME
Il pro di un sistema come il precedente, invece, è che qualora la QueryString e la Session fossero gestite in tutte le pagine, il Partner è libero di puntare a qualsiasi pagina del servizio, non dimenticando di includere nel link la propria Username come referente.

La pagina privata dei Partners Affiliati: gestione dei guadagni

Anche in questo caso vale il concetto che presumo che il lettore abbia competenze di Asp ed Sql: mi limiterò quindi a definire, passo per passo, come creare una pagina di gestione dei guadagni per i Partners Affiliati.

Ogni nuovo utente che si iscrive al servizio tramite tramite il referente lukeonweb, verrà memorizzato in un record il cui campo ref verrà valorizzato dalla Username del referente, in questo caso lukeonweb.

Il file di gestione dei compensi potrebbe chiamarsi compensi.asp e deve essere protetto da password. Una volta effettuato il Login, l'Affiliato lukeonweb avrà generato una Sessione a suo nome, del tipo
<%@LANGUAGE = JScript%>
<%
    if (Session("username") == null)
    {
        Response.Write("ACCESSO NEGATO!");
        Response.End;
    }
    else
    {
        Session("username") = username;
    }
%>
<html>
...
Nell'ipotesi in cui il Login è stato effettuato con successo, dovremo ampliare la condizione else con una semplice Query che conti il numero di record dalla tabella utenti dove il campo ref sia valorizzato con la Username lukeonweb.

Ovviamente si dovrà trattare di una variabile, ed useremo la stessa variabile di Sessione:
var Conta_Tuoi_Utenti = Cn.Execute("SELECT COUNT(*) AS id FROM utenti WHERE username = '" + Session("username") + "'");
A questo punto è possibile utilizzare questa Query per stampare a video il risultato:
<p align="center">
    Ciao <%=Session("username")%>, ci hai portato <%=Conta_Tuoi_Utenti("id")%> iscritti!
</p>
A questo punto è sufficiente moltiplicare il numero di utenti referenziati * il valore economico di ogni singolo utente referenziato.

Conclusioni

Questo sistema, nel complesso, è relativamente affidabile: funziona alla perfezione, ma non utilizza determinati sistemi di sicurezza come i cookie o il rilevamento dell'indirizzo IP. In ogni caso, come da titolo, mi sono limitato ad esporre le basi del progetto in un'ottica abbastanza generale, non potendo trattare lo script in modo che si adatti alla perfezione con gli svariati codici che compongono tutte Applicazioni Web che potrebbero avvalersi di un sistema di Affiliazione.

I più cliccati della sezione Asp

:: Un semplice form mail in Asp (52.079)

:: Creazione di un Guestbook in Asp (50.971)

:: Creazione di un'area di accesso riservato in Asp (45.576)

:: Connessione ad un database MySql con Asp (25.227)

:: Connessione ad un database Microsoft SQL Server con Asp (24.399)

:: Asp e database (23.285)

:: Differenza tra i metodi get e post e recupero dei dati, attraverso Asp (22.644)

:: Una semplice area di accesso riservato senza DB in Asp (21.549)

:: Riscrivere le URL con Asp (19.946)

:: Creazione di un Sondaggio in Asp (19.221)

IN EVIDENZA
DOWNLOAD