Principiul denumirii metodei.
Următoarele convenții sunt acceptate când se utilizează Data API:
- Câmpurile goale sunt întotdeauna returnate într-un răspuns nul. In cazul unui tablou se returneaza un tablou gol, in cazul unui obiect se returneaza un obiect gol;
- Toate câmpurile legate de dată și oră sunt transmise în formatul AAAA-LL-ZZ hh: mm: ss;
- Solicitările API sunt întotdeauna făcute folosind metoda POST;
- Toți parametrii din cereri/răspunsuri, precum și din structurile de date în format JSON și numele metodelor sunt denumiți în stilul Snake Case - separarea cuvintelor prin litere de subliniere;
- Datele sunt returnate numai în format JSON conform specificației RFC 7159. Antetul Accept este ignorat;
- Codificarea datelor UTF-8;
- Antetul Content-Type trebuie să fie „application / json; charset = UTF-8”;
- Antetul Content-Length trebuie să conțină lungimea corectă a mesajului, urmând specificația HTTP / 1.1
Adăugați o adresă IP la lista permisă
În mod implicit, accesul la API este interzis tuturor, astfel încât să puteți face solicitări, trebuie să adăugați în lista albă adresa IP a gazdei de la care se face solicitarea. Acest lucru se poate face prin contul personal „Administrator -> Cont -> Reguli și setări de securitate”, fila „API”.
Dacă trebuie să permiteți accesul la toate adresele IP, atunci trebuie să adăugați 0.0.0.0/0 la lista de permise.
Dacă cererea este făcută de sub agent, atunci adresa IP a acestuia trebuie adăugată la lista albă a contului client
Utilizatori API și autentificare
Utilizatorii și cheile de acces sunt supuse unor drepturi de acces similare cu cele din contul personal.
Acces cu cheie
Cheile sunt generate la nivel de utilizator în secțiunea „Cont” → „Gestionarea utilizatorilor”
Există două tipuri de chei:
- Constant;
- Temporar;
O cheie permanentă are o durată nelimitată.
O cheie temporară are o anumită dată de expirare pentru cheie.
Autentificare și acces prin parolă
Se folosește autentificarea sesiunii
Durata de viață a sesiunii este de 1 oră.
Raport de solicitări API
În contul dvs. personal „Rapoarte” -> „Serviciu” -> „Solicitări API” puteți crea un raport despre solicitările API
Adresa URL de bază pentru acces API
Adresa URL de bază pentru accesarea API-ului urmează următorul model:
https: //dataapi.site/
Versiune
Current Data API 2.0
Data API acceptă versiunea. Versiunea este specificată în adresa URL de bază ca vX.Y, unde X este numărul versiunii majore, Y este numărul versiunii minore
Dacă a fost lansată o versiune nouă, atunci cea veche este considerată învechită și, în consecință, la accesarea versiunii veche a API-ului, parametrul „current_version_deprecated” cu valoarea „true” va fi returnat în meta-parametri (vezi secțiunea )
Numărul maxim de versiuni acceptate este 2
Perioada de suport pentru versiunea învechită 2 luni
Limite și restricții
Punctele sunt deduse numai pentru solicitările reușite, adică în raportul privind solicitările API (vezi secțiunea) sunt marcate ca reușite.
Informațiile despre limite sunt returnate în toate răspunsurile în meta-parametri (vezi secțiunea), cu excepția cazurilor în care limitele nu sunt luate în considerare;
Limitele se bazează pe un sistem de puncte, adică fiecare metodă are propria sa greutate. Apelul metodei scade punctele zilnice/minute disponibile cu dimensiunea greutății metodei apelate
Informații despre limitele în meta-parametri:
Metode și costul acestora în puncte
Extinderea limitelor
Pe pagina „Cont” -> „Tarife și opțiuni” din contul personal, puteți extinde limitele.
Eroare la procesare
Opțiuni pentru mesaje de eroare
Nume | Tip de | Obligatoriu | Descriere |
---|---|---|---|
eroare | obiect | da | Obiect cu conținut de eroare |
cod | număr | da | Cod de eroare neunic (vezi secțiunea) |
mesaj | şir | da | Mesaj de eroare |
date | obiect | da | Obiect cu detalii despre eroare |
mnemonic | şir | da | Cod de eroare textual unic. Este recomandat să utilizați acest parametru la tratarea erorilor. |
valoare | şir | Nu | Conține neschimbat ceea ce a trimis utilizatorul În unele cazuri, poate fi absent. De exemplu, un parametru necesar nu a fost completat deloc. |
extins_helper | şir | Nu | Link către o descriere mai detaliată a erorii și soluțiile posibile |
parametrii | obiect | Nu | Hartă de înlocuire a parametrilor pentru șablon cu text de eroare. Acestea. conține valori care se schimbă dinamic, de exemplu, limite. Valorile specificate în acest parametru pot fi utilizate în mesajele de eroare din interfață, care se bazează pe API-ul de date. |
camp | şir | Nu | Numele parametrului cu care este asociată eroarea Parametrii imbricați sunt afișați separați de un punct „.” |
Structura JSON a erorii
("jsonrpc": "2.0", "id": nul, "eroare": ("cod": "număr", "mesaj": "șir", "date": ("mnemonic": "șir", " câmp ":" șir "," valoare ":" șir "," parametri ": (" obiect ":" șir ")," extended_helper ":" șir "," metadate ": ())))Grupuri de coduri de eroare
Cod de eroare | Descriere |
---|---|
-32700 | Erori de validare JSON |
-32600 | |
-32601 | Erori legate de metoda |
-32602 | Erori legate de validarea parametrilor în metoda apelată |
-32603 | Erori interne ale serverului JSON RPC |
-32001 | Erori de autentificare și erori de cheie |
-32003 | Erori cu drepturile de acces - adresa ip nu este în lista albă, utilizatorul nu are drepturi |
-32004 | Erori asociate cu secvența greșită a metodelor apelate |
-32007 | Erori asociate cu numărul virtual |
-32008 | Erori componente |
-32009 | Erori de cont |
-32029 | Limitați erorile |
-32099 | Erori legate de suportul diferitelor părți ale specificației JSON RPC 2.0 - Operațiuni în bloc, Notificări |
Lista erorilor comune tuturor metodelor
Mesaj text | Cod | Mnemonice | Descriere |
---|---|---|---|
Solicitare nevalidă JSON trimis nu este un obiect de solicitare valid | -32600 | cerere invalida | Erori legate de validarea parametrilor cererii - id, jsonrpc |
Indicatorul de acces a expirat | -32001 | access_token_expired | Se aplică numai jetonului constant. Dacă durata de viață a simbolului constant a expirat, atunci eroarea specificată este returnată |
Jetonul de acces a fost blocat | -32001 | access_token_blocked | Dacă simbolul constant este blocat, atunci eroarea specificată este returnată |
Indicatorul de acces este nevalid | -32001 | access_token_invalid | Eroarea specificată este returnată dacă jetonul permanent/temporar nu este găsit |
Limita per (limit_type) a fost depășită. Valoarea limitei curente pe (limit_type) este (limit_max_value) | -32029 | limită depășită | Limită depășită |
Aveți nevoie de cel puțin una dintre următoarele componente pentru a accesa această metodă: (componente) | -32008 | method_component_disabled | Dacă componenta necesară pentru ca metoda să funcționeze nu este conectată |
Aveți nevoie de cel puțin una dintre următoarele componente pentru a accesa acest parametru: (componente) | -32008 | parameter_component_disabled | Dacă componenta nu este conectată, este necesar pentru a completa parametrul și a crea entitatea |
IP-ul dvs. (ip) nu este inclus în lista albă | -32003 | ip_not_whitelisted | Adresa IP de la care se face cererea nu se află în lista albă de adrese. Dacă solicitarea este făcută de sub agent, atunci adresa dumneavoastră IP trebuie să fie în listele de adrese permise din contul clientului |
Autentificarea sau parola este greșită | -32001 | auth_error | parolă sau logare incorectă |
Contul dvs. a fost dezactivat, contactați serviciul de asistență | -32009 | cont inactiv | contul este blocat |
Eroare internă, contactați serviciul de asistență | -32603 | eroare internă | Eroare internă, trebuie să contactați asistența tehnică |
Datele furnizate sunt de tip greșit | -32602 | data_type_error | De exemplu, dacă ne așteptăm la string și la transmis int |
Metoda nu există/nu este disponibilă | -32601 | metoda_negăsită | Metoda numită nu a fost găsită |
Acces refuzat | -32003 | interzis | Nu aveți permisiunea de a accesa metoda sau API-ul sau este interzis să efectuați orice acțiune |
JSON nevalid a fost primit de către server. | -32700 | parse_error | Eroare de validare JSON |
Operațiuni în lot nu sunt acceptate | -32099 | batch_opreations_not_supported | Operațiunile în bloc nu sunt acceptate |
Notificările nu sunt acceptate | -32099 | notificări_nu_acceptate | Parametrul id a fost pierdut în cerere. Vezi secțiunea |
Parametrul necesar a fost omis | -32602 | parametru_obligatoriu ratat | Parametrul necesar nu a fost trecut |
Valoare nevalidă a parametrului | -32602 | valoare_parametrului_invalid | Este returnat în toate cazurile dacă a fost transmisă o valoare incorectă a parametrului sau valoarea transmisă nu corespunde formatului de intrare necesar |
Parametru(i) metodei neașteptate | -32602 | parametri_neaștepți | Dacă parametrii au fost trecuți în „params” care nu sunt furnizați de structura JSON a metodei sau este specificat un parametru pentru sortare, filtrare și selectare care nu există |
Combinația de parametri nu este permisă | -32602 | invalid_parameters_combination | Dacă parametrii specificați în metodă sunt într-o combinație nevalidă sau au dependențe unul de celălalt. Trebuie să vă uitați la documentația despre metodă și parametrii acesteia. |
(mesaj_eroare) | -32602 | eroare | Erori dinamice |
Lista de erori pentru metodele cu verbul get
Text de eroare | Cod | Mnemonice | Descriere |
---|---|---|---|
Valoare nevalidă a parametrului | -32602 | valoare_parametrului_invalid | Dacă a fost transmisă o valoare incorectă în filtrele pentru expresia regulă, jsquery sau orice valoare care nu se potrivește cu documentația |
Sortarea după parametru este interzisă | -32602 | sort_interzis | Sortarea după parametru este interzisă și imposibilă, deoarece parametrul de sortare nu se află în lista de permise pentru sortare |
Filtrarea după parametru este interzisă | -32602 | filtru_interzis | Filtrarea după parametru este interzisă și imposibilă, deoarece parametrul pentru filtrare nu se află în lista de permise pentru filtrare |
Valoarea maximă a intervalului de date solicitat este de 3 luni | -32602 | date_interval_limit_reached | Dacă în cerere perioada dintre datele specificate în date_from și date_till este mai mare de 3 luni. Practic, eroarea este relevantă doar pentru metodele de primire a rapoartelor, dar nu pentru toate. |
Lista erorilor comune metodelor cu verbul șterge
Lista erorilor comune metodelor cu verbul create și update, set, unset
Text de eroare | Cod | Mnemonice | Descriere |
---|---|---|---|
Entitatea nu a fost găsită | -32602 | entitate_ne_găsită | Dacă se transmite un identificator unic al unei entități care nu a fost găsit |
Entitate duplicat | -32602 | duplicate_entity | Dacă entitatea există deja |
O nouă limită de date a fost depășită | -32602 | data_limit_exceeded | Apare o eroare dacă a fost atinsă cantitatea maximă de date. |
Acțiunea nu este permisă pentru planul dvs. tarifar. Trebuie să contactați serviciul de asistență sau să modificați setările planului tarifar din contul dvs | -32602 | tarife_restrictions | Orice restricții ale planului tarifar |
Această valoare este deja utilizată de o altă entitate | -32602 | deja folosit | Valoarea parametrului specificat este deja utilizată într-o altă entitate. De exemplu, numărul virtual este deja folosit într-o altă campanie de publicitate. |
Operațiuni de grup
Funcționalitatea nu este acceptată
Convenția de denumire a metodei
Numele metodei JSON-RPC constă din două părți separate printr-o punct: verbul și numele obiectului.
Numele obiectului este selectat ca substantiv la plural pentru a reflecta entitatea comercială, cum ar fi abonații.
Numele metodei trebuie să înceapă cu un verb care reflectă esența operației.
Verbe folosite în denumirea metodei
Verb | Descriere |
---|---|
crea | Adaugă o entitate. |
obține | Returnează o listă de date sortate și filtrate folosind criterii de filtrare și metode de sortare. Este posibil să se aplice o limită și o paginare cererii privind cantitatea de date primite (vezi secțiunea). Folosind criteriile de filtrare, o înregistrare poate fi obținută și prin identificatorul său unic (vezi secțiunea). Într-un meta-parametru special, este returnat numărul total de înregistrări (vezi secțiunea). Folosind un parametru special, puteți specifica ce câmpuri să returnați în mesajul de răspuns (vezi secțiunea). |
Actualizați | Actualizează o entitate cu un anumit identificator. Este posibilă actualizarea parțială a parametrilor |
șterge | Elimină o entitate cu un anumit identificator. |
adăuga | Relația dintre un obiect și altul. |
permite | Conexiune obiect |
dezactivați | Dezactivați obiectul |
a stabilit | Setarea unei proprietăți la un alt obiect, de exemplu, setarea unei etichete pentru un apel |
neasezat | Eliminarea unei proprietăți dintr-un alt obiect, de exemplu, eliminarea unei etichete dintr-un apel |
Criterii de filtrare
Filtrarea datelor se aplică numai verbului „get” (vezi secțiunea folosind primitiva opțională „filter”, care este un obiect și poate conține:
- Filtru simplu;
- Un arbore de filtre care conține filtre simple cu condiții.
Un filtru simplu este un obiect care conține primitivele necesare:
Arborele de filtrare conține „filtre” primitive speciale, care pot conține atât filtre simple, cât și un arbore de filtre.
Posibile erori de filtrare
Exemplu de structură JSON a unui filtru simplu
Obținem o listă de înregistrări pentru care câmpul „nume” are numele „Bob”
("jsonrpc": "2.0", "id": 1, "metoda": "get.entity", "params" :( "filtru" :( "câmp": "nume", "operator": "=" , „valoare”: „Bob”)))
Exemplu de structură JSON a unui arbore de filtru cu un nivel de imbricare
Primim o listă de înregistrări în care câmpul „nume” are numele „Bob” și vârsta acestuia este de 25 de ani
("jsonrpc": "2.0", "id": 1, "metoda": "get.entity", "params" :( "filtru" :( "filtre": [("câmp": "nume", " operator ":" = "," valoare ":" Bob "), (" câmp ":" vârstă "," operator ":" = "," valoare ": 25)]," condiție ":" și ")) )
Exemplu de structură JSON a unui arbore de filtru dublu imbricat
Obținem o listă de înregistrări în care câmpul „nume” are numele „Bob” și vârsta lui este de 25 de ani sau o listă de înregistrări în care câmpul „nume” are numele „Dexter” și vârsta lui este de 2 ani
("jsonrpc": "2.0", "id": 1, "metoda": "get.entity", "params" :( "filtru" :( "filtre": [("filtre": [("câmp") : „nume”, „operator”: „=", „valoare”: „Bob”), „câmp”: „vârstă”, „operator”: „=", „valoare”: 25)], „condiție” : "și"), ("filtre": [("câmp": "nume", "operator": "=", "valoare": "Dexter"), ("câmp": "vârstă", "operator" : „=", „valoare”: 2)], „condiție”: „și”)], „condiție”: „sau”)))
Exemplu de structură JSON a unui arbore de filtrare cu nivel de imbricare triplu
Condiție de interogare ((addv_comp_id = 10 sau addv_comp_id = 12) și (tag_id = 1 sau tag_id = 5)) sau visitor_id = 14 sau (date_from = 2015-12-14 și date_till = 2015-12-16)
("filtru" :( "filtre": [("filtre": [("filtre": [("câmp": "addv_comp_id", "operator": "=", "valoare": 10), ("câmp ":" addv_comp_id "," operator ":" = "," valoare ": 12)]," condiție ":" sau "), (" filtre ": [(" câmp ":" tag_id "," operator ": „=", „valoare”: 1), („câmp”: „id_etichetă”, „operator”: „=", „valoare”: 5)], „condiție”: „sau”)], „condiție”: „și”), („câmp”: „codul_vizitatorului”, „valoare”: 14, „operator”: „="), (“filtre”: [(„câmp”: „data_de la”, „valoare”: „2015 -12-14 12:00:00 "," operator ":" = "), (" câmp ":" date_till "," valoare ":" 2015-12-16 15:00:00 "," operator ": „=")], „condiție”: „și”)], „condiție”: „sau”))
Operatori de filtrare
Filtrarea null și nu null va fi = null,! = Null
Operator | Descriere | Șiruri sensibile la majuscule | Tip de date |
---|---|---|---|
= | Egal | da | |
!= | Nu este egal | da | număr, șir, nul, boolean, iso8601, enumerare |
< | Mai puțin decât | - | număr, iso8601 |
> | Mai mult decât | - | număr, iso8601 |
<= | Mai mic sau egal cu | - | număr, iso8601 |
>= | Mai mult sau egal | - | număr, iso8601 |
ca | Începe cu, se termină cu, conține | da | şir |
expresie regulată | Posix | da | şir |
jsquery | PostgreSQL jsquery | da | obiect, matrice |
în | Matrice de valori în raport cu „sau” | da | număr, șir, enumerare |
Sortarea datelor
Sortarea datelor se aplică numai verbului „get” (vezi secțiunea) folosind o matrice de obiecte de sortare cu următoarele primitive:
- câmp - câmpul prin care se realizează sortarea;
- ordine - direcții de sortare. Valorile posibile sunt „asc” / „desc”. „asc” – ascendent, „desc” – descendent. Parametrul este optional. Valoarea implicită este „asc”.
Lista câmpurilor prin care poate fi efectuată sortarea este determinată individual pentru fiecare metodă.
Posibile erori de sortare
Structura JSON:
("jsonrpc": "2.0", "id": "număr", "metoda": "șir", "params" :( "sortare": [("câmp": "șir", "comandă": "șir ")]))
Ieșire paginată
Paginare poate fi aplicată verbului „get” (vezi secțiunea). Următorii parametri sunt utilizați pentru a efectua paginarea datelor:
Structura JSON:
("jsonrpc": "2.0", "id": "număr", "metoda": "șir", "params" :( "offset": "număr", "limită": "număr"))
Meta parametri
A revenit când se folosește verbul „obține” (vezi secțiunea).
Prezenți atât în răspunsurile de eroare, cât și în cele de succes
Parametrul „api_version” este returnat numai pentru versiunile învechite.
Structura JSON:
("metadate" :( "versiunea_api" :( "versiunea_actuală_deprecată": "boolean", "versiunea_actuală": "șir", "ultima versiune": "șir"), "limite" :( "limită_zi": "număr", " day_remaining ":" număr "," day_reset ":" număr "," minute_limit ":" număr "," minute_remaining ":" număr "," minute_reset ":" număr ")," total_items ":" număr "))
Prezentarea datelor returnate
Listă separată de coloane returnate
Verbul de primire a datelor „obține” (vezi secțiunea) poate conține „câmpuri” primitive opționale speciale de tip matrice, care poate conține o listă de câmpuri care urmează să fie afișate în ieșire. Dacă primitiva „câmpuri” nu este utilizată, atunci rezultatul arată toate câmpurile implicite pentru metoda apelată.
Lista câmpurilor este individuală pentru fiecare metodă.
Structura JSON:
("jsonrpc": "2.0", "id": "număr", "metodă": "șir", "params" :( "câmpuri": ["șir"]))
Posibile erori în prezentarea datelor returnate
Câmpuri comune pentru toate metodele
Nume | Tip de | Obligatoriu | Valori valide | Descriere |
---|---|---|---|---|
id | șir sau număr | da | Un identificator unic pentru cererea API care este utilizat pentru a asocia o solicitare cu un răspuns. Se recomandă să o faceți sub forma unui hash unic sau a unui număr aleatoriu. | |
metodă | şir | da | Metoda numită | |
jsonrpc | şir | da | 2.0 | Numărul specificației JSON-RPC |
parametrii | obiect | da | Conține corpul solicitării API. În funcție de metoda apelată, corpul cererii se modifică. |
Autentificare
Intrare
Solicitați parametri
Opțiuni de răspuns
Durata de viață a cheii de sesiune de autentificare primită după apelarea metodei „login.user” este de 1 oră. Când cheia de sesiune expiră, aceasta trebuie să fie din nou solicitată, adică. apelați metoda „login.user”.
Pentru a face solicitări API, este posibil să utilizați o cheie de autentificare permanentă, care este disponibilă în Contul personal la nivel de utilizator.
Structura cererii JSON
("jsonrpc": "2.0", "id": "număr", "method": "login.user", "params" :( "login": "șir", "parolă": "șir"))Folosesc codul InApp V3 pentru achiziții în aplicație în aplicația mea, primesc această eroare BILLING_RESPONSE_RESULT_BILLING_UNAVAILABLE și valoare de eroare: 3 când contul Google nu este disponibil pe dispozitiv. Vreau să știu dacă există alte posibilități pentru a obține această eroare, deoarece atunci când primesc această eroare trebuie să arăt utilizatorului o fereastră pop-up cu câteva date. Dacă acest lucru se datorează inaccesibilității contului Google de pe dispozitiv, voi afișa un dialog cu textul corespunzător. Acesta este codul pe care îl folosesc
MHelper.startSetup (nou IabHelper.OnIabSetupFinishedListener () (public void onIabSetupFinished (rezultat IabResult) (dacă (! Result.isSuccess ()) (// eroare aici return;))));
Această eroare este Verificarea erorilor pentru suport pentru facturare v3. (răspuns: 3: Facturare indisponibilă) Eroare la verificarea suportului pentru facturare v3. (răspuns: 3: Facturare indisponibilă)
După cum putem vedea direct în codul de configurare IabHElper al eșantionului furnizat de google, eroarea înseamnă:
„Serviciul de facturare nu este disponibil pe dispozitiv.”
Versiunea API de facturare nu este acceptată pentru tipul solicitat
Aceasta este referința de facturare în aplicație (IAB versiunea 3), deci eroarea înseamnă că IAB v3 nu este instalat pe dispozitiv.
Acest lucru înseamnă efectiv că utilizatorul are un cont Google și, eventual, un serviciu de facturare în aplicație, dar nu are cea mai recentă versiune. Acest lucru se întâmplă pe dispozitivele mai vechi și, atunci când utilizatorul nu actualizează niciodată nimic, este folosit pentru dispozitivele în care puteți vedea vechea aplicație Market în loc de aplicația Play.
Deci eroarea pe care trebuie să o arăți utilizatorului și testul pe care trebuie să-l faci nu este dacă dispozitivul are cont google, ci dacă are servicii google play instalate și actualizate corect.
ACTUALIZAȚI:
Dacă căutați cod în bibliotecile SDK și clasele de ajutor oferite de google, acesta este singurul loc unde putem găsi exact ceea ce apelați: IabHelper din clasa IabHelper
Intenție serviceIntent = intenție nouă ("com.android.vending.billing.InAppBillingService.BIND"); if (! mContext.getPackageManager (). queryIntentServices (serviceIntent, 0) .isEmpty ()) (// serviciu disponibil pentru a gestiona acea intenție mContext.bindService (serviceIntent, mServiceConn, Context.BIND_AUTO_CREATE);) else (// nici un serviciu disponibil pentru a gestiona acea intenție mServiceConn = null; if (ascultător! = nul) (ascultător.onIabSetupFinished (nou IabResult (BILLING_RESPONSE_RESULT_BILLING_UNAVAILABLE, „Serviciul de facturare indisponibil pe dispozitiv.”));))
Aceasta înseamnă că aplicația nu se poate conecta la serviciul de pe dispozitiv, deoarece managerul de pachete nici măcar nu știe despre asta . Aceasta este singura opțiune care poate provoca această eroare. Și ce înseamnă că nu se poate conecta la serviciu? Aceasta înseamnă unul dintre următoarele:
- Dispozitivul nu are un serviciu instalat.
- Are o versiune veche, deoarece știm că cele mai recente versiuni ale magazinului de jocuri folosesc IAB v3.
Deci eroarea ta poate însemna doar una dintre acestea, ceea ce înseamnă pentru tine că trebuie să arăți utilizatorului mesagge, de exemplu: „Nu ai instalat serviciile Google Play sau trebuie să le actualizezi”. Și nu există altă posibilitate sau să obțineți această eroare.
Dar, dacă doriți să le ușurați utilizatorilor, le puteți spune că trebuie să actualizeze aplicația Google Play la cea mai recentă versiune. Și va face totul să funcționeze ca un farmec.
Această eroare este acceptată și după ce utilizatorul își șterge contul Google de pe dispozitiv.
Practic, posibilitatea problemei dvs. BILLING_RESPONSE_RESULT_BILLING_UNAVAILABLE este că în unele țări nu este încă permisă în Achiziția aplicației, cum ar fi în Serbia și în multe țări.
Astfel, orice utilizator dintr-o țară în care Google Play nu acceptă achiziția aplicației va primi BILLING_RESPONSE_RESULT_BILLING_UNAVAILABLE.
Acest lucru va fi mai puțin probabil ca utilizatorul să nu aibă Serviciul Google Play instalat pe telefon actualizat, așa că nu vă faceți griji cu privire la acest caz.
Încercați aceste hack-uri
Ștergeți memoria cache, datele și actualizările pentru aplicația de reluare, lansați din nou aplicația de reluare, ar trebui să funcționeze! Sau încercați cu cele mai recente actualizări (dacă s-au rezolvat)
FYI:
Ține cont doar de:
IABv3 este încorporat în Serviciile Google Play, deci este necesară o actualizare pentru a actualiza App Play.
V2 a fost integrat în clientul Play Store. Problema cache / EULA nu este legată în mod specific de IAB, are legătură cu setarea Serviciilor Play (și sperăm că pentru majoritatea utilizatorilor acest lucru este opțional, oricum face parte din cache).
În această perioadă de tranziție, când Serviciile Play trebuie actualizate, sistemul trebuie să fie actualizat pentru ca aplicația să-l folosească, dar cred că majoritatea oamenilor ar fi de acord că acest lucru este mai bine decât să aștepte o actualizare a sistemului de operare.”
Vezi acest raport: raport de eroare, mesaj G +
Dacă nu v-ați autentificat dispozitivul cu contul Google, este posibil să primiți această eroare.
Pentru cei care încă se confruntă cu această problemă, în cele mai multe cazuri iab nu este acceptat în țara dvs., așa cum a spus Williams. Puteți folosi un VPN pentru ca acesta să funcționeze.
Dacă un PBX obișnuit nu mai este cool pentru tine, atunci în lexic apare cuvântul INTEGRARE. Pentru mulți, acest cuvânt este asociat cu procese complexe, dezvoltare îndelungată și bugete mari. INTEGRAREA este de obicei urmată de API, chiar setul de proceduri și mijloace prin care IP PBX-ul nostru este conectat la o aplicație terță parte.
Semnificația INTEGRAȚIEI se rezumă aproape întotdeauna la transferul de la IP PBX la aplicație (de obicei un fel de CRM) a numărului atunci când se efectuează un apel (ei bine, faptul apelului în sine, desigur) și transferul aceluiași număr de la aplicația către IP PBX la ieșire. În plus, aplicația însăși decide ce să facă cu acest număr:
- Deschideți cardul găsit după număr
- Faceți o intrare în jurnal
- Trimite un mesaj
- etc.
Mai rar, INTEGRAREA implică încorporarea unei funcționalități mai largi:
- Managementul stării liniei operatorului
- Lucrul cu propriile apeluri
- Gestionarea apelurilor colegilor
- Lucrul cu conferințe
- Lucrul cu agenda telefonică
- etc.
Aici, de fapt, transferăm funcționalitatea softphone-ului nostru CRM.
Care sunt API-urile 3CX
API HTTP
Cu ajutorul lui puteți:
- Efectuați un apel de la un abonat 3CX (la un număr intern sau extern)
- Deconectați abonatul
- Activează abonatul
- Dezactivați apelurile externe ale abonatului
- Activați apelurile externe către abonat
- Activați înregistrarea conversației pentru abonat
- Dezactivați înregistrarea apelurilor pentru abonat
Totul funcționează destul de simplu, de exemplu, pentru a efectua un apel, introducem următoarea linie în browser
ADRESĂ IP -3CX: 5000 / ivr / PbxAPI.aspx? Func = make_call & from = numere-apelare-de la & către = apelare-unde & pin = parolă
Mai întâi, apelul va ajunge la inițiator, îl va pune în așteptare, apoi 3CX va apela la numărul de la distanță și va combina apelurile.
Descrierea completă a variabilelor este aici - http://www.3cx.com/blog/docs/3cx-http-api/
Îl puteți folosi în orice CRM bazat pe browser. Contra - interacțiune numai față de centrala telefonică automată. Este imposibil să trimiteți o notificare clientului despre un apel primit în acest fel.
API-ul CRM
Cu ajutorul lui puteți:
- Efectuați apeluri dintr-o aplicație terță parte
- Notificări privind modificarea stării apelului (conexiune stabilită, deconectată, apelare, apelare etc.)
- Notificări privind starea abonatului (conectat, deconectat, fără conexiune la PBX)
CRM API este în esență un modul pentru softphone nativ - 3CX Phone for Windows. Pentru a dezvolta un plug-in, trebuie să cunoașteți Microsoft Visual Studio. Se realizează o bibliotecă DLL, care este scrisă în fișierul de configurare al softphone-ului.
Îl poți folosi oriunde. Trebuie amintit că acest API necesită un softphone, acesta este atât un plus: preia interacțiunea client - server și un minus - este nevoie oricum de un softphone.
CALL CONTROL API
API-ul de control al apelurilor este disponibil pentru sistemul telefonic 3CX versiunea 11 și ulterioară și vă permite să controlați apelurile în mod programatic. Dezvoltarea necesită experiență cu .NET și C #.Cu ajutorul lui puteți:
- Vizualizați toate apelurile active pe PBX
- Interceptarea controlului apelurilor
- Transfer de apel
- Închide
- Modificarea setărilor sistemului telefonic 3CX
- Și încă vreo 30 de funcții diferite
Descrierea comenzilor cu exemple este aici - http://www.3cx.com/blog/docs/call-control-api/
Integrari CRM disponibile „din cutie”
Toate integrările disponibile sunt realizate ca pluginuri pentru 3CX Phone.- Click to Call - abilitatea de a forma un număr cu un singur clic din CRM.
- Apel pop-up - afișarea automată a unei cărți de contact pe baza ID-ului apelantului.
- Jurnalele de apeluri - păstrarea istoricului apelurilor în CRM.
Integrarea cu Microsoft Outlook și Microsoft Office 365 este disponibilă pentru orice versiune comercială a licenței comerciale 3CX Phone System. Alte pluginuri necesită versiunea CRM 3CX Phone System PRO. Trebuie remarcat faptul că numărul de utilizatori ai acestor plugin-uri nu este licențiat în niciun fel.
Pe lângă Outlook și Office deja menționate, sunt acceptate următoarele CRM-uri:
- Microsoft Dynamics
- Contacte Google
- Forta de vanzare
- SugarCRM
- Sage CRM
În a doua parte a articolului, voi oferi o selecție de pluginuri și module terțe implementate pe API-ul 3CX.