dedemorozoff/kommo-api-php

为 kommo/amoCRM API 提供的简单 PHP7+ 包装器,支持 OAuth 2.0

1.0.1 2023-04-19 04:38 UTC

This package is auto-updated.

Last update: 2024-09-19 07:44:32 UTC


README

基于

amoCRM logo

Latest Stable Version Total Downloads GitHub stars GitHub forks GitHub watchers License

一个简单的 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 文件链接

内容

要求

  • 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 - 返回参数的名称,其值被返回(valueenumsubtype)。
  • 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 个):KommoContactKommoCompany、...;
    • $returnResponses - 返回服务器 Kommo 的数组响应,而不是实体参数数组;
    • $subdomain - Kommo 子域名或完整域名。如果为 null,则使用最后一个执行授权的子域名。
  • static saveObjectsWithLimit(array $amoObjects, bool $returnResponses = false, string $subdomain = null, $limit = 250) :array
    在 Kommo 中添加或更新实体,并限制 API 请求中实体的数量。返回实体参数数组。
    • $amoObjects - 模型类对象的数组:KommoContactKommoCompany、...;
    • $returnResponses - 返回服务器 Kommo 的数组响应,而不是实体参数数组;
    • $subdomain - Kommo 子域名或完整域名。如果为 null,则使用最后一个执行授权的子域名;
    • $limit - API 请求中实体的最大数量。

实体批量删除方法

KommoAPI 包含用于批量删除列表和列表元素的静态方法

  • static deleteObjects(array $amoObjects, bool $returnResponses = false, string $subdomain = null) :array
    在 Kommo 中删除实体。返回空实体参数数组。
    • $amoObjects - 模型类对象的数组:KommoCatalogKommoCatalogElement
    • $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 - KommoIncomingLeadFormKommoIncomingLeadSip 类对象或这些对象的数组;
    • $returnResponses - 返回 Kommo 服务器响应数组代替 UID 数组;
    • $subdomain - Kommo 子域名或完整域名。如果为 null,则使用最后一个执行授权的子域名。
  • static saveIncomingObjectsWithLimit(KommoIncomingLeadForm|KommoIncomingLeadSip|array $amoObjects, bool $returnResponses = false, string $subdomain = null, $limit = 250) :array
    批量添加申请到未整理,对单个 API 请求中的申请数量进行限制。返回未整理的 UID 数组。
    • $amoObjects - KommoIncomingLeadFormKommoIncomingLeadSip 类对象或这些对象的数组;
    • $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图

Kommo API class diagram UML

作者

© 2019-2021 andrey-tech

© 2023 dedomorozoff

许可

本库按照 MIT 许可证条款分发。