Приняты следующие соглашения при использовании Data API:
По умолчанию доступ к API запрещен всем, чтобы можно было делать запросы необходимо IP-адрес хоста с которого делается запрос добавить в белый список. Это можно сделать через личный кабинет "Администратор -> Аккаунт -> Правила и настройки безопасности" вкладка "API".
Если необходимо разрешить доступ всем IP-адресам, то нужно добавить в список разрешенных 0.0.0.0/0
Если запрос делается из под агента, то его IP адрес должен быть добавлен в белый список клиентского аккаунта
К пользователям и ключам доступа применяются права доступа аналогичные правам доступа в личном кабинете
Ключи генерируются на уровне пользователя в разделе личного кабинета "Аккаунт" → "Управление пользователями"
Существует два типа ключей:
Постоянный ключ имеет неограниченное время действия.
Временный ключ имеет конкретную дату окончания действия ключа.
Используется аутентификация с использованием сессий
Время жизни сессии 1 час.
В личном кабинете "Отчёты"->"Служебные"->"Запросы к API" можно построить отчёт по запросам к API
Базовый URL для доступа к API соответствует следующему шаблону:
https://dataapi.сайт/
Текущая версия Data API 2.0
Data API поддерживает версионность. Версия указывается в базовом URL как vX.Y , где X - номер мажорной версии, Y - номер минорной версии
Если была выпущена новая версия, то старая считается устаревшей и соответственно при обращении к старой версии API в мета-параметрах (см. раздел ) будет возвращаться параметр "current_version_deprecated" со значением "true"
Максимальное количество поддерживаемых версий - 2
Период поддержки устаревшей версии 2 месяца
Баллы списываются только за успешные запросы, т.е в отчете по запросам к API (см. раздел ) он помечен как успешный.
Информация о лимитах возвращается во всех ответах в мета-парметрах (см. раздел ) кроме случаев когда лимиты не учитываются;
Лимиты построены по бальной системе, т.е каждый метод имеет свой вес. Вызов метода уменьшает доступные дневные/минутные баллы на размер веса вызываемого метода
Информация о лимитах в мета-параметрах:
На странице "Аккаунт" -> "Тарифы и опции" в личном кабинете можно расширить лимиты.
Название | Тип | Обязательный | Описание |
---|---|---|---|
error | object | да | Объект с содержимым ошибки |
code | number | да | Не уникальный код ошибки (см. раздел ) |
message | string | да | Cообщение об ошибке |
data | object | да | Объект с деталями ошибки |
mnemonic | string | да | Уникальный текстовый код ошибки. При обработке ошибок рекомендуется использовать этот параметр. |
value | string | нет | Содержит то, что передал пользователь без изменений В некоторых случаях может отсутствовать. К примеру, обязательный параметр вообще не был заполнен. |
extended_helper | string | нет | Ссылка на более подробное описание ошибки и возможные решения |
params | object | нет | Карта подстановок параметров для шаблона с текстом об ошибке. Т.е. содержит динамически изменяемые значения, к примеру, лимиты. Значения указанные в этом параметре могут быть использованы в сообщениях об ошибках в интерфейсе, который базируется на Data API. |
field | string | нет | Название параметра, с которым связана ошибка Вложенные параметры отображаются через разделитель точка "." |
Код ошибки | Описание |
---|---|
-32700 | Ошибки связанные с валидацией JSON |
-32600 | |
-32601 | Ошибки связанные с методом |
-32602 | Ошибки связанные с валидацией параметров в вызываемом методе |
-32603 | Внутренние ошибки JSON RPC сервера |
-32001 | Ошибки аутентификации и ошибки с ключами |
-32003 | Ошибки с правами доступа - ip адрес не в белом списке, нет прав у пользователя |
-32004 | Ошибки связанные с неверной последовательностью вызываемых методов |
-32007 | Ошибки связанные с виртуальным номером |
-32008 | Ошибки связанные с компонентами |
-32009 | Ошибки связанные с аккаунтом |
-32029 | Ошибки связанные с лимитами |
-32099 | Ошибки связанные с поддержкой различных частей спецификации JSON RPC 2.0 - Групповые операции, Уведомления |
Текст сообщение | Код | Мнемоника | Описание |
---|---|---|---|
Invalid Request The JSON sent is not a valid Request object | -32600 | invalid_request | Ошибки связанные с валидацией параметров запроса - id , jsonrpc |
Access token has been expired | -32001 | access_token_expired | Применяется только к постоянному токену. Если время жизни постоянного токена истекло, то возвращается указанная ошибка |
Access token has been blocked | -32001 | access_token_blocked | Если постоянный токен заблокирован, то возвращается указанная ошибка |
Access token is invalid | -32001 | access_token_invalid | Указанная ошибка возвращается если постоянный/временный токен не найден |
Limit per {limit_type} has been exceeded. Value of current limit per {limit_type} is {limit_max_value} | -32029 | limit_exceeded | Лимит превышен |
You need at least on of the following components to access this method: {components} | -32008 | method_component_disabled | Если не подключен компонент, который требуется для работы метода |
You need at least on of the following components to access this paremeter: {components} | -32008 | parameter_component_disabled | Если не подключен компонент, который нужен для заполнения параметра и создания сущности |
Your IP {ip} is not whitelisted | -32003 | ip_not_whitelisted | IP адрес с которого делается запрос не находится в белом списке адресов. Если запрос делается из под агента, то ваш IP адрес должен быть в списках разрешеных адресов внутри клиентского аккаунта |
Login or password is wrong | -32001 | auth_error | Неправильный логин или пароль |
Your account has been disabled, contact the support service | -32009 | account_inactive | Аккаунт заблокирован |
Internal error, contact the support service | -32603 | internal_error | Внутренняя ошибка, необходимо обратиться в службу технической поддержки |
Data supplied is of wrong type | -32602 | data_type_error | К примеру, если ожидаем string а передали int |
The method does not exist / is not available | -32601 | method_not_found | Вызываемый метод не найден |
Permission denied | -32003 | forbidden | Нет прав на доступ к методу или API, или запрещено выполнять какое-либо действие |
Invalid JSON was received by the server. | -32700 | parse_error | Ошибка валидации JSON |
Batch operations not supported | -32099 | batch_opreations_not_supported | Групповые операции не поддерживаются |
Notifications not supported | -32099 | notifications_not_supported | Был потерян параметр id в запросе. См. раздел |
The required parameter has been missed | -32602 | required_parameter_missed | Обязательный параметр не передали |
Invalid parameter value | -32602 | invalid_parameter_value | Возвращается во всех случаях, если было передано некорректное значение параметра или переданное значение не соответствует требуемому формату ввода |
Unexpected method parameter(s) | -32602 | unexpected_parameters | Если в "params" были переданы параметры которые не предусмотрены JSON структурой метода или указан параметр для сортировки, фильтрации и выборки, который не существует |
The combination of parameters is not permitted | -32602 | invalid_parameters_combination | Если параметры указанные в методе находятся в недопустимой комбинации или имеют зависмость друг от друга. Нужно смотреть документацию по методу и его параметрам. |
{error_message} | -32602 | error | Динамические ошибки |
Текст ошибки | Код | Мнемоника | Описание |
---|---|---|---|
Invalid parameter value | -32602 | invalid_parameter_value | Если в фильтрах было передано некорректное значение для regexp, jsquery или любых значений не соответствующих документации |
Sort by parameter is prohibited | -32602 | sort_prohibited | Сортировка по параметру запрещена и невозможна, так как параметр для сортировки не находится в списке разрешенных для сортировки |
Filter by parameter is prohibited | -32602 | filter_prohibited | Фильтрация по параметру запрещена и невозможна, так как параметр для фильтрации не находится в списке разрешенных для фильтрации |
Max value of requested date interval is 3 months | -32602 | date_interval_limit_reached | Если в запросе период между указанными датами в date_from и date_till превышает 3 месяца. В основном ошибка актуальна только для методов получения отчетов, но не для всех. |
Текст ошибки | Код | Мнемоника | Описание |
---|---|---|---|
Entity not found | -32602 | entity_not_found | Если передан уникальный идентификатор сущности, которая не найдена |
Duplicate entity | -32602 | duplicate_entity | Если сущность уже существует |
A new data limit has been exceeded | -32602 | data_limit_exceeded | Ошибка возникает в случае, если было достигнуто максимальное количество данных. |
Action is not allowed for your tariff plan. You need contact support service or change your tariff plan settings in your account | -32602 | tariff_restrictions | Любые ограничения тарифного плана |
This value is already used by another entity | -32602 | already_in_use | Значение указанного параметра уже используется в другой сущности. К примеру, виртуальный номер уже используется в другой рекламной кампании. |
Функционал не поддерживается
Имя JSON-RPC метода состоит из двух частей разделенных точкой: глагола и имени объекта.
Имя объекта выбирается как существительное во множественном числе, отражающее бизнес-сущность, например subscribers .
Имя метода должно начинаться с глагола, отражающего суть операции.
Глагол | Описание |
---|---|
create | Добавляет сущность. |
get | Возвращает список отсортированных и отфильтрованных данных с помощью критериев фильтрации и методов сортировки. К запросу возможно применить лимит и постраничный вывод на количество получаемых данных (см. раздел ). С помощью критериев фильтрации может быть так же получена одна запись, по ёё уникальному идентификатору (см. раздел ). В специальном мета-параметре возвращается общее количество записей (см. раздел ). С помощью специального параметра можно указать какие поля возвращать в ответном сообщении (см. раздел ). |
update | Обновляет сущность с определённым идентификатором. Возможно частичное обновление параметров |
delete | Удаляет сущность с определённым идентификатором. |
add | Связь одного объекта с другим. |
enable | Подключение объекта |
disable | Отключение объекта |
set | Простановка свойства на другой объект, к примеру, установка тега на обращение |
unset | Снятие свойства с другого объека, к примеру, снятие тега с обращения |
Фильтрация данных применяется только к глаголу "get" (см. раздел с помощью необязательного примитива "filter" , который является объектом и может содержать:
Простой фильтр - это объект, который содержит в себе обязательные примитивы:
Дерево фильтров содержит специальный примитив "filters" , который может содержать в себе как простые фильтры, так и дерево фильтров.
Получаем список записей у которых поле "name" имеет имя "Bob"
{ "jsonrpc":"2.0", "id":1, "method":"get.entity", "params":{ "filter":{ "field":"name", "operator":"=", "value":"Bob" } } }
Получаем список записей у которых поле "name" имеет имя "Bob" и его возраст 25 лет
{ "jsonrpc":"2.0", "id":1, "method":"get.entity", "params":{ "filter":{ "filters":[ { "field":"name", "operator":"=", "value":"Bob" }, { "field":"age", "operator":"=", "value":25 } ], "condition":"and" } } }
Получаем список записей у которых поле "name" имеет имя "Bob" и его возраст 25 лет или список записей у которых поле "name" имеет имя "Dexter" и его возраст 2 года
{ "jsonrpc":"2.0", "id":1, "method":"get.entity", "params":{ "filter":{ "filters":[ { "filters":[ { "field":"name", "operator":"=", "value":"Bob" }, { "field":"age", "operator":"=", "value":25 } ], "condition":"and" }, { "filters":[ { "field":"name", "operator":"=", "value":"Dexter" }, { "field":"age", "operator":"=", "value":2 } ], "condition":"and" } ], "condition":"or" } } }
Условие запроса ((addv_comp_id = 10 or addv_comp_id = 12) and (tag_id = 1 or tag_id = 5)) or visitor_id = 14 or (date_from = 2015-12-14 and date_till = 2015-12-16)
{ "filter":{ "filters":[ { "filters":[ { "filters":[ { "field":"addv_comp_id", "operator":"=", "value":10 }, { "field":"addv_comp_id", "operator":"=", "value":12 } ], "condition":"or" }, { "filters":[ { "field":"tag_id", "operator":"=", "value":1 }, { "field":"tag_id", "operator":"=", "value":5 } ], "condition":"or" } ], "condition":"and" }, { "field":"visitor_id", "value":14, "operator":"=" }, { "filters":[ { "field":"date_from", "value":"2015-12-14 12:00:00", "operator":"=" }, { "field":"date_till", "value":"2015-12-16 15:00:00", "operator":"=" } ], "condition":"and" } ], "condition":"or" } }
Фильтрация null и not null будет =null, !=null
Оператор | Описание | Учёт регистра строк | Тип данных |
---|---|---|---|
= | Равно | да | |
!= | Не равно | да | number, string, null, boolean, iso8601, enum |
< | Меньше чем | - | number, iso8601 |
> | Больше чем | - | number, iso8601 |
<= | Меньше или равно | - | number, iso8601 |
>= | Больше или равно | - | number, iso8601 |
like | Начинается с, Заканчивается на, Содержит | да | string |
regexp | Posix | да | string |
jsquery | PostgreSQL jsquery | да | object, array |
in | Массив значений в отношении "or" | да | number, string, enum |
Сортировка данных применяется только к глаголу "get" (см. раздел ) с помощью массива объектов сортировки со следующими примитивами:
Список полей по которым можно производить сортировку определяется индивидуально для каждого метода.
JSON структура:
{ "jsonrpc":"2.0", "id":"number", "method":"string", "params":{ "sort":[ { "field":"string", "order":"string" } ] } }
Постраничный вывод может быть применён к глаголу "get" (см. раздел ). Для выполнения пагинации данных используются следующие параметры:
JSON структура:
{ "jsonrpc":"2.0", "id":"number", "method":"string", "params":{ "offset":"number", "limit":"number" } }
Возвращаются при использовании глагола "get" (см. раздел ).
Присутствуют как в ошибочном, так и в успешном ответе
Параметр "api_version" возвращается только для версий которые deprecated.
JSON структура:
{ "metadata":{ "api_version":{ "current_version_deprecated":"boolean", "current_version":"string", "latest_version":"string" }, "limits":{ "day_limit":"number", "day_remaining":"number", "day_reset":"number", "minute_limit":"number", "minute_remaining":"number", "minute_reset":"number" }, "total_items":"number" } }
В глаголе получения данных "get" (см. раздел ) может быть указан специальный необязательный примитив "fields" с типом массив, который может содержать список полей которые необходимо показать в выводе. Если примитив "fields" не используется, то в выводе показываются все поля по умолчанию для вызываемого метода.
Список полей индивидуален для каждого метода.
JSON структура:
{ "jsonrpc":"2.0", "id":"number", "method":"string", "params":{ "fields":[ "string" ] } }
Название | Тип | Обязательный | Допустимые значения | Описание |
---|---|---|---|---|
id | string или number | да | Уникальный идентификатор запроса к API, который используется для связи запроса с ответом. Рекомендуется делать в виде уникального хэша или случайного числа. | |
method | string | да | Вызываемый метод | |
jsonrpc | string | да | 2.0 | Номер спецификации JSON-RPC |
params | object | да | Содержит тело запроса к API. В зависимости от вызываемого метода тело запроса меняется. |
Время жизни полученного ключа сессии аутентификации после вызова метода "login.user" - 1 час. По истечению времени жизни ключа сессии его необходимо запрашивать заново, т.е. вызывать метод "login.user" .
Для совершения запросов к API возможно использование постоянного ключа аутентификации, который доступен в Личном кабинете на уровне пользователя.
Я использую код InApp V3 для покупок в приложении в моем приложении, я получаю эту ошибку BILLING_RESPONSE_RESULT_BILLING_UNAVAILABLE и error value:3 когда учетная запись Google недоступна на устройстве. Я хочу знать, есть ли другие возможности для получения этой ошибки, потому что, когда я получаю эту ошибку, мне нужно показать всплывающее окно пользователю с некоторыми данными. Если это вызвано из-за недоступности учетной записи Google на устройстве, я покажу диалог с соответствующим текстом. Это код, который я использую
MHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() { public void onIabSetupFinished(IabResult result) { if (!result.isSuccess()) { // error here return; } } });
Это ошибка Error checking for billing v3 support. (response: 3:Billing Unavailable) Error checking for billing v3 support. (response: 3:Billing Unavailable)
Как мы можем видеть непосредственно в коде установки IabHElper образца, предоставленного google, ошибка означает:
«Служба биллинга недоступна на устройстве».
Billing API version is not supported for the type requested
Это Справочник биллинга In-app (IAB Version 3), поэтому ошибка означает, что IAB v3 не установлен на устройстве.
Фактически это означает, что у пользователя есть учетная запись google и, возможно, также служба выставления счетов в приложении, но у нее нет последней версии. Это происходит в старых устройствах, и когда пользователь никогда ничего не обновляет, он используется для устройств, где вы можете увидеть старое приложение Market вместо приложения Play.
Таким образом, ошибка, которую вы должны показать пользователю, и тест, который вы должны выполнить, заключается не в том, что у устройства есть учетная запись google, но если у него установлены и правильно обновлены сервисы игры google.
ОБНОВИТЬ:
Если вы ищете код во всем SDK библиотеки и вспомогательные классы, предоставляемые google, это единственное место, где мы можем найти именно то, что именно вы вызываете: IabHelper класса IabHelper
Intent serviceIntent = new Intent("com.android.vending.billing.InAppBillingService.BIND"); if (!mContext.getPackageManager().queryIntentServices(serviceIntent, 0) .isEmpty()) { // service available to handle that Intent mContext.bindService(serviceIntent, mServiceConn, Context.BIND_AUTO_CREATE); } else { // no service available to handle that Intent mServiceConn=null; if (listener != null) { listener.onIabSetupFinished(new IabResult(BILLING_RESPONSE_RESULT_BILLING_UNAVAILABLE, "Billing service unavailable on device.")); } }
Это означает, что приложение не может подключиться к службе на устройстве, так как диспетчер пакетов даже не знает об этом . Это единственный вариант, который может вызвать эту ошибку. И что означает, что он не может подключиться к сервису? Это означает одно из следующих:
Таким образом, ваша ошибка может означать только одно из этого, что для вас означает, что вы должны показать пользователю mesagge, например: «У вас нет установленных служб google play, или вам нужно их обновить». И нет других возможностей или получить эту ошибку.
Но, если вы хотите сделать это проще для пользователей, вы можете сказать, что им нужно обновить приложение Google Play до последней версии . И это заставит все работать как шарм.
Эта ошибка также принимается после того, как пользователь удалит свою учетную запись google с устройства.
В основном возможность вашей проблемы BILLING_RESPONSE_RESULT_BILLING_UNAVAILABLE заключается в том, что в некоторых странах все еще в App Purchase не разрешено, как в Сербии и во многих странах.
Таким образом, любой пользователь из страны, в которой Google Play не поддерживает приложение App Purchase, получит BILLING_RESPONSE_RESULT_BILLING_UNAVAILABLE .
Это будет меньше шансов, что у пользователя не будет обновлена Служба Google Play, установленная на телефоне, поэтому не беспокойтесь об этом случае.
Попробуйте эти хаки
Удалите кеш, данные и обновления для приложения для воспроизведения, снова запустите приложение для воспроизведения, оно должно работать! Или попробуйте с последними обновлениями (если он исправлен)
FYI:
Просто имейте в виду:
IABv3 встроен в сервисы Google Play, поэтому для обновления App Play требуется обновление.
V2 был встроен в клиент Play Store. Проблема кеша / EULA не связана конкретно с IAB, это связано с настройкой Play Services (и, надеюсь, для большинства пользователей это необязательно, часть кэша в любом случае).
В этот переходный период, когда Play Services нужно обновить, нужно обновить систему, чтобы приложение могло ее использовать, но я думаю, что большинство людей согласятся с тем, что это лучше, чем ждать обновления ОС ».
См. Этот отчет: сообщение об ошибке, сообщение G +
Если вы не аутентифицировали свое устройство с помощью учетной записи Google, может возникнуть эта ошибка.
Для тех, кто все еще сталкивается с этой проблемой, в большинстве случаев iab не поддерживается в вашей стране, как сказал Уильямс. Вы можете использовать VPN, чтобы он работал.
Если обычная АТС для вас уже не круто, то в лексиконе появляется слово ИНТЕГРАЦИЯ. Это слово для многих ассоциируется со сложными процессами, долгой разработкой и высокими бюджетами. Следом за ИНТЕГРАЦИЕЙ обычно ходит API, тот самый набор процедур и средств, с помощью которого наша IP АТС стыкуется с каким-то сторонним приложением.
Смысл ИНТЕГРАЦИИ почти всегда сводится к передаче от IP АТС в сторону приложения (обычно это какая-нибудь CRM) номера при выходящем звонке (ну и факта самого звонка разумеется) и передаче того же номера из приложения в IP АТС, при исходящем. Далее приложение уже само решает, что сделать с этим номером:
Реже ИНТЕГРАЦИЯ подразумевает встраивание более широкого функционала:
Тут по сути, мы переносим нашу CRM функционал софтфона.
С его помощью можно:
Работает все это довольно просто, например, для того чтобы позвонить набираем в браузере такую строку
IP-АДРЕС -3CX:5000/ivr/PbxAPI.aspx?func=make_call&from=номер-откуда-звоним&to=куда-звоним&pin=пароль
Сначала звонок прилетит инициатору, поставит его на hold, потом 3CX будет дозваниваться до удаленного номера и объединит звонки.
Полное описание переменных есть тут- http://www.3cx.com/blog/docs/3cx-http-api/
Применять можно в любой браузерной CRM. Минусы – взаимодействие только в сторону АТС. Направить таким образом уведомление клиенту о входящем звонке – нельзя.
С его помощью можно:
CRM API, это по сути модуль к родному софтфону – 3CX Phone for Windows. Для разработки плагина нужно владеть Microsoft Visual Studio. Делается библиотека DLL, которая прописывается в конфигурационном файле софтфона.
Применять можно где угодно. Нужно помнить, что данное API требует наличия софтфона, это одновременно и плюс: он на себя берет клиент – серверное взаимодействие, и минус – софтфон нужен по-любому.
Кроме уже указанного Outlook и Office поддерживаются следующие CRM:
Во второй части статьи приведу подборку сторонних плагинов и модулей реализованных на 3CX API.