dedemorozoff / kommo-api-php
为 kommo/amoCRM API 提供的简单 PHP7+ 包装器,支持 OAuth 2.0
Requires
- php: >=8.0
- ext-curl: *
- ext-json: *
- ext-mbstring: *
- phpunit/phpunit: ^10.0
This package is auto-updated.
Last update: 2024-09-19 07:44:32 UTC
README
基于
一个简单的 PHP8+ 包装器,用于与 Kommo REST API Kommo v2 (版本 2) 交互,支持通过 oAuth 2.0 或用户 API 密钥进行身份验证,支持 AJAX 前端方法请求,API 请求节流,防止同时更新同一实体,并将 API 请求/响应记录到文件。
此库是在基于 amocrm-api-php 库的基础上创建的,该库用于 AmoCRM 的英文版本,现在称为 Kommo,并支持 新的 amoCRM 要求,这些要求适用于公共集成。
公共集成必须使用 oAuth 2.0 身份验证机制,不允许使用 API 密钥机制。此要求从 2020 年 2 月开始实施。
从 2020 年 7 月 1 日起,用户 API 密钥的信息在 amoCRM 界面中不可用。
目前,最新版本是 REST API amoCRM v4 (版本 4)(API 请求发送到 /api/v4/)。
REST API amoCRM v2 文档
REST API v2 文档现在在 amoCRM 的俄语版本网站上不可用。在英文版本网站上,此文档已移至 API V2 GENERAL METHODS 部分。
REST API amoCRM v2 文档的 HTML 格式存档已移至单独的 存储库。
以下是该存档中单独的 HTML 文件链接
内容
- 要求
- 安装
- 身份验证
- 配置参数
- 与 amoCRM 实体交互
- 防止一个实体同时更新
- API请求节流
- 调试模式与日志记录
- 错误处理
- 示例
- 类UML图
- 作者
- 许可
要求
- PHP >= 8.0.
- 实现PSR-4标准的任意自动加载器类。
安装
通过composer安装
$ composer require dedomorozoff/kommo-api-php
或通过在composer.json文件的require部分添加
"dedomorozoff/kommo-api-php": "^1.0"
。
身份验证
通过oAuth 2.0协议进行授权(当前方法)
static KommoAPI::oAuth2(string $subdomain, string $clientId, string $clientSecret, string $redirectUri, string $authCode = null) :array
$subdomain
- amoCRM的子域名或完整域名;$clientId
- 集成ID;$clientSecret
- 集成密钥;$redirectUri
- 重定向URI;$authCode
- 授权码(临时密钥),用于交换获取access token和refresh token。
初次身份验证和将授权代码交换为访问令牌和刷新令牌
初次授权时,将授权码authCode
交换为access token和refresh token,这些token与传递的$clientId
、$clientSecret
和$redirectUri
一起保存在token存储中。
use Kommo\{KommoAPI, KommoAPIException}; use Kommo\TokenStorage\TokenStorageException; try { // Параметры авторизации по протоколу oAuth 2.0 $clientId = 'aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee'; $clientSecret = 'TFPoaG2A5hp3G3o6opCL8eC9v92Mm0fKQWEHBDwIjedCmVliT4kI3XQcjOOP1s'; $authCode = 'eee60208cc09e3ae3506d667228038345b6578a11d4862094655f630074c8c6ed87a9d804d49b5880e'; $redirectUri = 'https://www.example.com/oauth2/'; $subdomain = 'testsubdomain'; // Первичная авторизация KommoAPI::oAuth2($subdomain, $clientId, $clientSecret, $redirectUri, $authCode); // Получение информации об аккаунте вместе с пользователями и группами print_r(KommoAPI::getAccount($with = 'users,groups')); } catch (KommoAPIException $e) { printf('Ошибка авторизации (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage()); } catch (TokenStorageException $e) { printf('Ошибка обработки токенов (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage()); }
后续身份验证
初次交换授权码为access token和refresh token后,后续授权时只需传递$subdomain
- amoCRM的子域名或完整域名。
use Kommo\{KommoAPI, KommoAPIException}; use Kommo\TokenStorage\TokenStorageException; try { // Последующие авторизации $subdomain = 'testsubdomain'; KommoAPI::oAuth2($subdomain); // Получение информации об аккаунте print_r(KommoAPI::getAccount()); } catch (KommoAPIException $e) { printf('Ошибка авторизации (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage()); } catch (TokenStorageException $e) { printf('Ошибка обработки токенов (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage()); }
access token过期后,会自动获取新的access token和refresh token,当API请求返回HTTP状态码401 Unauthorized
时。
存储 access 和 refresh 令牌
token的保存和加载使用实现\KommoCRM\TokenStorage\TokenStorageInterface
接口的类。
TokenStorageInterface
接口
\KommoCRM\TokenStorage\TokenStorageInterface
接口定义了三个方法
save(array $tokens, string $domain) :void
保存授权参数和token。$tokens
- 授权参数和token的关联数组
[ 'access_token' => '...', 'refresh_token' => '...', 'client_id' => '...', 'client_secret' => '...', 'redirect_uri=> '...' ]
;$domain
- amoCRM的完整域名(例如,testsubdomain.amocrm.ru
)。
load(string $domain) :?array
加载授权参数和token并返回它们。当没有保存的token时,方法应返回null
。$domain
- amoCRM的完整域名。
hasTokens(string $domain) :bool
检查是否存在指定amoCRM域名的token,即是否已执行初次授权。$domain
- amoCRM的完整域名。
FileStorage
类
默认情况下,使用实现\Kommo\TokenStorage\TokenStorageInterface
接口的\Kommo\TokenStorage\FileStorage
类来保存和加载token。该类将token存储在JSON文件中,文件名与amoCRM域名对应(例如,testsubdomain.amocrm.ru.json
)。
可以在传递给类构造函数的参数中指定存储token的目录
__construct(string $storageFolder = '')
类构造函数。$storageFolder
- 存储token文件的目录。可以是绝对路径或相对于当前工作目录的路径。如果传递空字符串,则创建默认目录 - 'tokens'。
在出现错误时抛出\KommoCRM\TokenStorage\TokenStorageException
类异常。
使用自定义类来存储令牌
使用自定义类在数据库中保存token的示例
use Kommo\{KommoAPI, KommoAPIException}; use Kommo\TokenStorage\DatabaseStorage; try { // Параметры авторизации по протоколу oAuth 2.0 $clientId = 'aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee'; $clientSecret = 'TFPoaG2A5hp3G3o6opCL8eC9v92Mm0fKQWEHBDwIjedCmVliT4kI3XQcjOOP1s'; $authCode = 'eee60208cc09e3ae3506d667228038345b6578a11d4862094655f630074c8c6ed87a9d804d49b5880e'; $redirectUri = 'https://www.example.com/oauth2/'; $subdomain = 'testsubdomain'; // Устанавливаем объект класса, обеспечивающего сохранение токенов KommoAPI::$tokenStorage = new DatabaseStorage(); // Авторизация KommoAPI::oAuth2($subdomain, $clientId, $clientSecret, $redirectUri, $authCode); // Получение информации об аккаунте print_r(KommoAPI::getAccount()); } catch (KommoAPIException $e) { printf('Ошибка авторизации (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage()); }
示例类 \Kommo\TokenStorage\DatabaseStorage
<?php namespace Kommo\TokenStorage; class DatabaseStorage implements TokenStorageInterface { /** * Сохраняет токены * @param array $tokens Токены для сохранения * @param string $domain Полный домен amoCRM * @return void */ public function save(array $tokens, string $domain) { // Здесь токены сохраняются в базе данных } /** * Загружает токены * @param string $domain Полный домен amoCRM * @return array|null */ public function load(string $domain) { // Здесь токены извлекаются из базы данных } /** * Проверяет: существуют ли токены для заданного домена amoCRM, * то есть была ли выполнена первичная авторизация * @param string $domain Полный домен amoCRM * @return boolean */ public function hasTokens(string $domain) :bool { // Здесь проверяется наличие токенов в базе данных } }
检查初次身份验证是否存在
要检查是否已为 amoCRM 的所需子域进行过初次认证,可以使用接口 \Kommo\TokenStorage\TokenStorageInterface
的 hasTokens() 方法。
use Kommo\{KommoAPI, KommoAPIException}; use Kommo\TokenStorage\{FileStorage, TokenStorageException}; try { // Параметры авторизации по протоколу oAuth 2.0 $clientId = 'aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee'; $clientSecret = 'TFPoaG2A5hp3G3o6opCL8eC9v92Mm0fKQWEHBDwIjedCmVliT4kI3XQcjOOP1s'; $authCode = 'eee60208cc09e3ae3506d667228038345b6578a11d4862094655f630074c8c6ed87a9d804d49b5880e'; $redirectUri = 'https://www.example.com/oauth2/'; $subdomain = 'testsubdomain'; KommoAPI::$tokenStorage = new FileStorage(); $domain = KommoAPI::getAmoDomain($subdomain); $isFirstAuth = ! KommoAPI::$tokenStorage->hasTokens($domain); if ($isFirstAuth) { // Первичная авторизация KommoAPI::oAuth2($subdomain, $clientId, $clientSecret, $redirectUri, $authCode); } else { // Последующие авторизации KommoAPI::oAuth2($subdomain); } } catch (KommoAPIException $e) { printf('Ошибка авторизации (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage()); } catch (TokenStorageException $e) { printf('Ошибка обработки токенов (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage()); }
用户 API-密钥认证(过时方法)
从 2020 年 7 月 1 日起,用户 API 密钥的信息在 amoCRM 界面中不可用。
static KommoAPI::oauth(string $login, string $hash, string $subdomain) :array
$login
- 用户登录名;$hash
- 用户 API-密钥;$subdomain
- Kommo 的子域或完整域名。
用户 API-密钥认证示例。
use \Kommo\{KommoAPI, KommoAPIException}; try { // Параметры авторизации по API-ключу пользователя $login = 'login@example.com'; $hash = 'TFPoaG2A5hp3G3o6opCL8eC9v92Mm0fKQWEHBDwIjedCmVliT4kI3XQcjOOP1s'; $subdomain = 'testsubdomain'; // Авторизация KommoAPI::auth($login, $hash, $subdomain); // Получение информации об аккаунте print_r(KommoAPI::getAccount()); } catch (KommoAPIException $e) { printf('Ошибка авторизации (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage()); }
在多个 Kommo 账户中同时认证
库允许同时处理多个 Kommo 子域(账户)。为此,需要在每个子域中依次执行认证。
use Kommo\{KommoAPI, KommoAPIException}; try { // Авторизация в поддомене 1 KommoAPI::oAuth2($subdomain1, $clientId1, $clientSecret1, $redirectUri1, $authCode1); // Авторизация в поддомене 2 KommoAPI::auth($login2, $hash2, $subdomain2); //... // Авторизация в поддомене N KommoAPI::oAuth2($subdomainN, $clientIdN, $clientSecretN, $redirectUriN, $authCodeN); } catch (KommoAPIException $e) { printf('Ошибка авторизации (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage()); }
配置参数
所有库设置参数都通过 KommoAPI
类的静态属性设置。
处理 Kommo 实体
处理 Kommo 实体是通过以下方式构建的:
- 模型类的方法
KommoContact
- 联系人模型;KommoCompany
- 公司模型;KommoLead
- 成交模型;KommoNote
- 事件(备注)模型;KommoTask
- 任务模型;KommoCatalog
- 列表(目录)模型;KommoCatalogElement
- 列表(目录)元素模型;KommoIncomingLead
- 未整理的抽象基本申请模型;KommoIncomingLeadForm
- 在添加网页表单中的申请时从未整理的申请模型;KommoIncomingLeadSip
- 类型为进入电话的未整理申请模型。
- 类
KommoAPI
的额外静态方法; - 通过模型类的公共属性对象可访问的模型参数。
方法和常量模型列表
模型的基本类 KommoObject
所有模型的抽象基本类 - KommoObject
包含以下公共方法
__construct(array $params = [], string $subdomain = null)
创建新的模型对象并填充其内容。$params
- 模型参数;$subdomain
- 子域或 Kommo 的完整域名。如果为 null,则使用最后认证的子域。
fillById(int|string $id, array $params = []) :KommoObject
通过实体 ID 填充模型数据。$id
- 实体 ID;$params
- 传递给 Kommo 的 GET 请求的额外参数。
getParams() :array
返回所有模型参数。getCustomFields(array|int $ids) :array
通过字段 ID 返回额外字段。$ids
- 字段 ID 或字段 ID 数组。
getCustomFieldValueById(int $id, bool $returnFirst = true, string $returnValue = 'value')
通过字段 ID 返回额外字段值。$i
- 字段 ID;$returnFirst
- 只返回列表中的第一个值;$returnValue
- 返回参数的名称,其值被返回(value
,enum
,subtype
)。
setCustomFields(array $params) :KommoObject
设置额外字段值。$params
- 额外字段值的数组。
addTags(array|string $tags) :KommoObject
添加标签。$tags
- 标签或标签数组。
delTags(array|string $tags) :KommoObject
删除标签。$tags
- 标签或标签数组。
save(bool $returnResponse = false)
在 Kommo 中保存模型对象并返回实体 ID。$returnResponse
- 返回服务器响应而不是实体 ID。
定义绑定实体类型的常量
CONTACT_TYPE = 1
- 联系人;LEAD_TYPE = 2
- 成交;COMPANY_TYPE = 3
- 公司;TASK_TYPE = 4
- 任务;CUSTOMER_TYPE = 12
- 购买者。
KommoContact
类 - 联系人模型
addLeads(array|int $id)
通过 ID 绑定成交。addCustomers(array|int $id)
通过 ID 绑定购买者。addCompany(int $id)
通过 ID 绑定公司。getPhone()
返回联系人的第一个电话。getEmail()
返回联系人的第一个电子邮件。
KommoCompany
类 - 公司模型
addLeads(array|int $id)
通过 ID 绑定成交。addContacts(array|int $id)
通过 ID 绑定联系人。addCustomers(array|int $id)
通过 ID 绑定购买者。getPhone()
返回公司的第一个电话。getEmail()
返回公司的第一个电子邮件。
KommoLead
类 - 交易模型
⚠ 对于未整理的申请,存在特殊方法。
addContacts(array|int $id)
通过联系人ID(一个交易不超过40个联系人)绑定联系人。removeContacts(array|int $id)
通过联系人ID解绑联系人。addCompany(int $id)
通过公司ID绑定公司。removeCompany(int $id)
通过公司ID解绑公司。setCatalogElements(array $catalogElements)
通过列表ID设置列表(目录)元素。
KommoTask
类 - 任务模型
addContact(int $id)
通过ID绑定联系人。addLead(int $id)
通过ID绑定交易。
类中的常量,用于定义任务类型
CALL_TASKTYPE = 1
- 电话;MEET_TASKTYPE = 2
- 会议;MAIL_TASKTYPE = 3
- 写信。
KommoNote
类 - 事件(备注)模型
类中的常量,用于定义事件类型
LEAD_CREATED_NOTETYPE = 1
- 创建交易;CONTACT_CREATED_NOTETYPE = 2
- 创建联系人;LEAD_STATUS_CHANGED_NOTETYPE = 3
- 交易状态变更;COMMON_NOTETYPE = 4
- 普通备注;COMPANY_CREATED_NOTETYPE = 12
- 创建公司;TASK_RESULT_NOTETYPE = 13
- 任务结果;SYSTEM_NOTETYPE = 25
- 系统消息;SMS_IN_NOTETYPE = 102
- 入站短信;SMS_OUT_NOTETYPE = 103
- 出站短信。
KommoCatalog
类 - 列表(目录)模型
类 KommoCatalog
没有自己特定的方法。
KommoCatalogElement
类 - 列表(目录)元素模型
类 KommoCatalogElement
没有自己特定的方法。
KommoIncomingLead
类 - 未整理中的基本申请模型
处理未整理的申请与其他Kommo实体的工作有很大不同。
根据官方文档
最初,未整理的申请存储在单独的存储中,是独立的实体,因此至今在Kommo界面和API中仍有特殊功能,这些功能区分了未整理状态下的交易行为与其他状态下的交易行为。
⚠ 因此,对于未整理申请的模型,以下类 KommoObject
的方法不起作用
fillById()
;getCustomFields()
;getCustomFieldValueById()
;setCustomFields()
;addTags()
;delTags()
;KommoAPI::saveObjects()
;KommoAPI::saveObjectsWithLimit()
.
处理未整理中申请的通用方法
未整理申请的抽象基本类模型 - KommoIncomingLead
包含以下方法
fillByUid(int|string $uid, array $params = []) :KommoObject
使用交易UID填充申请模型。$uid
- 实体UID;$params
- 传递给 Kommo 的 GET 请求的额外参数。
setIncomingLeadInfo(array $params) :KommoIncomingLead
设置未整理申请的参数。$params
- 未整理参数。
addIncomingLead(KommoLead|array $lead) :KommoIncomingLeadSip
添加交易参数。$lead
-KommoLead
类的实例或交易参数数组。
addIncomingContact(KommoContact|array $contact) :KommoIncomingLead
添加联系人参数。$contact
-KommoContact
类的实例或联系人参数数组。
addIncomingCompany(KommoCompany|array $company) :KommoIncomingLead
添加公司参数。$company
-KommoCompany
类的实例或公司参数数组。
save(bool $returnResponse = false)
在未整理中添加新的申请并返回包含申请UID的数组。$returnResponse
- 返回服务器响应而不是UID。
用于批量添加申请到Kommo以及接受或拒绝未整理申请的静态方法位于 KommoAPI
类中。
类 KommoIncomingLeadForm
- 来自未解析的通过网页表单添加的申请模型
子类 KommoIncomingLeadForm
没有自己特定的方法。
类 KommoIncomingLeadSip
- 来自未解析的带有入站通话类型的申请模型
子类 KommoIncomingLeadSip
没有自己特定的方法。
实体加载方法
类 KommoAPI
包含以下用于加载实体的公共静态方法:
static getAll
加载指定类型(array $params, bool $returnResponse = false, string $subdomain = null) :\Generator 的所有实体,支持筛选。
返回 \Generator 类型的对象,以便后续选择实体参数。<Entities>
:- 联系人
- 公司
- 线索
- 任务
- 笔记
- 目录元素
- incomingLeads
$params
- 筛选参数;$returnResponse
- 返回 Kommo 服务器完整响应,而不是实体参数数组;$subdomain
- Kommo 子域名或完整域名。如果为 null,则使用最后一个执行授权的子域名。
static get
(array $params, bool $returnResponse = false, string $subdomain = null) :?array
加载指定类型的实体,支持筛选和分页。
返回实体参数数组,用于填充模型或 null。<Entities>
:- 联系人
- 公司
- 线索
- 任务
- 笔记
- Webhooks
- Widgets
- incomingLeads
- IncomingLeadsSummary
- Pipelines
- Catalogs
- 目录元素
$params
- 筛选和分页参数;$returnResponse
- 返回 Kommo 服务器完整响应,而不是实体参数数组;$subdomain
- Kommo 子域名或完整域名。如果为 null,则使用最后一个执行授权的子域名。
实体批量保存方法
类 KommoAPI
包含用于批量保存(添加或更新)的静态方法,一个请求最多可以保存 500 个不同类型的实体到单个 Kommo 子域名。
根据官方文档
创建或更改的实体最大数量不超过 500,为了更好地工作集成和避免错误,建议不超过 250。如果遇到 504 错误,建议减少请求中传输的实体数量并重新发送请求。
static saveObjects(array $amoObjects, bool $returnResponses = false, string $subdomain = null) :array
在 Kommo 中添加或更新实体。返回实体参数数组。$amoObjects
- 模型类对象的数组(每个类型的对象不超过 500 个):KommoContact
、KommoCompany
、...;$returnResponses
- 返回服务器 Kommo 的数组响应,而不是实体参数数组;$subdomain
- Kommo 子域名或完整域名。如果为 null,则使用最后一个执行授权的子域名。
static saveObjectsWithLimit(array $amoObjects, bool $returnResponses = false, string $subdomain = null, $limit = 250) :array
在 Kommo 中添加或更新实体,并限制 API 请求中实体的数量。返回实体参数数组。$amoObjects
- 模型类对象的数组:KommoContact
、KommoCompany
、...;$returnResponses
- 返回服务器 Kommo 的数组响应,而不是实体参数数组;$subdomain
- Kommo 子域名或完整域名。如果为 null,则使用最后一个执行授权的子域名;$limit
- API 请求中实体的最大数量。
实体批量删除方法
类 KommoAPI
包含用于批量删除列表和列表元素的静态方法
static deleteObjects(array $amoObjects, bool $returnResponses = false, string $subdomain = null) :array
在 Kommo 中删除实体。返回空实体参数数组。$amoObjects
- 模型类对象的数组:KommoCatalog
或KommoCatalogElement
;$returnResponses
- 返回空实体参数数组,而不是服务器 Kommo 的空数组响应;$subdomain
- Kommo 子域名或完整域名。如果为 null,则使用最后一个执行授权的子域名。
webhooks 方法
类 KommoAPI
包含用于添加和删除 webhooks 的静态方法
static addWebhooks(array $params, bool $returnResponse = false, string $subdomain = null) :array
添加一个 webhook 或多个 webhook(不超过 100 个)。params
- webhook 参数或 webhook 参数数组;$returnResponse
- 返回服务器 Kommo 的数组响应,而不是 webhook 参数数组;$subdomain
- Kommo 子域名或完整域名。如果为 null,则使用最后一个执行授权的子域名。
static deleteWebhooks(array $params, bool $returnResponse = false, string $subdomain = null) :array
删除一个 webhook 或多个 webhook(不超过 100 个)。params
- webhook 参数或 webhook 参数数组;$returnResponse
- 返回服务器 Kommo 的数组响应,而不是 webhook 参数数组;$subdomain
- Kommo 子域名或完整域名。如果为 null,则使用最后一个执行授权的子域名。
未解析相关方法
类 KommoAPI
包含以下用于处理未处理申请的静态方法
static saveIncomingObjects(KommoIncomingLeadForm|KommoIncomingLeadSip|array $amoObjects, bool $returnResponses = false, string $subdomain = null) :array
批量添加未处理申请。返回未处理申请 UID 参数数组。$amoObjects
-KommoIncomingLeadForm
或KommoIncomingLeadSip
类对象或这些对象的数组;$returnResponses
- 返回 Kommo 服务器响应数组代替 UID 数组;$subdomain
- Kommo 子域名或完整域名。如果为 null,则使用最后一个执行授权的子域名。
static saveIncomingObjectsWithLimit(KommoIncomingLeadForm|KommoIncomingLeadSip|array $amoObjects, bool $returnResponses = false, string $subdomain = null, $limit = 250) :array
批量添加申请到未整理,对单个 API 请求中的申请数量进行限制。返回未整理的 UID 数组。$amoObjects
-KommoIncomingLeadForm
或KommoIncomingLeadSip
类对象或这些对象的数组;$returnResponses
- 返回 Kommo 服务器响应数组代替 UID 数组;$subdomain
- Kommo 子域名或完整域名。如果为 null,则使用最后一个执行授权的子域名;$limit
- 单个 API 请求中申请的最大数量。
static acceptIncomingLeads(array $params, bool $returnResponse = false, $subdomain = null) :array
接受未整理的申请。params
- 申请参数;$returnResponse
- 返回 Kommo 服务器响应代替接受的申请参数数组;$subdomain
- Kommo 子域名或完整域名。如果为 null,则使用最后一个执行授权的子域名。
static declineIncomingLeads(array $params, bool $returnResponse = false, $subdomain = null) :array
拒绝未整理的申请。params
- 申请参数;$returnResponse
- 返回 Kommo 服务器响应代替拒绝的申请参数数组;$subdomain
- Kommo 子域名或完整域名。如果为 null,则使用最后一个执行授权的子域名。
额外方法
KommoAPI
类的其他静态方法
static getAccount(string $with = '', string $subdomain = null) :array
返回 Kommo 账户信息。$with
- 返回账户的附加参数列表,用逗号分隔,包括custom_fields
- 实体额外的字段;users
- 用户;pipelines
- 流程;groups
- 用户组;note_types
- 事件(备注)类型;task_types
- 任务类型。
$subdomain
- Kommo 子域名或完整域名。如果为 null,则使用最后一个执行授权的子域名。
static getAccountDomain(string $subdomain = null) :array
返回通过 OAuth2.0 协议授权的 Kommo 账户域信息。$subdomain
- Kommo 子域名或完整域名。如果为 null,则使用最后一个执行授权的子域名。
static getLastResponse(bool $unescapeUnicode = true) :?string
以原始形式返回 Kommo 服务器的最后一个响应。$unescapeUnicode
- 将响应中的 UTF-8 \uXXXX 字符串解码。
static request(string $query, string $type = 'GET', array $params = [], string $subdomain = null) :?array
允许执行 Kommo API 的原始请求。$query
- 请求 URL 的路径;$type
- 请求方法 'GET', 'POST' 或 'AJAX';$params
- 请求参数;$subdomain
- 子域或 Kommo 的完整域名。如果为 null,则使用最后认证的子域。
static getAmoDomain(string $subdomain) :string
返回 Kommo 的完整域名。$subdomain
- Kommo 的子域或完整域名。
防止一个实体同时更新
在 API Kommo 中,当在多个进程或执行流中同时更新一个相同的实体(具有相同 ID 的交易、联系人、公司等)时,由于与更新请求一起发送的实体 updated_at
值,可能会出现错误 "Last modified date is older than in database"。
为了防止出现此错误,在 save()
方法中实现了防止同时更新同一实体的机制。在第一个启动的进程(执行流)完成实体更新并从 API Kommo 收到响应之前,其他竞争同一实体更新的进程将暂停,并每隔 KommoAPI::$lockEntityTimeout
秒尝试重复更新实体,最多尝试 KommoAPI::$lockEntityAttempts
次。
API请求节流
为了防止在单个进程或执行流中超过对 API Kommo 的最大请求数量(不超过每秒 7 个请求),在库中实现了一个简单的请求节流算法,该算法基于计算自上次发送 API 请求以来经过的时间,并在 1/KommoAPI::$throttle
秒内暂停进程。
调试模式与日志记录
当启用调试模式 KommoAPI::$debug = true
时,每个请求/响应的信息将被输出到 STDOUT。
可以使用实现标准 PSR-3 的任意类-日志记录器或简单的类-日志记录器 KommoAPIDebugLogger
来记录每个请求/响应到 API Kommo。类-日志记录器对象设置在 KommoAPI::$debugLogger
属性中。记录操作独立于调试模式 KommoAPI::$debug
的状态。在每次请求/响应 API 时,在类-日志记录器中调用 debug()
方法。
在 KommoAPIDebugLogger
类的构造函数中可以传递日志文件名
__construct(string $logFile = 'logs/debug.log')
$logFile
- 日志文件。
错误处理
发生错误时,会抛出一个包含 \Kommo\KommoAPIException
类对象的异常。KommoAPIException
类异常包含以下辅助方法
getErrors() :array
返回来自 Kommo 服务器响应的错误消息数组。getItems() :array
返回来自 Kommo 服务器响应的实体参数数组。
示例
处理联系人
use Kommo\{KommoAPI, KommoContact, KommoAPIException}; try { // Авторизация $subdomain = 'testsubdomain'; KommoAPI::oAuth2($subdomain); // Загрузка ВСЕХ контактов с возможностью фильтрации $generator = KommoAPI::getAllContacts([ 'query' => 'Ганс' ]); foreach ($generator as $items) { foreach ($items as $item) { print_r($item); } } // Загрузка контактов с возможностью фильтрации и постраничной выборки $items = KommoAPI::getContacts([ 'limit_rows' => 100, 'limit_offset' => 1000 ]); foreach ($items as $item) { print_r($item); } // ------------------------------------------------------------------------- // Создание нового контакта $contact1 = new KommoContact([ 'name' => 'Ганс-Дитрих Геншер', 'responsible_user_id' => 12345678 ]); // Установка дополнительных полей $contact1->setCustomFields([ '6532343' => 41, '123456' => [[ 'value' => '+79451112233', 'enum' => 'WORK' ]], '123467' => [[ 'value' => 'hans@example.com', 'enum' => 'WORK' ]] ]); // Сохранение контакта и получение его ID $contact1Id = $contact1->save(); // Обновление существующего контакта и получение ответа сервера Kommo $contact2 = new KommoContact([ 'id' => 12300344, 'name' => 'Улоф Йоаким Пальме' ]); $contact2->first_name = 'Улоф'; $contact2->last_name = 'Пальме'; print_r($contact1->save($returnResponse = true)); // Пакетное добавление и/или обновление контактов $items = KommoAPI::saveObjects([ $contact1, $contact2 ]); foreach ($items as $item) { print_r($item); } // ------------------------------------------------------------------------- // Заполнение модели контакта по ID контакта $contact3 = new KommoContact(); $contact3->fillById(12345679); // Получение всех дополнительных полей контакта print_r($contact3->custom_fields); // Получение всех параметров контакта из модели print_r($contact3->getParams()); // Получение дополнительных полей контакта по ID полей print_r($contact3->getCustomFields([ 123456, 123467 ])); // Получение первого значения дополнительного поля контакта по ID поля print_r($contact3->getCustomFieldValueById(155114)); // Получение всех значений дополнительного поля контакта по ID поля print_r($contact3->getCustomFieldValueById(155116, $returnFirst = false)); // Получение первого ENUM дополнительного поля контакта по ID поля print_r($contact3->getCustomFieldValueById(155116, $returnFirst = true, $returnValue = 'enum')); // Получение всех ENUM дополнительного поля контакта по ID поля print_r($contact3->getCustomFieldValueById(155116, $returnFirst = false, $returnValue = 'enum')); // ------------------------------------------------------------------------- // Привязка сделок к контакту по ID сделок $contact3->addLeads([ 12380925, 12364352 ]); // Привязка покупателей к контакту по ID покупателей $contact3->addCustomers([ 1237374, 1239658 ]); // Добавление тегов к контакту $contact3->addTags([ 'сотрудник', 'стажер' ]); // Удаление тегов контакта $contact3->delTags('курьер'); // Сохранение контакта $contact3->save(); // ------------------------------------------------------------------------- $items = KommoAPI::getContacts([ 'responsible_user_id' => 12373452 ]); // Пакетная привязка сделки к контактам $contacts = []; foreach ($items as $item) { $contacts[] = (new KommoContact($item))->addLeads(12380925); } // Пакетное сохранение контактов KommoAPI::saveObjects($contacts); } catch (KommoAPIException $e) { printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage()); }
处理公司
use Kommo\{KommoAPI, KommoCompany, KommoAPIException}; try { // Авторизация $subdomain = 'testsubdomain'; KommoAPI::oAuth2($subdomain); // Загрузка ВСЕХ компаний с возможностью фильтрации $generator = KommoAPI::getAllCompanies([ 'query' => 'OOO', 'limit_offset' => 12000 ]); foreach ($generator as $items) { foreach ($items as $item) { print_r($item); } } // Загрузка компаний с возможностью фильтрации и постраничной выборки $items = KommoAPI::getCompanies([ 'responsible_user_id' => 12357492, 'limit_rows' => 250, 'limit_offset' => 1000 ]); foreach ($items as $item) { print_r($item); } // ------------------------------------------------------------------------- // Создание новой компании $company1 = new KommoCompany([ 'name' => 'ООО МММ', 'responsible_user_id' => 12358394, ]); // Установка дополнительных полей $company1->setCustomFields([ '2390423' => 'Город Москва', '123456' => [[ 'value' => '+79457778899', 'enum' => 'WORK' ]], '123467' => [[ 'value' => 'mmm@example.com', 'enum' => 'WORK' ]] ]); // Привязка контакта $company1->addContacts(12375435); // Привязка сделки $company1->addLeads(12349693); // Привязка покупателя $company1->addCustomers(1237374); // Добавление тега $company1->addTags('Акционер'); // Сохранение компании и получение ее ID $companyId = $company1->save(); // Обновление существующей компании и получение ответа сервера Kommo $company2 = new KommoCompany([ 'id' => 12375435, 'created_by' => 12396034, 'name' => 'ООО Рога и Копыта', ]); $response = $company2->save($returnResponse = true); // Пакетное добавление и/или обновление компаний $items = KommoAPI::saveObjects([ $company1, $company2 ]); foreach ($items as $item) { print_r($item); } // ------------------------------------------------------------------------- // Заполнение модели компании по ID $company3 = new KommoCompany(); $company3->fillById(12375435); // Получение всех параметров компании из модели print_r($company3->getParams()); // Получение дополнительных полей компании по ID полей print_r($company3->getCustomFields([ 123456, 123467, 2390423 ])); // Получение первого значения дополнительного поля компании по ID поля print_r($company3->getCustomFieldValueById(2390423)); // Получение всех значений дополнительного поля компании по ID поля print_r($company3->getCustomFieldValueById(2390423, $returnFirst = false)); // Получение первого subtype дополнительного поля компании по ID поля print_r($company3->getCustomFieldValueById(2390423, $returnFirst = true, $returnValue = 'subtype')); // Получение первого ENUM дополнительного поля компании по ID поля print_r($company3->getCustomFieldValueById(2390423, $returnFirst = true, $returnValue = 'enum')); // ------------------------------------------------------------------------- $items = KommoAPI::getCompanies([ 'responsible_user_id' => 12358394 ]); // Пакетная привязка сделки к компаниям $companies = []; foreach ($items as $item) { $companies[] = (new KommoCompany($item))->addLeads([ 12380925 ]); } // Пакетное сохранение компаний KommoAPI::saveObjects($companies); } catch (KommoAPIException $e) { printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage()); }
处理交易
处理未解析的申请与处理交易显著不同。对于它们,使用 特殊方法。
use Kommo\{KommoAPI, KommoLead, KommoAPIException}; try { // Авторизация $subdomain = 'testsubdomain'; KommoAPI::oAuth2($subdomain); // Загрузка ВСЕХ сделок с возможностью фильтрации $generator = KommoAPI::getAllLeads([ 'responsible_user_id' => 12357492 ]); foreach ($generator as $items) { foreach ($items as $item) { print_r($item); } } // Загрузка сделок с возможностью фильтрации и постраничной выборки $items = KommoAPI::getLeads([ 'limit_rows' => 250, 'limit_offset' => 2000 ]); foreach ($items as $item) { print_r($item); } // ------------------------------------------------------------------------- // Создание новой сделки $lead1 = new KommoLead([ 'name' => 'Заказ № 964023', 'responsible_user_id' => 12358394, 'pipeline' => [ 'id' => 45232121 ], 'status_id' => 142, 'sale' => 15000 ]); // Установка дополнительных полей $lead1->setCustomFields([ '3434323' => 'Акционерное общество', '3434327' => [ 1121, 1122, 1123 ] ]); // Привязка контакта $lead1->addContacts(12375435); // Привязка компании $lead1->addCompany(12364643); // Установка элементов списка $lead1->setCatalogElements([ 93492 => [ 9898 => 10, 9899 => 5 ] ]); // Добавление тега $lead1->addTags('Акционер'); // Сохранение сделки и получение ее ID $leadId = $lead1->save(); // Обновление существующей компании и получение ответа сервера Kommo $lead2 = new KommoLead([ 'id' => 123057838, 'sale' => 175000 ]); $response = $lead2->save($returnResponse = true); // Пакетное добавление и/или обновление сделок $items = KommoAPI::saveObjects([ $lead1, $lead2 ]); foreach ($items as $item) { print_r($item); } // ------------------------------------------------------------------------- // Заполнение модели сделки по ID $lead3 = new KommoLead(); $lead3->fillById(12328958); // Отвязка контакта от сделки $lead3->removeContacts(12345678); // Отвязка компании от сделки $lead3->removeCompany(12345671); // Получение параметров сделки из модели print_r($lead3->getParams()); // Получение дополнительных полей сделки по ID полей print_r($lead3->getCustomFields([ 123456, 123467, 2390423 ])); // Получение первого значения дополнительного поля сделки по ID поля print_r($lead3->getCustomFieldValueById(2390423)); // Получение всех значений дополнительного поля сделки по ID поля print_r($lead3->getCustomFieldValueById(2390423, $returnFirst = false)); // Получение всех ENUM дополнительного поля сделки по ID поля print_r($lead3->getCustomFieldValueById(2390423, $returnFirst = true, $returnValue = 'enum')); // ------------------------------------------------------------------------- $leads = KommoAPI::getLeads([ 'responsible_user_id' => 12358394 ]); // Пакетная привязка компании к сделкам $leads = []; foreach ($items as $item) { $leads[] = (new KommoLead($item))->addCompany(12380925); } // Пакетное сохранение сделок KommoAPI::saveObjects($leads); } catch (KommoAPIException $e) { printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage()); }
处理事件
use Kommo\{KommoAPI, KommoNote, KommoAPIException}; try { // Авторизация $subdomain = 'testsubdomain'; KommoAPI::oAuth2($subdomain); // Загрузка ВСЕХ событий, привязанных к сделкам, с возможностью фильтрации $generator = KommoAPI::getAllNotes([ 'type' => 'lead', 'note_type' => KommoNote::COMMON_NOTETYPE ]); foreach ($generator as $items) { foreach ($items as $item) { print_r($item); } } // Загрузка событий, привязанных к контактам, с возможностью фильтрации и постраничной выборки $items = KommoAPI::getLeads([ 'type' => 'contact', 'limit_rows' => 250, 'limit_offset' => 2000 ]); foreach ($items as $item) { print_r($item); } // ------------------------------------------------------------------------- // Создание нового события типа "обычное примечание", привязанного к сделке $note = new KommoNote([ 'element_id' => 12328687, 'note_type' => KommoNote::COMMON_NOTETYPE, 'element_type' => KommoNote::LEAD_TYPE, 'text' => 'Текст примечания к сделке' ]); // Сохранение события и получение его ID $noteId = $note->save(); // Обновление существующего события $note2 = new KommoNote([ 'id' => 12300958, 'text' => 'Обновленный текст события' ]); // Заполнение модели события по ID и изменение текста события $note3 = new KommoNote(); $note3->fillById(12347842); $note3->text = 'Новый тест события'; // Получение параметров события из модели print_r($note3->getParams()); // Пакетное сохранение событий KommoAPI::saveObjects([ $note2, $note3 ]); } catch (KommoAPIException $e) { printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage()); }
处理任务
use Kommo\{KommoAPI, KommoTask, KommoAPIException}; try { // Авторизация $subdomain = 'testsubdomain'; KommoAPI::oAuth2($subdomain); // Загрузка ВСЕХ задач, привязанных к сделкам, с возможностью фильтрации $generator = KommoAPI::getAllTasks([ 'type' => 'lead', 'filter' => [ 'task_type' => [ KommoTask::CALL_TASKTYPE, KommoTask::MAIL_TASKTYPE ] ] ]); foreach ($generator as $items) { foreach ($items as $item) { print_r($item); } } // Загрузка задач, с возможностью фильтрации и постраничной выборки $items = KommoAPI::getTasks([ 'responsible_user_id' => 12381202, 'limit_rows' => 100, 'limit_offset' => 800 ]); foreach ($items as $item) { print_r($item); } // ------------------------------------------------------------------------- // Создание новой задачи типа "написать письмо", привязанной к контакту $task = new KommoTask([ 'task_type' => KommoTask::MAIL_TASKTYPE, 'element_type' => KommoTask::CONTACT_TYPE, 'element_id' => 12367433, 'text' => 'Необходимо написать письмо', 'complete_till_at' => 1508706000 ]); // Сохранение задачи и получение её ID $taskId = $task->save(); // Обновление существующей задачи $task2 = new KommoTask([ 'id' => 12311954, 'text' => 'Обновленный текст задачи' ]); // Привязка сделки к задаче по ID $task2->addLead(12389536); // Заполнение модели задачи по ID и изменение текста задачи $task3 = new KommoTask(); $task3->fillById(12327872); $task3->text = 'Новый тест события'; // Получение параметров задачи из модели print_r($task3->getParams()); // Пакетное сохранение задач KommoAPI::saveObjects([ $task2, $task3 ]); } catch (KommoAPIException $e) { printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage()); }
处理列表(目录)
use Kommo\{KommoAPI, KommoCatalog, KommoAPIException}; try { // Авторизация $subdomain = 'testsubdomain'; KommoAPI::oAuth2($subdomain); // Загрузка перечня списков с возможностью фильтрации $items = KommoAPI::getCatalogs(); foreach ($items as $item) { print_r($item); } // Создание нового списка $catalog = new KommoCatalog([ 'name' => 'Товары на складе' ]); // Сохранение списка и получение его ID $catalogId = $catalog->save(); // Обновление существующего списка $catalog2 = new KommoCatalog([ 'id' => 7185, 'name' => 'Не товары' ]); // Заполнение модели списка по ID и изменение названия списка $catalog3 = new KommoCatalog(); $catalog3->fillById(7187); $catalog3->name = 'Актуальные товары'; // Получение параметров списка из модели print_r($catalog3->getParams()); // Пакетное сохранение списков KommoAPI::saveObjects([ $catalog2, $catalog3 ]); // Пакетное удаление списков KommoAPI::deleteObjects([ $catalog2, $catalog3 ]); } catch (KommoAPIException $e) { printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage()); }
处理列表(目录)元素
use Kommo\{KommoAPI, KommoCatalogElement, KommoAPIException}; try { // Авторизация $subdomain = 'testsubdomain'; KommoAPI::oAuth2($subdomain); // Загрузка ВСЕХ элементов заданного списка с возможностью фильтрации $generator = KommoAPI::getAllCatalogElements([ 'catalog_id' => 4422, 'term' => 'Маркер' ]); foreach ($generator as $items) { foreach ($items as $item) { print_r($item); } } // Загрузка элементов заданного списка с фильтрацией с постраничной выборкой $items = KommoAPI::getCatalogElements([ 'catalog_id' => 4422, 'term' => 'Фломастер', 'page' => 21 ]); foreach ($items as $item) { print_r($item); } // ------------------------------------------------------------------------- // Создание нового элемента каталога $element = new KommoCatalogElement([ 'catalog_id' => 4422, 'name' => 'Ручка гелевая' ]); // Установка дополнительных полей $element->setCustomFields([ '20423' => 'Артикул 14567323', '24233' => 120 ]); // Сохранение элемента списка и получение его ID $elementId = $element->save(); // Обновление существующего элемента списка $element2 = new KommoCatalogElement([ 'id' => 12312312, 'text' => 'Ручка перьевая' ]); // Заполнение модели элемента списка по ID и изменение имени элемента $element3 = new KommoCatalogElement(); $element3->fillById(12398096); $element3->name = 'Карандаш'; // Получение параметров элемента списка из модели print_r($element3->getParams()); // Пакетное сохранение элементов KommoAPI::saveObjects([ $element2, $element3 ]); // Пакетное удаление элементов KommoAPI::deleteObjects([ $element2, $element3 ]); } catch (KommoAPIException $e) { printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage()); }
处理webhooks
use Kommo\{KommoAPI, KommoAPIException}; try { // Авторизация $subdomain = 'subdomain'; KommoAPI::oAuth2($subdomain); // Получаем список установленных webhooks $webhooks = KommoAPI::getWebhooks(); print_r($webhooks); // Добавляем webhook KommoAPI::addWebhooks([ 'url' => 'https://example.com/webhook/', 'events' => [ 'add_lead' ] ]); // Удаляем webhook KommoAPI::deleteWebhooks([ 'url' => 'https://example.com/webhook/', 'events' => [ 'add_lead' ] ]); // Добавляем несколько webhooks KommoAPI::addWebhooks([ [ 'url' => 'https://example1.com/webhook/', 'events' => [ 'add_lead' ] ], [ 'url' => 'https://example2.com/webhook/', 'events' => [ 'update_lead' ] ] ]); // Удаляем несколько webhooks KommoAPI::deleteWebhooks([ [ 'url' => 'https://example1.com/webhook/', 'events' => [ 'add_lead' ] ], [ 'url' => 'https://example2.com/webhook/', 'events' => [ 'update_lead' ] ] ]); } catch (KommoAPIException $e) { printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage()); }
处理未解析的申请
处理未整理的申请与其他Kommo实体的工作有很大不同。
根据官方文档
最初,未整理的申请存储在单独的存储中,是独立的实体,因此至今在Kommo界面和API中仍有特殊功能,这些功能区分了未整理状态下的交易行为与其他状态下的交易行为。
以下是在从网页表单添加时处理未解析申请的示例。
use Kommo\{KommoAPI, KommoLead, KommoContact, KommoIncomingLeadForm, KommoAPIException}; try { // Авторизация $subdomain = 'testsubdomain'; KommoAPI::oAuth2($subdomain); // Создаем новую заявку в неразобранном при добавлении из веб-формы $incomingLead = new KommoIncomingLeadForm(); // Устанавливаем обязательные параметры $incomingLead->setIncomingLeadInfo([ 'form_id' => 1, 'form_page' => 'https://www.example.com', 'form_name' => 'Home page form' ]); // Добавляем параметры сделки $lead = new KommoLead([ 'name' => 'Новая заявка с сайта' ]); $lead->setCustomFields([ 25475362 => '#1543252' ]); $incomingLead->addIncomingLead($lead); // Добавляем параметры контакта $contact = new KommoContact([ 'name' => 'Ганс-Дитрих Геншер' ]); $contact->setCustomFields([ 255114 => [[ 'value' => '+10349654820', 'enum' => 'WORK' ]], 255116 => [[ 'value' => 'hans@example.com', 'enum' => 'WORK' ]] ]); $incomingLead->addIncomingContact($contact); // Добавляем параметры компании $incomingLead->addIncomingCompany([ 'name' => 'Freie Demokratische Partei' ]); // Сохраняем заявку KommoAPI::saveIncomingObjects($incomingLead); // ------------------------------------------------------------------------ // Получаем заявку из неразобранного по UID $uid = 'f03c796fb5455667e648dd0ec9755fc9680bc3775ac76a540753d249d455'; $incomingLead2 = new KommoIncomingLeadForm(); $incomingLead2->fillByUid($uid); print_r($incomingLead2->getParams()); // Загрузка ВСЕХ заявок из неразобранного с фильтрацией по категории $generator = KommoAPI::getAllIncomingLeads([ 'categories' => [ 'forms' ] ]); foreach ($generator as $items) { foreach ($items as $item) { print_r($item); } } // ------------------------------------------------------------------------ // Принимаем заявки из неразобранного KommoAPI::acceptIncomingLeads([ 'accept' => [ 'f03c796fb5455667e648dd0ec9755fc9680bc3775ac76a540753d249d455', 'a12c723fb54556676e6487d0e89795fc9080bc3975ac86a548752302d478', ], 'user_id' => 13752426, 'status_id' => 142 ]); // Отклоняем заявки из неразобранного KommoAPI::declineIncomingLeads([ 'decline' => [ 'e21c796dfb5sd566de648ccb80ec546a4d25e4baecbd343actf0b3ed4363c4' ], 'user_id' => 13752426 ]); } catch (KommoAPIException $e) { printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage()); }
支持对前端方法的AJAX请求
\Kommo\KommoAPI::request()
方法允许执行针对前端方法的 AJAX 请求。
use Kommo\{KommoAPI, KommoAPIException}; try { // Авторизация $subdomain = 'testsubdomain'; KommoAPI::oAuth2($subdomain); $params = [ 'filter' => [ 'cf'=> [ '681165'=> [ 'from' => '30.03.2022', 'to' => '30.03.2022' ] ], ], 'useFilter' => 'y', 'element_type' => 1, 'json' => 1, 'page' => 1 ]; $data = KommoAPI::request('/ajax/contacts/list', 'AJAX', $params); print_r($data); } catch (KommoAPIException $e) { printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage()); }
响应示例(片段)
{
"response": {
"url": "\/contacts\/list\/contacts\/",
"items": [
{
"id": 68207643,
"tags": {
"items": []
},
"url": "\/contacts\/detail\/68207643",
"element_type": 1,
"entity": "contact",
"is_deleted": false,
"rights": {
"contacts": {
"edit": true
},
"companies": {
"edit": true
}
},
"class_name": "",
"name": {
"text": "Звонок от 79521111111",
"url": "\/contacts\/detail\/68207643"
},
"company_name": {
"name": "",
"url": "#"
},
"manager": "Иван Петров",
"date_create": "Сегодня 11:30",
"creator": "Робот",
"date_modified": "Сегодня 11:31",
"modified_by": "Робот",
"date_of_nearest_task": {
"date": 1652641199,
"failed": false
},
"custom_fields": [
{
"id": "72797",
"name": "Телефон",
"values": [
{
"enum": "112761",
"value": "+7 952 111-11-11"
}
]
}
],
...
处理多个子域名
use Kommo\{KommoAPI, KommoCompany, KommoAPIException}; try { // Авторизация в поддомене 1 // ... KommoAPI::oAuth2($subdomain1, $clientId1, $clientSecret1, $redirectUri1, $authCode1); // Авторизация в поддомене 2 // ... KommoAPI::oAuth2($subdomain2, $clientId2, $clientSecret2, $redirectUri2, $authCode2); // Загрузка компаний из поддомена 1 $items1 = KommoAPI::getCompanies([ 'responsible_user_id' => 12357492 ], $subdomain1); // Загрузка всех компаний из поддомена 2 $generator2 = KommoAPI::getAllCompanies([ 'query' => 'OOO' ], $subdomain2); // Создание новой компании для поддомена 1 $company1 = new KommoCompany([ 'name' => 'ООО Абракадабра', ], $subdomain1); // Обновление существующей компании для поддомена 1 $company2 = new KommoCompany([], $subdomain1); $company2->fillById(12389423); $company2->name = 'OOO Розенталь'; // Пакетное сохранение компаний для поддомена 1 KommoAPI::saveObjects([ $company1, $company2 ], $subomain1); } catch (KommoAPIException $e) { printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage()); }
调试与日志记录
use Kommo\{KommoAPI, KommoAPIDebugLogger, KommoAPIException}; try { // Включение вывода запросов/ответов к API в STDOUT KommoAPI::$debug = true; // Включение логирования запросов/ответов к API в файл KommoAPI::$debugLogger = new KommoAPIDebugLogger($logFile = 'logs/debug_amocrm_api.log'); // Авторизация $subdomain = 'testsubdomain'; KommoAPI::oAuth2($subdomain); } catch (KommoAPIException $e) { printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage()); }
类UML图
作者
© 2019-2021 andrey-tech
© 2023 dedomorozoff
许可
本库按照 MIT 许可证条款分发。