Il documento contiene le specifiche tecniche d’integrazione delle api betting in modalità iframe del software di gioco di BetBalancer.
Il sistema si basa su una serie di chiamate HTTP che forniscono un output formattato in JSON.
Ogni richiesta viene autenticata in modo stateless mediante un hash di sicurezza che viene inviato con la stessa usando un sistema di chiave pubblica e privata.
Ogni richiesta http viene strutturata con due set di dati:
https://..betbalancer-service-host../api/webservice/
parametro | descrizione |
public | la chiave pubblica assegnata che va inviata in chiaro con la richiesta |
time | il timestamp attuale al momento della richiesta |
op | il nome del metodo della webservice che si intende invocare |
hmac | l’hash di sicurezza inviato per la validazione della richiesta |
es.: /api/webservice/?public=test&op=users.auth&time=1537871253&hmac=af091…
Per la generazione dell’hash è necessario disporre della chiave privata fornita in coppia quella pubblica. Tale informazione è quello che garantisce la sicurezza della richiesta e deve pertanto essere archiviata in modo sicuro.
L’hash hmac viene calcolato con l’algoritmo sha256 a cui vanno forniti in ingresso i parametri op, time e il payload POST della richiesta e utilizzando come chiave quella fornita.
Queste informazioni vanno concatenate tra loro come stringa senza alcun carattere separatore. Lo pseudocodice rappresentativo della codifica è il seguente:
hmac = HMAC.SHA256(
op + time + postdata,
privatekey
)
Importante: l’hash deve essere fornito come rappresentazione esadecimale lowercase.
Tutte le risposte del servizio arrivano in forma di stringa JSON contenente i parametri:
parametro | descrizione | ||||||
status | l’esito della richiesta, puo’ essere uno tra i seguenti:
| ||||||
method | indica il metodo della webservice invocato | ||||||
msg | in caso di “warning” ed “error” fornisce ulteriori dettagli sulle problematiche | ||||||
data | contiene i dati di output del metodo. Nella documentazione dei metodi della webservice si da` per scontato che i dati forniti siano racchiusi in questo nodo. |
Questo metodo si occupa della creazione di una sessione utente sul servizio. Se l’utente non esiste sarà creato automaticamente. Se la struttura a cui appartiene l’utente non esiste sarà creata automaticamente.
NB: Una volta creato un utente e uno shop, i loro dati non potranno essere modificati. In assenza di shopid e shopname, l’utente sarà creato sotto lo shop di default e non sarà possibile spostarlo al di sotto di un altro shop.
I dati POST accettati dalla richiesta sono i seguenti:
parametro | descrizione |
username | Lo username che l’utente utilizzerà per il login. (pattern: ^[a-zA-Z0-9_-]{3,50}$) |
clientip | L’ip di collegamento attuale dell’utente. Se non viene fornito l’ip corretto la sessione utente non potrà essere creata. |
userid | Facoltativo. [intero positivo, 10 cifre max] ID esterno che identifica la user in maniera univoca. Se fornita viene ritornata nei report delle api del wadmin. |
currency | Facoltativo. La valuta dell’utente in formato ISO 4217. Se non fornita viene utilizzata la valuta di default configurata per il partner che integra il servizio. Nota: una volta iscritto un utente con una valuta non è ammesso cambiarla e non è possibile iscrivere utenti con una valuta diversa da quella della struttura di appartenenza |
cashier | Facoltativo. Se valorizzato come “1” indica che la user deve disporre delle funzionalità di cassa, altrimenti è un utente normale. Valore di default: “0” |
shopid | Facoltativo. [alfanumerico, 10 caratteri max] Un id univoco della struttura sotto cui si trova la user. Se non fornito la user verrà iscritta sotto la struttura di default. Se valorizzata, deve essere fornita in coppia col parametro “shopname” altrimenti il metodo ritornerà errore |
shopname | Facoltativo. Il nominativo univoco di riferimento della struttura sotto cui iscrivere la user. Se non fornito la user verrà iscritta sotto la struttura di default. Se valorizzata, deve essere fornita in coppia col parametro “shopid” altrimenti il metodo ritornerà errore |
I dati forniti in risposta da questo metodo sono i seguenti:
parametro | descrizione |
id | l’id interno univoco del servizio generato per l’utente |
token | il token di sessione |
Questo metodo si occupa di invalidare uno specifico token, forzando in questo modo il logout dell’utente a cui è associato.
I dati POST della richiesta sono tutti obbligatori e sono i seguenti:
parametro | descrizione |
token | il token di sessione associato all’utente fornito dal metodo users.auth |
Il nodo “data” di questo metodo sarà sempre null. Per verificarne l’esito si deve fare unicamente riferimento al valore del parametro status
Permette di creare una struttura Shop sotto cui poter iscrivere gli utenti.
I dati POST accettati dalla richiesta sono i seguenti:
parametro | descrizione |
shopid | Un id numerico univoco che identifichi la struttura. |
shopname | Il nominativo univoco di riferimento della struttura. |
currency | Facoltativo. La valuta della struttura in formato ISO 4217. Se non fornita viene utilizzata la valuta di default configurata per il partner che integra il servizio. Nota: una volta creata la struttura con una valuta non è ammesso cambiarla. |
Nota: per poter avere utenti di valuta differente sul servizio bisogna creare degli shop appositi con quella precisa valuta sotto cui iscrivere gli utenti.
Il nodo “data” di questo metodo sarà sempre null. Per verificarne l’esito si deve fare unicamente riferimento al valore del parametro status
Permette di annullare un ticket entro 3 minuti dal suo piazzamento.
I dati POST accettati dalla richiesta sono i seguenti:
parametro | descrizione |
ticketid | L’id numerico univoco fornito in fase di piazzamento che identifichi il ticket da annullare |
Il nodo “data” di questo metodo sarà sempre null. Per verificarne l’esito si deve fare unicamente riferimento al valore del parametro status
Permette di verificare se il ticket non supera i limiti configurati e può essere giocato regolarmente.
I dati POST accettati dalla richiesta sono i seguenti:
parametro | descrizione |
username | lo username univoco dell’utente che ha giocato il ticket |
clientip | L’ip di collegamento attuale dell’utente. Se non viene fornito l’ip corretto la sessione utente non potrà essere creata. |
ticketcode | Codice identificativo del ticket |
ticketbody | il dettaglio del ticket in formato json |
ticketcurrency | codice ISO-4217 che rappresenta la valuta del ticket |
ticketbet | valore decimale della scommessa del ticket (es: 5.00) |
ticketwin | valore decimale della vincita. In caso di sistema rappresenta la possibile vincita max. |
ticketbonus | valore decimale del bonus applicato al ticket. È già sommato alla vincita. |
ticketodds | quota totale del ticket |
tickettype | indica la tipologia di ticket giocato |
ticketsystem | stringa JSON col dettaglio di gioco di un sistema. Non usato per altri tipi di ticket. |
[
{
“id”:”12345678-123-1″,
“event”: {
“name”:”Roma – Lazio”,
“date”:”2020-03-05T19:00:00.000Z”,
“sport”:”Calcio”,
“category”:”Italia”,
“tournament”:”Serie A”,
“eventid”:12345678,
“sportid”:123,
“categoryid”:123,
“tournamentid”:123
},
“outcome”: {
“name”:”1″,
“market”:”1X2″,
“result”:”Match”,
“odd”:”4.37″,
“rule”:”1-20″,
“type”:”P”,
“fixed”:false,
“marketid”:123,
“outcomeid”:1,
“gamephase”: “1st Half”,
“gametimer”: “65”,
“gamescore”: “1-1”
}
}, //…
]
{
“combinations”:[
{
“type”:1,
“count”:3,
“import”:3,
“fullOdd”:13.32,
“bonus”:false,
“max_win”:”39.96″
}, {
“type”:2,
“count”:3,
“import”:3,
“fullOdd”:43.2564,
“bonus”:false,
“max_win”:”129.77″
}, {
“type”:3,
“count”:1,
“import”:3,
“fullOdd”:40.323008,
“bonus”:false,
“Max_win”:”120.97″
}, //…
]
}
tickettype | descrizione |
P | Scommessa Prematch |
L | Scommessa Live |
S | Sistema di scommesse |
M | Mista Live/Prematch |
I dati forniti in risposta da questo metodo sono i seguenti:
parametro | descrizione |
code | codice di stato dell’operazione |
message | messaggio interno descrittivo dell’esito dell’operazione |
details | dettaglio relativo ai limiti violati dal ticket se presenti |
tickettype | descrizione |
error | Limiti superati, il ticket non può essere piazzato |
awaiting-approval | Il ticket è in attesa di convalida manuale |
success | Il Ticket rispetta tutti i limiti e può essere piazzato regolarmente |
https://..betbalancer-service-host../api/auth/{token}/{lang}/{page}?public={publickey}
Il caricamento dell’interfaccia e l’autenticazione dell’utente al servizio avvengono tramite una url che va fatta aprire via IFRAME all’interno del sito del partner.
Bisogna passsare alla url il token di sessione ricevuto dalla chiamata al metodo users.auth e il codice a due lettere della lingua scelta per la visualizzazione (es: it, en, fr etc..)
parametro | descrizione |
token | il token di autenticazione fornito dalla chiamata api users.auth |
lang | codice lingua a due lettere in formato ISO 639-1 |
publickey | la Public Key fornita da BetBalancer |
page | Facoltativo. Se omesso o valorizzato come “0” porta alla pagina prematch, “1” porta al livebetting |
Il partner dovrà fornire una URL di Callback su cui riceverà in tempo reale i ticket giocati dagli utenti e dovrà fornire una risposta nel body che servirà a stabilire il rifiuto o l’accettazione del ticket. L’output di risposta deve essere formattato in JSON.
La sicurezza del messaggio viene garantita tramite la firma con hash hmac inviato seguendo le stesse modalità descritte nei capitoli 1-2 e 1-3, con op valorizzato sempre come “cbplace”. E’ onere del partner assicurarsi della validità della firma digitale prima di eseguire l’operazione di piazzamento.
I seguenti parametri saranno passati alla url di callback col metodo HTTPS POST come dati form/urlencoded:
parametro | descrizione |
token | il token di sessione dell’utente che ha giocato il ticket |
username | lo username dell’utente che ha giocato il ticket |
fromcashier | se valorizzato come “1” significa che questa è una giocata assistita (ovvero, è lo shop che materialmente ha inviato la scommessa per conto del giocatore) |
ticketid | l’id numerico univoco del ticket |
ticketcode | codice alfanumerico univoco del ticket a 20 cifre da usare per le funzioni di stampa |
ticketbody | il dettaglio del ticket in formato json |
ticketcurrency | codice ISO-4217 che rappresenta la valuta del ticket |
ticketbet | valore decimale della scommessa del ticket (es: 5.00) |
ticketwin | valore decimale della vincita. In caso di sistema rappresenta la possibile vincita max. |
ticketbonus | valore decimale del bonus applicato al ticket. È già sommato alla vincita. |
ticketodds | quota totale del ticket |
tickettype | indica la tipologia di ticket giocato |
ticketsystem | stringa JSON col dettaglio di gioco di un sistema. Non usato per altri tipi di ticket. |
ticketrejected | se valorizzato come “1” significa che il ticket è stato rifiutato dall’accettazione, altrimenti la scommessa è valida (default: “0”). In caso il ticket sia stato rifiutato, ci si aspetta che la risposta del partner risulti obbligatoriamente in status = C |
[
{
“id”:”12345678-123-1″,
“event”: {
“name”:”Roma – Lazio”,
“date”:”2020-03-05T19:00:00.000Z”,
“sport”:”Calcio”,
“category”:”Italia”,
“tournament”:”Serie A”,
“qbetcode”:”1544″,
“eventid”:12345678,
“sportid”:123,
“categoryid”:123,
“tournamentid”:123
},
“outcome”: {
“name”:”1″,
“market”:”1X2″,
“result”:”Match”,
“odd”:”4.37″,
“rule”:”1-20″,
“type”:”P”,
“fixed”:false,
“spread”:null,
“marketid”:123,
“outcomeid”:1
}
}, //…
]
{
“combinations”:[
{
“type”:1,
“count”:3,
“import”:3,
“fullOdd”:13.32,
“bonus”:false,
“max_win”:”39.96″
}, {
“type”:2,
“count”:3,
“import”:3,
“fullOdd”:43.2564,
“bonus”:false,
“max_win”:”129.77″
}, {
“type”:3,
“count”:1,
“import”:3,
“fullOdd”:40.323008,
“bonus”:false,
“max_win”:”120.97″
}, //…
]
}
La risposta della callback URL deve essere formattata in json ed è composta da:
parametro | descrizione |
status | Il codice d’errore dell’operazione |
method | valore fisso, sarà sempre “cbplace” |
msg | Facoltativo. Una descrizione leggibile da recapitare all’utente |
esempio:
{“status”:”A”, “method”:”cbplace”, “msg”:”Scommessa Accettata”}
tickettype | descrizione |
P | Scommessa Prematch |
L | Scommessa Live |
S | Sistema di scommesse |
M | Mista Live/Prematch |
status | descrizione |
A | Scommessa Accettata |
C | Scommessa Rifiutata |
M | Rifiutata per mancanza di fondi utente |
V | Rifiutata. Utente non connesso |
Ad intervalli regolari il servizio contatterà un endpoint fornita dal partner a cui saranno inviati i referti dei ticket giocati.
La sicurezza del messaggio viene garantita tramite la firma con hash hmac inviato seguendo le stesse modalità descritte nei capitoli 1-2 e 1-3, con op valorizzato sempre come “cbdefine”.
E’ onere del partner assicurarsi della validità della firma digitale prima di eseguire l’operazione di definizione dei tickets.
N.B. Nel messaggio di comunicazione dei referti dei ticket, si potrà ricevere il referto di più giocate contemporaneamente fino ad un massimo di 200 giocate per messaggio .
I seguenti parametri saranno passati alla url di callback col metodo HTTPS POST come dati form/urlencoded:
parametro | descrizione |
ticketstatus | il referto dei ticket in formato json |
Non è prevista nessuna risposta formattata per questa chiamata: se la richiesta termina con codice di stato http 200 viene considerata riuscita, altrimenti viene tentato il reinvio dell’ultimo pacchetto di refertazione fino alla sua riuscita.
[
{
“username”:”johnsmith”,
“ticketId”:1234,
“ticketCurrency”:”USD”,
“ticketBet”:10.00,
“ticketWin”:43.70,
“ticketOdd”:4.37,
“cashoutTime”:false,
“status”:”W”,
“outcomes”: [
{
“id”:”1234-123-1″,
“status”:”W”,
“odds”:2.18,
“cashout”:false,
“results”: {
“HT”:”1:0″,
“FT”:”2:0″
}
}, //…
]
}, //…
]
status | descrizione |
N | None |
L | Loser |
V | Voided |
W | Winner |
C | Cancelled |
status | descrizione |
L | Loser |
V | Voided |
Z | Half-Lose |
H | Half-Win |
W | Winner |
Il nodo “results” di ogni outcomes contiene il risultato dell’evento di riferimento. Il suo invio non viene garantito in quanto subordinato alle informazioni fornite dal provider e nel caso verrà inviato come valore NULL nel momento in cui il dato non sia disponibile.
Qualora disponibile il dato sarà spedito come nell’esempio in precedenza.
Nota: TUTTI i parametri che possono apparire nel nodo results sono facoltativi, pertanto prima di utilizzare un dato valore bisogna sempre accertarsi che sia presente. Al momento vengono serviti solo il Calcio e il Tennis.
Tipo di Risultato | Descrizione |
HT | Primo Tempo |
FT | Finale |
OT | Tempi Supplementari |
AP | Rigori |
S1 | Set 1 |
S2 | Set 2 |
S3 | Set 3 |
S4 | Set 4 |
S5 | Set 5 |
Metodo Facoltativo. Se implementato permette di stabilire al momento del piazzamento di un ticket se la user dispone del credito necessario per l’operazione velocizzando alcuni controlli e impedendo sul nascere ritardi al rifiuto di ticket dovuti all’insufficienza di fondi utente.
La sicurezza del messaggio viene garantita tramite la firma con hash hmac inviato seguendo le stesse modalità descritte nei capitoli 1-2 e 1-3, con op valorizzato sempre come “cbfunds”. E’ onere del partner assicurarsi della validità della firma digitale prima di eseguire l’operazione di piazzamento.
I seguenti parametri saranno passati alla url di callback col metodo HTTPS POST come dati form/urlencoded:
parametro | descrizione |
token | il token di sessione dell’utente che ha giocato il ticket |
username | lo username dell’utente che ha giocato il ticket |
currency | codice ISO-4217 che rappresenta la valuta del ticket |
amount | valore decimale della scommessa del ticket (es: 5.00) |
fromcashier | se valorizzato come “1” significa che i fondi sono richiesti per una giocata assistita (ovvero: lo shop che materialmente fa la giocata per conto del giocatore) |
La risposta della callback URL deve essere formattata in json ed è composta da:
parametro | descrizione |
status | Il codice d’errore dell’operazione |
method | valore fisso, sarà sempre “cbfunds” |
msg | Facoltativo. Una descrizione leggibile da recapitare all’utente |
esempio:
{“status”:”M”, “method”:”cbfunds”, “msg”:null}
status | descrizione |
A | Scommessa Accettata |
M | Rifiutata per mancanza di fondi utente |
C | Rifiuto arbitrario della scommessa, è consigliabile, non obbligatoriamente, in questo caso fornire una descrizione del motivo nel nodo “msg” della risposta da recapitare alla end user |